使用pt-slave-delay實現mysql的延遲備份

來源:互聯網
上載者:User

標籤:pt-slave-delay mysql

########################################################################
####                         mysql的安裝初始化                        ####
########################################################################


########################################################################
###    在三台伺服器上搭建主從環境(vm_web1為主,vm_web2和vm_mysql1為從)###    
########################################################################
1) 在主(vm_web1)上建立備份使用者
MariaDB [(none)]> CREATE USER ‘mysql_slave‘@‘192.168.1.%‘ IDENTIFIED BY ‘JE8mG2ZhmRVq23uq‘;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT REPLICATION SLAVE , REPLICATION CLIENT ON * . * TO ‘mysql_slave‘@‘192.168.1.%‘ IDENTIFIED BY ‘JE8mG2ZhmRVq23uq‘ WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

2) 分別修改各個伺服器的設定檔
vm_web1:
[mysqld]
log-bin = /data/mysql/binlog/mysql-bin
server-id       = 1 #設定server-id的值(server_id值可以是整數型的數字(1 ~ 2^31-1), 在同一個複製組(replicating group)中的每台伺服器的server_id都必須是唯一的)
[[email protected]_web1 ~]# service mysql restart

vm_web2:
[mysqld]
log-bin = /data/mysql/binlog/mysql-bin
server-id       = 2
[[email protected]_web2 ~]# service mysql restart

vm_mysql1:    vm_mysql1採用的是mysql的多執行個體所以配置有點特殊
[mysqld3306]
# 佔用的連接埠(每一個執行個體佔用一個連接埠)
port=3306
server-id       = 3  
# 指定通訊端檔案所在的目錄
socket=/tmp/mysql3306.sock
# 指定鎖檔案所在的位置
pid-file=/tmp/mysql3306.pid
# 指定資料庫執行個體目錄
datadir=/mariadb/data3306
log-bin=/data/mysql/3306/binlog/mysql-bin
[[email protected]_mysql1 ~]# mysqld_multi --defaults-extra-file=/etc/my.cnf start 3306  # 多執行個體的mysql啟動和其他不同,具體參考上一篇日誌

3) 開啟主從

vm_web2上執行:
MariaDB [(none)]> change master to master_host=‘192.168.1.211‘,master_user=‘mysql_slave‘,master_password=‘JE8mG2ZhmRVq23uq‘,master_port=3306,master_log_file=‘mysql-bin.000001‘,master_log_pos=312;
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> start slave;

vm_mysql1上執行
MariaDB [(none)]> change master to master_host=‘192.168.1.211‘,master_user=‘mysql_slave‘,master_password=‘JE8mG2ZhmRVq23uq‘,master_port=3306,master_log_file=‘mysql-bin.000001‘,master_log_pos=312;
Query OK, 0 rows affected (0.04 sec)
MariaDB [(none)]> start slave;


4) 測試
vm_web1上:
MariaDB [master_slave_test_db]> create database master_slave_test_db;
MariaDB [master_slave_test_db]> create table m_s_test1(id int,name varchar(20));
會即時同步到vm_web2 和 vm_mysql1上

####################################################################
###                把vm_mysql1做成延遲同步                            ####
####################################################################
1) vm_web1上安裝percona-xtrabackup
[[email protected]_web1 ~]# yum -y install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
[[email protected]_web1 ~]# yum -y install percona-toolkit

2) 在延遲伺服器上建立授權使用者
vm_mysql1:
MariaDB [mysql]> grant all on *.* to ‘delay_user‘@‘192.168.1.%‘ identified by ‘5BbCZ4WLurwvBFbX‘;
MariaDB [mysql]> flush PRIVILEGES;

3) 主伺服器上設定延遲同步
[[email protected]_web1 ~]# pt-slave-delay --user=‘delay_user‘ --password=‘5BbCZ4WLurwvBFbX‘ --delay=2m --interval=20s --run-time=6m --port 3306 192.168.1.217
參數說明: --user=‘delay_user‘ # 延遲伺服器中授權的使用者名稱 delay_user
           --password=‘5BbCZ4WLurwvBFbX‘ # 延遲伺服器中授權使用者的密碼
           --delay=2m 延時同步的時間,這裡我測試用的是2分鐘
           --interval=20s 檢查同步的時間,這裡設定為20s
           --run-time=6m pt-slave-delay的已耗用時間,這裡設定為6分鐘
           --port 3306 延時伺服器mysql開啟連接埠
           192.168.1.217 延時伺服器的IP地址
           
4)主伺服器上插入資料,進行測試
vm_web1:
MariaDB [master_slave_test_db]> insert into m_s_test1 values(1,‘zhangsan‘);

執行完上面這條命令我們分別在兩台伺服器上查看資料的變化
vm_web2:
MariaDB [master_slave_test_db]> select * from m_s_test1;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
+------+----------+
1 row in set (0.00 sec)  # 即時同步

vm_mysql1:
MariaDB [master_slave_test_db]> select * from m_s_test1;
Empty set (0.00 sec) # 在vm_mysql1上並沒有資料同步到
過一段時間再去查看
MariaDB [master_slave_test_db]> select * from m_s_test1;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
+------+----------+
1 row in set (0.00 sec)  # 探索資料已經同步了

