MySQL主從 - 邱乘屹的個人技術博客

MySQL主從同步原理

  1. master服務器將數據的改變記錄二進制binlog日誌,當master上的數據發生改變時,則將其改變寫入二進制日誌中;

slave服務器會在一定時間間隔內對master二進制日誌進行探測其是否發生改變,如果發生改變,則開始一個I/OThread請求master二進制事件

同時主節點爲每個I/O線程啓動一個dump線程,用於向其發送二進制事件,並保存至從節點本地的中繼日誌中,從節點將啓動SQL線程從中繼日誌中讀取二進制日誌,在本地重放,使得其數據和主節點的保持一致,最後I/OThread和SQLThread將進入睡眠狀態,等待下一次被喚醒。

MySQL主從一致效驗

我們可以通過採用pt-table-checksum工具來檢查主從的一致性,以下是具體流程。

工具安裝

wget http://www.percona.com/get/percona-toolkit.tar.gz

安裝所需依賴

yum install perl perl-devel perl-Time-HiRes perl-DBI perl-DBD-MySQL
perl-Compress-Raw-Bzip2
perl-Compress-Raw-Zlib
perl-Digest
perl-Digest-MD5
perl-IO-Compress
perl-IO-Socket-IP
perl-IO-Socket-SSL
perl-Mozilla-CA
perl-Net-Daemon
perl-Net-LibIDN
perl-Net-SSLeay

安裝工具

# tar zxf percona-toolkit-2.2.13.tar.gz
# cd percona-toolkit-2.2.13
# perl Makefile.PL
# make && make install

在進行主從校驗之前,我們首先需要對主從庫進行授權

#主庫授權
root@node1 12:28:  [pt_check]> GRANT CREATE,INSERT,SELECT,DELETE,UPDATE,LOCK TABLES,PROCESS,SUPER,REPLICATION SLAVE ON *.* TO 'root'@'47.97.218.145' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
root@node1 12:29:  [pt_check]>  flush privileges;
Query OK, 0 rows affected (0.00 sec)
root@node1 12:29:  [pt_check]> select Host,User  from mysql.user;
+----------------+---------------+
| Host         | User        |
+---------------------+--------------------+
| localhost      | root          |
| localhost      | mysql.session  |
| localhost      | mysql.sys      |
| 172.16.156.%   | rep           |
| %            | java          |
| 192.168.1.101   | ptuser        |
+----------------------+---------------------+

#從庫授權
MariaDB [(none)]> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'root'@'9.106.84.122' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

授權到主從兩個數據庫之後呢,我們就可以開開心心的,進行主從數據一致性的校驗。且看下面

pt-table-checksum是通過在主(master)上通過執行校驗的查詢對複製的一致性進行檢查,對比主從的校驗值,從而產生結果。
DSN指向的是主的地址,該工具的退出狀態不爲零,如果發現有任何差別,或者如果出現任何警告或錯誤,可以查看官方資料。

MySQL基於Docker的主從複製

基於Docker的主從複製的好處:
• 一臺服務器可以運行多個docker容器。
• docker 容器之間相互獨立,互不衝突。
• docker 使用步驟簡便。

首先基於docker拉取mysql鏡像

docker pull mysql:5.7

使用下載好的鏡像,啓動主從兩個容器

docker run -p 3339:3306 --name mymysql –e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7  # 主
docker run -p 3340:3306 --name mymysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7  # 從

配置主從

docker exec -it 627a2368c865 /bin/bash # 進入容器,627a2368c865是容器的id,而mysql-master是容器的名稱
apt-get update
apt-get install vim # 在容器中手動安裝 vim

vi my.cnf,進入/etc/mysql目錄下,對my.cnf進行編輯

[mysqld]
server-id = 100
log-bin = mysql-bin
service mysql restart   		# 重啓mysql
docker start mysql-master 	# 啓動容器

創建主從所需權限用戶

CREATE USER 'slave'@'%' IDENTIFIED BY '123456'  # 創建用戶
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'  # 設置權限

配置從數據庫

[mysqld]
server-id = 101
service mysql restart   		# 重啓mysql
docker start mysql-master 	# 啓動容器
change master to master_host='172.17.0.2', master_user='slave', 		 master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 254, master_connect_retry=30;

這裏需要注意的是,有兩個參數來自於主庫,可以通過主庫中運行show master status 查看得到,分別是master_log_file以及master_log_pos。
最終在從庫執行show slave status查看從庫狀態即可。看到IO與SQL線程處於活躍狀態即爲正常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章