利用docker 搭建mysql 主从 数据同步 数据延迟处理

docker 搭建 mysql 主从 监控主从复制不同步 解决办法

利用docker搭建mysql 主从
mysql主从数据不同步处理
mysql主从数据延迟问题处理

1.利用docker 搭建mysql主从
docker pull mysql:5.6 利用docker拉一个mysql镜像
docker images 查看
在这里插入图片描述
我们在一个目录下面 创建两个目录 master slave
在这里插入图片描述
在这两个目录中 分别创建 data 和 mysql目录
先创建一个容器docker run -itd -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.6
docker exec -it mysql bash 进入容器后 我们可以看到
在这里插入图片描述
退出容器 进入宿主机 在宿主机中 利用docker cp 命令 将容器内的etc/mysql 复制到 /你的目录/master 或者
/你的目录/slave
在这里插入图片描述
这里 有的容器在最开始的时候 可能没有my.cnf 那么我们在拷贝目录之后 在宿主机中 新建一个my.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
将上面这些粘贴进去

当master slave准备就绪后
创建master镜像
docker run -itd -p 13306:3306 -v /tmx/master/mysql/mysql:/etc/mysql -v /tmx/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.6
创建slave镜像
docker run -itd -p 23306:3306 -v /tmx/slave/mysql/mysql:/etc/mysql -v /tmx/slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql_slave mysql:5.6

-p参数 是端口映射 我们访问宿主机的23306 端口就相当于 访问 容器内的3306端口了
-v参数 是挂载共享目录 将宿主机的目录/文件 跟 容器内共享
毕竟老是去容器中修改配置文件比较麻烦 同时也避免因容器重启而导致数据消失

构建成功之后 我们docker ps -a查看一下
在这里插入图片描述
看一下STATUS这个栏目 如果是up 就是可以了 说明容器启动成功
如果容器没有启动成功 可以使用docker logs 容器名称/容器ID来查看一下报错

这个时候我们用工具连接一下
在这里插入图片描述

分别连接master和slave后 我们开始主从配置
这里先简单讲一下 mysql主从复制的流程
1.master在执行 比如新增 修改 删除操作时候 会记录到binlog中
2.slave有一个复制线程 会请求master的Binlog Dump线程(Binlog Dump这个线程会将master的binlog传输给slave的复制线程)
3.slave 的复制线程在获取到数据(master的binlog)后将数据写到 中继日志中(relay_log)
4.slave 会有一个 sql线程 来负责 讲 中继日志中 master的binlog 同步到 数据磁盘(data目录)

主从配置呢先在master之的配置文件中开始binlog日志 并且设置一下server-id 开设账号
在宿主机的master目录下面 找到我们刚刚写的my.cnf
在这里插入图片描述
docker restart mysql 重启服务 我们进入工具看一下 是否开启了binlog 并且查看一下
在这里插入图片描述
在这里插入图片描述
还要在开设一个 可以访问主库的账号 这个账号是给从服务器使用的
create user ‘你的账号’@’%’ identified by ‘你的密码’; 创建账号
select user,host from mysql.user; 查询刚才创建的账号

现在master没什么问题了 我们配置一下slave
在slave中 要开启 中继日志 并且 指定一下server-id 这个server-id不能与主服务器重复
在宿主机的slave目录 找到my.cnf并加入

server-id = 2
relay_log = /var/run/mysqld/mysql-relay-bin
relay_log-index = /var/run/mysqld/mysql-relay-bin.index

重启slave镜像 docker restart mysql_slave
docker exec -it mysql_slave bash
之后 我们进入进入slave容器的mysql 执行
change master to
master_host=‘宿主机的IP地址’,
master_port=13306, 这个是宿主机的映射端口 通过13306可以访问 容器内3303
master_user=‘在上一步设置的账号’,
master_password=‘在上一步设置的密码’,
master_log_file=‘mysql-bin.000001’, 这个是刚才在master执行show master status 最新的一条数据
master_log_pos=0;
之后执行
start slave;

这样从阶段就配置完成 我们查看一下是否成功
执行show slave status \G;
在这里插入图片描述
Slave_IO_Running: Yes 他表示slave的一个复制线程是否正常
Slave_SQL_Running: Yes 他表示slave的一个sql线程是否正常

在master新建一个库 添加两条数据
在这里插入图片描述
进入slave查看一下
在这里插入图片描述
从库 会自动同步主库binlog 中的信息

2.解决主从复制不同步问题
利用percona工具来执行 主从验证

检测mysql主从数据工具(可以校验 主从数据库 数据是否一致 可以让他们数据一致)
wget https://www.percona.com/downloads/percona-toolkit/3.0.12/binary/redhat/6/x86_64/percona-toolkit-3.0.12-1.el6.x86_64.rpm
yum install perl-DBI perl-DBD-MySQL perl-Digest-MD5 perl-IO-Socket-SSL perl-TermReadKey
rpm -ivh percona-toolkit-3.0.12-1.el6.x86_64.rpm

我们利用 pt-table-checksum 来验证 主从数据是否一致
在宿主机上 运行
pt-table-checksum --no-check-binlog-format --replicate=check_data.checksums --databases=master_slave_test --tables=student --host=宿主机服务器IP --port=宿主机映射端口 --user=root --password=123456

注意一下
–replicate=check_data.checksums 这个意思是 在master中 新建一个库(check_data)并且新建一个表(checksums)
在返回的记录结果 会存放到这个表中

