1. 程式人生 > 資料庫 >詳解Docker方式實現MySql 主從複製(實踐篇)

詳解Docker方式實現MySql 主從複製(實踐篇)

本文實踐了用Docker方式來實現基於binlog的MySql主從複製。關於MySql主從複製的原理將在下一篇中進行講解。

一些資料的本地儲存目錄結構

mysql >tree -L 2
.
├── data
│  ├── master01
│  └── slave01
├── master01
│  └── master01.cnf
└── slave01
  └── slave01.cnf

master01.cnf配置

[mysqld]
log-bin=mysql-master01-bin # 使用binary logging,mysql-master01-bin是log檔名的字首
server-id=1 # 唯一伺服器ID,非0整數,不能和其他伺服器的server-id重複

slave01.cnf配置

[mysqld]
log-bin=mysql-slave01-bin 
server-id=2  

建立master01容器

複製程式碼 程式碼如下:
docker run -d --name master01 -v /Users/craneyuan/backup/docker/mysql/data/master01:/var/lib/mysql -v /Users/craneyuan/backup/docker/mysql/master01:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 mysql:5.7

注意:啟動容器的時候不要立刻就去連線資料庫,會造成一些莫名奇妙的問題,比如連不上,可以將資料都刪掉然後restart容器。

建立slave01容器

複製程式碼 程式碼如下:
docker run -d --name slave01 -v /Users/craneyuan/backup/docker/mysql/data/slave01:/var/lib/mysql -v /Users/craneyuan/backup/docker/mysql/slave01:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -p 3308:3306 mysql:5.7

在master01中新增複製使用者

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';

show master status; # 檢視master的狀態

在slave01中配置與master01相關的內容

SET sql_mode=(SELECT REPLACE(@@sql_mode,''));

change master to master_host='192.168.10.223',master_port=3307,master_user='backup',master_password='123456',master_log_file='mysql-master01-bin.000003',master_log_pos=154;

master_host是宿主機的IP(ifconfig查到的作業系統IP,不是容器的IP,一定不能搞錯) 
master_port是主伺服器的對映到3306的埠(預設3306) 
master_user為建立的備份使用者 
master_password備份使用者的密碼 
master_log_file和master_log_pos則是show master status列表裡面的兩個值,分別是mysql日誌名和起始備份位置 

啟動slave(依然在slave01中操作)

start slave; 
show slave status; 或者show slave status\G;

如果是Waiting for master to send event則說明主從複製成功了,若是Connecting to master肯定是配置錯誤,樓主就錯了幾次,重刪除配置一下就行,這就是容器的好處,刪除的代價很小,短時間就可以恢復。如果是Waiting for master to send event,對主庫的增刪改查從庫都會同步修改。

擴充套件問題

slave設定為只讀

在slave的配置檔案中新增下面的選項

read-only=1    # 除非有SUPER許可權,否則只讀
super-read-only=1 # SUPER許可權也是隻讀

其他

如果master已經有資料了,怎麼新增slave:可以先把master的資料匯入到slave,再啟動slave。具體可以參考這裡。

如果已經有主從複製了,怎麼增加slave:思路同上,不過不需要使用master的資料,直接用已有的slave資料就可以了。不需要停止master,新slave使用新的server-id。具體可以參考這裡。

前面介紹的都是主從,如果需要slave也能同步到master就要設定主主複製:也就是說反過來再做一遍。

當slave比較多得時候,master的負載可能會成為問題。可以用主從多級複製:以slave為master來再引入新的slave。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。