KeepAlived 原理和配置详解

1 Keepalived 简介

Keepalived 软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP 功能。因此,Keepalived除了能够管理 LVS 软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。

Keepalived 软件主要通过 VRRP 协议实现高可用功能的,VRRP 是 Virtual Router Redundancy Protocol (虚拟路由器冗余协议)的缩写,VRRP 出现的目的就是为了解决动态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断的运行。所以,Keepalived 一方面具有配置管理 LVS 的功能,同时还具有对LVS 下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。

Keepalived 软件的官方站点: http://www.keepalived.org

2 Keepalived 服务的三个重要功能

2.1 管理 LVS 负载均衡软件

早期的 LVS 软件,需要通过命令行或脚本实现管理,并且没有针对 LVS 节点的健康检查功能。为了解决 LVS 的这些使用不便的问题,Keepalived就诞生了,可以说,Keepalived软件起初是专为了解决 LVS 的问题而诞生的。因此,Keepalived和LVS的感情很深,它们的关系如同夫妻一样,可以紧密的结合,愉快的工作。Keepalived 可以通过读取自身的配置文件实现通过更底层的接口直接管理 LVS 的配置以及控制服务的启动、停止等功能,这使得 LVS 的应用就更加简单方便了。

2.2 实现对 LVS 集群节点健康检查功能(healthcheck)

Keepalived 可以通过在自身的keepalived.conf文件里配置 LVS 的节点 IP 和相关参数实现对 LVS 的直接管理;除此之外,当 LVS 集群中的某一个甚至是几个节点服务器同时发生故障无法提供服务时,Keepalived 服务会自动将失效的节点服务器从 LVS 的正常转发队列中清楚出去,并转换到别的正常节点服务器上,从而保证最终用户的访问不受影响;当故障的节点服务器被修复后,Keepalived 服务又会自动地把它们加入到正常转发队列中,对客户提供服务。

2.3作为系统网络服务的高可用功能(failover)

Keepalived 可以实现任意两台主机之间,例如 Master 和 Backup 主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是 LVS 负载均衡、Nginx 反向代理这样的服务器。

Keepalived 高可用功能实现的原理为:两台主机同时安装好 keepalived 软件并启动服务,开始正常工作时,由角色为 Master 的主机获得所有资源并对用户提供服务,角色 Backup 的主机作为 Master 主机的热备;当角色为 Master 的主机失效或出现故障时,角色为 Backup 的主机将自动接管 Master 主机的所有工作,包括接管 VIP 资源及相应资源服务;而当角色为 Master 的主机故障修复后,又会自动接管回它原来处理的工作,角色为 Backup 的主机则同时释放 Master 主机失效它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。

3 运行原理

Keepalived 高可用服务对之间的故障切换转移,是通过 VRRP 协议(虚拟路由冗余协议)来实现的。

在 Keepalived 服务正常工作时,主 Master 节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备 Backup 节点自己还活着,当主 Master 节点发生故障时,就无法发送心跳消息了,备节点也就因此无法继续检测到来自Master 节点的心跳了,进而调用自身的接管程序,接管主 Master 节点的 IP 资源及服务。而当主 Master 节点恢复时,备 Backup 节点又会释放主节点故障时自身接管的 IP 资源及服务,恢复到原来备用角色。

4 选举策略

选举策略是根据 VRRP 协议,完全按照权重大小,权重最大(0~255)的是 MASTER 机器,下面几种情况会触发选举

  1. keepalived 启动的时候
  2. master 服务器出现故障(断网,重启,或者本机器上的 keepalived crash 等,而本机器上其他应用程序 crash 不算)
  3. 有新的备份服务器加入且权重最大

5 VRRP协议

VRRP 协议,全称 Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP 的出现就是为了解决静态路由的单点故障问题,VRRP 协议是通过一种竞选机制来将路由的任务交给某台 VRRP 路由器的。VRRP 协议早期是用来解决交换机、路由器等设备单点故障的。

5.1 VRRP 原理描述(同样适用于 Keepalived 的工作原理)

在一组 VRRP 路由器集群中,有多台物理 VRRP 路由器,但是这多台物理的机器并不是同时工作的,而是由一台称为 MASTER 的机器负责路由工作,其他的机器都是 BACKUP。MASTER 角色并非一成不变,VRRP 协议会让每个 VRRP 路由参与竞选,最终获胜的就是 MASTER。MASTER 拥有虚拟路由器的 IP 地址,我们把这个 IP 地址称为 VIP,MASTER 负责转发发送给网关地址的数据包和响应 ARP 请求。

