一.keepalived介绍

1.1.Keepalived实现原理

由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务。
每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态。
若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务。
在配置时设置优先级,优先级高的那一方为master。master节点承载着VIP地址。

在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP,主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

  • 主服务器作用:转发数据;发送报文告诉备服务器自己在线。
  • 备服务器作用:监听主服务器发来的数据;收不到消息的时候就接替主服务器。

Keepalived及其工作原理

keepalived高可用应用(健康检查,故障切换)

底层基于VRRP协议实现的高可用

由优先级决定服务器的主备角色,Master服务器上会生成vip,客户端会把访问发送给vip,由Master服务器接收用户的请求,Master服务器会定期给Backup服务器发送VRRP报文,来告知Master服务器状态正常。

当Backup在超时时间内没有收到VRRP报文则会认为Master异常,此时会通过ip命令生成VIP,接替Master的工作接收用户请求。

1.2.Keepalived工具介绍

  • 支持故障自动切换(Failover)
  • 支持节点健康状态检查(Health Checking)
  • 基于vrrp协议完成地址流动
  • 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
  • 为ipvs集群的各RS做健康状态检测
  • 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务
  • 官方网站:https://keepalived.org/

用户空间核心组件:

vrrp stack:VIP消息通告

checkers:监测real server(简单来说 就是监控后端真实服务器的服务)

system call:实现 vrrp 协议状态转换时调用脚本的功能

SMTP:邮件组件(报警邮件)

IPVS wrapper:生成IPVS规则(直接生成ipvsadm)

Netlink Reflector:网络接口(将虚拟地址ip(vip)地址飘动)

WatchDog:监控进程(整个架构是否有问题)

控制组件:提供keepalived.conf 的解析器,完成Keepalived配置

IO复用器:针对网络目的而优化的自己的线程抽象

内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限

1.3.Keepalived的体系模块

  • core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
  • vrrp模块:是来实现VRRP协议的。(调度器之间的健康检查和主备切换)
  • check模块:负责健康检查,常见的方式有端口检查及URL检查。(节点服务器的健康检查)

1.4.高可用(HA)群集与普通群集的比较

普通群集

普通的群集的部署是通过一台度器控制调配多台节点服务器进行业务请求的处理,但是仅仅是一台调度器,就会存在极大的单点故障风险,当该调度器的链路或则调度器本身出现故障时,就会导致整个业务的无法正常进行。


高可用群集(HA)

高可用集群是由一台主调度器和一台或多台备用调度器。在主调度器能够正常运转时,由主调度器进行节点服务器业务的分配处理,其余备用调度器处于待机状态,不参与当前的集群运转。当主调度器出现故障无法运转时,此时备用调度器会由优先级最高的调度承担主调度器的工作,而出现故障的主调调度器便会退出当前工作,由人工维修后返回集群。

两者比较后:高可用集群只需要在调度器上多进行一台或两台(服务器本身的价格比较昂贵,一般备用的服务器的数量会和当前业务创造的价值对等)的设置,就可避免因调度器瘫痪业务中断的风险,所以实现了真正的高可用的效果。


一个健康的集群的特点

1.负载均衡

2.健康检查:探针 (心跳消息-ping, tcp端口检查-三次握手,http url检查-返回码)

3.故障切换


1.5.Keeplived、VRRP及其工作原理(高可用方案)

Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。

在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP(VIP),主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。(主备服务器之间由优先级决定,优先级更高的充当主服务器,优先级低的成为备份服务器。)

1.6.vrrp协议(虚拟路由冗余协议)

Keepalived采用VRRP热备份协议实现Linux服务器的多机热备功能

1)vrrrp是什么?

  • 是针对路由器的一种备份解决方案
  • 由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务
  • 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
  • 若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务

2)vrrp工作过程

  • 选举Master,比较优先级,高的为Master,若优先级相同无Master时,比较接口IP地址,大的为Master,Master设备发送ARP报文,承担报文转发工作;
  • 状态维持,Master设备周期发送通告报文,公布配置信息和工作状态;
  • Backup设备根据收到的通告报文判断Master设备是否工作正常,如果Master设备主动放弃Master地位时,会发送优先级为0的通告报文,Backup设备收到后会快速切换成Master设备或者定时器超时后Backup设备认为Master设备无法正常工作,会切换状态为Master。

