目錄
- 一、概述
- 三、創(chuàng)建Slave實例
- 四、主從配置
- 五、參考
一、概述
1、原理
- master服務器將數(shù)據(jù)的改變記錄二進制binlog日志,當master上的數(shù)據(jù)發(fā)生改變時,則將其改變寫入二進制日志中;
- slave服務器會在一定時間間隔內對master二進制日志進行探測其是否發(fā)生改變,如果發(fā)生改變,則開始一個I/OThread請求master二進制事件
- 同時主節(jié)點為每個I/O線程啟動一個dump線程,用于向其發(fā)送二進制事件,并保存至從節(jié)點本地的中繼日志中,從節(jié)點將啟動SQL線程從中繼日志中讀取二進制日志,在本地重放,使得其數(shù)據(jù)和主節(jié)點的保持一致,最后I/OThread和SQLThread將進入睡眠狀態(tài),等待下一次被喚醒。
主從流程圖
2、實現(xiàn)
主庫:192.168.3.13:3310從庫:192.168.3.14:3310二、創(chuàng)建master主庫進入服務器192.168.3.13
1、安裝鏡像
2、新建目錄
mkdir -p /home/apps/mysql-master/{config,log,data}
3、創(chuà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
添加以下內容
[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實例
進入服務器192.168.3.14
1、同上面操作一樣
# 創(chuàng)建目錄
mkdir -p /home/apps/mysql-slave-01/{config,log,data}
# 啟動容器
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
# 添加以下內容
[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
# 開啟二進制日志
log-bin=mysql-bin
read-only=0
# 需要同步的數(shù)據(jù)庫
binlog-do-db=rapid-cloud
binlog-do-db=rapid-cloud-test
# 需要忽略的數(shù)據(jù)庫
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添加帳號,用來同步的用戶
# 進入容器
docker exec -it mysql-master /bin/bash
# 進入主庫mysql數(shù)據(jù)庫
mysql -u root -p
# 授權root可以遠程訪問( 主從無關,為了方便我們遠程連接mysql)
# 授權遠程
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 刷新
flush privileges;
# 創(chuàng)建backup用戶
# 應先創(chuàng)建新用戶
create user 'backup'@'%' identified by '123456';
# 執(zhí)行授權
grant all privileges on *.* to 'backup'@'%';
# 刷新
flush privileges;
# 授權遠程
ALTER USER 'backup'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 刷新
flush privileges;
# 查看主庫狀態(tài)
show master status;
6、在從庫里設置主庫連接
# 進入容器
docker exec -it mysql-slave-01 /bin/bash
# 進入主庫mysql數(shù)據(jù)庫
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、啟動從庫同步
先將主庫的數(shù)據(jù)復制一份到從庫,包含表結構及數(shù)據(jù)
將主庫binlog清除一下,這樣它的位置就從0開始了
purge master logs to'mysql-bin.000001';
開啟同步
# 開始同步
start slave;
# 停止同步
# stop slave;
# 查看同步狀態(tài)
show slave status\G;
8、錯誤排查
如果無法實現(xiàn)主從同步,可以通過以下排查
總結:
主從數(shù)據(jù)庫在自己配置文件中聲明需要同步哪個數(shù)據(jù)庫,忽略哪個數(shù)據(jù)庫等信息。并且server-id不能一樣主庫授權某個賬號密碼來同步自己的數(shù)據(jù)從庫使用這個賬號密碼連接主庫來同步數(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
到此這篇關于docker實現(xiàn)mysql主從復制的示例代碼的文章就介紹到這了,更多相關docker mysql主從復制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!