5.2 VRRP 是如何工作的?

VRRP 协议通过竞选机制来实现虚拟路由器的功能,所有的协议报文都是通过 IP 多播(默认的多播地址:224.0.0.18)形式进行发送。虚拟路由器由 VRID (范围0-255)和一组 IP 地址组成,对外表现为一个周知的 MAC 地址:00-00-5E-00-01-{VRID}。所以,在一个虚拟路由器中,不管谁是 MASTER,对外都是相同的 MAC 地址和 IP 地址,如果其中一台虚拟路由器宕机,角色发生切换,那么客户端并不需要因为 MASTER 的变化修改自己的路由设置,可以做到透明的切换。这样就实现了如果一台机器宕机,那么备用的机器会拥有 MASTER 上的 IP 地址,实现高可用功能。

5.3 VRRP 是如何通信的?

在一组虚拟路由器中,只有作为 MASTER 的 VRRP 路由器会一直发送 VRRP 广播包,此时 BACKUP 不会抢占 MASTER 。当 MASTER 不可用时,这个时候 BACKUP 就收不到来自 MASTER 的广播包了,此时多台 BACKUP 中优先级最高的路由器会去抢占为 MASTER。这种抢占是非常快速的(可能只有1秒甚至更少),以保证服务的连续性。出于安全性考虑,VRRP 数据包使用了加密协议进行了加密。

6 Keepalived 高可用服务脑裂问题

6.1 什么是脑裂?

由于某些原因,导致两台高可用服务器在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器都还活着并在正常运行,这样就会导致同一个 IP 或服务在两端同时存在发生冲突,最严重的是两台主机占用同一个 VIP 地址,当用户写入数据时可能会分别写入到两端,这可能会导致服务器两端的数据不一致或造成数据丢失,这种情况就被称为脑裂。

6.2 导致脑裂发生的原因

一般来说,脑裂的发生,有以下几种原因:

1)高可用服务器之间心跳线链路故障,导致无法正常通信。

心跳线坏了(包括断了,老化)
网卡及相关驱动坏了,IP 配置及冲突问题(网卡直连)
心跳线连接的设备故障(网卡及交换机)
2)高可用服务器上开启了 iptables 防火墙阻挡了心跳消息传输。

3)高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败。

4)其他服务配置不当等原因,如心跳方式不同,心跳广播冲突、软件 BUG等。

注意:Keepalived 配置里同一 VRRP 实例如果 virtual_router_id 参数两端配置不一致,也会导致脑裂问题发生。

6.3 解决脑裂的具体方案

在实际生产环境中,可以从以下几个方面来防止脑裂问题的发生

1)同时使用串行电缆和以太网电缆连接,同时用两条心跳线路,这样一条线路坏了,另一个还是好的,依然能够传送心跳消息

2)当检测到脑裂时强行关闭一个心跳节点(这个功能需要特殊设备支持,如Stonith、fence)。相当于备节点接收不到心跳消息,发送关机命令通过单独的线路关闭主节点的电源。

3)做好对脑裂的监控报警(如邮件及手机短信等或值班),在问题发生时人为第一时间介入仲裁,降低损失。例如,百度的监控报警短信就有上行和下行的区别。报警信息报到管理员手机上,管理员可以通过手机回复对应数字或简单的字符串操作返回给服务器,让服务器根据指令自动处理相应故障,这样解决故障的时间更短。

4)如果开启防火墙,一定要让心跳消息通过,一般通过允许 IP 段的形式。

7 keepalived 的配置文件说明

Keepalived 是运行在 lvs 之上, 它的主要功能是实现 RealServer(真实服务器)的故障隔离及 Director(负载均衡器)间的 FailOver(失败切换).

  • keepalived 是 lvs 的扩展项目, 因此它们之间具备良好的兼容性
  • 对 RealServer 的健康检查, 实现对失效机器 / 服务的故障隔离
  • 负载均衡器之间的失败切换 failover

7.1 全局定义

全局配置又包括两个子配置

  1. 全局定义(global definition)
  2. 静态路由配置(static ipaddress/routes)
