【高可用】Keepalived 2.07 编译安装与配置教程

Keepalived 作为一款高可用软件,经常和 LVS 等负载均衡配合使用,Keepalived 可以让 LVS 的命令配置文件化,不用再去配置 ipvsadm。Keepalived 可以实现 VIP 的自动漂移,并且会检测后端服务器的状态,当主服务器工作出现故障时会将其剔除,并将备用服务器上线;当主服务器修复后,又会自动将备用服务器下线,让主服务器上线。这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障服务器。

一、Keepalived 安装与配置

1、Keepalived 的下载在官方网站http://www.keepalived.org/。Keepalived1.2 和 1.4 版本对环境要求有略微区别,由于 1.4 版本开始需要对 IPV6 进行支持,所以在编译安装 Keepalived 之前要先安装如下环境:

| 1 | yum ``install -y libnl-devel libnl3-devel libnfnetlink-devel |

2、在需要进行高可用配置的节点上都编译安装 Keepalived。编译安装完成后注意看是否有如图出现几个 yes 的标记,这个是代表安装 Keepalived 所支持的功能

| 1 | ./configure --prefix=/usr/``local``/keepalived |

| 2 | make |

| 3 | make install |

| 4 | /usr/``local``/keepalived/sbin/keepalived -``v  #查看版本 |

如果编译时出现!!! OpenSSL is not properly installed on your system. !!! Can not include OpenSSL headers files.!!! 这样的报错需要先安装 openssl-devel 这个软件包

| 1 | yum ``install openssl-devel -y |

 

3、keepalived 在运行时需要指定配置文件,在安装好 keepalived 后有提供许多的配置文件模板(在 keepalived/etc 中)。启动 Keepalived 时默认会在 /etc/keepalived 目录中去找 keepalived.conf 文件,如果没有将配置文件放在该目录,启动 Keepalived 时需要使用 -f 选项来指定配置文件路径:

| 1 | cp /usr/``local``/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/  ``#拷贝配置文件到/etc/keepalived目录,该目录需要先创建 |

| 2 | /usr/``local``/keepalived/sbin/keepalived -f /usr/``local``/keepalived/etc/keepalived/keepalived.conf  ``#以指定配置文件的方式来启动服务 |

4、启动服务后使用 ps 命令查看是否有进程在工作。然后通过 ip add 命令可以看到配置出的 VIP 信息已经出现在 Master 节点上(用 ifconfig 是看不到的) ,当 Master 挂掉后该 VIP 会自动绑定到 Slave 节点去。

5、下面是 Keepalived 配置文件示例,主备节点除了 state 标识和 priority 权重上需要调整,其他配置基本一样,如果发现有错误的话可以查看系统日志,keepalived 把日志都写在了 /var/log/message 中:

| 01 | global_defs { |

| 02 | # 全局设置,主要是主备切换时发送邮件通知,可以直接注释 |

| 03 | # notification_email { |

| 04 | #   acassen@firewall.loc |

| 05 | #   failover@firewall.loc |

| 06 | #   sysadmin@firewall.loc |

| 07 | # } |

| 08 | # notification_email_from Alexandre.Cassen@firewall.loc |

| 09 | # smtp_server 192.168.145.1 |

| 10 | # smtp_connect_timeout 30 |

| 11 | # router_id LVS_DEVEL |

| 12 | # vrrp_skip_check_adv_addr |

| 13 | # vrrp_strict |

| 14 | # vrrp_garp_interval 0 |

| 15 | # vrrp_gna_interval 0 |

| 16 | } |

| 17 |   |

