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. 分别在AB服务器上启动从服务线程,并查看

# 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