1.用keepalived管理nginx服务
7-1和7-2配置
#7-1和7-2安装nginx
systemctl stop firewalld
setenforce 0
yum install epel-release.noarch -y
yum install -y nginx
systemctl start nginx
vim /etc/nginx/nginx.conf
upstream web {
server 192.168.91.102;
server 192.168.91.103;
}
location / {
proxy_pass http://web;
}
scp /etc/nginx/nginx.conf 192.168.91.101:/etc/nginx/nginx.conf
#7-1和7-2安装keepalived
yum install keepalived -y
7-1
vim /etc/keepalived/keepalived.conf
! 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 127.0.0.1 # 修改邮箱地址
smtp_connect_timeout 30
router_id LVS01 # 修改名称
vrrp_skip_check_adv_addr
#vrrp_strict #关闭严格模式
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_down {
script "/etc/keepalived/ng.sh"
interval 1
weight -30
fall 3
rise 2
timeout 2
}
vrrp_script check_down {
script "/etc/keepalived/ng.sh" #指明脚本的位置
interval 1 #每隔1s 执行一次检测
weight -30 #如果 脚本执行失败自动减少优先级30
fall 3 # 3次不成功才标注为失败
rise 2 #nginx 重新起来后检测两次成功 才真的成功
timeout 2 #超时时间 2s
}
vrrp_instance VI_1 {
state MASTER #将7-2改成BACKUP
interface ens33 #修改网卡的名称
virtual_router_id 51
priority 100 #7-2将优先级改为99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.91.188 #修改vip
}
track_script {
check_down
}
}
vim /etc/keepalived/ng.sh
killall -0 nginx
#编写检测nginx是否启动脚本
chmod +x /etc/keepalived/ng.sh
scp /etc/keepalived/keepalived.conf 192.168.91.101://etc/keepalived/
#现在7-2 上安装keepalived 就7-1配置文件复制到7-2
实验效果
使用tcpdump命令抓包可以看到ip地址来源与主的那台keeplived管理nginx的服务器
当主的那台nginx服务下线后不会影响7-3和7-4继续提供web服务
可以通过抓包看到看到当keepalived判断主的nginx停止服务了以后,将服务转交给了从的nginx
用keepalived管理haproxy提供web服务
#在haproxy的配置文件中配置代理真实服务器
listen ky26_port_80
bind 192.168.91.100:80
mode http
log global
server rs1 192.168.10.20:80 check
server rs2 192.168.10.1:80 check
#需要开启优化使haproxy可以监听虚拟ip
sysctl -a |grep bind
#net.ipv4.ip_nonlocal_bind = 1
vim /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
sysctl -p
#修改脚本检测
vim /etc/keepalived/ng.sh
killall -0 haproxy
#tcpdump -i ens33 -nn port 80
keepalived脑裂现象
什么是脑裂?
在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,本来为一整体、动作协调的HA系统,就分裂成为2个独立的个体。
由于相互失去了联系,都以为是对方出了故障。两个节点上的HA软件像“裂脑人”一样,争抢“共享资源”、争起“应用服务”,就会发生严重后果。共享资源被瓜分、两边“服务”都起不来了或者两边“服务”都起来了,但同时读写“共享存储”,导致数据损坏
都有哪些原因导致脑裂?
1.高可用服务器对之间心跳线链路发生故障,导致无法正常通信。
2.因心跳线坏了(包括断了,老化)。
3.因网卡及相关驱动坏了,ip配置及冲突问题(网卡直连)
4.因心跳线间连接的设备故障(网卡及交换机)高可用服务器上开启了 iptables防火墙阻挡了心跳消息传输。
5.高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败
6.其他服务配置不当等原因,如心跳方式不同,心跳广插冲突、软件Bug等。
如何解决keepalived脑裂问题?
在实际生产环境中,我们从以下方面防止脑裂:
1.同时使用串行电缆和以太网电缆连接、同时使用两条心跳线路,这样一条线路断了,另外一条还是好的,依然能传送心跳消息
2.当检查脑裂时强行关闭一个心跳节点(这个功能需要特殊设备支持,如stonith、fence)相当于备节点接收不到心跳消息,通过单独的线路发送关机命令关闭主节点的电源
3.做好对脑裂的监控报警解决常见方案:
(1)如果开启防火墙,一定要让心跳消息通过,一般通过允许IP段的形式解决
(2)可以拉一条以太网网线或者串口线作为主被节点心跳线路的冗余
(3)开发检测程序通过监控软件检测脑裂