docker實(shí)現(xiàn)mysql主從復(fù)制的示例代碼
一、概述
1、原理
- master服務(wù)器將數(shù)據(jù)的改變記錄二進(jìn)制binlog日志,當(dāng)master上的數(shù)據(jù)發(fā)生改變時(shí),則將其改變寫入二進(jìn)制日志中;
- slave服務(wù)器會(huì)在一定時(shí)間間隔內(nèi)對(duì)master二進(jìn)制日志進(jìn)行探測(cè)其是否發(fā)生改變,如果發(fā)生改變,則開始一個(gè)I/OThread請(qǐng)求master二進(jìn)制事件
- 同時(shí)主節(jié)點(diǎn)為每個(gè)I/O線程啟動(dòng)一個(gè)dump線程,用于向其發(fā)送二進(jìn)制事件,并保存至從節(jié)點(diǎn)本地的中繼日志中,從節(jié)點(diǎn)將啟動(dòng)SQL線程從中繼日志中讀取二進(jìn)制日志,在本地重放,使得其數(shù)據(jù)和主節(jié)點(diǎn)的保持一致,最后I/OThread和SQLThread將進(jìn)入睡眠狀態(tài),等待下一次被喚醒。
主從流程圖

2、實(shí)現(xiàn)
主庫(kù):192.168.3.13:3310從庫(kù):192.168.3.14:3310二、創(chuàng)建master主庫(kù)進(jìn)入服務(wù)器192.168.3.13
1、安裝鏡像
docker pull mysql:8.0.26
2、新建目錄
mkdir -p /home/apps/mysql-master/{config,log,data}
3、創(chuàng)建并啟動(dòng)
docker run -d --name mysql-master \ --restart=always \ --privileged=true \ -p 3310:3306 \ -v /home/apps/mysql-master/config:/etc/mysql/conf.d \ -v /home/apps/mysql-master/log:/var/log/mysql \ -v /home/apps/mysql-master/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:8.0.26
4、新增/修改master基本配置
vim /home/apps/mysql-master/config/my.cnf
添加以下內(nèi)容
[client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake skip-name-resolve
三、創(chuàng)建Slave實(shí)例
進(jìn)入服務(wù)器192.168.3.14
1、同上面操作一樣
# 創(chuàng)建目錄
mkdir -p /home/apps/mysql-slave-01/{config,log,data}
# 啟動(dòng)容器
docker run -d --name mysql-slave-01 \
--restart=always \
--privileged=true \
-p 3310:3306 \
-v /home/apps/mysql-slave-01/config:/etc/mysql/conf.d \
-v /home/apps/mysql-slave-01/log:/var/log/mysql \
-v /home/apps/mysql-slave-01/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.26
# 修改Slave基本配置
vim /home/apps/mysql-slave-01/config/my.cnf
# 添加以下內(nèi)容
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
四、主從配置
1、添加master配置
vim /home/apps/mysql-master/config/my.cnf server_id=1 # 開啟二進(jìn)制日志 log-bin=mysql-bin read-only=0 # 需要同步的數(shù)據(jù)庫(kù) binlog-do-db=rapid-cloud binlog-do-db=rapid-cloud-test # 需要忽略的數(shù)據(jù)庫(kù) replicate-ignore-db=mysql replicate-ignore-db=sys replicate-ignore-db=information_schema replicate-ignore-db=performance_schema
2、重啟容器
docker restart mysql-master
3、添加Slave配置
vim /home/apps/mysql-slave-01/config/my.cnf server_id=2 log-bin=mysql-bin read-only=1 binlog-do-db=rapid-cloud binlog-do-db=rapid-cloud-test replicate-ignore-db=mysql replicate-ignore-db=sys replicate-ignore-db=information_schema replicate-ignore-db=performance_schema
4、重啟容器
docker restart mysql-slave-01
5、master添加帳號(hào),用來(lái)同步的用戶
# 進(jìn)入容器 docker exec -it mysql-master /bin/bash # 進(jìn)入主庫(kù)mysql數(shù)據(jù)庫(kù) mysql -u root -p # 授權(quán)root可以遠(yuǎn)程訪問(wèn)( 主從無(wú)關(guān),為了方便我們遠(yuǎn)程連接mysql) # 授權(quán)遠(yuǎn)程 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; # 刷新 flush privileges; # 創(chuàng)建backup用戶 # 應(yīng)先創(chuàng)建新用戶 create user 'backup'@'%' identified by '123456'; # 執(zhí)行授權(quán) grant all privileges on *.* to 'backup'@'%'; # 刷新 flush privileges; # 授權(quán)遠(yuǎn)程 ALTER USER 'backup'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; # 刷新 flush privileges; # 查看主庫(kù)狀態(tài) show master status;

6、在從庫(kù)里設(shè)置主庫(kù)連接
# 進(jìn)入容器 docker exec -it mysql-slave-01 /bin/bash # 進(jìn)入主庫(kù)mysql數(shù)據(jù)庫(kù) mysql -u root -p change master to master_host='192.168.3.13',master_user='backup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3310;
7、啟動(dòng)從庫(kù)同步
先將主庫(kù)的數(shù)據(jù)復(fù)制一份到從庫(kù),包含表結(jié)構(gòu)及數(shù)據(jù)
將主庫(kù)binlog清除一下,這樣它的位置就從0開始了
purge master logs to'mysql-bin.000001';
開啟同步
# 開始同步 start slave; # 停止同步 # stop slave; # 查看同步狀態(tài) show slave status\G;

8、錯(cuò)誤排查
如果無(wú)法實(shí)現(xiàn)主從同步,可以通過(guò)以下排查

總結(jié):
主從數(shù)據(jù)庫(kù)在自己配置文件中聲明需要同步哪個(gè)數(shù)據(jù)庫(kù),忽略哪個(gè)數(shù)據(jù)庫(kù)等信息。并且server-id不能一樣主庫(kù)授權(quán)某個(gè)賬號(hào)密碼來(lái)同步自己的數(shù)據(jù)從庫(kù)使用這個(gè)賬號(hào)密碼連接主庫(kù)來(lái)同步數(shù)據(jù)
五、參考
https://www.cnblogs.com/heian99/p/12104189.html
https://blog.csdn.net/lilygg/article/details/98187015
binlog清除:https://www.cnblogs.com/kiko2014551511/p/11532426.html
到此這篇關(guān)于docker實(shí)現(xiàn)mysql主從復(fù)制的示例代碼的文章就介紹到這了,更多相關(guān)docker mysql主從復(fù)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Docker安裝mysql主從復(fù)制的實(shí)現(xiàn)步驟
- docker實(shí)現(xiàn)MySQL的主從復(fù)制
- Docker部署MySQL主從復(fù)制的實(shí)現(xiàn)
- 一文教會(huì)你在Docker容器中實(shí)現(xiàn)Mysql主從復(fù)制
- Docker上部署mysql8主從復(fù)制的實(shí)現(xiàn)
- Docker搭建MySQL5.7主從復(fù)制的實(shí)現(xiàn)
- 基于Docker的MySQL主從復(fù)制環(huán)境搭建的實(shí)現(xiàn)步驟
- 基于Docker如何實(shí)現(xiàn)MySQL主從復(fù)制詳解
- 詳解Docker方式實(shí)現(xiàn)MySql 主從復(fù)制(實(shí)踐篇)
- 詳解如何利用docker快速構(gòu)建MySQL主從復(fù)制環(huán)境
- 使用Docker容器搭建MySql主從復(fù)制
- Docker部署Mysql8.0.20并配置主從復(fù)制的實(shí)現(xiàn)步驟
相關(guān)文章
淺談Docker consul的容器服務(wù)更新與發(fā)現(xiàn)
本文主要介紹了淺談Docker consul的容器服務(wù)更新與發(fā)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
基于Docker實(shí)現(xiàn)MySQL主從復(fù)制的詳細(xì)教程
這篇博客整理了如何在Docker環(huán)境下配置MySQL主從復(fù)制,通過(guò)創(chuàng)建和命名兩個(gè)MySQL容器,設(shè)置獨(dú)立IP,并詳細(xì)說(shuō)明了在宿主機(jī)上持久化數(shù)據(jù)、開啟root遠(yuǎn)程訪問(wèn)及添加復(fù)制用戶的過(guò)程,需要的朋友可以參考下2024-10-10
docker容器內(nèi)服務(wù)隨容器自動(dòng)啟動(dòng)的幾種方案
Docker是一種輕量級(jí)的容器化平臺(tái),可以幫助開發(fā)者快速部署、運(yùn)行和管理應(yīng)用程序,這篇文章主要給大家介紹了關(guān)于docker容器內(nèi)服務(wù)隨容器自動(dòng)啟動(dòng)的幾種方案,需要的朋友可以參考下2024-07-07
Docker中部署Redis集群與部署微服務(wù)項(xiàng)目的詳細(xì)過(guò)程
這篇文章主要介紹了Docker中部署Redis集群與部署微服務(wù)項(xiàng)目,主要包括使用docker部署的好處以及Docker與Kubernetes對(duì)比分析,需要的朋友可以參考下2022-06-06

