CentOS安装配置keepalived实现高可用
场景假使你有一套系统部署在一台Linux机器上,这套系统执行的业务对你来说是相当重要的,要是某天系统崩溃了,业务会中断,将带来不可估量的损失。这时你会想,能不能部署两台机器,业务还是由其中一台机器执行,要是这台机器崩溃了,另一台机器能自动接管业务呢。keepalived采用的是虚拟IP的实现方式,恰好能满足以上场景,这也是本文介绍的重点。你可能会问,为什么让另一台机空闲,多浪费资源啊,直接用ngi
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脚本文件配置
#!/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使用更令人振奋呢。
更多推荐
所有评论(0)