二.Keepalived高可用群集脑裂

2.1.脑裂的产生的原因

Keepalived经常会出现的问题:脑裂现象

脑裂现象:

在”双机热备”高可用(HA)系统中,当联系两个节点的”心跳线”断开时(即两个节点断开联系时),本来为一个整体、动作协调的HA系统,就分裂成为两个独立的节点(即两个独立的个体)。由于相互失去了联系,都以为是对方出了故障,此时备用调度器会运转起来争做主调度器的工作,而主调度器依然保持着调度工作,两个调度的同时运转导致整个系统的紊乱。就会发生严重后果:(1)共享资源被瓜分、两边”服务”都起不来了.(2)或者两边”服务”都起来了,但同时读写”共享存储”,导致数据损坏(常见如数据库轮询着的联机日志出错)。

脑裂现象产生的原因:

Master一直发送心跳消息给backup主机,如果中间的链路突然断掉,backup主机将无法收到master主机发送过来的心跳消息(也就是vrrp报文),backup这时候会立即抢占master的工作,但其实这时候的master是正常工作的,此时就会出现脑裂的现象。

2.2.脑裂的预防

1.使用shell脚本对这两个主机之间的连通性进行监测,如果发现有问题,就会立即关闭keepalived服务来防止脑裂的产生。

2.增加一条链路作为备用链路,即使主链路挂掉了,备用链路也会顶上来,master主机可以继续给backup主机发送心跳消息。

3.监控软件的方法,这边主要是采用的zabbix来监控的,主要就是创建监控项,创建触发器来测试关闭keepalived服务。

三.搭建LVS+Keepalived 高可用集群

3.1.keepalived的配置相关解释

cd /etc/keepalived/cp keepalived.conf keepalived.conf.bakvim keepalived.conf......global_defs {#定义全局参数--10行--修改,邮件服务指向本地smtp_server 127.0.0.1--12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02router_id LVS_01--14行--注释掉,取消严格遵守VRRP协议功能,否则VIP无法被连接#vrrp_strict} vrrp_instance VI_1 {#定义VRRP热备实例参数--20行--修改,指定热备状态,主为MASTER,备为BACKUPstate MASTER--21行--修改,指定承载vip地址的物理接口interface ens33--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致virtual_router_id 10#nopreempt#如果设置非抢占模式,两个节点state必须为bakcup,并加上配置 nopreempt--23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90priority 100advert_int 1#通告间隔秒数(心跳频率)authentication {#定义认证信息,每个热备组保持一致auth_type PASS#认证类型--27行--修改,指定验证密码,主备服务器保持一致auth_pass abc123}virtual_ipaddress {#指定群集vip地址192.168.80.188}}--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数virtual_server 192.168.80.188 80 {delay_loop 6#健康检查的间隔时间(秒)lb_algo rr#指定调度算法,轮询(rr)--39行--修改,指定群集工作模式,直接路由(DR)lb_kind DRpersistence_timeout 0#连接保持时间(秒)protocol TCP#应用服务采用的是 TCP协议--43行--修改,指定第一个Web节点的地址、端口real_server 192.168.80.12 80 {weight 1#节点的权重--45行--删除,添加以下健康检查方式TCP_CHECK {connect_port 80#添加检查的目标端口connect_timeout 3#添加连接超时(秒)nb_get_retry 3#添加重试次数delay_before_retry 3#添加重试间隔}} real_server 192.168.80.13 80 {#添加第二个 Web节点的地址、端口weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}##删除后面多余的配置##}systemctl start keepalivedip addr#查看虚拟网卡vip

3.2.实验练习

实验环境:

主keepalived服务器:192.168.47.102
备keepalived服务器:192.168.47.103
web1服务器:192.168.47.104
web2服务器:192.168.47.105
vip:192.168.47.101
客户机:192.168.47.106

1)配置负载调度器(主keepalived服务器:192.168.47.102)

