keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:nginx,haproxy,mysql等)的高可用解决方案软件
keepalived软件主要通过VRRP协议实现高可用功能的。VRRP(虚拟路由器冗余协议),VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保持当个别节点宕机时,整个网络可以不间断地运行
所以keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能
官网:www.keepalived.org

对LVS集群节点健康检查

keepalived可以在自身的配置文件中修改对LVS节点的管理、启停,以及当LVS集群节点失效的时候,踢出集群,并且转换IP地址等配置,转移到健康的节点上,从而保证用户的访问不受影响
当故障的节点恢复后,keepalived服务能够重新将其加入LVS集群中

作为系统网络服务的高可用共而过

keepalived能够实现任意两台主机之间,例如master和backup主机之间的故障和自动转义,这个主机可以是普通的禁止停机的业务服务器,也可以是例如LVS、Nginx这样的方向代理服务器

keepalived高可用&故障切换原理

image.png

VRRP描述

image.png

keepalived配置文件

安装keepalived

yum install keepalived -y

默认的配置文件路径

/etc/keepalived/keepalived.conf

keepalived主要有3个功能,下面仅分享其高可用的功能,非高可用性相关的功能可以将其注释掉
有关高可以用性的配置,有如下两大区块

全局定义部分(global defintiton)

这部分主要定义keepalived的故障通知机制和Router ID标识

  1. [root@lb01 conf]# head -12 /etc/keepalived/keepalived.conf | cat -n
  2. 1 ! Configuration File for keepalived
  3. 2
  4. 3 glbal_defs {
  5. 4 notification_email {
  6. 5 acassen@firewall.loc
  7. 6 failover@firewall.loc
  8. 7 sysadmin@firewall.loc
  9. 8 }
  10. 9 notification_email_from Alexandre.Cassen@firewall.loc
  11. 10 smtp_server 192.168.200.1
  12. 11 smtp_connect_timeout 30
  13. 12 router_id LVS_DEVEL
  14. 13 }

内容解释:
1.注释行,!和 # 作用一样
2.空行
3~8.定义邮件报警的地址,当keepalived主备切换,或者RS(后端服务器 real sever)故障时发送告警邮件
9.指定告警邮件,发信人的地址
10.指定邮件服务器地址,例如本地配置了sendmail服务
11.连接邮件服务器的超时时间
12.重要参数,指定keepalived的路由指标(router_id),在局域网内,该ID应该是唯一的

VRRP实例配置

主要配置keepalived主备状态,接口、优先级,认证方式,IP地址等信息

/etc/keepalived/keepalived.conf

  1. 19 vrrp_instance VI_1 {
  2. 20 state MASTER
  3. 21 interface eth0
  4. 22 virtual_router_id 51
  5. 23 priority 100
  6. 24 advert_int 1
  7. 25 authentication {
  8. 26 auth_type PASS
  9. 27 auth_pass 1111
  10. 28 }
  11. 29 virtual_ipaddress {
  12. 30 192.168.200.16
  13. 31 192.168.200.17
  14. 32 192.168.200.18
  15. 33 }
  16. 34 }

内容解释:
19.定义vrrp实例,名字是VI_1,每一个vrrp实例可以理解为是keepalived的一个业务,vrrp实例在配置文件中可以有多个,并且主节点的keepalived配置的vrrp_instance在备节点也必须存在,才能实现故障迁移(keepalived是一款工具,真正干活的配置是vrrp_instance)
20.参数作用是表示当前实例VI_1的角色是主节点,该参数只有MASTER和BACKUP两种,严格区分大小写。MASTER表示工作中的主节点,BACKUP表示备用节点。BACKUP在MASTER故障时,接替其工作继续运转
21.insterface为网络通信接口,对外提供服务器的网络接口,根据自己机器修改
22.唯一虚拟路由ID标识,最好是数字,在当前keepalived.conf配置文件中必须是唯一的,且在MASTER和BACKUP的配置中相同实例的virtual_router_id必须是一样的,否则会出现脑裂问题
23.定义实例的优先级,也是一串数字,数字越大,优先级越高。在同一个vrrp_instance实例里,MASTER的优先级必须高于BACKUP,一般配置MASTER和BACKUP间隔大小在50,例如MASTER的优先级150,BACKUP的优先级是小于100的数值
24.定义MASTER和BACKUP之间的通信检查时间,默认单位是秒
25~28.权限配置参数,密码类型是PASS,密码为明文方式,长度建议不超过8个字符,一般用4位数字,同一个VRRP实例,MASTER和BACKUP的密码必须一样才能通信
29~34.定义虚拟IP的地址,可以配置多个IP地址,且明确子网掩码和IP绑定的网络接口(网卡名),否则虚拟IP的子网掩码默认是32位,网络接口和前面的Interface参数一致,这里的虚拟IP(VIP)就是实际工作中需要使用的IP地址,和域名进行绑定解析

