基本思路:
先停掉原mysql,把这个文件夹压缩了传到另一台机器。
然后解压,用docker直接挂载解压后的文件夹。
机器1:192.168.10.2
机器2:192.168.10.3
一,两个库的准备
-
- 采用离线备份文件夹的方式先停原mysql,然后把文件夹压缩了(我这里该文件夹名为bak1223,里面包含了所有的数据文件和日志文件,所以只用传输这一个文件夹即可)
tar -zcvf bak1223.tar.gz ./bak1223/
- 采用离线备份文件夹的方式先停原mysql,然后把文件夹压缩了(我这里该文件夹名为bak1223,里面包含了所有的数据文件和日志文件,所以只用传输这一个文件夹即可)
-
- 解压到data目录下,去掉前导目录(相当于换了原文件夹名称)
tar -xzvf bak1223.tar.gz --strip-components 2 -C ./data
- 解压到data目录下,去掉前导目录(相当于换了原文件夹名称)
-
- 采用GTID模式配置my.cnf (在我这里取名为 hl.cnf ,把他放在宿主机上,然后通过docker volumes挂载到配置文件目录下面即可)
[mysqld]
lower_case_table_names=1
max_connections=1024
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
default-time_zone = '+8:00'
log-bin = /var/lib/mysql/mysql-bin.log
expire-logs-days = 5
max-binlog-size = 1024M
server-id = 1 #第一台机器填1 第二台机器填2
#log_slave_updates=true #MySQL5.7可以不启用此参数,5.7版本使用了gtid_executed表记录同步复制的信息,避免两次写入relay-log和binlog,降低了从库磁盘I/O
gtid_mode=on
enforce_gtid_consistency=ON
slave_parallel_type=logical_clock #MySQL5.7新增加的值,配置基于表的组提交并行复制,默认值为database(基于库进行多线程复制,MySQL5.6是基于库的方式进行多线程方式复制)建议改为logical_clock,基于表的组方式复制,提高复制的效率。
replicate-ignore-db = mysql
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
3.1 注意,如果是按照冷备份直接拷贝文件夹的方式,还需要改data/auto.cnf
把里面的server-uuid改为两机器不一样4.编辑docker_compose.yml
mysql:
image: sameersbn/mysql:5.7.26-0
restart: always
container_name: mysql57
volumes:
- /mnt/data:/var/lib/mysql
- /mnt/conf/hualv.conf:/etc/mysql/mysql.conf.d/hl.cnf
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=xx66xxx123
PS:注意yml的格式,key:[空格]value,key冒号后面要加空格。 另外每一行通过空格来区分层次关系
- 5.两台机器都按照上面把cnf和yml配好,配置的不同的地方已经在注释中写明。然后启动mysql:
docker-compose pull && docker-compose up -d
二、配置GTID模式的双主
-
- 创建复制账号
在两个mysql上分别执行,注意要创建不同的用户名
注:可以把'%'改为对方ip,进行精细权限控制
- 创建复制账号
机器1mysql>grant replication client,replication slave on *.* to repl103@'%' IDENTIFIED BY '123asd!@#ASD';
mysql> flush privileges;
机器2mysql>grant replication client,replication slave on *.* to repl102@'%' IDENTIFIED BY '123asd!@#ASD';
mysql> flush privileges;
-
- GTID不用再对齐binlog同步点
所以不用再记录show master status 的结果
在下面的主从连接配置中(各自配置对方的用户名):
- GTID不用再对齐binlog同步点
---机器1mysql>
change master to master_host='192.168.10.3', master_user='repl102', master_password='123asd!@#ASD', master_port=3306, master_auto_position=1;
---机器1mysql>
reset slave;
start slave;
---机器2mysql>
change master to master_host='192.168.10.2', master_user='repl103', master_password='123asd!@#ASD', master_port=3306, master_auto_position=1;
reset slave;
start slave;
配置完以后,要两个Yes才算成功:
然后可以检查一下是否双主同步成功:
三、配置虚拟IP漂移
8 .安装keepalived
centos :yum -y install keepalived
或
ubuntu:apt-get -y install keepalived-
vi /etc/keepalived/keepalived.conf
vrrp_script chk_mysql { #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
script "/opt/chk_mysql.sh" #这里通过脚本监测(见9.1)
interval 2 #脚本执行间隔,每2s检测一次
weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 #检测1次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {
state MASTER #机器1写 MASTER 机器2写BACKUP
interface ens18 #指定虚拟ip的网卡接口, 根据ifconfig确定
virtual_router_id 57 #路由器标识,MASTER和BACKUP必须是一致的
priority 100 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
advert_int 1
authentication {
auth_type PASS
auth_pass 111
}
virtual_ipaddress {
192.168.10.10
}
track_script {
chk_mysql
}
}
如上配置,两台机器只有两个地方不一样,一是state ;二是priority 。
- 9.1 检测mysql是否存活
前置条件:宿主机安装了mysql客户端:sudo apt-get install mysql-client
vi /opt/chk_mysql.sh
#! /bin/bash
#! /bin/bash
MYSQL_PASS=XX66xxx123
MYSQL_PING=`mysqladmin -u root -p${MYSQL_PASS} -h192.168.10.3 ping`
MYSQL_OK="mysqld is alive"
if [[ "$MYSQL_PING" != "$MYSQL_OK" ]]
then
echo "mysql not ok"
docker restart mysql57
sleep 5
if [[ "$MYSQL_PING" != "$MYSQL_OK" ]]
then
killall keepalived
fi
else
echo "mysql is ok"
fi
给脚本加上执行权限:
chomod +x chk_mysql.sh
注意修改对应mysql的ip。
-
- 启动keepalived(两台机器都要启动)
systemctl start keepalived
- 启动keepalived(两台机器都要启动)
-
- 验证虚拟ip是否正常
在机器1上(MASTER),ip addr:
- 验证虚拟ip是否正常
可以看到,除了原本自己的10.2,还多了一个10.10
通过mysql客户端可以直接连接IP:10.10
至此,全部配置完毕,想要验证高可用就自行启停机器试试吧。