MySQL主從
MySQL主從同步原理
- 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線程處於活躍狀態即爲正常。