192.168.184.128 主/heartbeat1
192.168.184.129 从/heartbeat2
192.168.184.131 漂移地址
主备基础:需要在128和129服务器上,搭建mysql主从复制
- 环境基础配置
128、129操作关闭防火墙
# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# systemctl stop firewalld
128上操作
# hostnamectl set-hostname db1 修改主机名
# vim /etc/hosts
192.168.184.128 db1
192.168.184.129 db2
129上操作
#hostnamectl set-hostname db2
# vim /etc/hosts
192.168.184.128 db1
192.168.184.129 db2
(1)主从上都按照keepalived(两台均操作以下安装步骤)
A:MySQL Master 192.168.184.128
B:MySQL Slave 192.168.184.129
VIP 192.168.184.131
# wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz
# yum -y install gcc gcc-c++ autoconf automake openssl openssl-devel
# tar -zxvf keepalived-1.2.13.tar.gz
# cd keepalived-1.2.13
# ./configure && make && make install
# cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
# mkdir /etc/keepalived
# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
# cp /usr/local/sbin/keepalived /usr/sbin/
# chkconfig --add keepalived
# chkconfig --level 345 keepalived on
(2)修改主的keepalived的配置文件
注意的是:
nopreempt这个参数只能用于state为BACKUP的情况,所以在配置的时候要把master和backup的state都设置成BACKUP,这样才会实现keepalived的非抢占模式!
也就是说:
* 当state状态一个为MASTER,一个为BACKUP的时候,加不加nopreempt这个参数都是一样的效果。即都是根据priority优先级来决定谁抢占vip资源的,是抢占模式!
* 当state状态都设置成BACKUP,如果不配置nopreempt参数,那么也是看priority优先级决定谁抢占vip资源,即也是抢占模式。
* 当state状态都设置成BACKUP,如果配置nopreempt参数,那么就不会去考虑priority优先级了,是非抢占模式!即只有vip当前所在机器发生故障,另一台机器才能接管vip。
即使优先级高的那一台机器恢复正常后也不会主动抢回vip,只能等到对方发生故障,才会将vip切回来。
Keepalived+mysql双主一般来说,中小型规模的时候,采用这种架构是最省事的。 在master节点发生故障后,利用keepalived的高可用机制实现快速切换到备用节点。
在这个方案里,有几个需要注意的地方:
1、采用 keepalived 作为高可用方案时,两个节点最好都设置成 BACKUP模式,避免因为意外情况下(比如 脑裂)相互抢占导致往两个节点写入相同数据而引发冲突;
2、把两个节点的 auto_increment_increment(自增步长)和 auto_increment_offset(自增起始值)设成不同值。其目的是为了避免master 节点意外宕机时,可能会有部分 binlog 未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原先master上冲突了,因此一开始就使其错开;当然了,如果有合适的容错机制能解决主从自增ID 冲突的话,也可以不这么做;
3、slave 节点服务器配置不要太差,否则更容易导致复制延迟。作为热备节点的 slave服务器,硬件配置不能低于 master 节点;
4、如果对延迟问题很敏感的话,可考虑使用 MariaDB 分支版本,或者直接上线 MySQL 5.7 最新版本,利用多线程复制的方式可以很大程度降低复制延迟。
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id Master #路由名称
}
vrrp_script check_run_mysql
{
script "/etc/keepalived/bin/mysql.sh" #检查mysql状态脚本
interval 2 #每两秒检测一下
}
vrrp_instance VI_1 {
state BACKUP #都设置为BACKUP,设置非抢占模式,防止主库故障重起之后数据不同步,就进行VIP飘移
nopreempt
interface ens33 #网卡名称
virtual_router_id 51
priority 100 #优先级,从库要比主库低
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_run_mysql #执行mysql监控服务脚本
}
virtual_ipaddress {
192.168.184.131/24 #vip地址
}
}
virtual_server 192.168.184.131 3306 {
delay_loop 5 #每5秒检查一次
#lb_algo rr
#Lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.184.128 3306 { #P为当前主机IP,3306为数据库端口
weight 1
notify_down /etc/keepalived/bin/mysql.sh
TCP_CHECK {
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 3306 #检查端口
}
}
}
编写监测脚本:监测到mysql挂掉了,将keepalived进程关掉
# mkdir /etc/keepalived/bin/
# vim /etc/keepalived/bin/mysql.sh
#!/bin/bash
STATUS=`/usr/local/mysql/bin/mysql -uroot -p123456 -e "show databases" |grep -c Database`
if [ $STATUS -eq 0 ];then
systemctl stop keepalived
fi
# chmod +x /etc/keepalived/bin/mysql.sh
(3)修改从的keepalived的配置文件
# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id Slave
}
vrrp_script check_run_mysql
{
script "/etc/keepalived/bin/mysql.sh"
interval 2
}
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface ens33
virtual_router_id 51
priority 90 #要比主库的小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_run_mysql
}
virtual_ipaddress {
192.168.184.131/24
}
}
virtual_server 192.168.184.131 3306 {
delay_loop 6
#lb_algo rr
#lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.184.129 3306 { #从的地址
weight 1
notify_down /etc/keepalived/bin/mysql.sh
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
编写监测脚本:监测到mysql挂掉了,将keepalived进程关掉
# mkdir /etc/keepalived/bin/
# vim /etc/keepalived/bin/mysql.sh
#!/bin/bash
STATUS=`/usr/local/mysql/bin/mysql -uroot -p123456 -e "show databases" |grep -c Database`
if [ $STATUS -eq 0 ];then
systemctl stop keepalived
fi
# chmod +x /etc/keepalived/bin/mysql.sh
(4)主从上分别启动keepalived
# systemctl start keepalived
# ip a查看地址
只有主上会产生vrrp地址
(5)测试高可用
关掉主库mysql
# service mysqld stop 停掉主mysql
#ip a 查看ip没有虚拟ip
从库上查看ip可以看到虚拟vip
再启动主库mysql、keepakived
# service mysqld start
# systemctl start keepalived
# ip a 主重新产生vip
当切换到从上面,需要限制从为只读,以免恢复主后,主从复制数据出现问题
Mysql>flush tables with read lock; 全表为只读,包括超级用户root
Mysql>unlock tables; 解除限制,为读写
Mysql>set global read_only=0;