docker实现mysql主从复制的示例代码

 更新时间:2021年08月31日 10:00:14   作者:吕林光  
Docker它不香吗?即省去了安装Mysql所需要的步骤,有多个容器之间相互资源独立,IP互不冲突,具有一定的参考价值,感兴趣的可以了解一下

一、概述

1、原理

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

主从流程图

2、实现

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

1、安装镜像

docker pull mysql:8.0.26

2、新建目录

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

3、创建并启动

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

三、创建Slave实例

进入服务器192.168.3.14

1、同上面操作一样

# 创建目录
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

# 需要同步的数据库
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、重启容器

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数据库
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;

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

# 进入容器
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开始了

purge master logs to'mysql-bin.000001';

开启同步

# 开始同步
start slave;

# 停止同步
# stop slave;

# 查看同步状态
show slave status\G;

8、错误排查

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

总结:

主从数据库在自己配置文件中声明需要同步哪个数据库,忽略哪个数据库等信息。并且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主从复制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker中部署mysql服务的方法及遇到的坑

    Docker中部署mysql服务的方法及遇到的坑

    这篇文章主要介绍了Docker中部署mysql服务的方法及遇到的坑,本文是小编细心给大家收藏整理下来的,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • Docker如何进入启动容器

    Docker如何进入启动容器

    本篇文章主要介绍了Docker如何进入启动容器,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Docker图文详解

    Docker图文详解

    今天小编就为大家分享一篇关于Docker图文详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 一次docker错误的耗时排查过程记录

    一次docker错误的耗时排查过程记录

    这篇文章主要给大家介绍了一次docker错误的耗时排查过程记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Ubuntu Docker 源码编译(1.9.1 )详解

    Ubuntu Docker 源码编译(1.9.1 )详解

    这篇文章主要介绍了Ubuntu Docker 源码编译(1.9.1 )详解的相关资料,这里对编译过程进行了详细的分析介绍,需要的朋友可以参考下
    2016-11-11
  • Docker MQTT安装使用教程

    Docker MQTT安装使用教程

    今天小编就为大家分享一篇关于Docker MQTT安装使用教程,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • Docker安装logstash的详细过程

    Docker安装logstash的详细过程

    这篇文章主要介绍了Docker安装logstash的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • docker网络及部署集群和打包镜像问题

    docker网络及部署集群和打包镜像问题

    这篇文章主要介绍了docker网络及部署集群和打包镜像问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 使用docker compose快速配置一组容器服务详解

    使用docker compose快速配置一组容器服务详解

    这篇文章主要为大家介绍了使用docker- compose快速配置一组容器服务详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • 如何解决报错unable to remove volume问题

    如何解决报错unable to remove volume问题

    这篇文章主要介绍了如何解决报错unable to remove volume问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02

最新评论