前言
1)、mysql主從復(fù)制用途
- 實(shí)時(shí)災(zāi)備,用于故障切換
- 讀寫分離,提供查詢服務(wù)
- 備份,避免影響業(yè)務(wù)
2)、主從部署必要條件:
- 主庫開啟binlog日志(設(shè)置log-bin參數(shù))
- 主從server-id不同
- 從庫服務(wù)器能連通主庫
利用docker實(shí)現(xiàn)mysql的主從復(fù)制,首先需要在服務(wù)器上安裝好docker 及拉取相關(guān)mysql鏡像:
一、部署主從Mysql服務(wù)器
在服務(wù)器創(chuàng)建兩個(gè)目錄 master 與 slave 分別對應(yīng)主從數(shù)據(jù)庫的data和conf ,目錄結(jié)構(gòu)如下
然后在master/conf/ 路徑下創(chuàng)建 my.cnf 里面內(nèi)容如下
[mysqld]
## 同一局域網(wǎng)內(nèi)注意要唯一
server-id=1
## 開啟二進(jìn)制日志功能,可以隨便取(關(guān)鍵)
log-bin=mysql-bin
secure_file_priv=/var/lib/mysql
default_authentication_plugin=mysql_native_password #設(shè)置密碼規(guī)則
max_connections=1000 #最大連接數(shù)設(shè)置 根據(jù)實(shí)際需要 自行調(diào)整
在slave /conf/路徑下 創(chuàng)建 my.cnf 內(nèi)容如下
[mysqld]
## 設(shè)置server_id,注意要唯一
server-id=2
## 開啟二進(jìn)制日志功能,以備Slave作為其它Slave的Master時(shí)使用
log-bin=mysql-slave-bin
## relay_log配置中繼日志
relay_log=edu-mysql-relay-bin
secure_file_priv=/var/lib/mysql
default_authentication_plugin=mysql_native_password #設(shè)置密碼規(guī)則
max_connections=1000 #最大連接數(shù)設(shè)置 根據(jù)實(shí)際需要 自行調(diào)整
然后利用鏡像分別啟動(dòng)兩個(gè)容器,一個(gè)master 一個(gè)slave , master端口為3306,slave為3307 對應(yīng)的root密碼為123456,映射配置文件和數(shù)據(jù)存儲目錄到mysql
啟動(dòng) Master
docker run --name master -p 3306:3306 -v "/root/home/mysql/master/conf/my.cnf":/etc/mysql/my.cnf -v "/root/home/mysql/master/data":/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
啟動(dòng)Slave
docker run --name slave -p 3307:3306 -v "/root/home/mysql/slave/conf/my.cnf":/etc/mysql/my.cnf -v "/root/home/mysql/slave/data":/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
啟動(dòng)完成后,分別測試下連接,發(fā)現(xiàn)都可以正常連接,接下來開始具體的主從配置
二、主從數(shù)據(jù)同步配置
使用navicat連接 master數(shù)據(jù)庫,進(jìn)行slave賬戶創(chuàng)建及相關(guān)授權(quán)
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
在Master進(jìn)入mysql,執(zhí)行show master status;
回到linux服務(wù)器,執(zhí)行命令查看master容器的ip地址
docker inspect --format={{.NetworkSettings.IPAddress}} master
然后在slave數(shù)據(jù)庫服務(wù)器中根據(jù)上面得到的信息執(zhí)行命令,主要是
master_log_file和 master_log_pos這兩個(gè)參數(shù)需要根據(jù)上面 圖5語句查出來的結(jié)果進(jìn)行配置,IP分配的內(nèi)部地址基本就是172.17.0.2,如果不是這個(gè)地址改為上述查詢出來的地址即可。
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000006', master_log_pos= 1249, master_connect_retry=30,get_master_public_key=1;
- master_port: Master的端口號,指的是容器的端口號.
- master_user:用于數(shù)據(jù)同步的用戶
- master_password:用于同步的用戶的密碼
- master_log_file:指定Slave從哪個(gè)日志文件開始復(fù)制數(shù)據(jù),即上文中提到的File字段的值
- master_log_pos:從哪個(gè)Position開始讀,即上文中提到的Position字段的值
- master_connect_retry:如果連接失敗,重試的時(shí)間間隔,單位是秒,默認(rèn)是60秒
- get_master_public_key:在該用戶在連接主庫時(shí)自動(dòng)獲得主庫的公鑰
查詢下當(dāng)前從服務(wù)器的狀態(tài)
show slave status \G;
show slave status \G;
由于navicat 不支持 \G格式化展示,所以我們進(jìn)入slave從服務(wù)器內(nèi)查看
# 進(jìn)入slave 的mysql命令界面
docker exec -it slave mysql -uroot -p123456
# 查詢下當(dāng)前從服務(wù)器的狀態(tài)
show slave status \G
可以看到這兩個(gè)屬性都為No
設(shè)置從數(shù)據(jù)庫開啟主從服務(wù)
start slave;
如果中途報(bào)錯(cuò),之類的,可以使用reset slave進(jìn)行從服務(wù)器重置
reset slave;
三、主從同步測試
在主庫中新建一個(gè)數(shù)據(jù)庫
刷新從庫
發(fā)現(xiàn)在主數(shù)據(jù)庫添加的新庫db0也被同步到從數(shù)據(jù)庫上了,至此主從同步配置完成。
過程中遇到的問題及相關(guān)命令
1:如果遇到message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection異常只需在添加主庫的語句中加上獲取主庫密鑰即可get_master_public_key=1
2:查看server_id :
show variables like 'server_id';
如果沒有生效手動(dòng)設(shè)置
set global server_id=2;
這里為什么會失效,多半是因?yàn)樵趩?dòng)mysql容器時(shí)映射路徑配置錯(cuò)誤