keepalived配置信息

  1. global_defs {
  2. router_id lb01
  3. }
  4. vrrp_instance VI_1 {
  5. state MASTER
  6. interface ens33
  7. virtual_router_id 51
  8. priority 150
  9. advert_int 1
  10. authentication {
  11. auth_type PASS
  12. auth_pass 1111
  13. }
  14. virtual_ipaddress {
  15. 192.168.47.140/24 dev ens33 label ens33:1
  16. }
  17. }
  1. global_defs {
  2. router_id lb02
  3. }
  4. vrrp_instance VI_1 {
  5. state BACKUP
  6. interface ens33
  7. virtual_router_id 51
  8. priority 100
  9. advert_int 1
  10. authentication {
  11. auth_type PASS
  12. auth_pass 1111
  13. }
  14. virtual_ipaddress {
  15. 192.168.47.140/24 dev ens33 label ens33:1
  16. }
  17. }

keepalived实战单实例

事实上网络服务的高可用功能原理是比较简单的,本质上就是手动的操作自动化就可以解决了。
如果没有配置高可用服务,当服务器宕机了就得找一个新的服务器,重新进行环境初始化,配置IP,搭建服务,整个手动恢复的时间比较漫长,对于用户而言,就不太友好。这个切换过程必须自动化完成,效率更高,体验更好。
高可用性的实验配置,就是开启一堆服务器,同时配置好高可用服务,但是只有获取到虚拟IP(VIP)的主服务器提供服务,若是主的宕机,VIP会自动漂浮到备用服务器上,此时用户的请求,也就跟着走到了备用服务器,这个过程完全自动化,快速迁移。

配置主keepalived服务器 lb01-master

  1. 备份旧配置文件,定义新配置文件

    进入配置文件目录

    cd /etc/keepalived/

    备份配置文件

    cp keepalived.conf{,.bak}

    清空配置文件内容

    keepalived.conf

  2. 定义新配置 ```nginx global_defs { router_id lb01 }

vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.178.3/24 dev ens33 lable ens33:3 } }

  1. 3. 启动keepalived
  2. > systemctl start keepalived
  3. > ps -ef | grep keep | grep -v grep
  4. 4. 检查是否生成新的vip地址,192.168.178.3
  5. > ip addr | grep "inet 192"
  6. <a name="eFIOK"></a>
  7. ## 配置keepalived备服务器 lb02-BACKUP
  8. 1. 注意主备的区别
  9. ```nginx
  10. global_defs {
  11. router_id lb02
  12. }
  13. vrrp_instance VI_1 {
  14. state BACKUP
  15. interface ens33
  16. virtual_router_id 51
  17. priority 100
  18. advert_int 1
  19. authentication {
  20. auth_type PASS
  21. auth_pass 1111
  22. }
  23. virtual_ipaddress {
  24. 192.168.178.3/24 dev ens33 lable ens33:3
  25. }
  26. }
  1. 同样的启动服务,检查服务状态,查看是否出现虚拟IP(VIP)

    ip addr | grep “inet 192”

  • 正确的结果应该是没有出现VIP
  • 因为lb02位BACKUP,当主节点正常的时候,他不会接管VIP
  • 若是lb02看到了VIP,表示配置出错了

    报错排查故障思路

    如果出现lb01、lb02抢夺vip资源

  • 主备服务器是否能够通信,可以ping检测

  • 是否没有正确配置防火墙,或是忘记关闭防火墙
  • 两台服务器的keepalived.conf是否写错(例如虚拟路由ID是否不一样)

高可用集训脑裂

什么是脑裂?

