前言:当mysql有了主主或者主备配置后,数据备份有了保障,但是当其中一个master挂掉后,mysql还是无法使用,本文采用Keepalived来保障一个master挂掉后,另一个master立即切换使用
1、MHA和Keepalived
- MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
- 该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。
- MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。
- MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
问题:mysql初学者,目前在mysql的高可用架构上有些疑问。我的理解:
- 只使用MHA(不用使用keepalived)可以实现自动故障切换,配合master_ip_failover_script等脚本可以实现透明故障切换,以及VIP的自动漂移.
- 只使用keepalived (不用MHA) 也可以配置"主--从" 或者"主--主"架构,并且实现VIP的自动漂移和故障切换
我的理解
- 那么要MHA和keepalived从高可用架构这个角度上来说应该是完成相同功能, 只是keepalived可以实现"双主"和"主--从"架构,MHA只能实现"主--从"架构,
- 什么情况下应该使用MHA,什么情况下使用keepalived?
网上找的一句户:MHA,其实是实现了数据一致性的问题的,主要考虑在master宕机了后保证slave的数据损失最小;keepalived就是实现vip的高可用而已
一 、本文采用Keepalived搭建高可用,配合mysql使用(物理机)
- 先在一台机器上部署keepalived和mysql(mysql已默认安装)
1、查看本地ip
2、安装Keepalived
# 可直接用yum源安装
yum install keepalived
查看keepalived的配置文件位置,修改配置文件
3、keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email { #关于邮件的设置
sachin_0906@183.com #email send to
}
notification_email_from notice@keepalived.cn
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MASTER-HA
}
vrrp_script chk_mysql_port { #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
script "/opt/chk_mysql.sh" #这里通过脚本监测
interval 2 #脚本执行间隔,每2s检测一次
weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 #检测1次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {
state MASTER #master1 设置为MASTER
interface eno1 #指定虚拟ip的网卡接口
# mcast_src_ip 192.168.40.127 #绑定的地址
virtual_router_id 51 #路由器标识,MASTER和BACKUP必须是一致的
priority 101 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
advert_int 1
authentication { #认证类型PASS|AH(IPSEC)
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #虚拟IP的设置即vip
192.168.200.100
}
track_script { #监控脚本
chk_mysql_port
}
}
4、chk_mysql.sh 脚本
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
service keepalived stop
fi
chk_mysql.sh的目的是监控mysql是否还存活,如果mysql挂掉,则停止本机器的keepalived,keepalived会自动切换另一个mysql来使用
5、启动keepalived
查看ip后,发现vip已经生成,此时通过vip 192.168.200.100访问mysql
6、在另外一台局域网机器按1-5步骤通用部署keepalived,keepalived.conf 中除了priority配置,其他可保持一致,这样两台mysql的高可用配置已经完成。可通过主动停掉mysql来进行测试,发现keepalived可以主动漂移到另一台机器的mysql使用,对外统一暴露192.168.200.100虚拟ip
二、docker版keepalived和mysql
1、拉取keepalived镜像
# 拉取镜像
docker pull leishuaishuai/keepalived:2.0
2、运行容器
2.1 脚本配置
-
目录如下:
- restart.sh
# BEGIN ANSIBLE MANAGED BLOCK
#!/bin/bash
HOME="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
docker rm -f keepalived;
docker run -d --name keepalived --cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW --net=host \
-v $HOME/conf:/usr/local/etc/keepalived \
leishuaishuai/keepalived:2.0 --copy-service
# END ANSIBLE MANAGED BLOCK
-
conf 目录
- chk_mysql.sh
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
echo '!3306 挂了...' > /proc/1/fd/1
pid=$(ps x | grep keepalived | grep -v grep | awk '{print $1}')
echo $pid > /proc/1/fd/1
for i in $pid
do
kill $i
done
else
echo '!3306正常运行...' > /proc/1/fd/1
fi
- keepalived.conf (配置好后把监控脚本放开)
global_defs {
default_interface eth0
}
vrrp_script chk_mysql_port { #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
script "/usr/local/etc/keepalived/chk_mysql.sh" #这里通过脚本监测
interval 2 #脚本执行间隔,每2s检测一次
weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 #检测1次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {
interface eth0
state BACKUP
virtual_router_id 51
priority 150
nopreempt
unicast_peer {
192.168.1.10
192.168.1.11
}
virtual_ipaddress {
192.168.200.126
}
authentication {
auth_type PASS
auth_pass d0cker
}
track_script { #监控脚本
chk_mysql_port
}
notify "/container/service/keepalived/assets/notify.sh"
}
2.2 执行脚本
bash restart.sh
查看日志
docker logs -f --tail 100 keepalived
发现此时,虚拟ip192.168.200.126已构建,并且正常监控3306端口,此时外部访问mysql可以用192.168.200.126来访问
2.3 查看ip
ip a
此时也显示构建成功
- 另一台物理机同理构建
- mysql、keepalived构建成功,停掉一台机器的mysql,keepalived也随着停止,keepalived的ip会自动切换到另一台机器上,实现mysql的高可用