mysql 有则更新无则添加_基于Docker实现MYSQL主从复制

文章来源公众号ytao ,

作者ytao

前言

MySQL的主从复制是实现应用的高性能,高可用的基础。对于数据库读操作较密集的应用,通过使数据库请求负载均衡分配到不同 MySQL服务器,可有效减轻数据库压力。当遇到 MySQL单点故障中,也能在短时间内实现故障切换。本文就 MySQL的内建的复制功能进行阐述。

版本

  • MySQl: 5.7.17
  • CentOS: 7.4.1708
  • Docker: 1.13.1

概述

MySQL复制数据流程:

  1. 主库在数据更新提交事务之前,将事件异步记录到binlog二进制日志文件中,日志记录完成后存储引擎提交本次事务
  2. 从库启动一个I/O线程与主库建立连接,用来请求主库中要更新的binlog。这时主库创建的binlog dump线程,这是二进制转储线程,如果有新更新的事件,就通知I/O线程;当该线程转储二进制日志完成,没有新的日志时,该线程进入sleep状态。
  3. 从库的I/O线程接收到新的事件日志后,保存到自己的relay log(中继日志)中
  4. 从库的SQL线程读取中继日志中的事件,并执行更新保存。

配置主从库

主库my.cnf配置

在主库的my.cnf中打开二进制日志,并设置服务Id。

log-bin = mysql-bin

server-id = 1

注意 server-id必须是一个唯一的数字,必须主从不一致, 且主从库必须设置项。

从库my.cnf配置

log-bin = mysql-bin

server-id = 2

log-slave-updates = 1

read-only = 1

从库也开启 log-bin, log-slave-updates设置为从库重放中继日志时,记录到自己的二进制日志中,可以让从库作为其他服务器的主库,将二进制日志转发给其他从库,在做一主多从方案时可考虑该种方案。

Dockerfile构建MySQL镜像

构建所需文件

这里master和slave文件各自保存不共用,先创建文件夹/usr/local/mysql然后在目录创建master和slave两个目录,再各自创建data文件夹

4ef24b90dec9e20d11d9d7f35bdf59d9.png
  • data 目录用来保存数据文件的目录
  • Dockerfile 保存Dockerfile内容
  • init.sql 初始化数据库的SQL
  • my.cnf 数据库配置文件,配置方式上面已提到
  • start.sh Dockerfile构建MySQL时的脚本

Dockerfile 内容

58fa847402aec76c98dfcdc04f075e7c.png

这里的master和slave都是基于同一个镜像构建,使用的存储引擎和其他的组件最好是同一中,不然在复制过程中可能会出现异常。

init.sql 初始化数据

7b0569c2316babe8e3934b00c830dc9e.png

创建data_copy数据库和person表。

start.sh 脚本

c5a2e4ed606ed29331af2addca26323a.png

构建master和slave镜像并运行容器

构建master镜像

docker build -t master/mysql .

构建slave镜像

docker build -t slave/mysql .

构建成功会返回Successfuly,或通过docker images命令查看镜像

6b333269726c768fcf2382da6846d0b3.png

使用刚构建的镜像来运行容器

# master 容器docker run --name master -p 3306:3306 -v /usr/local/mysql/master/data/:/var/lib/mysql -d master/mysql# slave 容器docker run --name slave -p 3307:3306 -v /usr/local/mysql/slave/data/:/var/lib/mysql -d slave/mysql

指定 master端口为 3306, slave端口为 3307,挂载data目录为保存数据的目录。

连接到数据库后验证数据库是否初始化成功

aea89aca8e5103ed1c22aabb5621cf8b.png

查看 log-bin 是否开启

b9b246a446cd396c60d0adb56abb3ca4.png

创建复制账号

前面有提到从库I/O线程要与主库建立连接,所以需要用到账号进行验证。账号除了要有连接权限(REPLICATION CLIENT),同时还要有复制权限(REPLICATION SLAVE)。

GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO muser@'%' IDENTIFIED BY 'ytao';

这里设置的访问地址是开放的,实际使用过程中安全起见一定要指定访问地址。

从库启动复制

从库连接到主库,获取到二进制日志后重放。这里首先要配置上面创建的账号进行连接,使用命令进行相应的设置。

8d3f25bf9c4945322125539a7b90b04c.png

到这里复制还没有启动,需要再从库中启动

START SLAVE;

使用SHOW SLAVE STATUSG;命令查看启动后的情况

e4c924711f31a9e37ad0e202b10d5829.png

上面标记的输出信息Slave_IO_Running:Yes和Slave_SQL_Running:Yes可以看到I/O线程和SQL线程已启动运行中。

测试同步数据

如果在主库中添加,更新或删除一个数据,那么从库中应该也有与主库对应的数据变化。向主库添加一条数据

INSERT INTO `data_copy`.`person` (`id`, `name`) VALUES ('1', 'ytao');

查询从库数据,数据已被同步过来。

6965982e89a6ff4241851997f82e15cb.png

总结

上述是最简单最基本的配置,但是理解上面的配置过程,就可以根据自身情况定制不同方案,实现一主多从,主主复制(主动-主动或主动-被动模式)等等来满足自身需求。MySQL的复制虽然使用简单方便,但也伴随着一些问题需要我们在使用中进行解决,比如:不能从服务器异常停止中恢复,数据同步的延迟等等,还好现在遇到的大部分问题在行业中已得到相应的解决。对这方面感兴趣的可以去了解下现在解决这些问题的中间件实现方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Docker中设置MySQL主从复制,您可以按照以下步骤进行操作: 1. 首先,创建一个Docker容器来运行主数据库。假设您已经安装了Docker并具有基本的Docker知识。在命令行中运行以下命令: ``` docker run --name mysql-master -e MYSQL_ROOT_PASSWORD=your_password -p 3306:3306 -d mysql ``` 请将"your_password"替换为您所需的实际密码。 2. 确保主数据库容器正在运行。您可以运行以下命令来检查容器状态: ``` docker ps ``` 3. 创建一个Docker容器来运行从数据库。在命令行中运行以下命令: ``` docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=your_password -p 3307:3306 -d mysql ``` 请注意,这里我们使用的是不同的端口来避免与主数据库冲突。同样,将"your_password"替换为您所需的实际密码。 4. 确保从数据库容器正在运行。 5. 进入主数据库容器。运行以下命令: ``` docker exec -it mysql-master bash ``` 6. 在主数据库容器中,编辑MySQL配置文件以启用二进制日志。运行以下命令: ``` vi /etc/mysql/my.cnf ``` 将以下行添加到文件的末尾: ``` [mysqld] log-bin=mysql-bin server-id=1 ``` 保存并退出文件。 7. 重新启动主数据库容器,使更改生效。运行以下命令: ``` service mysql restart ``` 8. 进入从数据库容器。运行以下命令: ``` docker exec -it mysql-slave bash ``` 9. 在从数据库容器中,编辑MySQL配置文件以启用主从复制。运行以下命令: ``` vi /etc/mysql/my.cnf ``` 将以下行添加到文件的末尾: ``` [mysqld] server-id=2 replicate-do-db=my_database ``` 这里的"my_database"是您要复制的数据库名称。如果您只想复制特定数据库,请将其替换为您的数据库名称。 保存并退出文件。 10. 重新启动从数据库容器,使更改生效。运行以下命令: ``` service mysql restart ``` 11. 在主数据库容器中,创建一个新用户并授予复制权限。运行以下命令: ``` mysql -u root -p -e "CREATE USER 'replication_user'@'%' IDENTIFIED BY 'your_password';" mysql -u root -p -e "GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';" mysql -u root -p -e "FL

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值