1、场景

假使你有一套系统部署在一台Linux机器上,这套系统执行的业务对你来说是相当重要的,要是某天系统崩溃了,业务会中断,将带来不可估量的损失。这时你会想,能不能部署两台机器,业务还是由其中一台机器执行,要是这台机器崩溃了,另一台机器能自动接管业务呢。

keepalived采用的是虚拟IP的实现方式,恰好能满足以上场景,这也是本文介绍的重点。

你可能会问,为什么让另一台机空闲,多浪费资源啊,直接用nginx实现负载均衡不是更好吗?没错,优秀的程序员应该避免资源浪费。但是如果你的业务同一时间只能由一个实例执行呢,是不是nginx爱莫能助了?或者你有更好的实现方法,不妨留言分享下?谢谢。

2、虚拟IP原理

虚拟IP。何为虚拟IP,就是一个未分配给真实主机的IP,也就是说对外提供服务的主机除了有一个真实IP外还有一个虚拟IP,使用这两个IP中的任意一个都可以连接到这台主机,当服务器发生故障无法对外提供服务时,动态将这个虚拟IP切换到备用主机。

虚拟IP实现原理主要是靠TCP/IP的ARP协议。因为IP地址只是一个逻辑地址,在以太网中MAC地址才是真正用来进行数据传输的物理地址,每台主机中都有一个ARP高速缓存,存储同一个网络内的IP地址与MAC地址的对应关系,以太网中的主机发送数据时会先从这个缓存中查询目标IP对应的MAC地址,会向这个MAC地址发送数据。操作系统会自动维护这个缓存。这就是整个实现 的关键。

3、举例说明

假设我安装并配置好keepalived后,过程顺利,keepalived正常工作,下边是服务器上的arp缓存的内容。
(192.168.1.219) at 00:21:5A:DB:68:E8 [ether] on bond0
(192.168.1.217) at 00:21:5A:DB:68:E8 [ether] on bond0

(192.168.1.218) at 00:21:5A:DB:7F:C2 [ether] on bond0

192.168.1.217、192.168.1.218是两台真实的电脑,192.168.1.217为对外提供数据库服务的主机,192.168.1.218为热备的机器。

192.168.1.219为虚拟IP。

大家注意,219、217的MAC地址是相同的。

现在我让217宕机,之后的arp缓存如下:
(192.168.1.219) at 00:21:5A:DB:7F:C2 [ether] on bond0
(192.168.1.217) at 00:21:5A:DB:68:E8 [ether] on bond0
(192.168.1.218) at 00:21:5A:DB:7F:C2 [ether] on bond0 

这就是奥妙所在。当218 发现217宕机后会向网络发送一个ARP数据包,告诉所有主机192.168.1.219这个IP对应的MAC地址是00:21:5A:DB:7F:C2,这样所有发送到219的数据包都会发送到mac地址为00:21:5A:DB:7F:C2的机器,也就是218的机器。而发现伙伴出问题,并广播ARP数据包的工作正是keepalived做的。

4、安装keepalived

在CentOS系统下安装keepalived可使用如下命令:

yum install keepalived

本文不提供其它版本的系统或其它方式的安装方法。另外需要注意的是,keepalived没有windows版本。

5、测试系统的准备

当前手上有两台服务器,信息如下:

服务器A:192.168.14.132

服务器B:192.168.14.133

两台服务器都部署了一个测试网站并启动顺利。

访问服务器A的测试页:http://192.168.14.132:8080/WebTest/keepalived.html

访问服务器B的测试页:http://192.168.14.133:8080/WebTest/keepalived.html



6、配置

现在我把服务器A配置成MASTER,而服务器B配置成BACKUP。虚拟IP定为:192.168.14.100

6.1、keepalived.conf文件配置

MASTER配置(/etc/keepalived/keepalived.conf):

/bin/bash: Configuration: command not found
bal_defs {
   notification_email {
     root@localhost
   }
   notification_email_from root@localhost  //这里没有使用keepalived的邮件通知服务,听说邮件通知还是用监控软件好。
   smtp_server localhost
   smtp_connect_timeout 30
   router_id NodeA //当前服务器的ID
}

vrrp_script chk_maintainace {  //定义一个健康检查的脚本,用以告诉keepalived当前系统是否是健康的
        script "/etc/keepalived/health_check.sh"
        interval 3  //3秒执行一次检查
        weight -10  //如果脚本执行失败,priority会相应减少,就会造成降级
}

vrrp_instance VI_1 {
    state MASTER   //主服务器
    interface eno16777736   //配置成系统上网卡的名字
    virtual_router_id 51
    priority 100   //优先级,必须比备机上的大
    advert_int 1
    authentication {   //邮件通知的配置
        auth_type PASS
        auth_pass specialpassword
    }
    virtual_ipaddress {   //虚拟IP,如果当前系统获取拥有虚拟IP的权限,就会向网卡添加如下虚拟IP,其中24是掩码
        192.168.14.100/24
    }
   track_script {  //健康检查的脚本
        chk_maintainace
   }

}

BACKUP配置(/etc/keepalived/keepalived.conf):

/bin/bash: Configuration: command not found
bal_defs {
   notification_email {
     root@localhost
   }
   notification_email_from root@localhost
   smtp_server localhost
   smtp_connect_timeout 30
   router_id NodeB
}

vrrp_script chk_maintainace {
        script "/etc/keepalived/health_check.sh"
        interval 3
        weight -10
}

vrrp_instance VI_1 {
    state BACKUP
    interface eno16777736
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass specialpassword
    }
    virtual_ipaddress {
        192.168.14.100/24
    }
   track_script {
        chk_maintainace
   }

}

6.2、Health check脚本文件配置

 healthcheck脚本文件(/etc/keepalived/health_check.sh): 
 此脚本在keepalived.conf文件中被配置使用,脚本大意是检查系统中是否有tomcat进程,如果有,则认为服务器是健康的。
#!/bin/bash

count=$(ps aux | grep -v grep | grep tomcat | wc -l)
if [ $count -gt 0 ]
then
    exit 0
else
    exit 1
fi

本作者试过编辑脚本为检查业务系统的某个页面或接口是否是200的http状态,而单独执行脚本则验证通过,放到keepalived上则不能正常工作,实在不知道是什么问题。

7、启动keepalived服务

启动服务命令:

service keepalived start

建议查找资料将服务做成开机自动运行。

检查服务是否正常启动敲如下命令查看日志:

journalctl -xe

正常的日志大体如下:


同样服务器B也这样启动服务。

8、高可用测试

让一台服务器不健康,可kill掉keepalived进程或者kill掉tomcat进程,又或者直接关机。

8.1、服务器A和服务器B均健康

访问http://192.168.14.100:8080/WebTest/keepalived.html:


8.2、服务器A不健康,服务器B健康


8.3、服务器A健康,服务器B不健康


9、拓展

你是否觉得,keepalived结合nginx使用更令人振奋呢。

Logo

更多推荐