由于某些问题,导致两台高可用服务器在指定时间内无法检测到对方的心跳信息,导致各自都取得资源和服务的拥有权,这样会导致同一个IP地址或服务同时存在,引发的冲突问题。并且可能两台机器使用同一个VIP地址,用户写入数据可能会分别写入两台机器,导致服务器两端数据不一致,造成数据混乱,这种情况就是脑裂问题。

导致脑裂的原因

  • 高可用服务器之间的心跳线路故障,无法通信
  • 心跳线坏了、断裂、老化(心跳线指的是服务器之间使用网络连接)
  • 网卡或驱动损毁,ip配置冲突
  • 防火墙阻挡了心跳信息传输
  • 配置文件写错,虚拟路由ID不一致

    解决脑裂方案

  • 使用双心跳线路,防止单线路损坏,另一个还是好的,同时使用串行电缆和以外网电缆

  • 当检测到脑裂情况时,强行关闭一个心跳节点(需要额外设备支持,如stonith),备节点收不到心跳消息的时候,通过单独的线路发送关机命令,强制关闭主节点电源
  • 做好脑裂监控报警,如手机短信、邮件、微信等,在发生脑裂问题时,人为第一时间介入仲裁,降低损失
  • 注意如果开启了防火墙,一定要允许心跳信息通过,允许ip段访问
  • 使用专业级监控软件,Nagios等进行脑裂检测

    keepalived双实例双主模式实战

    设备准备

  1. A业务在lb01上是主模式,在lb02上是备模式
  2. B业务在lb02上是备模式,在lb02上是主模式

lb01 — 192.168.178.130 — vip:192.168.178.3(绑定A业务www.chaoge.com)
lb02 — 192.168.178.131 — vip:192.168.178.4(绑定B业务bbs.chaoge.com)

文件配置

  1. 配置lb01,添加vrrp实例 ```nginx global_defs { router_id lb01 }

vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.178.3/24 dev ens33 lable ens33:3 } }

vrrp_instance VI_2 { state BACKUP interface ens33 virtual_router_id 52 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.178.4 dev ens33 lable ens33:4 } }

  1. 2. 配置lb02
  2. ```nginx
  3. global_defs {
  4. router_id lb02
  5. }
  6. vrrp_instance VI_1 {
  7. state BACKUP
  8. interface ens33
  9. virtual_router_id 51
  10. priority 100
  11. advert_int 1
  12. authentication {
  13. auth_type PASS
  14. auth_pass 1111
  15. }
  16. virtual_ipaddress {
  17. 192.168.178.3/24 dev ens33 lable ens33:3
  18. }
  19. }
  20. vrrp_instance VI_2 {
  21. state MASTER
  22. interface ens33
  23. virtual_router_id 52
  24. priority 150
  25. advert_int 1
  26. authentication {
  27. auth_type PASS
  28. auth_pass 1111
  29. }
  30. virtual_ipaddress {
  31. 192.168.178.4 dev ens33 lable ens33:4
  32. }
  33. }
  1. 分别重启keepalived,查看vip的信息情况

    systemctl restart keepalived

检验结果:谁是vrrp实例的master,谁就优先得到vip,lb01得到ip192.168.178.3,lb02得到ip192.168.178.4

nginx + keepalived高可用实验

##准备四台机器## 高可用性负载均衡集群节点 lb01 keepalived master lb02 keepalived backup 2个real server节点,资源服务器节点 web01 nginx web02 nginx

  1. 准备2个web节点的内容,即配置对应ip首页的显示内容,方便我们进行实验检测
  2. 配置lb01,主要是修改nginx,定义负载均衡池,以及域名的配置 ```nginx upstream my_web { server 172.20.0.67; server 172.20.0.72; }

server { listen 80; server_name www.chaoge.cn; location / { proxy_pass http://my_web; } } ```

  1. 配置lb02,与lb01相同
  2. 检验效果

curl lb01的IP地址
curl lb02的ip地址
#都能够分别得到两个web节点的内容,即ok

进行keepalived vip结合

  • 选用lb01为master主的负载均衡器,选用的他的vip,与公司域名绑定即可
  • 修改hosts文件,填写vip和域名绑定解析关系
  • 这个时候,我们就可以利用网页,通过域名查看到web站点的内容
  • 且这个时候我们关闭lb01,可以查看vip已经到了lb02机器上,发现网站还是可以正常访问