Docker Mysql數據庫主從同步配置方法
一、背景
最近在做內部平臺架構上的部署調整,順便玩了一下數據庫的主從同步,特此記錄一下操作~
二、具體操作
1、先建立數據存放目錄(~/test/mysql_test/)
--mysql
--master
--data
--conf
--my.cnf
--slave
--data
--conf
--my.cnf
2、Master my.cnf配置文件
[mysqld]
server_id = 1
log-bin= mysql-bin
read-only=0
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
3、Slave my.cnf配置文件
[mysqld]
server_id = 2
log-bin= mysql-bin
read-only=1
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
4、創建master主容器
docker run --name mastermysql -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -v ~/test/mysql_test/master/data:/var/lib/mysql -v ~/test/mysql_test/master/conf/my.cnf:/etc/mysql/my.cnf mysql:5.7
5、創建slave從容器
docker run --name slavemysql -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -v ~/test/mysql_test/slave/data:/var/lib/mysql -v ~/test/mysql_test/slave/conf/my.cnf:/etc/mysql/my.cnf mysql:5.7
6、master容器設置
//進入master容器
docker exec -it mastermysql bash
//啟動mysql命令,剛在創建窗口時我們把密碼設置為:root
mysql -u root -p
//創建一個用戶來同步數據,每個slave使用標準的MySQL用戶名和密碼連接master。進行復制操作的用戶會授予REPLICATION SLAVE 權限。
CREATE USER 'slave'@ '%' IDENTIFIED BY '123456'; (其實可省略)
GRANT REPLICATION SLAVE ON *.* to 'slave'@'%' identified by '123456';
//這里表示創建一個slaver同步賬號slave,允許訪問的IP地址為%,%表示通配符
//查看狀態,記住File、Position的值,在Slave中將用到
show master status/G;
7、slave容器設置
//進入slaver容器
docker exec -it slavemysql bash
//啟動mysql命令,剛在創建窗口時我們把密碼設置為:root
mysql -u root -p
//設置主庫鏈接
change master to master_host='172.17.0.2',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3306;
//啟動從庫同步
start slave;
//查看狀態
show slave status\G;
如果 show slave status\G命令結果中出現:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上兩項都為Yes,那說明沒問題了。
三、注意事宜
mysqldump -uroot -p --all-databases >/root/all_database.sql
mysql -uroot -p <all_database.sql
#如需要,可以master容器中,執行以下命令鎖定數據庫以防止寫入數據。
mysql>FLUSH TABLES WITH READ LOCK;
等待主從數據追平,主從同步后在打開鎖!
#解鎖數據表。
mysql>UNLOCK TABLES;
主從數據追平后,定位好從庫到主庫日志的文件名字,和相應的位置
mysql> show master status\G;

看到相應文件名字和位置!
slave從庫運行:
#設置主庫鏈接
change master to master_host='172.17.0.9',master_user='slave',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=2037,master_port=3306;
#執行從庫同步
start slave;
#查看從庫同步狀態
show slave status\G;

在結果中看到:
四、主從同步驗證
注:在本次實驗中,由上述my.cnf配置文件可得知,主從同步針對的數據庫(除了mysql,sys,information_schema,performance_schema這些以外)的其它所有數據庫都會進行同步(含數據庫、表、數據等)
1、如當前數據庫情況如下:

2、在master主庫容器中,創建數據庫master_demo,并在此庫下創建表userinfo,并插入一條記錄
create database master_demo;
use master_demo;
create table userinfo(username varchar(50),age int);
insert into userinfo values('Tom',18);

3、此時,進入從庫容器中,查看:

確實已經將在master主庫新建的數據庫和表記錄都同步過來了。
既然是主從同步,那反過來驗證一下,在從庫下插入記錄后,會不會同步到主庫中來呢?
在從庫上操作插入記錄:
insert into userinfo values('slave',20);
查看:

切到master主庫中,查看:

發現在master主庫中,還是只有一條記錄,說明與預期設想的一樣,在從庫中插入記錄,是不會同步到master主庫中來的
再來一波,在主庫master上,插入新記錄:
insert into userinfo values('master',25);

在從庫中,查看

發現在master主庫中新加入的master記錄,在從庫中同步過來了。
到此,基于docker mysql數據庫的主從同步配置,驗證到此結束,命令、配圖給的如此詳細,來點個贊吧~

浙公網安備 33010602011771號