| 18 | vrrp_instance VI_1 {  ``#实例名称随便取 |

| 19 | state MASTER  ``#标记该节点是master还是backup,但并不起实际作用,为了防止脑裂抢占IP可以都设置为backup |

| 20 | interface eth0  ``#配置VIP绑定的网卡,这里使用和外网通信的网卡 |

| 21 | virtual_router_id 51  ``#取1-255之间的值,主备需要相同,这样才能成为一个组 |

| 22 | priority 100  ``#权重,数值高的主机是master,这是影响主备的关键 |

| 23 | nopreempt  ``#非抢占模式,需要设置state为backup |

| 24 | advert_int 1  ``#主备之间通讯的间隔秒数,用于判断主节点是否存活 |

| 25 | authentication { |

| 26 | auth_type PASS  ``#进行安全认证的方式,PASS或者AH方式,推荐PASS |

| 27 | auth_pass 1111  ``#PASS的密码 |

| 28 | } |

| 29 | virtual_ipaddress { |

| 30 | 192.168.145.200  ``#VIP地址最多可以写20个,keepalive启动后会自动配置该处VIP |

| 31 | } |

| 32 | #    virtual_server 192.168.145.200 {  #如果访问VIP的话可以转发到后端其他节点 |

| 33 | #        delay_loop 6 |

| 34 | #        protocol TCP |

| 35 | #        lb_algo rr |

| 36 | #        lb_kind DR |

| 37 | #        real_server 192.168.145.101 80{  #后端节点1 |

| 38 | #          weight 1        } |

| 39 | #        |

| 40 | #        real_server 192.168.145.102 80{  #后端节点2 |

| 41 | #           weight 1       } |

| 42 | #    } |

| 43 | # } |

6、要验证服务的话可以在主备节点都安装好 Nginx,然后将两台节点的默认首页文件分别修改(比如写上各自的 IP 做为标记),然后用 VIP 访问 Nginx(或者设置一个域名解析到 VIP 上),看获取的页面内容是啥。最后将主节点关机或者杀掉 keepalived,再次查看 Nginx 的内容,发现内容发生了切换,说明已经 VIP 已经自动跳到另一台节点。当之前的 Keepalive 恢复后又会将 VIP 抢过来,如果要防止抢占的话需要在配置文件中增加 nopreempt 选项,且 state 都需要是 BACKUP,否则 nopreempt 无效。还有一个需要提醒开发人员注意的地方就是使用负载均衡后的 session 问题。

二、Keepalived 脑裂问题

如果 keepalived 在使用中被强行杀死或者网络会出现脑裂问题,VIP 会同时出现在主备节点上,只能通过重启网络解决

| 1 | #两种导致脑裂的操作 |

| 2 | pkill -9 keepalived |

| 3 | iptables -A OUTPUT -p vrrp -j DROP |

| 4 | #恢复办法 |

| 5 | systemctl restart network |

三、Keepalived 健康检查

在 Keepalived 的实际运用中需要对后端服务(比如 Nginx)做一个健康检查来判断服务是否正常,否则 Keepalived 检查的对象是 Keepalived 自身服务而不是其他应用服务。所以存在后端 Nginx 服务挂了但是 Keepalived 还在正常工作,这个时候就不会切换 VIP 到正常的服务器上去。

Keepalived 健康检查功能支持 TCP_CHECK、HTTP_GET、MISC_CHECK、VRRP_SCRIPT 方式。前两种比较简单,配置示例:

| 01 | TCP_CHECK { |

| 02 | connect_port 80 |

| 03 | connect_timeout 6 |

| 04 | nb_get_retry 3 |

| 05 | delay_before_retry 3 |

| 06 | } |

| 07 |   |

| 08 | HTTP_GET { |

| 09 | url { |

| 10 | path /index.html |

| 11 | status_code 200 |

| 12 | } |

| 13 | connect_timeout 6 |

| 14 | nb_get_retry 3 |

| 15 | delay_before_retry 3 |

| 16 | } |

再看看 vrrp_script 脚本检查,该选项配合 track_script 使用。使用自定义脚本来判断服务是否异常或网关是否无法 ping 通等,如果出现异常就应该移除掉 VIP,也就是主动来停止 Keepalived 服务:

| 01 | global_defs {  ``#全局部分设置,全部注释都可以,主要是邮件信息 |

| 02 | notification_email { |

| 03 | tanglu@qq.com  ``#主从切换时发送邮件通知,这里是收件人地址 |

| 04 | } |

| 05 | notification_email_from tanglu@postfix.com  ``#发件人地址 |

| 06 | smtp_server 192.168.200.1  ``#邮件服务器地址 |

| 07 | smtp_connect_timeout 30  ``#发送邮件超时时间 |

| 08 | router_id LVS_DEVEL |

| 09 | } |

| 10 |   |

| 11 | vrrp_script check_nginx {  ``#定义循环检测 |

| 12 | script ``"/scripts/check_nginx.sh" |

| 13 | interval 5  ``#5秒运行一次检测脚本 |

| 14 | } |

| 15 |   |

| 16 | vrrp_instance VI_1 { |

| 17 | interface ens33  |

| 18 | nopreempt |

| 19 | priority 100 |

| 20 | advert_int 1  |

| 21 | virtual_ipaddress { |

| 22 | 192.168.68.250  ``#VIP,最多设置20个 |

| 23 | } |

| 24 | track_script {  ``#调用循环检测 |

| 25 | check_nginx |

| 26 | } |

| 27 | } |

check_nginx.sh 脚本代码参考:

| 01 | #!/bin/bash    |

| 02 | if [ ``"$(ps -ef | grep "``nginx: master process``"| grep -v grep )" == ``"" ]    |

| 03 | then    |

| 04 | /usr/``local``/nginx/sbin/nginx    |

| 05 | sleep 5    |

| 06 | if [ ``"$(ps -ef | grep "``nginx: master process``"| grep -v grep )" == ``"" ]    |

| 07 | then    |

| 08 | killall keepalived    |

| 09 | fi    |

| 10 | fi |