2.ShardingSphere准备-Docker中mysql主从复制
目的
因为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
这里可以明显看到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地址。
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;
3.查看二进制日志信息
只有开启二进制日志,这句命令才有结果,表示当前数据库的二进制日志写到什么位置
mysql> show master status\G;
注意:此时别向数据库做任何添加删除操作。否则Position就会变化
名称 | 含义 |
---|---|
File | 需要同步的开始日志文件 |
Position | 同步的开始位置 |
设置从库从主库同步数据
1.获得主库IP地址
因为从库需要指定要同步的主库的ip地址,所以这里和开始获得从库的ip的方式一样。
docker inspect mysql | grep 'IPAddress' | awk -F: '{print $2}' | tail -n 1
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_file | master上面查看到的二进制日志名 |
master_log_pos | master上面查看到的POS值 |
3.启动从库
mysql> start slave;
4.查看从库状态
show slave status\G;
验证是否同步
可以在主库中新建一个库和表,查看从库是否同步更新过来。注意,历史已经存在的表是不会同步的。是从我们设置主从配置开始后才开始同步的库和表。
真诚点赞 诚不我欺~