2.ShardingSphere准备-Docker中mysql主从复制

老马 老马 | 437 | 2022-09-27

目的

因为Sharding Sphere主要是操作分库分表操作的。所以,我们先按照实际生成环境,搭建一个mysql的主从数据库。我们来个最简单的一主一从的环境即可。

前提

  • 已经安装了docker环境
  • docker中已经安装了mysql

主节点Master配置

1.为什么我们要做conf的卷宗映射

我们就拿实例名为mysql的作为主节点。来看下我们启动镜像的docker命令:

docker run -p 3306:3306 --name mysql \
-v /root/docker_volume/mysql/conf:/etc/mysql \
-v /root/docker_volume/mysql/logs:/var/log/mysql \
-v /root/docker_volume/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7

这里/root/docker_volume/mysql/conf和容器中的/etc/mysql做映射。为什么要这么做呢?我们可以进入容器内部,看看MySQL默认找的配置文件my.cnf的位置

#粘附我们mysql实例
docker exec -it mysql /bin/bash
#显示mysql配置文件my.cnf的位置
mysql --help | grep my.cnf
image-20220927151901203

这里可以明显看到my.cnf从三个位置均可以修改并且被mysql启动时加载。所以我们映射到宿主机上的位置和容器内部的位置对应,这样我们就可以很方便的在宿主机上修改配置文件,mysql容器启动就可以读取到配置文件。

2.配置主库

上面了解了映射的缘由后,那么只要添加一个my.cnf到我们宿主机的/root/docker_volume/mysql/conf下就可以了。

# 添加my.cnf配置文件
vim /root/docker_volume/mysql/conf/my.cnf
#内容为分割线中间的部分
-----------------------------------------------------------
[mysqld]
# 服务id。同一个局域网唯一
server-id=100
# 开启二进制日志功能
log-bin=mysql-bin
# 设置不需要同步的数据库
binlog-ignore-db=information_schema    
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
------------------------------------------------------------

3.重新启动主库

# 重启配置文件才能生效
docker stop mysql
docker start mysql

从节点slave配置

1.从节点启动的卷宗映射

docker run -p 13306:13306 --name mysql-slave \
-v /root/docker_volume/mysql_slave/conf:/etc/mysql \
-v /root/docker_volume/mysql_slave/logs:/var/log/mysql \
-v /root/docker_volume/mysql_slave/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7

这里注意宿主机的目录和容器内部映射的对应关系,需要在宿主机上创建对应的目录。可以根据自己的实际情况进行修改。

2.配置从库

# 添加my.cnf配置文件
vim /root/docker_volume/mysql_slave/conf/my.cnf
#内容为分割线中间的部分
-----------------------------------------------------------
[mysqld]
port=13306
# 服务id。同一个局域网唯一
server-id=101
# 开启二进制日志功能,以备S1ave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
# relay_1og配置中继日志
relay_log=mysql-relay-bin
# 复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
# 如果需要同步函数或者存储过程时设置为true
log_bin_trust_function_creators=true
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1832错误是因为主从数据库数据不一致
slave_skip_errors=1062
-----------------------------------------------------------

3.重新启动从库

# 重启配置文件才能生效
docker stop mysql-slave
docker start mysql-slave

主库授权从库可以同步数据

1.获得从库IP地址

因为主库授权从库访问时,需要指定哪个ip可以访问,所以需要知道从库的ip地址。

docker inspect mysql-slave | grep 'IPAddress' | awk -F: '{print $2}' | tail -n 1

红框中的即为云服务器上的内部ip地址。

image-20220927152445171

2.创建授权用户

# 粘附master主库
docker exec -it mysql /bin/bash
# 进入mysql
mysql -uroot -p123456
# 创建授权用户。这里就需要用到从库的ip地址。
mysql> grant replication slave on *.* to 'root'@'172.17.0.5' identified by '123456';
#查看授权
mysql> select user,host from mysql.user;
# 使更改生效
mysql> flush privileges;
image-20220927152559489

3.查看二进制日志信息

只有开启二进制日志,这句命令才有结果,表示当前数据库的二进制日志写到什么位置

mysql> show master status\G;
image-20220927152707390

注意:此时别向数据库做任何添加删除操作。否则Position就会变化

名称含义
File需要同步的开始日志文件
Position同步的开始位置

设置从库从主库同步数据

1.获得主库IP地址

因为从库需要指定要同步的主库的ip地址,所以这里和开始获得从库的ip的方式一样。

docker inspect mysql | grep 'IPAddress' | awk -F: '{print $2}' | tail -n 1

image-20220927152858817

2.设置需要同步的主库

# 粘附master主库
docker exec -it mysql-slave /bin/bash
# 进入mysql
mysql -uroot -p123456
# 设置需要同步的主库
mysql> change master to master_host='172.17.0.2', master_user='root', 
master_password='123456', master_port=3306, 
master_log_file='mysql-bin.000001', master_log_pos=446;
名称含义
master_host主库ip
master_user同步用户
master_password同步用户的密码
master_port端口
master_log_filemaster上面查看到的二进制日志名
master_log_posmaster上面查看到的POS值

3.启动从库

mysql> start slave;

4.查看从库状态

show slave status\G;
image-20220927153113388

验证是否同步

可以在主库中新建一个库和表,查看从库是否同步更新过来。注意,历史已经存在的表是不会同步的。是从我们设置主从配置开始后才开始同步的库和表。

推荐指数:

真诚点赞 诚不我欺~

2.ShardingSphere准备-Docker中mysql主从复制

点赞 收藏 评论