1 前言
2 环境准备
3 安装
3.1 配置master1的my.cnf
3.2 配置master2的my.cnf
3.3 启动容器
3.4 配置master信息
3.4.1查询master1、master2的File、Position
3.4.2 在maste1和master互相配置对方为自己的master
3.5 测试双主热备
1 前言
请先参考2.Docker主从复制搭建MySQL了解MySQL主从复制搭建,双主热备其实就是互为主从,相互实时同步
双主热备与主从搭建步骤基本一致,在my.cnf配置略有区别,还要在两个机器上设置对方为自己的master。
2 环境准备
mysql master1:192.168.64.20
mysql master2: 192.168.64.21
3 安装
3.1 配置master1的my.cnf
> mkdir -p /data/mysql
> mkdir conf data logs
> cd /data/mysql
> chmod -R 777 logs
> cd /data/mysq/conf
> touch my.cnf
> vim my.cnf
my.cnf如下:红色设置就是跟主从模式配置的区别
[mysqld]
port=3306
#[必须]服务器唯一ID,默认是1,一般取IP最后一段,这里看情况分配
server-id=20
#主键自增长偏移起始量,主2设置2,主3设置成3,主n设置成n
auto_increment_offset=1
#主键自增长步长量,2个主就设置成2,3个主就设置成3,n个主就设置成n
auto_increment_increment=2
#[必须]启用二进制日志
log-bin=mysql-bin
#将复制事件写入binlog,一台服务器既做主库又做从库此选项必须要开启
log-slave-updates=true
#主库binlog模式:row,从库不需要设置
binlog_format=ROW
#只保留最近30天的binlog日志
expire_logs_days=30
#设置日志文件得最大值,超过该值则另启文件记录日志
max_binlog_size = 500M
#设置日志文件缓存大小
max_connections=16384
# 字符集
character-set-server=utf8mb4
# 存储引擎
default-storage-engine=INNODB
group_concat_max_len=102400
#开启慢查询:
slow_query_log=ON
#慢查询时间,单位秒
long_query_time=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
#全局日志
general_log=ON
general_log_file=/var/log/mysql/mysql-general.log
#错误日志
log_error=/var/log/mysql/mysql-error.log
3.2 配置master2的my.cnf
> mkdir -p /data/mysql
> mkdir conf data logs
> cd /data/mysql
> chmod -R 777 logs
> cd /data/mysq/conf
> touch my.cnf
> vim my.cnf
my.cnf如下:红色配置就是跟master1的区别
[mysqld]
port=3306
#[必须]服务器唯一ID,默认是1,一般取IP最后一段,这里看情况分配
server-id=21
#主键自增长偏移起始量,主2设置2,主3设置成3,主n设置成n
auto_increment_offset=2
#主键自增长步长量,2个主就设置成2,3个主就设置成3,n个主就设置成n
auto_increment_increment=2
#[必须]启用二进制日志
log-bin=mysql-bin
#将复制事件写入binlog,一台服务器既做主库又做从库此选项必须要开启
log-slave-updates=true
#主库binlog模式:row,从库不需要设置
binlog_format=ROW
#只保留最近30天的binlog日志
expire_logs_days=30
#设置日志文件得最大值,超过该值则另启文件记录日志
max_binlog_size = 500M
#设置日志文件缓存大小
max_connections=16384
# 字符集
character-set-server=utf8mb4
# 存储引擎
default-storage-engine=INNODB
group_concat_max_len=102400
#开启慢查询:
slow_query_log=ON
#慢查询时间,单位秒
long_query_time=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
#全局日志
general_log=ON
general_log_file=/var/log/mysql/mysql-general.log
#错误日志
log_error=/var/log/mysql/mysql-error.log
3.3 启动容器
master1机器启动容器:
> docker run --name mysql-5.7.27 --network=host -e MYSQL_ROOT_PASSWORD=123456 --privileged=true -v /data/mysql/conf:/etc/mysql -v /data/mysql/logs:/var/log/mysql -v /data/mysql/data:/var/lib/mysql -d mysql:5.7.27
进入data查看binlog是否生成
> cd /data/mysq/data
master2机器启动容器:
> docker run --name mysql-5.7.27 --network=host -e MYSQL_ROOT_PASSWORD=123456 --privileged=true -v /data/mysql/conf:/etc/mysql -v /data/mysql/logs:/var/log/mysql -v /data/mysql/data:/var/lib/mysql -d mysql:5.7.27
检查mysql容器是否启动成功,没有成功则检查my.cnf和docker run启动参数,删除mysql容器重新启动
3.4 配置master信息
3.4.1查询master1、master2的File、Position
分别进入master1、master2机器的mysql运行下面sql,记录master的File、Position的值,待会在master2库配置中要用到
mysql>show master status;
master1:
master2:
3.4.2 在maste1和master互相配置对方为自己的master
在master1设置master2为自己的maste:
mysql>change master to
master_host='192.168.64.21',
master_user='root',
master_log_file='mysql-bin.000003',
master_log_pos=154,
master_port=3306,
master_password='123456';
mysql> start slave;
在master2设置master1为自己的maste:
mysql>change master to
master_host='192.168.64.20',
master_user='root',
master_log_file='mysql-bin.000005',
master_log_pos=154,
master_port=3306,
master_password='442611344';
mysql> start slave;
如果不小心配置错, 输入 mysql> stop slave; 然后重新录入一遍后在start slave就可以了
检查主从连接状态:
mysql> show slave status\G;
这两个必须是 Yes 为 No 或者 connect 说明没有连接上
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3.5 测试双主热备
在master1库上建库、建表、插入sql,然后到master2库查看是否同步成功
create database db01 default character set utf8mb4 collate utf8mb4_general_ci;
use db01;
create table `tb01` (
`id` int(11) not null auto_increment,
`name` varchar(255) default null,
`phone` varchar(255) default null,
primary key (`id`)
) engine=innodb auto_increment=1 default charset=utf8mb4;
insert into tb01(name, phone) values('name_1', 'phone_1');
insert into tb01(name, phone) values('name_2', 'phone_2');
insert into tb01(name, phone) values('name_3', 'phone_3');
在master2查看是否同步成功后操作表数据,然后查看master1是否同步成功