如何基于docker搭建mysql8.0主从复制从而实现读写分离

前言

1、 docker的安装与mysql8.0镜像的打包这里不做详细介绍。以后有时间再出详细教程。安装好docker运行环境拉去mysql8镜像,我使用的是自己源码编译的mysql8.0。docker-hub地址如下

docker pull gongxulei/centos-lnmp:mysql8

2、主从复制原理

mysql的主从复制是基于bin-log实现的,因此需要开启bin-log配置,另外mysql8.0默认是开启bin-log的。
如下图所示mysql的主从复制主要分三步实现:

  • Master 主库在事务提交时,会把数据变更作为时间 Events 记录在二进制日志文件 Binlog 中。
  • 主库推送二进制日志文件 Binlog 中的日志事件到从库的中继日志 Relay Log 。
  • slave重做中继日志中的事件,将改变反映它自己的数据。

    知道了原理我们下面开始搭建
搭建mysql8.0主从复制
1、master搭建
  • 修改配置并启动一个msql的容器
    (1)my.cnf 配置如下
# bin-log二进制日志设置
log-bin=/usr/local/mysql/log/mysqlbin/mysql-bin
# logging format: mixed|statement|row
binlog_format=statement# 主从配置master
# required unique id between 1 and 2^32 - 1 defaults to 1 if master-host is not set
server-id = 1
#是否只读,1 代表只读, 0 代表读写
read-only=0
#忽略的数据, 指不需要同步的数据库
binlog-ignore-db=mysql
#指定同步的数据库
#binlog-do-db=db01

(2) 启动容器

我这里使用的 -v 来挂载了mysql 的data数据目录、etc配置目录、log日志目录
并映射的容器的3306端口到宿主机3306端口

# docker-mysql-master
docker run -d -it --privileged=true -p 3306:3306  -v /Users/gongxulei/docker/mysql/master/data:/usr/local/mysql/data   -v  /Users/gongxulei/docker/mysql/master/etc:/usr/local/mysql/etc -v /Users/gongxulei/docker/mysql/master/log:/usr/local/mysql/log --name my-app-mysql8-master 449f953ecd8b

(3) 初始化mysql并启动mysql

我这里初始化指定了mysql的 --log-bin 文件路径,是因为我没有采用默认的目录(data目录)
如果指定会无法初始化。具体原因见我的之前的一篇文章

# 初始化data目录
/usr/local/mysql/bin/mysqld --initialize-insecure --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --log-bin=/usr/local/mysql/log/mysqlbin/mysql-bin --user=mysql
# 以守护进程方式启动mysql
/usr/local/mysql/bin/mysqld_safe --user=mysql &

(4) 设置mysql主从复制账户

# 登录mysql
/usr/local/mysql/bin/mysql -uroot -p
# 设置master的root账户密码 并且允许外部连接mysql
alter mysql.user set host='%' where user='root' and host='localhost';
alter user 'root'@'%' identified by 'root123456';# 设置当前master授予slave的账户(用于从库复制)
# 注意:这里的ip为slave的ip地址。意思是允许此ip通过账户slave1来访问master数据库
create user 'slave1'@'172.17.0.5' identified by 'slave1123456';
# 授予slave权限并刷新权限
grant replication slave on *.* to 'slave1'@'172.17.0.5';
flush privileges;

此时可以使用 show master status命令查看master数据库状态

# 后面设置slave会用到下面的字段
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000006 |     869 |              | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
字段含义:
File : 从哪个日志文件开始推送日志文件
Position : 从哪个位置开始推送日志
Binlog_Ignore_DB : 指定不需要同步的数据库
2、slave搭建

(1)my.cnf 配置如下

# bin-log二进制日志设置
log-bin=/usr/local/mysql/log/mysqlbin/mysql-bin
# logging format: mixed|statement|row
binlog_format=statement# 主从配置slave
# required unique id between 1 and 2^32 - 1 defaults to 1 if master-host is not set
server-id = 2

(2) 启动容器

我这里使用的 -v 来挂载了mysql 的data数据目录、etc配置目录、log日志目录
并映射的容器的3306端口到宿主机3307端口

# docker-mysql-slave
docker run -d -it --privileged=true -p 3307:3306 -v /Users/gongxulei/docker/mysql/slave1/data:/usr/local/mysql/data   -v  /Users/gongxulei/docker/mysql/slave1/etc:/usr/local/mysql/etc -v /Users/gongxulei/docker/mysql/slave1/log:/usr/local/mysql/log  --name my-app-mysql8-slave1 449f953ecd8b

(3) 初始化mysql并启动mysql

初始化与上面master一致

(4) 设置slave账户并开启salve复制

下面用到的master_host地址为master服务器的IP地址。
master_user,master_password 是之前在master服务器设置的用于主从复制的账户密码
master_log_file,master_log_pos 是master服务器中执行show master status的信息

# 设置密码: 参考上面master的root账户设置
# 设置slave账户
change master to master_host= '172.17.0.4', master_user='slave1', master_password='slave1123456', master_log_file='mysql-bin.000006', master_log_pos=869;
# 开启slave模式
start slave;

此时可通过 show slave status命令查看slave是否设置成功

Slave_IO_Running: Yes Slave_SQL_Running: Yes 说明slave设置成功

