keepalived
主要用来主备子系统切换 Master节点 通过组播方式向所有BACKUP节点发送数据包 一旦BACKUP节点没有收到Master节点 的数据包 则所有BACKUP节点按优先级接管主Master节点的 IP资源(虚拟ip)及服务 主 Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色
配置文件 /etc/keepalived/keepalived.conf 服务文件 /etc/rc.d/init.d/keepalived start|stop|restart|reload|force-reload|status|condrestart|try-restart service keepalived start service keepalived status
检查 脑裂现象和nginx进程
脑裂(split-brain):指在一个高可用(HA)系统中,当联系着的两个节点断开联系时,本来为一个整体的系统,分裂为两个独立节点,这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏 如果一个虚拟ip同时出现在多个机子上
#!/bin/bash vip="192.168.1.70" #ping 虚拟ip 2次 ping -c 2 -W 3 $vip &>/dev/null # 如果ping 失败了 并且在该机发现虚拟ip 说明出现脑裂现象 if [ $? -eq 0 -a `ip add|grep "$vip "|wc -l` -eq 1 ];then # 用php写个报警机制 # php alarm.php echo "出现脑裂现象" # 如果nginx进程数小于1 说明nginx挂掉 elif [$(netstat -tlnp|grep nginx|wc -l) -lt 1];then # php alarm.php /etc/init.d/keepalived stop echo "nginx服务停了" else echo "正常" fi防火墙配置
vim /etc/sysconfig/iptables #允许组播地址通信 -I INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT #允许VRRP协议 -I INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT service iptables restart详细配置
! Configuration File for keepalived global_defs { notification_email { #发送报警邮件收件地址 acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc #指明报警邮件的发送地址 smtp_server 192.168.200.1 #邮件服务器地址 smtp_connect_timeout 30 #smtp的超时时间 router_id LVS_DEVEL #物理服务器的主机名 vrrp_mcast_group4 #定义一个组播地址 static_ipaddress { 192.168.1.1/24 dev eth0 scope global } static_routes { 192.168.2.0/24 via 192.168.1.100 dev eth0 } } vrrp_sync_group VG_1 { #定义一个故障组,组内有一个虚拟路由出现故障另一个也会一起跟着转移,适用于LVS的NAT模型。 group { VI1 # name of vrrp_instance (below) VI2 # One for each moveable IP } } vrrp_instance VI_1 { #定义一个虚拟路由 state MASTER|BACKUP #当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP; interface eth0 #绑定为当前虚拟路由器使用的物理接口; virtual_router_id 51 #当前虚拟路由器的惟一标识,范围是0-255; priority 100 #当前主机在此虚拟路径器中的优先级;范围1-254; advert_int 1 #通告发送间隔,包含主机优先级、心跳等。 authentication { #认证配置 auth_type PASS #认证类型,PASS表示简单字符串认证 auth_pass 1111 #密码,PASS密码最长为8位 virtual_ipaddress { 192.168.200.16 #虚拟路由IP地址,以辅助地址方式设置 192.168.200.18/24 dev eth2 label eth2:1 #以别名的方式设置 } track_interface { eth0 eth1 } #配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态; nopreempt #定义工作模式为非抢占模式; preempt_delay 300 #抢占式模式下,节点上线后触发新选举操作的延迟时长; virtual_routes { #配置路由信息,可选项 # src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> [or <IPADDR>] dev <STRING> scope <SCOPE> tab src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1 192.168.112.0/24 via 192.168.100.254 192.168.113.0/24 via 192.168.200.254 or 192.168.100.254 dev eth1 blackhole 192.168.114.0/24 } notify_master <STRING>|<QUOTED-STRING> #当前节点成为主节点时触发的脚本。 notify_backup <STRING>|<QUOTED-STRING> #当前节点转为备节点时触发的脚本。 notify_fault <STRING>|<QUOTED-STRING> #当前节点转为“失败”状态时触发的脚本。 notify <STRING>|<QUOTED-STRING> #通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知。 smtp_alert #如果加入这个选项,将调用前面设置的邮件设置,并自动根据状态发送信息 } virtual_server 192.168.200.100 443 { #LVS配置段 ,设置LVS的VIP地址和端口 delay_loop #服务轮询的时间间隔;检测RS服务器的状态。 lb_algo rr #调度算法,可选rr|wrr|lc|wlc|lblc|sh|dh。 lb_kind NAT #集群类型。 nat_mask 255.255.255.0 #子网掩码,可选项。 persistence_timeout 50 #是否启用持久连接,连接保存时长 protocol TCP #协议,只支持TCP sorry_server <IPADDR> <PORT> #备用服务器地址,可选项。 real_server 192.168.201.100 443 { #配置RS服务器的地址和端口 weight 1 #权重 SSL_GET { #检测RS服务器的状态,发送请求报文 url { path / #请求的URL digest ff20ad2481f97b1754ef3e12ecd3a9cc #对请求的页面进行hash运算,然后和这个hash码进行比对,如果hash码一样就表示状态正常 status_code <INT> #判断上述检测机制为健康状态的响应码,和digest二选一即可。 } #这个hash码可以使用genhash命令请求这个页面生成 connect_timeout 3 #连接超时时间 nb_get_retry 3 #超时重试次数 delay_before_retry 3 #每次超时过后多久再进行连接 connect_ip <IP ADDRESS> #向当前RS的哪个IP地址发起健康状态检测请求 connect_port <PORT> #向当前RS的哪个PORT发起健康状态检测请求 bindto <IP ADDRESS> #发出健康状态检测请求时使用的源地址; bind_port <PORT> #发出健康状态检测请求时使用的源端口; } } }