共计 3833 个字符,预计需要花费 10 分钟才能阅读完成。
1. keepalived 实现 nginx 高可用
1.1 安装
1.2Nginx 监控脚本
该脚本检测 ngnix 的运行状态,并在 nginx 进程不存在时尝试重新启动 ngnix,如果启动失败则停止 keepalived,准备让其它机器接管。
PS:该脚本应赋予相应的执行权限等,否则 Keepalived 将无法调用从而无法进行切换
/etc/keepalived/check_nginx.sh
:
1.3 keepalived.conf
! Configuration File for keepalived global_defs { notification_email { zhouxiao@example.com itsection@example.com } notification_email_from itsection@example.com smtp_server mail.example.com smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_nginx { # script “killall -0 nginx” script “/etc/keepalived/check_nginx.sh” interval 2 weight -5 fall 3 rise 2 } vrrp_instance VI_1 { state MASTER interface eth0 mcast_src_ip 172.29.88.224 virtual_router_id 51 priority 101 advert_int 2 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.29.88.222 } track_script { chk_nginx } } |
在其它备机 BACKUP 上,只需要改变 state MASTER
-> state BACKUP
,priority 101
-> priority 100
,mcast_src_ip 172.29.88.224
-> mcast_src_ip 172.29.88.225
即可。
1.4 配置选项说明
global_defs
notification_email
:keepalived 在发生诸如切换操作时需要发送 email 通知地址,后面的 smtp_server 相比也都知道是邮件服务器地址。也可以通过其它方式报警,毕竟邮件不是实时通知的。router_id
:机器标识,通常可设为 hostname。故障发生时,邮件通知会用到
vrrp_instance
state
:指定 instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优 先级来确定。如果这里设置为 MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为 MASTERinterface
:实例绑定的网卡,因为在配置虚拟 IP 的时候必须是在已有的网卡上添加的mcast_src_ip
:发送多播数据包时的源 IP 地址,这里注意了,这里实际上就是在那个地址上发送 VRRP 通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于 heartbeat 的心跳端口,如果没有设置那么就用默认的绑定的网卡的 IP,也就是 interface 指定的 IP 地址virtual_router_id
:这里设置 VRID,这里非常重要,相同的 VRID 为一个组,他将决定多播的 MAC 地址priority
:设置本节点的优先级,优先级高的为 masteradvert_int
:检查间隔,默认为 1 秒。这就是 VRRP 的定时器,MASTER 每隔这样一个时间间隔,就会发送一个 advertisement 报文以通知组内其他路由器自己工作正常authentication
:定义认证方式和密码,主从必须一样virtual_ipaddress
:这里设置的就是 VIP,也就是虚拟 IP 地址,他随着 state 的变化而增加删除,当 state 为 master 的时候就添加,当 state 为 backup 的时候删除,这里主要是有优先级来决定的,和 state 设置的值没有多大关系,这里可以设置多个 IP 地址track_script
:引用 VRRP 脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。
vrrp_script
告诉 keepalived 在什么情况下切换,所以尤为重要。可以有多个 vrrp_script
script
:自己写的检测脚本。也可以是一行命令如killall -0 nginx
interval 2
:每 2s 检测一次weight -5
:检测失败(脚本返回非 0)则优先级 -5fall 2
:检测连续 2 次失败才算确定是真失败。会用 weight 减少优先级(1-255 之间)rise 1
:检测 1 次成功就算成功。但不修改优先级
这里要提示一下 script 一般有 2 种写法:
- 通过脚本执行的返回结果,改变优先级,keepalived 继续发送通告消息,backup 比较优先级再决定
- 脚本里面检测到异常,直接关闭 keepalived 进程,backup 机器接收不到 advertisement 会抢占 IP
上文 vrrp_script 配置部分,killall -0 nginx
属于第 1 种情况,/etc/keepalived/check_nginx.sh
属于第 2 种情况(脚本中关闭 keepalived)。个人更倾向于通过 shell 脚本判断,但有异常时 exit 1,正常退出 exit 0,然后 keepalived 根据动态调整的 vrrp_instance 优先级选举决定是否抢占 VIP:
- 如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加
- 如果脚本执行结果非 0,并且 weight 配置的值小于 0,则优先级相应的减少
其他情况,原本配置的优先级不变,即配置文件中 priority 对应的值。
提示:
- 优先级不会不断的提高或者降低
- 可以编写多个检测脚本并为每个检测脚本设置不同的 weight(在配置中列出就行)
- 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于 0 或者优先级大于等于 255 的情况
- 在 MASTER 节点的 vrrp_instance 中 配置
nopreempt
,当它异常恢复后,即使它 prio 更高也不会抢占,这样可以避免正常情况下做无谓的切换
以上可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。
配置结束
在默认的 keepalive.conf 里面还有 virtual_server,real_server 这样的配置,我们这用不到,它是为 lvs 准备的。notify
可以定义在切换成 MASTER 或 BACKUP 时执行的脚本,如有需求请自行 google。
notify
1.5 Nginx 配置
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-12/138221.htm