一、方案说明
说明:官方图示(如下图)高可用集群部署方案中最少需要两台物理机器(Master和Slave),二者之间互为主从, Master负责读写,Slave通过二进制日志文件同步数据。这就要求两台物理机器必须开启binlog日志,来复制并执行日志中的事件(主要是数据库的DDL和DML)。MySQL Router使用KeepAlive实现。
二、详细步骤
Master | xx.xx.xx.68 |
Slave | xx.xx.xx.149 |
KeepAlive VIP | xx.xx.xx.90 |
2.1修改mysql配置文件
Master配置文件
###########################################
server-id = 1【必须唯一】
log_bin
#= /var/log/mysql/mysql-bin.log
#expire_logs_days = 10
max_binlog_size = 100M
# prevent split brain
#auto_increment_offset = 1【奇数自增】
#auto_increment_increment = 2
Slave配置文件
###########################################
server-id = 2【必须唯一】
log_bin
#= /var/log/mysql/mysql-bin.log
#expire_logs_days = 10
max_binlog_size = 100M
# prevent split brain
#auto_increment_offset = 2 【偶数自增】
#auto_increment_increment = 2
NOTE:
Server-id | 必须唯一,参数值[1,2^32-1) |
Log_bin=日志文件名【可不填写】 | 必须开启,从服务器必须开启 |
Expire_logs_days =10 | 删除十天以前的binlog日志 |
Max_binlog_szie =100M | 日志文件最大100M,但是事物必须完成,所有偶尔会看到日志大于100M |
auto_increment_offset=1 auto_increment_increment=2 | 在发生网络环境脑裂时候出现主键冲突,所以设置Master奇数增长,Slave偶数增长 |
【可选:如果需要的话:binlog-ignore-db=mysql 可以不写binlog,replicate-ignore-db可以不复制】
NOTE:
!!!修改之后必须重启!!!
2.2创建用户
在Master和Slave两台机器上创建复制数据的账号(rootha)和密码(rootha),可任意取名
Mysql> grant replication slave on *.* to rootha@'%' identified by 'rootha';
Mysql> flush privileges;
查看日志数据:
Show binary logs;
如果不是初装系统,使用以下命令来清除日志记录:
Msyql> purge binary logs before '2020-01-01';
2.3设置主从
2.3.1设置Master日志复制
Msyql> show master status;
Slave【注意Master查看之后在Slave执行】上执行【以下参数来源于上面的数据】
Msyql>
CHANGE MASTER TO
MASTER_HOST='xx.xx.xx.68',
MASTER_USER='rootha',
MASTER_PASSWORD='rootha',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=591;
!!!Slave上执行!!!
2.3.2设置Slave日志复制
Msyql> show master status;
Master【注意Slave查看之后在Master执行】上执行【以下参数来源于上面的数据】
Msyql>
CHANGE MASTER TO
MASTER_HOST='xx.xx.xx.149',
MASTER_USER='rootha',
MASTER_PASSWORD='rootha',
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=154;
!!!Master上执行!!!
2.3.3启动复制
Master和Slave上执行:
Msyql> start slave;
2.3.3验证双主
2.3.3.1 Master查看状态
Mysql> show slave status\G;
2.3.3.2 Slave 查看状态
Mysql> show slave status\G;
以下状态均为Yes表示设置成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
NOTE:
!!!如果不成功,请重复以上操作!!!
2.4 KeepAlive
2.4.1编写mysql-keepalived.sh
安装keepalived:
在Master和Slave机器上执行,下载最新版本的keepalived并安装
创建脚本:> cd /usr
> sudo vim mysql-keepalived.sh
NOTE:
账号密码都是之前创建的用户名和密码,mysql命令路径根据实际情况填写
!!!黑色字体必须要要确保正确!!!
===================== Master开始 mysql-keepalived.sh =====================
#!/bin/bash
MYSQL=/usr/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=rootha
MYSQL_PASSWORD=rootha
CHECK_TIME=3
MYSQL_OK=1
function check_mysql_health (){
$MYSQL -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1
if [ $? = 0 ] ;then
MYSQL_OK=1
echo 'mysql is ok'
else
MYSQL_OK=0
echo 'mysql is down'
fi
return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME-=1"
check_mysql_health
if [ $MYSQL_OK = 1 ] ; then
CHECK_TIME=0
exit 0
fi
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
then
/etc/init.d/keepalived stop
exit 1
fi
sleep 1
done
===================== Master 结束 mysql-keepalived.sh ==========================
===================== Slave开始 mysql-keepalived.sh =======================
#!/bin/bash
MYSQL=/usr/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=rootha
MYSQL_PASSWORD=rootha
CHECK_TIME=3
#mysql is up MYSQL_OK is 1 , mysql down MYSQL_OK is 0
MYSQL_OK=1
function check_mysql_health (){
$MYSQL -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1
if [ $? = 0 ] ;then
MYSQL_OK=1
echo 'mysql is ok'
else
MYSQL_OK=0
echo 'mysql is down'
fi
return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME-=1"
check_mysql_health
if [ $MYSQL_OK = 1 ] ; then
CHECK_TIME=0
exit 0
fi
if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
then
/etc/init.d/keepalived stop
exit 1
fi
sleep 1
done
================= Slave mysql-keepalived.sh ============================
赋予可执行权限
> sudo chmod +x mysql-keepalived.sh
> ./mysql-keepalived.sh
结果如下:(表示MySQL正常)
2.4.2编写keepalived.conf
2.4.2.1 Maser配置文件keepalived.conf
global_defs {
router_id zhf
}
vrrp_script check_run {
script "/usr/mysql-keepalived.sh"
interval 5
}
vrrp_sync_group VG1 {
group {
VI_1
}
}
vrrp_instance VI_1 {
state MASTER
interface enp0s3
virtual_router_id 100
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
check_run
}
virtual_ipaddress {
xx.xx.xx.90
}
}
2.4.2.2 Slave配置文件keepalived.conf
global_defs {
router_id zhf
}
vrrp_script check_run {
script "/usr/mysql-keepalived.sh"
interval 5
}
vrrp_sync_group VG1 {
group {
VI_1
}
}
vrrp_instance VI_1 {
state BACKUP
interface enp0s3
virtual_router_id 10
priority 10
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
track_script {
check_run
}
virtual_ipaddress {
xx.xx.xx.90
}
}
在Master和Slave启动keepalived
> sudo service keepalived start
> ip addr
NOTE:
router_id | 主从必须一致 |
State | Master设置为MASTER Slave 设置为BACKUP |
interface | 发送VRRP包的网络接口,使用命令ifconfig查看 |
virtual_router_id | 取值在0-255之间,用来区分多个instance的VRRP组播, 同一网段中该值不能重复 |
priority | 用来选举master的,要成为master,那么这个选项的值最好高于其他机器50个点,该项取值范围是1-255(在此范围之外会被识别成默认值100) |
advert_int | 发VRRP包的时间间隔,即多久进行一次master选举,可以认为是健康查检时间间隔,单位为秒 |
auth_type | 同一vrrp实例MASTER与BACKUP 使用相同的密码才能正常通信 |
auth_pass | 主从必须一致 |
virtual_ipaddress | VIP |
测试:
停掉任何一台机器的MySQL,访问90机器都可以相应的切换,表示成功。
三、FAQ
3.1 主键自增带来的问题
事先设置好offset和increment的值,即:实现设置好自增字段的初始值和步长。
MASTER为奇数开始,SLAVE为偶数开始。两者都采用相同的步长。
1)、设置主主服务器的自增长偏移位置不同:
A :auto_increment_offset=3
B :auto_increment_offset=4
2)、设置主主服务器步长相同:
auto_increment_increment=2