主節(jié)點(diǎn):可讀可寫(xiě)。
從節(jié)點(diǎn):可讀不可寫(xiě),可以用來(lái)分擔(dān)主節(jié)點(diǎn)讀操作壓力。
這里搭建的是1個(gè)主節(jié)點(diǎn),1個(gè)從節(jié)點(diǎn)。
1. 拉取鏡像
docker pull mysql:latest
2. 建立相關(guān)目錄
建立主節(jié)點(diǎn)和從節(jié)點(diǎn)的配置、數(shù)據(jù)、日志目錄
mkdir -p /mysql_test/mysql_cluster/master/config
mkdir -p /mysql_test/mysql_cluster/master/data
mkdir -p /mysql_test/mysql_cluster/master/log
mkdir -p /mysql_test/mysql_cluster/slave/config
mkdir -p /mysql_test/mysql_cluster/slave/data
mkdir -p /mysql_test/mysql_cluster/slave/log
修改log目錄的所屬用戶,其實(shí)data也是要改的,但是data會(huì)自動(dòng)改。不修改log目錄權(quán)限啟動(dòng)容器會(huì)報(bào)錯(cuò)。
sudo chown 999 /mysql_test/mysql_cluster/master/log
sudo chown 999 /mysql_test/mysql_cluster/slave/log
3. 建立配置文件
配置文件名為my.cnf。主節(jié)點(diǎn)的放在/mysql_test/mysql_cluster/master/config里,從節(jié)點(diǎn)的放在/mysql_test/mysql_cluster/slave/config里。
配置文件詳解可以參考https://blog.csdn.net/uisoul/article/details/111677544
主節(jié)點(diǎn)my.cnf內(nèi)容。
[mysqld]
skip-host-cache
skip-name-resolve
log-error=/var/log/mysql/error.log
server-id=1
log-bin=mysql-bin
從節(jié)點(diǎn)my.cnf內(nèi)容,注意節(jié)點(diǎn)的server-id不可以相同。
[mysqld]
skip-host-cache
skip-name-resolve
log-error=/var/log/mysql/error.log
server-id=2
relay-log=mysql-relay
4. 建個(gè)密碼配置文件,為了docker啟動(dòng)腳本中不出現(xiàn)密碼明文
mkdir -p /mysql_test/mysql_cluster/master/config/secrets
mkdir -p /mysql_test/mysql_cluster/slave/config/secrets
echo "1234567" > /mysql_test/mysql_cluster/master/config/secrets/password
echo "1234567" > /mysql_test/mysql_cluster/slave/config/secrets/password
5. 編寫(xiě)主從容器啟動(dòng)腳本
主節(jié)點(diǎn)容器腳本run_mysql_cluster_master.sh
docker run --name mysql_master1 \
-h mysql_master1 \
-p 0.0.0.0:4000:3306 \
-v /mysql_test/mysql_cluster/master/config:/etc/mysql/conf.d \
-v /mysql_test/mysql_cluster/master/data:/var/lib/mysql \
-v /mysql_test/mysql_cluster/master/log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD_FILE=/etc/mysql/conf.d/secrets/password \
--restart=always \
-d mysql:latest \
從節(jié)點(diǎn)容器腳本run_mysql_cluster_slave.sh
docker run --name mysql_slave1 \
-h mysql_slave1 \
-p 0.0.0.0:4001:3306 \
-v /home/xushuzhen/mysql_test/mysql_cluster/slave/config:/etc/mysql/conf.d \
-v /home/xushuzhen/mysql_test/mysql_cluster/slave/data:/var/lib/mysql \
-v /home/xushuzhen/mysql_test/mysql_cluster/slave/log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD_FILE=/etc/mysql/conf.d/secrets/password \
--restart=always \
-d mysql:latest \
6. 啟動(dòng)容器
sh run_mysql_cluster_master.sh
sh run_mysql_cluster_slave.sh
7. 建立同步用戶
使用mysql命令行或者數(shù)據(jù)庫(kù)工具,連接主節(jié)點(diǎn)。
我使用的是Navicat,安裝可以參考https://www.bilibili.com/read/cv17235251
連上主節(jié)點(diǎn),建立同步用戶。建完要修改成mysql_native_password形式的密碼,不改可能會(huì)不能同步。
CREATE USER 'slave1'@'%' IDENTIFIED BY '1234567';
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';
FLUSH PRIVILEGES;
ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '1234567';
8. 查看主節(jié)點(diǎn)信息
show master status;
查詢結(jié)果是

9. 給從節(jié)點(diǎn)配置上同步用戶
連接從節(jié)點(diǎn)后,該命令填入主節(jié)點(diǎn)的:ip、端口、步驟7里建的用戶名密碼、步驟8查出來(lái)的mysql-bin信息,然后執(zhí)行。
CHANGE MASTER TO MASTER_HOST='192.168.10.2',
MASTER_PORT=4000,
MASTER_USER='slave1',
MASTER_PASSWORD='1234567',
MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=2643;
啟動(dòng)從服務(wù)
start slave;
查看從服務(wù)狀態(tài)
show slave status;
可以看到剛剛配的信息,然后水平滾動(dòng)條往后拉一拉,看到這兩項(xiàng)都是Yes,主從復(fù)制集群就搭建OK了。

如果Slave_IO_Running狀態(tài)不是Yes,而一直是Connecting
那就檢查一下步驟9命令里填的主節(jié)點(diǎn)相關(guān)信息有沒(méi)有填對(duì)。
如果還不行,再檢查一下步驟7中有沒(méi)有改為mysql_native_password形式的密碼,改完執(zhí)行停止、重置從服務(wù)命令
stop slave;
reset slave;
然后再執(zhí)行步驟9。
OK之后,可以在主節(jié)點(diǎn)里建庫(kù)建表,寫(xiě)個(gè)數(shù)據(jù)。然后重新鏈接一下從節(jié)點(diǎn),就可以看到自動(dòng)同步的表了。主從數(shù)據(jù)一致。