# 全局定义 (global definition) 
global_defs {                      
   notification_email {      
   acassen@firewall.loc     
   failover@firewall.loc
   sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc   
   smtp_server 192.168.200.1                         
   smtp_connect_timeout 30                                  
   router_id LVS_DEVEL     
}
notification_email: 表示 keepalived 在发生诸如切换操作时需要发送 email 通知以及 email 发送给哪些邮件地址邮件地址可以多个每行一个
notification_email_from admin@example.com: 表示发送通知邮件时邮件源地址是谁
smtp_server 127.0.0.1: 表示发送 email 时使用的 smtp 服务器地址这里可以用本地的 sendmail 来实现
smtp_connect_timeout 30: 连接 smtp 连接超时时间
router_id node1: 机器标识,通常配置主机名

# 静态地址和路由配置范例
static_ipaddress {
    192.168.1.1/24 brd + dev eth0 scope global
    192.168.1.2/24 brd + dev eth1 scope global
}
static_routes {
    src $SRC_IP to $DST_IP dev $SRC_DEVICE
    src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE
}
# 这里实际上和系统里面命令配置 IP 地址和路由一样例如 
# 192.168.1.1/24 brd + dev eth0 scope global 相当于: ip addr add 192.168.1.1/24 brd + dev eth0 scope global
# 就是给 eth0 配置 IP 地址路由同理, 一般这个区域不需要配置 
# 这里实际上就是给服务器配置真实的 IP 地址和路由的在复杂的环境下可能需要配置一般不会用这个来配置我们可以直接用 
# vi /etc/sysconfig/network-script/ifcfg-eth1 来配置切记这里可不是 VIP 不要搞混淆了切记切记

7.2 VRRPD 配置

包括三个类:

  1. VRRP 同步组(synchroization group)
  2. VRRP 实例(VRRP Instance)
  3. VRRP 脚本
# VRRP 同步组 (synchroization group) 配置范例 
vrrp_sync_group VG_1 {   // 注意 vrrp_sync_group  后面可自定义名称如 lvs_httpd ,httpd
	group {
		http
		mysql
	}
	notify_master /path/to/to_master.sh
	notify_backup /path_to/to_backup.sh
	notify_fault "/path/fault.sh VG_1"
	notify /path/to/notify.sh
	smtp_alert 
}
# 其中 http 和 mysql 是实例名和下面的实例名一致 
notify_master /path/to/to_master.sh // 表示当切换到 master 状态时要执行的脚本
notify_backup /path_to/to_backup.sh // 表示当切换到 backup 状态时要执行的脚本
notify_fault "/path/fault.sh VG_1"  // keepalived 出现故障时执行的脚本
notify /path/to/notify.sh  
smtp_alert                          // 表示切换时给 global defs 中定义的邮件地址发送邮件通知

# VRRP 实例(instance) 配置范例
vrrp_instance http {                // 注意 vrrp_instance 后面可自定义名称如 lvs_httpd ,httpd
	state MASTER
	interface eth0
	dont_track_primary
	track_interface {
		eth0
		eth1
	}
	mcast_src_ip <IPADDR>
	garp_master_delay 10
	virtual_router_id 51
	priority 100
	advert_int 1
	authentication {
	auth_type PASS
	autp_pass 1234
}
virtual_ipaddress {
	#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>
	192.168.200.17/24 dev eth1
	192.168.200.18/24 dev eth2 label eth2:1
}
virtual_routes {
	# src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev <STRING> scope <SCOPE> tab
	src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
	192.168.110.0/24 via 192.168.200.254 dev eth1
	192.168.111.0/24 dev eth2
	192.168.112.0/24 via 192.168.100.254
}
nopreempt
preemtp_delay 300
debug
}
  • 不使用Sync Group的话,如果机器(或者说router)有两个网段,一个内网一个外网,每个网段开启一个VRRP实例,假设VRRP配置为检查内网,那么当外网出现问题时,VRRPD认为自己仍然健康,那么不会发生Master和Backup的切换,从而导致了问题。Sync group就是为了解决这个问题,可以把两个实例都放进一个Sync Group,这样的话,group里面任何一个实例出现问题都会发生切换。
  • VRRP实例就表示在上面开启了VRRP协议,这个实例说明了VRRP的一些特征,比如主从,VRID等,可以在每个interface上开启一个实例。
  • state: state 指定 instance(Initial)的初始状态就是说在配置好后这台 服务器的初始状态就是这里指定的但这里指定的不算还是得要通过竞选通过优先级来确定里如果这里设置为 master 但如若他的优先级不及另外一台 那么这台在发送通告时会发送自己的优先级另外一台发现优先级不如自己的高那么他会就回抢占为 master
  • interface: 实例绑定的网卡因为在配置虚拟 VIP 的时候必须是在已有的网卡上添加的
  • dont track primary: 忽略 VRRP 的 interface 错误
  • track interface: 跟踪接口设置额外的监控里面任意一块网卡出现问题都会进入故障 (FAULT) 状态例如用 nginx 做均衡器的时候内网必须正常工作如果内网出问题了这个均衡器也就无法运作了所以必须对内外网同时做健康检查
  • mcast src ip: 发送多播数据包时的源 IP 地址这里注意了这里实际上就是在那个地址上发送 VRRP 通告这个非常重要一定要选择稳定的网卡端口来发送这里相当于 heartbeat 的心跳端口如果没有设置那么就用默认的绑定的网卡的 IP 也就是 interface 指定的 IP 地址
  • garp master delay: 在切换到 master 状态后延迟进行免费的 ARP(gratuitous ARP)请求,默认 5s
  • virtual router id: 这里设置 VRID 这里非常重要相同的 VRID 为一个组他将决定多播的 MAC 地址
  • priority 100: 设置本节点的优先级优先级高的为 master
  • advert int: 设置 MASTER 与 BACKUP 负载均衡之间同步即主备间通告时间检查的时间间隔, 单位为秒,默认 1s
  • virtual ipaddress: 这里设置的就是 VIP 也就是虚拟 IP 地址他随着 state 的变化而增加删除当 state 为 master 的时候就添加当 state 为 backup 的时候删除这里主要是有优先级来决定的和 state 设置的值没有多大关系这里可以设置多个 IP 地址
  • virtual routes: 原理和 virtual ipaddress 一样只不过这里是增加和删除路由
  • lvs sync daemon interface: lvs syncd 绑定的网卡,类似 HA 中的心跳检测绑定的网卡
  • authentication: 这里设置认证
  • auth type: 认证方式可以是 PASS 或 AH 两种认证方式
  • auth pass: 认证密码
  • nopreempt: 设置不抢占 master,这里只能设置在 state 为 backup 的节点上而且这个节点的优先级必须别另外的高,比如 master 因为异常将调度圈交给了备份 serve,master serve 检修后没问题,如果不设置 nopreempt 就会将调度权重新夺回来,这样就容易造成业务中断问题
  • preempt delay: 抢占延迟多少秒,即延迟多少秒后竞选 master
  • debug:debug 级别
  • notify master:和 sync group 这里设置的含义一样可以单独设置例如不同的实例通知不同的管理人员 http 实例发给网站管理员 mysql 的就发邮件给 DBA
# VRRP 脚本
# 如下所示为相关配置示例
vrrp_script check_running {
   script "/usr/local/bin/check_running"
   interval 10
   weight 10
}

vrrp_instance http {
   state BACKUP
   smtp_alert
   interface eth0
   virtual_router_id 101
   priority 90
   advert_int 3
   authentication {
   auth_type PASS
   auth_pass whatever
   }
   virtual_ipaddress {
   1.1.1.1
   }
   track_script {
   check_running
   }
}
# 首先在 vrrp_script 区域定义脚本名字和脚本执行的间隔和脚本执行的优先级变更, 如下所示:
vrrp_script check_running {
            script "/usr/local/bin/check_running"
            interval 10     # 脚本执行间隔
            weight 10       # 脚本结果导致的优先级变更 10 表示优先级 + 10-10 则表示优先级 - 10
            }
# 然后在实例(vrrp_instance) 里面引用有点类似脚本里面的函数引用一样先定义后引用函数名
track_script {
      check_running
}

注意:

VRRP 脚本 (vrrp_script) 和 VRRP 实例 (vrrp_instance) 属于同一个级别

keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。一般脚本检测返回的值为 0,说明脚本检测成功,如果为非 0 数值,则说明检测失败

如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加, 如果 weight 为非 0,则优先级不变

如果脚本执行结果非 0,并且 weight 配置的值小于 0,则优先级相应的减少, 如果 weight 为 0,则优先级不变

其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。

这里需要注意的是:

1) 优先级不会不断的提高或者降低