############################ 配置Keepalived master服务器 ################################# 1. #关闭防火墙systemctl stop firewalld.servicesetenforce 0 2. #安装服务yum install ipvsadm keepalived -y3. #修改配置文件keeplived.confcd /etc/keepalived/cp keepalived.conf keepalived.conf.bakvim keepalived.conf ......global_defs {#定义全局参数--10行--修改,邮件服务指向本地smtp_server 127.0.0.1--12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02router_id LVS_01} vrrp_instance VI_1 {#定义VRRP热备实例参数--20行--修改,指定热备状态,主为MASTER,备为BACKUPstate MASTER--21行--修改,指定承载vip地址的物理接口interface ens33--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致virtual_router_id 10--23行--修改,指定优先级,数值越大优先级越高,主为100,备为99priority 100advert_int 1#通告间隔秒数(心跳频率)authentication {#定义认证信息,每个热备组保持一致auth_type PASS#认证类型--27行--修改,指定验证密码,主备服务器保持一致auth_pass 123123}virtual_ipaddress {#指定群集vip地址192.168.47.101}}--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数virtual_server 192.168.47.101 80 {delay_loop 6#健康检查的间隔时间(秒)lb_algo rr#指定调度算法,轮询(rr)--39行--修改,指定群集工作模式,直接路由(DR)lb_kind DRpersistence_timeout 50#连接保持时间(秒)protocol TCP#应用服务采用的是 TCP协议--43行--修改,指定第一个Web节点的地址、端口real_server 192.168.47.104 80 {weight 1#节点的权重--45行--删除,添加以下健康检查方式TCP_CHECK {connect_port 80#添加检查的目标端口connect_timeout 3#添加连接超时(秒)nb_get_retry 3#添加重试次数delay_before_retry 3#添加重试间隔}} real_server 192.168.47.105 80 {#添加第二个 Web节点的地址、端口weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}}##删除后面多余的配置## 4. #启动服务、查看虚拟网卡vipsystemctl start keepalivedip addr show dev ens33 5. #调整proc响应参数,关闭Linux内核的重定向参数响应vim /etc/sysctl.confnet.ipv4.ip_forward = 1net.ipv4.conf.all.send_redirects = 0net.ipv4.conf.default.send_redirects = 0net.ipv4.conf.ens33.send_redirects = 0 6. #刷新一下sysctl -p ############################# 配置ipvsadm ################################# 7. #配置负载分配策略,并启动服务ipvsadm-save >/etc/sysconfig/ipvsadmsystemctl start ipvsadm.service 8. #清空ipvsadm,并做策略ipvsadm -Cipvsadm -A -t 192.168.47.101:80 -s rripvsadm -a -t 192.168.47.101:80 -r 192.168.47.104:80 -gipvsadm -a -t 192.168.47.101:80 -r 192.168.47.105:80 -g 9. #保存设置ipvsadmipvsadm -lnipvsadm-save >/etc/sysconfig/ipvsadm

2)配置负载调度器(备keepalived服务器:192.168.47.103)

