4、MYSQL主主热备
docker 测试mysql
# A
sudo docker run -p 12345:3306 --name mysql_master \
-v /docker/mysql_master/conf:/etc/mysql/conf.d \
-v /docker/mysql_master/logs:/logs \
-v /docker/mysql_master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
# B
sudo docker run -p 12346:3306 --name mysql_slave \
-v /docker/mysql_slave/conf:/etc/mysql/conf.d \
-v /docker/mysql_slave/logs:/logs \
-v /docker/mysql_slave/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
查看容器IP地址
sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql_master
sudo docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql_slave
查看 skip_networking 的状态
确保在主服务器上 skip_networking 选项处于 OFF 关闭状态, 这是默认值。如果是启用的,则从站无法与主站通信,并且复制失败。
sudo docker exec mysql_master /bin/sh -c "mysql -uroot -p123456 -e \"show variables like '%skip_networking%';\""
Mysql 双机热备
A: 172.17.0.2
B: 172.17.0.3
1. 首先创建测试数据库, <A、B 都需要创建>
create database test default charset utf8;
2. 创建同步用户,<A、B 都需要创建>
# A
grant replication slave on *.* to 'replicate'@'172.17.0.3' identified by '123456';
flush privileges;
# B
grant replication slave on *.* to 'replicate'@'172.17.0.2' identified by '123456';
flush privileges;
# 在 A,B 上测试连通性
mysql -ureplicate -p123456 -h172.17.0.2 -e 'show databases'
mysql --p123456 -h172.17.0.3 -e 'show databases'
3. 修改数据库配置文件,然后重启
# A
server-id = 1
log-bin = mysql-bin
binlog-do-db = test
binlog-ignore-db = mysql
log-slave-updates
sync_binlog = 1
auto_increment_offset = 1
auto_increment_increment = 2
replicate-do-db = test
replicate-ignore-db = mysql,information_schema
# B 配置同上,只修改 `server-id`
server-id = 2
3. 修改mysql配置文件,重启 MySQL
服务
# A, B 机器查看状态
show master status\G;
# A
change master to MASTER_HOST='172.17.0.3', MASTER_PORT=3306, MASTER_USER='replicate',MASTER_PASSWORD='123456',master_log_file='mysql-bin.000001',master_log_pos=0;
# B
change master to MASTER_HOST='172.17.0.2', MASTER_PORT=3306,MASTER_USER='replicate',MASTER_PASSWORD='123456',master_log_file='mysql-bin.000001',master_log_pos=0;
5. 分别在A
和B
服务器上启动从服务线程,并查看
# 5.1 分别在 A,B 启动从服务线程
start slave;
# 5.2 分别在 A,B 机器查看
show slave status\G;
# 查看下面两项值均为Yes,即表示设置从服务器成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
6. 测试写数据
# 在 `A` 机器 `test` 数据库中创建表,并插入一条数据
create table tb_mobile( mobile VARCHAR(20) comment'', time timestamp DEFAULT now() comment'' );
insert into tb_mobile(mobile) values('13888888888');
# 在 `B` 机器查看是否同步,如果同步,并在 `B` 机器上插入一条数据
insert into tb_mobile(mobile) values('13999999999');
# 查看 `A` 机器是否存在 `B` 机器插入的数据, 如果存在,那么主-主形式的双机热备成功实现。
7. 测试宕机
# 例如 `A` 机器挂B了,那么 `B` 机器就接手了! 接手后会有数据更新的操作,那么当A机器恢复的时候,数据和B机器不一致?
正常来说,宕机的机器会自动继续数据同步,如果没有继续同步,那么执行:
stop slave;
show slave status\G;
重新再 `change` 一次
start slave;
==注意,如果是在生成环境中,需要先锁表:==
flush tables with read lock;
unlck lock;
参数说明:
server-id
唯一标识,1~232之间
log-bin
表示打开binlog,打开该选项才可以通过I/O写到Slave的relay-log,也是可以进行replication的前提
binlog-do-db
表示需要记录二进制日志的数据库,如果有多个数据可以用逗号分隔,或者使用多个binlog-do-dg选项
binglog-ingore-db
表示不需要记录二进制日志的数据库,如果有多个数据库可用逗号分隔,或者使用多binglog-ignore-db选项。
replicate-do-db
表示需要同步的数据库,如果有多个数据可用逗号分隔,或者使用多个replicate-do-db选项。
replicate-ignore-db
表示不需要同步的数据库,如果有多个数据库可用逗号分隔,或者使用多个replicate-ignore-db选项。
master-connect-retry
表示主、从连接没有成功,等待时间,默认60s)。如果从服务器存在mater.info文件,它将忽略些选项。
log-slave-updates
配置从
操作是否写入二进制文件,如果是从库,还要做其他从库的主库,那么就需要打这个参数
slave-skip-errors
定义忽略错误号。如果从库只做备份,那就不配置。如果是分担主库的查询压力,可以考虑。
sync_binlog
0
不同步到磁盘, 1
同步到磁盘(防止系统崩溃丢失数据)
auto_increment_increment
控制列中的值的增量值,用于主-主服务器(master-to-master)复制
auto_increment_offset
确定AUTO_INCREMENT列值的起点。用于主-主服务器(master-to-master)复制
Last updated