Docker Mysql數據庫主從同步配置方法

 1、背景

最近在作內部平臺架構上的部署調整,順便玩了一下數據庫的主從同步,特此記錄一下操做~mysql

 

2、具體操做

一、先創建數據存放目錄(~/test/mysql_test/)sql

--mysql
   --master
      --data  
      --conf
         --my.cnf     
   --slave
      --data  
      --conf
         --my.cnf

 

二、Master my.cnf配置文件docker

[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/

 

三、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/

 

四、建立master主容器bash

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

 

五、建立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

 

六、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;

 

七、slave容器設置ide

//進入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,那說明沒問題了。spa

 

3、注意事宜

1, 首先在主從沒有生效的時候,要保持兩臺服務器數據庫、表相同,數據相同
 
master容器上執行:
mysqldump -uroot -p --all-databases >/root/all_database.sql

 

拷貝到slave容器中,在slave從庫上執行:
mysql -uroot -p <all_database.sql
 
如此兩步驟,主庫和從庫數據會追加相平,保持同步!
 
再此過程當中,若主庫存在業務,在同步的時候要先鎖表,讓其不要有修改!
 
#如須要,能夠master容器中,執行如下命令鎖定數據庫以防止寫入數據。

mysql>FLUSH TABLES WITH READ LOCK;

 

等待主從數據追平,主從同步後在打開鎖!3d

#解鎖數據表。

mysql>UNLOCK TABLES;

 

主從數據追平後,定位好從庫到主庫日誌的文件名字,和相應的位置

master主庫運行:
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;

 在結果中看到:

             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
便可成功同步!

 

4、主從同步驗證

注:在本次實驗中,由上述my.cnf配置文件可得知,主從同步針對的數據庫(除了mysql,sys,information_schema,performance_schema這些之外)的其它全部數據庫都會進行同步(含數據庫、表、數據等)

一、如當前數據庫狀況以下:

二、在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);

 

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

 

確實已經將在master主庫新建的數據庫和表記錄都同步過來了。

 

既然是主從同步,那反過來驗證一下,在從庫下插入記錄後,會不會同步到主庫中來呢?

在從庫上操做插入記錄:

insert into userinfo values('slave',20);

查看: 

 

切到master主庫中,查看:

發如今master主庫中,仍是隻有一條記錄,說明與預期設想的同樣,在從庫中插入記錄,是不會同步到master主庫中來的

 

再來一波,在主庫master上,插入新記錄:

insert into userinfo values('master',25);

 

在從庫中,查看

 

發如今master主庫中新加入的master記錄,在從庫中同步過來了。

 

到此,基於docker mysql數據庫的主從同步配置,驗證到此結束,命令、配圖給的如此詳細,來點個贊吧~

相關文章
相關標籤/搜索