用Docker搭建MySQL主從復(fù)制集群

主節(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é)果是


image.png

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了。

image.png

如果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ù)一致。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容