############################ 配置Keepalived master服务器 ################################# 1. #关闭防火墙systemctl stop firewalld.servicesetenforce 0 2. #安装服务yum -y install ipvsadm keepalived 3. #修改配置文件keeplived.confcd /etc/keepalived/cp keepalived.conf keepalived.conf.bakvim keepalived.conf ......global_defs {#定义全局参数--10行--修改,邮件服务指向本地smtp_server 127.0.0.1--12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02router_id LVS_01} vrrp_instance VI_1 {#定义VRRP热备实例参数--20行--修改,指定热备状态,主为MASTER,备为BACKUPstate BACKUP--21行--修改,指定承载vip地址的物理接口interface ens33--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致virtual_router_id 10--23行--修改,指定优先级,数值越大优先级越高,主为100,备为99priority 99advert_int 1#通告间隔秒数(心跳频率)authentication {#定义认证信息,每个热备组保持一致auth_type PASS#认证类型--27行--修改,指定验证密码,主备服务器保持一致auth_pass 123123}virtual_ipaddress {#指定群集vip地址192.168.47.101}}--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数virtual_server 192.168.47.101 80 {delay_loop 6#健康检查的间隔时间(秒)lb_algo rr#指定调度算法,轮询(rr)--39行--修改,指定群集工作模式,直接路由(DR)lb_kind DRpersistence_timeout 50#连接保持时间(秒)protocol TCP#应用服务采用的是 TCP协议--43行--修改,指定第一个Web节点的地址、端口real_server 192.168.47.104 80 {weight 1#节点的权重--45行--删除,添加以下健康检查方式TCP_CHECK {connect_port 80#添加检查的目标端口connect_timeout 3#添加连接超时(秒)nb_get_retry 3#添加重试次数delay_before_retry 3#添加重试间隔}} real_server 192.168.47.105 80 {#添加第二个 Web节点的地址、端口weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}}##删除后面多余的配置## 4. #启动服务、查看虚拟网卡vipsystemctl start keepalivedip addr show dev ens33 5. #调整proce响应参数,关闭Linux内核的重定向参数响应vim /etc/sysctl.confnet.ipv4.ip_forward = 1net.ipv4.conf.all.send_redirects = 0net.ipv4.conf.default.send_redirects = 0net.ipv4.conf.ens33.send_redirects = 0 6. #刷新一下sysctl -p ############################# 配置ipvsadm ################################# 7. #配置负载分配策略,并启动服务ipvsadm-save >/etc/sysconfig/ipvsadmsystemctl start ipvsadm.service 8. #清空ipvsadm,并做策略ipvsadm -Cipvsadm -A -t 192.168.47.101:80 -s rripvsadm -a -t 192.168.47.101:80 -r 192.168.47.104:80 -gipvsadm -a -t 192.168.47.101:80 -r 192.168.47.105:80 -g 9. #保存设置ipvsadmipvsadm -lnipvsadm-save >/etc/sysconfig/ipvsadm

3)配置节点服务器(web1服务器:192.168.47.104)

1. #关闭防火墙systemctl stop firewalldsetenforce 0 2. #安装并开启httpd服务yum -y install httpdsystemctl start httpd 3. #配置站点文件vim /var/www/html/index.htmlthis is zhang web1! 4. #配置虚拟vipvim /etc/sysconfig/network-scripts/ifcfg-lo:0DEVICE=lo:0ONBOOT=yesIPADDR=192.168.47.101NETMASK=255.255.255.255 5. #重启网络服务,开启虚拟网卡systemctl restart networkifup lo:0ifconfig lo:0 6. #设置路由route add -host 192.168.47.101 dev lo:0route -n 7. #调整 proc 响应参数#添加系统只响应目的IP为本地IP的ARP请求#系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IPvim /etc/sysctl.confnet.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2net.ipv4.conf.default.arp_ignore = 1net.ipv4.conf.default.arp_announce = 2net.ipv4.conf.lo.arp_ignore = 1net.ipv4.conf.lo.arp_announce = 2 8. #刷新proc参数sysctl -p

4)配置节点服务器(web2服务器:192.168.47.105)

1. #关闭防火墙systemctl stop firewalldsetenforce 0 2. #安装并开启httpd服务yum -y install httpdsystemctl start httpd 3. #配置站点文件vim /var/www/html/index.htmlthis is rui web2! 4. #配置虚拟vipvim /etc/sysconfig/network-scripts/ifcfg-lo:0DEVICE=lo:0ONBOOT=yesIPADDR=192.168.47.101NETMASK=255.255.255.255 5. #重启网络服务,开启虚拟网卡systemctl restart networkifup lo:0ifconfig lo:0 6. #设置路由route add -host 192.168.47.101 dev lo:0route -n 7. #调整 proc 响应参数#添加系统只响应目的IP为本地IP的ARP请求#系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IPvim /etc/sysctl.confnet.ipv4.conf.all.arp_ignore = 1net.ipv4.conf.all.arp_announce = 2net.ipv4.conf.default.arp_ignore = 1net.ipv4.conf.default.arp_announce = 2net.ipv4.conf.lo.arp_ignore = 1net.ipv4.conf.lo.arp_announce = 2 8. #刷新proc参数sysctl -p

5)测试验证

在客户机上测试(客户机:192.168.47.106)

curl 192.168.47.101
[root@xzq ~]# curl 192.168.47.101this is zhang webl![root@kehu ~]# curl 192.168.47.101this is rui web2![root@xzq ~]#

主keepalived服务器:192.168.47.102

备keepalived服务器:192.168.47.103

断开主keepalived服务器:192.168.47.102

systemctl stop keepalived.service

备keepalived服务器:192.168.47.103