5)pt-slave-delay 輸出日誌查看與分析
[[email protected]_web1 ~]# pt-slave-delay --user=‘delay_user‘ --password=‘5BbCZ4WLurwvBFbX‘ --delay=2m --interval=20s --run-time=6m --port 3306 192.168.1.217
# 串連到從伺服器
2015-05-13T23:06:59 slave running 0 seconds behind  # 檢查從伺服器落後主伺服器的時間(這裡是0秒 < 2分鐘)
2015-05-13T23:06:59 STOP SLAVE until 2015-05-13T23:08:59 at master position mysql-bin.000001/629  # 停止SLAVE上的執行進程,直到2015-05-13T23:08:59才開啟(剛好是我們設定的延遲2分鐘)
2015-05-13T23:07:19 slave stopped at master position mysql-bin.000001/629 # 20s後再次查看,發現slave執行進程是停止的,並且目前時間也沒有達到2015-05-13T23:08:59。所以什麼事情都不用做
2015-05-13T23:07:39 slave stopped at master position mysql-bin.000001/629 # 同上
2015-05-13T23:07:59 slave stopped at master position mysql-bin.000001/629 # 同上
2015-05-13T23:08:19 slave stopped at master position mysql-bin.000001/815 # 檢測到主上有資料更新
2015-05-13T23:08:39 slave stopped at master position mysql-bin.000001/815
2015-05-13T23:08:59 no new binlog events  # 開啟slave執行進程,但是從上沒有進行任何資料操作
2015-05-13T23:09:19 slave stopped at master position mysql-bin.000001/815
2015-05-13T23:09:39 slave stopped at master position mysql-bin.000001/815
2015-05-13T23:09:59 slave stopped at master position mysql-bin.000001/815
2015-05-13T23:10:19 START SLAVE until master 2015-05-13T23:08:19 mysql-bin.000001/815 # 執行23:08:19檢測到的主上更新的操作
2015-05-13T23:10:39 slave running 0 seconds behind
2015-05-13T23:10:39 STOP SLAVE until 2015-05-13T23:12:39 at master position mysql-bin.000001/815
2015-05-13T23:10:59 slave stopped at master position mysql-bin.000001/815
2015-05-13T23:11:19 slave stopped at master position mysql-bin.000001/815
2015-05-13T23:11:39 slave stopped at master position mysql-bin.000001/815
2015-05-13T23:11:59 slave stopped at master position mysql-bin.000001/815
2015-05-13T23:12:19 slave stopped at master position mysql-bin.000001/815
2015-05-13T23:12:39 no new binlog events
2015-05-13T23:12:59 slave stopped at master position mysql-bin.000001/815
2015-05-13T23:12:59 Setting slave to run normally #  pt-slave-delay退出,同步恢複到即時。
從上面的解釋可以看出來從上比主上最多延遲2分鐘20s最少會延遲2分鐘

6) 如果我們想讓pt-slave-delay在後台運行並且當進程退出時也不要追上master 則:
[[email protected]_web1 ~]# nohup  pt-slave-delay --user=‘delay_user‘ --password=‘5BbCZ4WLurwvBFbX‘  --nocontinue  --delay=2m --interval=20s  --port 3306 192.168.1.217 &
--continue:繼續複製,正常退出(預設是yes)如果退出後重啟線程沒有until條件,他會正常運行追上master
--nocontinue:表示不追上
######################################################################################
###              主伺服器上誤刪除資料後在延遲備份伺服器上恢複                        ##
######################################################################################
vm_web1:
[[email protected]_web1 ~]# pt-slave-delay --user=‘delay_user‘ --password=‘5BbCZ4WLurwvBFbX‘ --delay=20m --interval=100s --run-time=30m --port 3306 192.168.1.217  # 延遲同步啟動

vm_web1:
MariaDB [master_slave_test_db]> delete from m_s_test1 where id=1;
Query OK, 1 row affected (0.00 sec)

MariaDB [master_slave_test_db]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |     1349 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

vm_mysql1:
MariaDB [master_slave_test_db]> stop slave; # 延遲伺服器上停止從
Query OK, 0 rows affected (0.00 sec)

MariaDB [master_slave_test_db]> change master to master_log_file=‘mysql-bin.000001‘,master_log_pos=1349; #  跳過誤刪除點直接執行後面的操作。

MariaDB [master_slave_test_db]> start slave;
Query OK, 0 rows affected (0.00 sec)

我們再次往vm_web1上添加資料,可以看到在vm_mysql1上還保留有原來的那一條資料
vm_web1:
MariaDB [master_slave_test_db]> insert into m_s_test1 values(3,‘wangwu‘);
Query OK, 1 row affected (0.00 sec)
MariaDB [master_slave_test_db]> select * from m_s_test1;
+------+--------+
| id   | name   |
+------+--------+
|    3 | wangwu |
+------+--------+
1 row in set (0.00 sec)

vm_web2:

MariaDB [master_slave_test_db]> select * from m_s_test1;
+------+--------+
| id   | name   |
+------+--------+
|    3 | wangwu |
+------+--------+
1 row in set (0.00 sec)

vm_mysql1:
MariaDB [master_slave_test_db]> select * from m_s_test1;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    3 | wangwu   |
+------+----------+
2 rows in set (0.00 sec)





使用pt-slave-delay實現mysql的延遲備份

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.