2) 可以编写多个检测脚本并为每个检测脚本设置不同的 weight

3) 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于 0 或者优先级大于等于 255 的情况

这样可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。

7.3 virtual_server 虚拟主机配置

虚拟服务器virtual_server定义块 ,虚拟服务器定义是keepalived框架最重要的项目了,是keepalived.conf必不可少的部分。 该部分是用来管理LVS的,是实现keepalive和LVS相结合的模块。ipvsadm命令可以实现的管理在这里都可以通过参数配置实现,注意:real_server是被包含在viyual_server模块中的,是子模块。

关于 keeplived 的虚拟主机配置有三种如下所示

  • virtual server IP port
  • virtual server fwmark int
  • virtual server group string

以常用的第一种为例

  • virtual_server 192.168.1.2 80

    含义: 设置一个 virtual server: VIP:Vport

  • delay_loop 3

    含义: 设置 service polling 的 delay 时间即服务轮询的时间间隔

  • lb_algo rr|wrr|lc|wlc|lblc|sh|dh

    含义: 设置 LVS 调度算法

  • lb_kind NAT|DR|TUN

    含义: 设置 LVS 集群模式

  • persistence_timeout 120

    含义: 设置会话保持时间秒为单位即以用户在 120 秒内被分配到同一个后端 realserver, 超过此时间就重新分配

  • persistence_granularity

    含义: 设置 LVS 会话保持粒度 ipvsadm 中的 - M 参数默认是 0xffffffff 即每个客户端都做会话保持

  • protocol TCP

    含义: 设置健康检查用的是 TCP 还是 UDP

  • ha_suspend

    含义: suspendhealthchecker’s activity

  • virtualhost

    含义: HTTP_GET 做健康检查时检查的 web 服务器的虚拟主机即 host 头

  • sorry_server

    含义: 设置 backupserver 就是当所有后端 realserver 节点都不可用时就用这里设置的也就是临时把所有的请求都发送到这里

  • real_server

    含义: 设置后端真实节点主机的权重等设置主要后端有几台这里就要设置几个

  • weight 1

    含义: 设置给每台的权重 0 表示失效 (不知给他转发请求知道他恢复正常) 默认是 1

  • inhibit_on_failure

    含义: 表示在节点失败后把他权重设置成 0 而不是冲 IPVS 中删除

  • notify_up |

    含义: 设置检查服务器正常 (UP) 后要执行的脚本notify_down | 含义: 设置检查服务器失败 (down) 后要执行的脚本

