针对目前公司的数据库架构要做统计规划和调整,所以针对不同的业务环境要选择合适的架构就比较重要,同时作为运维人员又要考虑到维护的便捷性(不能做过多架构维护),最终停留在mha+vip/主从+vip/mycat集群/域名+主从这几种架构或组合,这里就分布对不同架构部署做下记录并对比起优劣,针对不同场景做出合适的选择。
本文主要针对主备自动切换,即VIP+主从方式,其中VIP通过keepalived控制。
一、环境描述
服务器IP |
操作系统 |
数据库 |
硬件配置 |
备注 |
192.168.1.23 |
RHEL6.6_x86_64 |
MySQL 5.7.21 |
内存:16GB CPU:4cores 硬盘:100GB |
VIP:192.168.1.27 Keepalived:1.4.4 |
192.168.1.24 |
RHEL6.6_x86_64 |
MySQL 5.7.21 |
内存:16GB CPU:4cores 硬盘:100GB |
二、业务场景
1、优点
1)部署简单,管理方便。
2)可实现主备库VIP切换,对业务无感知。
2、缺点
1)存在脑裂风险
2)存在切换主备,状态无检测风险
3)跨VLAN不支持
3、业务场景
1)双节点数据库服务器,仅仅为了实现主备VIP切换业务无感知
2)多个从节点,通过LVS,做负载均衡(现在不推荐这种架构实现负载均衡)
三、数据库安装和主从部署
略
四、keepalived安装部署
1.keepalived下载
下载地址:http://www.keepalived.org/software/keepalived-1.4.4.tar.gz
2.keepalived安装
主库: [root@node1 tools]# tar -xzvf keepalived-1.4.4.tar.gz [root@node1 tools]# cd keepalived-1.4.4 [root@node1 keepalived-1.4.4]# ./configure --prefix=/usr/local/keepalived [root@node1 keepalived-1.4.4]# make -j 4 [root@node1 keepalived-1.4.4]# make install [root@node1 keepalived-1.4.4]# cp -rp ./keepalived/etc/init.d/keepalived /etc/init.d/ [root@node1 keepalived-1.4.4]# chkconfig --add keepalived [root@node1 keepalived-1.4.4]# mkdir /etc/keepalived
[root@node2 keepalived-1.4.4]# cp -rp ./bin/keepalived /usr/bin/ [root@node1 keepalived-1.4.4]# cp ./keepalived/etc/keepalived/keepalived.conf /etc/keepalived [root@node1 keepalived-1.4.4]# cp -rp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ [root@node1 keepalived-1.4.4]# service keepalived status keepalived is stopped 备库: 安装keepalived同上 ###备注 *** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS. ###
3.keepalived配置
主库配置:
[root@node1 keepalived-1.4.4]# cp -rp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak
[root@node1 keepalived-1.4.4]# >/etc/keepalived/keepalived.conf
[root@node1 keepalived-1.4.4]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { notification_email { rangle@163.com } notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id Node_Master } vrrp_instance VI_1 { state BACKUP ##可配置master和backup模式,为了防止脑裂现象,主备均需要设置为backup模式,master模式会抢占VIP interface eth1 virtual_router_id 43 ##VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组 priority 100 nopreempt ##配合backup,防止切换后,主库服务恢复正常后,IP漂移过来 advert_int 1 ###组播信息发送间隔,两个节点设置必须一样 authentication { ###设置验证信息,两个节点必须一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { ###指定虚拟IP, 两个节点设置必须一样 192.168.1.27 label eth1:1 } } virtual_server 192.168.1.27 3306 { delay_loop 6 lb_algo wrr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh lb_kind DR #负载均衡转发规则NAT|DR|RUN persistence_timeout 50 protocol TCP real_server 192.168.1.23 3306 { weight 1 notify_down /etc/keepalived/mysql.sh TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } }
备库配置:
[root@node2 keepalived-1.4.4]# cp -rp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak
[root@node2 keepalived-1.4.4]# >/etc/keepalived/keepalived.conf
[root@node2 keepalived-1.4.4]# vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { notification_email { rangle@163.com } notification_email_from rangle@163.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id Node_backup } vrrp_instance VI_1 { state BACKUP interface eth1 virtual_router_id 43 priority 90 ##主优先级高于备,主设置100,备可设置90,(1-254之间) advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.27 label eth1:1 } } virtual_server 192.168.1.27 3306 { delay_loop 2 ##每隔2秒检查真实服务器状态 lb_algo wrr ##LVS算法,如果仅做高可用可不设 lb_kind DR ##LVS模式,如果仅做高可用可不设 persistence_timeout 60 protocol TCP real_server 192.168.1.24 3306{ weight 3 notify_down /etc/keepalived/mysql.sh ##如果mysql服务宕掉,执行的脚本 echo '3' > /etc/keepalived/t.log TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } }
mysql.sh配置内容:
#!/bin/bash run_status=`service keepalived status|grep running|wc -l` pro_status=`ps -ef |grep keepalived|grep -v grep |wc -l` service keepalived stop if [ ${run_status} != 0 ] || [ ${pro_status} != 0 ] then pkill keepalived fi
五、keepalived优化
1、keepalived+mysql风险点
1)脑裂风险
现象:
如果由于主备内部网络通信(vrrp组播)故障(网络波动、防火墙等)导致VIP切换,但实际主备服务均正常,此时VIP会存在两个节点上,这个就会导致主备数据同时写入导致数据不一致。
优化方案:
****主库节点增加脑裂检查脚本,通过本机增加网关链路的检查,增加仲裁节点,判断是否本机对外的网络出现问题,此时在配合VRRP组播,如果网络存在问题则直接关闭keepalived和mysql服务,然后发送告警邮件、短信。
2)主从同步漂移风险
现象:
VIP漂移不会检查从库状态,即无论从库数据是否同步,VIP都将完成漂移,数据不一致风险较大。
优化方案:
****在从节点增加主从状态检查脚本,判断主从同步进程是否正常,同时判断是否有数据延迟,如果有延迟或同步错误则不能完成切换,直接关闭keepalived服务
2、优化后配置如下
具体优化配置和脚本如下:
主库配置:
备库配置:
脑裂检查脚本:
3、防火墙端口开放
VRRP是用IP多播的方式(默认多播地址224.0.0.18)实现高可用对之间通信的,如果开启防火墙记得开放这个vrrp协议对应的策略