mysql> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 172.17.0.4Master_User: slave1Master_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000006Read_Master_Log_Pos: 1713Relay_Log_File: 4a63c19c8af1-relay-bin.000002Relay_Log_Pos: 1168Relay_Master_Log_File: mysql-bin.000006Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 1713Relay_Log_Space: 1384Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1Master_UUID: 7f06a326-b845-11ea-85b9-0242ac110002Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace:
1 row in set (0.00 sec)ERROR:
No query specified
3、测试主从是否成功

在mysql的master服务器中创建数据库并查看是否同步到slave中

# 在master中创建数据库并新增一张测试表
CREATE DATABASE `master_test`
DROP TABLE IF EXISTS `test1`;
CREATE TABLE `test1` (`id` int unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='这是一张测试master-slave的表';


如图上图所示,在slave服务器也有了对应的库跟表,那么恭喜你搭建成功了

基于docker 搭建mysql8.0主从复制相关推荐

  1. docker搭建mysql8.0主备(主从复制)

    目录 前言 1. 拉取mysql8.0.25镜像 2. 启动mysql容器 3. 修改配置文件 4. 进入主容器mysql 5. 进入从容器mysql 6. 测试主从复制效果 *注意事项:* 前言 由 ...

  2. 基于Docker搭建Redis集群(主从集群)

    最近陆陆续续有不少园友加我好友咨询 redis 集群搭建的问题,我觉得之前写的这篇 <基于Docker的Redis集群搭建> 文章一定是有问题了,所以我花了几分钟浏览之前的文章总结了下面几 ...

  3. 基于Docker搭建私有镜像仓库

    通常我们在docker中拉取的镜像都是在docker hub在线存储库中获取的,这个在线存储库里的docker镜像可以由任何用户发布和使用,显然这在某些场景下是不适用的,比如某些互金的隐私项目,或者是 ...

  4. 基于Docker搭建分布式消息队列Kafka

    本文基于Docker搭建一套单节点的Kafka消息队列,Kafka依赖Zookeeper为其管理集群信息,虽然本例不涉及集群,但是该有的组件都还是会有,典型的kafka分布式架构如下图所示.本例搭建的 ...

  5. 树莓派4b学习笔记三--基于Ubuntu搭建Docker 和portainer,基于Docker 搭建Homeassistant、EMQX

    文章目录 一.基于Ubuntu搭建Docker和portainer 1.Docker简介 2.Ubuntu20.04安装Docker-ce 3.Ubuntu20.04安装Docker图形化界面port ...

  6. 基于docker搭建cephfs分布式文件

    目的 在一台机器上, 利用多块硬盘, 搭建一个cephfs文件系统. 具体来说就是1个mon, 1个mds, 1个mgr, 3个osd 注意 a. 使用vmware会很方便 b. 安装过程中会遇到很多 ...

  7. 基于Docker搭建单机版Mesos/Marathon

    摘要: 本文介绍了基于Docker搭建单机版Mesos/Marathon的方法,Mesos/Marathon的所有组件均运行于单个容器中. GitHub地址: kiwenlau/single-meso ...

  8. 基于 Docker 搭建 ownCloud 个人云盘

    在我的博客上阅读 基于 Docker 搭建 ownCloud 个人云盘 官方文档 机翻气息贯穿全文~ 概述 配置: 公开端口 8080,允许 HTTP 连接. 使用单独的 MariaDB 和 Redi ...

  9. 基于 Docker 搭建 Hadoop 平台

    基于 Docker 搭建完全分布式 Hadoop 平台 前言 环境 遇到的坑 折腾实录 一.构建镜像 1. 准备JDK和Hadoop 2. 构建centos-hadoop镜像 二.启动容器 三.集群搭 ...

最新文章

  1. 第十五届全国大学生智能汽车竞赛 车模检查手册
  2. camerax 自动聚焦_Android实现手机摄像头的自动对焦
  3. webbench 代码阅读
  4. Angular bootstrap的一个例子
  5. python代码画皮卡丘_程序员式优雅表白,教你用python代码画爱心
  6. 控制台添加log4net
  7. jcache_随机JCache内容:多个提供程序和JMX Bean
  8. 在C#中使用C++编写的类
  9. 面向对象的设计原则-类设计原则
  10. java基础篇---网络编程(TCP程序设计)
  11. 庆祝:黑客x档案官方二级域名转向
  12. 王文京:纵横30年,阵阵桂花香
  13. Dropping Balls 小球下落
  14. 主板bios密码清除案例
  15. 解决win10睡眠后变卡的问题
  16. 全站开发-列表讲解、切片、内置方法、元组、字典
  17. Python简单处理excel数据(拆分合并单元格、根据表头合并sheet、添加列数、添加内容操作)
  18. HBase的详细介绍(概念以及特性)
  19. 让图片固定不动的两种方法
  20. c语言printf双精度还需要lf,C语言中printf区分双精度和单精度吗?为什么用lf输出不了双精度浮点数?...

热门文章

  1. ZIP压缩算法原理解析(好文推荐,看完就懂)
  2. 代码生成器的使用步骤
  3. Adobe Photoshop快捷键_艾孜尔江摘录
  4. Maven手工安装jar包到本地仓库
  5. 【二叉树】1758:二叉树
  6. 抛弃了wordpress
  7. boll指标(布林带)计算公式
  8. csgo搭建显示段位的服务器,csgo官匹隐藏分怎么看 官匹段位升级机制
  9. FRED应用:TMT MOBIE成像光谱仪的概念设计阶段杂散光分析
  10. c语言比其他语言都高级,9.以下说法中正确的是( ) a.C语言比其他语言高级 b.C语言不用编译就能被计算机执行 c.C语言以接近英语国...