注: keepalived 检查机制说明keepalived 健康检查方式有: HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK 几种如下所示

#HTTP/HTTPS 方式
HTTP_GET|SSL_GET {      # 设置健康检查方式

url {                   # 设置要检查的 URL 可以有多个
path /                  # 设置 URL 具体路径
digest <STRING>         # 检查后的摘要信息这些摘要信息可以通过 genhash 命令工具获取
status_code 200         # 设置返回状态码
}
connect_port 80         # 设置监控检查的端口
bindto  <IPADD>         # 设置健康检查的 IP 地址
connect_timeout   3     # 设置连接超时时间
nb_get_retry  3         # 设置重连次数
delay_before_retry  2   # 设置重连间隔
}

#TCP 方式
TCP_CHECK     {
connect_port 80         # 设置监控检查的端口
bindto  <IPADD>         # 设置健康检查的 IP 地址
connect_timeout   3     # 设置连接超时时间
nb_get_retry  3         # 设置重连次数
delay_before_retry  2   # 设置重连间隔
}
#SMTP 方式 (这个可以用来给邮件服务器做集群)
SMTP_CHECK {
host {
connect_ip <IP ADDRESS>
connect_port <PORT>     # 默认检查 25 端口
14 KEEPALIVED
bindto <IP ADDRESS>
}
connect_timeout <INTEGER>
retry <INTEGER>
delay_before_retry <INTEGER>
helo_name <STRING>|<QUOTED-STRING>
}

