ProxySQL存在单点隐患,开源架构中解决单点故障最常用的应该及时keepalived了。尤其是主备服务之间不需要“实时同步数据或状态”的服务,最为适用(举个反例,MySQL双主的高可用架构如果用keepalived的话,由于切换VIP的动作还必须考慎重的考虑主从数据一致性问题,所以切换逻辑就会比较复杂。之前写过一篇该方案的文章)
ProxySQL的配置支持配置文件和数据库接口(基于SQLite)两种,基于SQLite的方式配置灵活直观,并且我们平时观察ProxySQL的运行状态也是基于该数据库接口,由这一个入口进行ProxySQL的所有操作,也比较顺手。所以我选择了基于数据库接口的配置方式,但该方式有一个弊端,就是无法方便的判断两台ProxySQL的配置是否一致,这在VIP漂移时也是一个隐患。不过我们可以通过SQLite官方提供的一个小工具sqldiff来判断两个SQLite数据文件内容是否一致。
下面我们就通过sqldiff和keepalived及其状态监控机制来实现ProxySQL的故障转移并且在执行VIP漂移前自动判断配置文件是否一致并同步。
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
ljk@xxx.com
}
notification_email_from keepalived@xxx.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_proxysql {
script "/etc/keepalived/check_proxysql.sh"
interval 5
}
vrrp_instance proxysql {
state BACKUP #这里都为BACKUP(nopreempt才能生效)通过priority确定主备
interface br0
virtual_router_id 52
priority 100
advert_int 1
#nopreempt #注意主ProxySQL加,备ProxySQL上不需要加
authentication {
auth_type PA