小知识:docker实现mysql主从复制的示例代码

一、概述

1、原理

master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中; slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个i/othread请求master二进制事件 同时主节点为每个i/o线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动sql线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后i/othread和sqlthread将进入睡眠状态,等待下一次被唤醒。

主从流程图

%小知识:docker实现mysql主从复制的示例代码-猿站网-插图

2、实现

主库:192.168.3.13:3310从库:192.168.3.14:3310二、创建master主库进入服务器192.168.3.13

1、安装镜像

?
1
docker pull mysql:8.0.26

2、新建目录

?
1
mkdir -p /home/apps/mysql-master/{config,log,data}

3、创建并启动

?
1
2
3
4
5
6
7
8
9
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基本配置

?
1
vim /home/apps/mysql-master/config/my.cnf

添加以下内容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
[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

三、创建slave实例

进入服务器192.168.3.14

1、同上面操作一样

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 创建目录
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配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vim /home/apps/mysql-master/config/my.cnf
server_id=1
# 开启二进制日志
log-bin=mysql-bin
read-only=0
# 需要同步的数据库
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

2、重启容器

?
1
docker restart mysql-master

3、添加slave配置

?
1
2
3
4
5
6
7
8
9
10
11
12
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、重启容器

?
1
docker restart mysql-slave-01

5、master添加帐号,用来同步的用户

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 进入容器
docker exec -it mysql-master /bin/bash
# 进入主库mysql数据库
mysql -u root -p
# 授权root可以远程访问( 主从无关,为了方便我们远程连接mysql)
# 授权远程
alter user root@% identified with mysql_native_password by 123456;
# 刷新
flush privileges;
# 创建backup用户
# 应先创建新用户
create user backup@% identified by 123456;
# 执行授权
grant all privileges on *.* to backup@%;
# 刷新
flush privileges;
# 授权远程
alter user backup@% identified with mysql_native_password by 123456;
# 刷新
flush privileges;
# 查看主库状态
show master status;

%小知识:docker实现mysql主从复制的示例代码-1猿站网-插图

6、在从库里设置主库连接

?
1
2
3
4
5
6
7
# 进入容器
docker exec -it mysql-slave-01 /bin/bash
# 进入主库mysql数据库
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、启动从库同步

先将主库的数据复制一份到从库,包含表结构及数据

将主库binlog清除一下,这样它的位置就从0开始了

?
1
purge master logs tomysql-bin.000001;

开启同步

?
1
2
3
4
5
6
7
8
# 开始同步
start slave;
# 停止同步
# stop slave;
# 查看同步状态
show slave status\g;

%小知识:docker实现mysql主从复制的示例代码-2猿站网-插图

8、错误排查

如果无法实现主从同步,可以通过以下排查

%小知识:docker实现mysql主从复制的示例代码-3猿站网-插图

总结:

主从数据库在自己配置文件中声明需要同步哪个数据库,忽略哪个数据库等信息。并且server-id不能一样主库授权某个账号密码来同步自己的数据从库使用这个账号密码连接主库来同步数据

五、参考

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实现mysql主从复制的示例代码的文章就介绍到这了,更多相关docker mysql主从复制内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/lvlinguang/p/15205389.html

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:docker容器详细讲解如何精简镜像减小体积

2023-3-18 18:15:18

建站知识

小知识:基于Docker+Selenium Grid的测试技术应用示例代码

2023-3-18 18:30:03

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索