#MISC 方式 这个可以用来检查很多服务器只需要自己会些脚本即可
MISC_CHECK {
misc_path <STRING>|<QUOTED-STRING>  # 外部程序或脚本
misc_timeout <INT>                  # 脚本或程序执行超时时间
misc_dynamic
# 这个就很好用了可以非常精确的来调整权重是后端每天服务器的压力都能均衡调配这个主要是通过执行的程序或脚本返回的状态代码来动态调整 weight 值使权重根据真实的后端压力来适当调整不过这需要有过硬的脚本功夫才行哦
# 返回 0 健康检查没问题不修改权重
# 返回 1 健康检查失败权重设置为 0
# 返回 2-255 健康检查没问题但是权重却要根据返回代码修改为返回码 - 2 例如如果程序或脚本执行后返回的代码为 200# 那么权重这回被修改为 200-2
}

以上就是 keepalived 的配置项说明虽然配置项很多但很多时候很多配置项保持默认即可,以下是默认配置文件,方便大家做个对比参考

$ cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.200.200 1358

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

7.4 最简单的 Keepalived HA 配置实例

# 安装 keepalived,ipvsadm
yum install keepalived -y

# 如果开启防火墙,请添加 VRRP 白名单
-A INPUT -p vrrp -j ACCEPT
-A INPUT -p igmp -j ACCEPT
-A INPUT -d 224.0.0.18 -j ACCEPT

# 编辑 keepalived 配置文件,master 和 backup 节点配置文件一样
vi /etc/keepalived/keepalived.conf

vrrp_sync_group VI_GOP_NC1_HA {
    group {
        VI_GOP_NC1_HA_PRI
    }
}

vrrp_instance VI_GOP_NC1_HA_PRI {
    state BACKUP
    interface bond0
    virtual_router_id 139
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.65.33.139/23 dev bond0
    }
}

# 手动启动节点即为 master
service keepalived start

7.5 Keepalived 双活实践

7.5.1 最简单的 keepalived 双活,只需要修改 state 和 priority

  • 优点:配置文件简单
  • 缺点:
    • 当 master 恢复后会自动回切,影响业务流量
    • 两个节点配置不完全一致,对自动化运维管理不友好
# node1
vrrp_instance VI_1 {
    state MASTER
    interface bond0
    virtual_router_id 32
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.71.17.32/23 dev bond0
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface bond0
    virtual_router_id 33
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.71.17.33/23 dev bond0
    }
}

# node2

vrrp_instance VI_1 {
    state BACKUP
    interface bond0
    virtual_router_id 32
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.71.17.32/23 dev bond0
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface bond0
    virtual_router_id 33
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.71.17.33/23 dev bond0
    }
}

7.5.2 合理的 keepalived 双活

  • 优点:
    • 添加 nopreempt 可以防止自动回切
    • 添加 track_script 可以人为控制切换
    • 节点之间配置完全一致,便于自动化运维管理
  • 缺点:配置文件较为复杂
# node1
vrrp_script maint-10.71.17.32 {
    script "/bin/bash -c '[[ -e /etc/keepalived/10.71.17.32 ]]' && exit 1 || exit 0"
    interval 2
    fall 2
    rise 2
}

vrrp_script maint-10.71.17.33 {
    script "/bin/bash -c '[[ -e /etc/keepalived/10.71.17.33 ]]' && exit 1 || exit 0"
    interval 2
    fall 2
    rise 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface bond0
    virtual_router_id 32
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.71.17.32/23 dev bond0
    }
    track_script {
        maint-10.71.17.32
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface bond0
    virtual_router_id 33
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.71.17.33/23 dev bond0
    }
    track_script {
        maint-10.71.17.33
    }
}

# node2
vrrp_script maint-10.71.17.32 {
    script "/bin/bash -c '[[ -e /etc/keepalived/10.71.17.32 ]]' && exit 1 || exit 0"
    interval 2
    fall 2
    rise 2
}

vrrp_script maint-10.71.17.33 {
    script "/bin/bash -c '[[ -e /etc/keepalived/10.71.17.33 ]]' && exit 1 || exit 0"
    interval 2
    fall 2
    rise 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface bond0
    virtual_router_id 32
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.71.17.32/23 dev bond0
    }
    track_script {
        maint-10.71.17.32
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface bond0
    virtual_router_id 33
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.71.17.33/23 dev bond0
    }
    track_script {
        maint-10.71.17.33
    }
}
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值