一、Keepalived 简要介绍
Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前端服务的高可用。
Keepalived 以 VRRP 协议为实现基础,用 VRRP 协议来实现高可用性(HA)。 VRRP(Virtual RouterRedundancy Protocol)协议是用于实现路由器冗余的协议, VRRP 协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器 IP(一个或多个),而在路由器组内部,如果实际拥有这个对外 IP 的路由器如果工作正常的话就是 MASTER,或者是通过算法选举产生, MASTER 实现针对虚拟路由器 IP 的各种网络功能,如 ARP 请求, ICMP,以及数据的转发等;其他设备不拥有该虚拟 IP,状态是 BACKUP,除了接收 MASTER 的VRRP 状态通告信息外,不执行对外的网络功能。当主机失效时, BACKUP 将接管原先 MASTER 的网络功能。VRRP 协议使用多播数据来传输 VRRP 数据, VRRP 数据使用特殊的虚拟源 MAC 地址发送数据而不是自身网卡的 MAC 地址, VRRP 运行时只有 MASTER 路由器定时发送 VRRP 通告信息,表示 MASTER 工作正常以及虚拟路由器 IP(组), BACKUP 只接收 VRRP 数据,不发送数据,如果一定时间内没有接收到 MASTER 的通告信息,各 BACKUP 将宣告自己成为 MASTER,发送通告信息,重新进行 MASTER 选举状态。
二、安装Nginx与keepalived
# yum -y install nginx
# yum -y install keepalived
三、配置Nginx与keepalived
1、配置nginx
# vim /etc/nginx/nginx.conf Nginx用户改root
2、修改 Nginx 欢迎首页内容(用于后面测试, 用于区分两个节点的 Nginx):
# vim /usr/share/nginx/html/index.html
192.168.9.218 中的标题加 218

Welcome to nginx! 218

192.168.9.219 中的标题加 219

Welcome to nginx! 219


3、启动与开机启动Nginx
# systemctl start nginx.service 开启服务# systemctl enable nginx.service 设置开机自启动服务

4、配置keepalived服务server 1
# vim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs { # keepalived 自带的邮件提醒需要开启 sendmail 服务。 建议用独立的监控或第三方 SMTP notification_email { # 指定 keepalived 在发生事件,比如切换 IP 的时候需要发生邮件的地址,可以有多个,一行一个即可 [email protected] [email protected] [email protected] } notification_email_from [email protected] # 指定 smtp 服务器设置 smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id master # 标识本节点的字条串,通常为 hostname# vrrp_skip_check_adv_addr# vrrp_strict #需要注释掉,不然可能无法ping通# vrrp_garp_interval 0# vrrp_gna_interval 0}# 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称vrrp_instance VI_1 { # 监听一组 VIP state MASTER # 主节点为 MASTER, 对应的备份节点为 BACKUP interface ens160 # 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同 virtual_router_id 51 # 虚拟路由的 ID 号, 两个节点设置必须一样 priority 100 # 节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高 advert_int 1 # 组播信息发送间隔,两个节点设置必须一样, 默认 1s authentication { # 设置验证信息,两个节点必须一致 auth_type PASS auth_pass 1111 } virtual_ipaddress { # 虚拟 IP 池, 两个节点设置必须一样 192.168.9.220 # 虚拟 ip,可以定义多个 }}vrrp_instance VI_2 { state BACKUP # 第二组 IP 初始状态是 BACKUP interface ens160 virtual_router_id 52 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 5555 } virtual_ipaddress { 192.168.9.221 }}

5、配置keepalived服务server 2
# vim /etc/keepalived/keepalived.conf
6、在 Server 1关闭 keepalived , 在 Server 2 查看日志 可以看到server2上设置VIP192.168.9.220
[root@node1 ~]# tail -f /var/log/messagesNov 25 22:07:27 localhost Keepalived_vrrp[13090]: (VI_1) Backup received priority 0 advertisementNov 25 22:07:28 localhost Keepalived_vrrp[13090]: (VI_1) Receive advertisement timeoutNov 25 22:07:28 localhost Keepalived_vrrp[13090]: (VI_1) Entering MASTER STATENov 25 22:07:28 localhost Keepalived_vrrp[13090]: (VI_1) setting VIPs.Nov 25 22:07:28 localhost Keepalived_vrrp[13090]: Sending gratuitous ARP on ens160 for 192.168.9.220
验证 Server 2 的 IP 地址:server2此时两个虚拟ip都在
[root@node1 ~]# ip a l inet 192.168.9.219/24 brd 192.168.9.255 scope global noprefixroute ens160 valid_lft forever preferred_lft forever inet 192.168.9.221/32 scope global ens160 valid_lft forever preferred_lft forever inet 192.168.9.220/32 scope global ens160

7、在 Server 1开启keepalived , 在 Server 2 查看日志 移除虚拟VIP192.168.9.220,在server 1上重新添加虚拟VIP192.168.9.220

8、keepalived配置,解决vip无法ping通,虚拟服务器端口无法访问的问题
vip无法ping通
keepalived.conf中vip配置好后,通过ip addr可以看到vip已经顺利挂载,但是无法ping通,并且防火墙都已关闭,原因是keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。重启keepalived即可ping通。
映射端口无法访问
vip可ping通后,访问vip映射端口无法访问,直接访问real_server的ip和端口可访问。
解决这个问题需要对lvs相关知识进行初步了解,详见《LVS手册》http://www.linuxidc.com/Linux/2016-03/129233.htm
在keepalived.conf中对virtual_server配置有
lb_kind可以设置为NAT、DR、TUN。这个选项直接关系到你做的 virtual_server和real_server能否进行正确映射。
NAT模式和路由器NAT模式类似,用于访问client和real_server在不同网段实现通信。如果你在一个局域网内做负载均衡选用NAT,那恭喜你,你肯定是无法访问。可以做个NAT模式的测试,需要在keepalived主机上配置双网卡,分别在两个不同网段中,如keepalived主机网卡对client地址为10.0.0.0/24,对real_server的地址为192.168.2.0/24。vip设置为10.0.0.164,real_server为192.168.2.67,可采用下面的keepalived.conf配置

vrrp_instance VI_1 {
state MASTER
interface ens37
virtual_router_id 66
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.164/24
}
}

virtual_server 10.0.0.164 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
protocol TCP
real_server 192.168.2.67 80
{
weight 1
}
}

配置正确后在keepalived主机上执行systemctl restart keepalived.service。从client上执行curl 10.0.0.164发现还是无法访问。这是由于real_server在接收到请求包后找不到路由进行数据返回,此时需要将keepalived主机作为网关,在real_server上添加回程路由route add default gw 192.168.2.65。192.168.2.65即为keepalived主机。考虑keepalived主机一般双机,因此此处可以用keepalived主机的虚拟IP。 现在再执行curl 10.0.0.164就可以正常返回。

DR模式是在局域网内最简单的映射模式,原理可参见《LVS手册》。但只在keepalived主机上配置lb_kind DR是无法访问到real_server的,DR模式会将目标地址为虚拟IP地址原封不动的传给real_server。real_server发现这不是我的IP,因此会丢弃掉该包,所以这边得欺骗一下real_server,让他认为这是他的地址。做法很简单,在real_server的lo回环口上添加那个虚拟IP,这样real_server就会认为自己就是VIP这台服务器。切记在lo上设置,不要在真实网卡上设置,道理留给大家思考。

ifconfig lo:0 192.168.2.100 netmask 255.255.255.0 up
1
参考
LVS+Keepalived使用总结
https://www.linuxidc.com/Linux/2016-03/129232.htm
12-15 09:36