第一次运行 正产赶会抛出一个异常
[root@iZ2zeb24c7i2ydrx413aq6Z tmx]# pt-table-checksum --no-check-binlog-format --replicate=check_data.checksums --databases=master_slave_test --tables=student --host=39.106.204.104 --port=13306 --user=root --password=123456
Checking if all tables can be checksummed …
Starting checksum …
Cannot connect to P=3306,h=,p=…,u=root
Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information.
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TIME TABLE
02-23T02:57:38 0 0 2 0 1 0 0.017 master_slave_test.student

Diffs cannot be detected because no slaves were found. Please read the --recursion-method documentation for information这个异常说明master 没有 找到slave
那么如何解决这个异常呢 我们需要在从库的配置文件中 加入
report_port=23306 宿主机进入slave的端口23306映射从slave器3306端口
report_host=39.106.204.104 宿主机IP地址

之后我们再次执行 发现他Ok了
在这里插入图片描述
这里看一下 DIFFS ROWS DIFF_ROWS这三个参数
DIFFS如果为 0 则说明 主从数据一致 如果为 1 则说明 主从数据不一致
ROWS 为同步数据行数
DIFF_ROWS 为不同步数据行数
因为我们在上面指定了 --tables=student 所以只检查student表 下面我们以student表举例

上述截图 表示主从数据一致 那么我们让他不一致 在slave 的 student表中加入 几条数据 看一下结果
在这里插入图片描述
这个时候 在宿主机上执行 pt-table-checksum --no-check-binlog-format --replicate=check_data.checksums --databases=master_slave_test --tables=student --host=宿主机服务器IP --port=宿主机映射端口 --user=root --password=123456
在这里插入图片描述
发现不同步数据有两条 我们在看一下master 与slave 对比一下
master
在这里插入图片描述
slave
在这里插入图片描述
看来结果是这么回事 这个不同步的问题 使用pt-table-sync来使数据同步
pt-table-sync --replicate=check_data.checksums dsn=u=root,p=123456,h=39.106.204.104,P=13306 dsn=u=root,p=123456,h=39.106.204.104,P=23306 --print
–print 是显示不同步数据 并不会进行同步处理
在这里插入图片描述
返回结果中 id 3 4 不一致
使用–execute 来同步数据(就是把–print 替换咯)
执行 pt-table-sync --replicate=check_data.checksums dsn=u=root,p=123456,h=39.106.204.104,P=13306 dsn=u=root,p=123456,h=39.106.204.104,P=23306 --execute

在这里插入图片描述
进入工具查看一下master 和 slave
master
在这里插入图片描述
slave
在这里插入图片描述
发现数据一致

可以通过shell脚本 或者php脚本 定期定时执行 上面两个命令 来时主从数据同步
php里面的shell_exec函数 相当于在shell窗口中输入命令

3.降低主从复制延迟问题
主从复制的延迟
1.网络问题
2.数据量太大(slave复制线程处理的数据太多)
3.slave的sql线程 从中继日志 像 data磁盘中 输入数据过程

只要是使用主从就会就不可避免的出现数据延迟问题 这个问题无法彻底解决 只能降低延迟…
其中1 2 我们不做处理 只针对3描述一下

在mysql中只要是插入操作就会默认开启一个事物
将sync_binlog设置为0
innodb_flush_log_at_trx_commit设置为0
这两个有关于事物的设置不做过多讲解 可以百度看一看

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
1. 准备工作 - 安装Docker - 新建两个目录:`master`和`slave`,用于存放主从数据库的数据 2. 创建MySQL容器 - 创建主库容器 ``` docker run --name mysql-master -v /path/to/master:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 ``` - 创建从库容器 ``` docker run --name mysql-slave -v /path/to/slave:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 ``` 注意:`/path/to/master`和`/path/to/slave`是本地文件系统中的目录,用于存放主从数据库的数据。`123456`是MySQL的root密码,可以根据需要修改。 3. 配置主库 - 进入主库容器 ``` docker exec -it mysql-master /bin/bash ``` - 登录MySQL ``` mysql -uroot -p123456 ``` - 创建用于复制的用户 ``` CREATE USER 'replication'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%'; FLUSH PRIVILEGES; ``` - 查看主库状态 ``` SHOW MASTER STATUS; ``` 记录下File和Position的值,后面配置从库时需要用到。 4. 配置从库 - 进入从库容器 ``` docker exec -it mysql-slave /bin/bash ``` - 登录MySQL ``` mysql -uroot -p123456 ``` - 配置从库复制 ``` CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='replication', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; START SLAVE; ``` 注意:`mysql-master`是主库的容器名称,`replication`是上一步中创建的用于复制的用户,`mysql-bin.000001`和`154`分别是主库状态中的File和Position的值。 - 查看从库状态 ``` SHOW SLAVE STATUS\G ``` 如果Slave_IO_Running和Slave_SQL_Running都是`Yes`,则说明配置成功。 5. 测试主从同步 在主库中创建一个测试数据库和表,并插入一条数据: ``` CREATE DATABASE test; USE test; CREATE TABLE t (id INT, name VARCHAR(20)); INSERT INTO t VALUES (1, 'test'); ``` 在从库中查询该表: ``` USE test; SELECT * FROM t; ``` 可以看到从库中也有刚刚插入的数据,说明主从同步成功。 6. 总结 以上就是使用Docker搭建MySQL主从的步骤,需要注意的是,如果主库或从库的容器重启或者删除后再次创建,需要重新配置从库复制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值