Keepalved高可用服务实例

本文详细介绍了Keepalived的高可用配置方法,包括VRRP原理、单实例及双实例配置流程,以及如何进行主备切换实验,适合运维人员深入理解Keepalived的工作机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

特别申明:内容出自《跟老男孩学Linux:Web集群实战》

准备
系统:CentOS 7
软件:keepalived-1.3.5

Keepalived高可用故障切换转移原理

解答Keepalived的工作原理?

  Keepalived高可用对之间是通过VRRP通信的,因此,我从VRRP开始给您讲起:

  1)VRRP,全称Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障
  2)VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。
  3)VRRP用IP多播的方式(默认多播地址(224.0.0.18))实现高可用对之间通信。
  4)工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。
  5)VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。

  介绍完了VRRP,接下来我再介绍一下Keepalived服务的工作原理:
  Keepalived高可用对之间是通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
  在Keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒。

yum安装

# yum install -y keepalived

查看是否安装成功

[root@lb01 ~]# rpm -qa keepalived
keepalived-1.3.5-8.el7_6.5.x86_64

systemctl status keepalived.service查看状态
systemctl start keepalived启动
systemctl stop keepalived停止
systemctl restart keepalived重启

CentOS 6
service keepalived start启动
/etc/init.d/keepalived start
ps -ef|grep keep|grep -v grep

配置文件说明

具备高可用功能的keepalived.conf配置文件包含了两个重要区块,下面会分别说明。

(1)全局定义(Global Definitions)部分

这部分主要用来设置Keepalived的故障通知机制和Router ID标识。示例代码如下:

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

基础参数说明:
  第1行是注释,!开头是注释。
  第2行是空行。
  第3~8行是定义服务故障报警的Email地址。作用是当服务发生切换或RS节点等有故障时,发报警邮件。这几行是可选配置,notification_email指定在keepalived发生事件时,需要发送的Email地址,可以有多个,每行一个。
  第9行是指定发送邮件的发送人,即发件人地址,也是可选的配置。
  第10行smtp_server指定发送邮件的smtp服务器,如果本机开启了sendmail或postfix,就可以使用上面默认配置实现邮件发送,也是可选配置。
  第11行smtp_connect_timeout是连接smtp的超时时间,也是可选配置。
  注意:第4~11行所有和邮件报警相关的参数均可以不配,在实际工作中会将监控的任务交给更加擅长监控报警的Nagios或Zabbix软件。
  第12行是Keepalived服务器的路由标识(router_id)。在一个局域网内,这个标识(router_id)应该是唯一的。

  大括号“{}”。用来分隔区块,要成对出现。如果漏写了半个大括号,Keepalived运行时,不会报错,但也不会得到预期的结果。另外,由于区块间存在多层嵌套关系,因此很容易遗漏区块结尾处的大括号,要特别注意。

更多参数信息请执行man keepalived.conf获得。

(2)VRRP实例定义区块(VRRP instance(s))部分

这部分主要用来定义具体服务的实例配置,包括Keepalived主备状态、接口、优先级、认证方式和IP信息等。示例代码如下:

    19	vrrp_instance VI_1 {
    20	    state MASTER
    21	    interface eth0
    22	    virtual_router_id 51
    23	    priority 100
    24	    advert_int 1
    25	    authentication {
    26	        auth_type PASS
    27	        auth_pass 1111
    28	    }
    29	    virtual_ipaddress {
    30	        192.168.200.16
    31	        192.168.200.17
    32	        192.168.200.18
    33	    }
    34	}

参数说明:

  第19行表示定义一个vrrp_instance实例,名字是VI_1,每个vrrp_instance实例可以认为是Keepalived服务的一个实例或者作为一个业务服务,在Keepalived服务配置中,这样的vrrp_instance实例可以有多个。注意,存在于主节点中的vrrp_instance实例在备节点中也要存在,这样才能实现故障切换接管。
  第20行state MASTER表示当前实例VI_1的角色状态,当前角色为MASTER,这个状态只能有MASTER和BACKUP两种状态,并且需要大写这些字符。其中MASTER为正式工作的状态,BACKUP为备用的状态。当MASTER所在的服务器故障或失效时,BACKUP所在的服务器会接管故障的MASTER继续提供服务。
  第21行interface为网络通信接口。为对外提供服务的网络接口,如eth0、eth1。当前主流的服务器都有2~4个网络接口,在选择服务接口时,要搞清楚了。
  第22行virtual_router_id为虚拟路由ID标识,这个标识最好是一个数字,并且要在一个keepalived.conf配置中是唯一的。但是MASTER和BACKUP配置中相同实例的virtual_router_id又必须是一致的,否则将出现脑裂问题
  第23行priority为优先级,其后面的数值也是一个数字,数字越大,表示实例优先级越高。在同一个vrrp_instance实例里,MASTER的优先级配置要高于BACKUP的。若MASTER的priority值为150,那么BACKUP的priority必须小于150,一般建议间隔50以上为佳,例如:设置BACKUP的priority为100或更小的数值。
  第24行advert_int为同步通知间隔。MASTER与BACKUP之间通信检查的时间间隔,单位为秒,默认为1。
  第25~28行authentication为权限认证配置。包含认证类型(auth_type)和认证密码(auth_pass)。认证类型有PASS(Simple Passwd(suggested))、AH(IPSEC(not recommended))两种,官方推荐使用的类型为PASS。验证密码为明文方式,最好长度不要超过8个字符,建议用4位的数字,同一vrrp实例的MASTER与BACKUP使用相同的密码才能正常通信。
  第29~33行virtual_ipaddress为虚拟IP地址。可以配置多个IP地址,每个地址占一行,配置时最好明确指定子网掩码以及虚拟IP绑定的网络接口。否则,子网掩码默认是32位,绑定的接口和前面的interface参数配置的一致。注意,这里的虚拟IP就是在工作中需要和域名绑定的IP,即和配置的高可用服务监听的IP要保持一致!

Keepalved高可用服务单实例

Keepalived单实例模式IP及VIP规划表
HOSTNAMEIP说明
lb01192.168.55.7VIP: 192.168.55.12
lb02192.168.55.8VIP: 192.168.55.12

配置Keepalived主服务器lb01 MASTER

删除原有配置,编辑为:
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     123@qq.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb01
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 55
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.55.12/24 dev eth1 label eth1:1
    }
}

注意:
router_id lb01 #<==id为lb01,不同的keepalived.conf此ID要唯一
vrrp_instance VI_1 {#<==实例名字为VI_1,相同实例的备节点名字要和这个相同
state MASTER #<==状态为MASTER,备节点状态需要为BACKUP
interface eth0 #<==通信接口为eth0,此参数备节点设置和主节点相同
virtual_router_id 55 #<==实例ID为55,keepalived.conf里唯一
priority 150 #<==优先级为150,备节点的优先级必须比此数字低
advert_int 1 #<==通信检查间隔时间1秒
auth_type PASS #<==PASS认证类型,此参数备节点设置和主节点相同
auth_pass 1111 #<==密码是1111,此参数备节点设置和主节点相同
192.168.55.12/24 dev eth1 label eth1:1! #<==虚拟IP,即VIP为192.168.55.12,子网掩码为24位,绑定接口为eth0,别名为eth0:1,此参数备节点设置和主节点相同

配置完毕后,启动Keepalived服务

[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-08-02 11:20:46 CST; 6s ago
  Process: 4334 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 4335 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─4335 /usr/sbin/keepalived -D
           ├─4336 /usr/sbin/keepalived -D
           └─4337 /usr/sbin/keepalived -D

Aug 02 11:20:46 lb01 Keepalived_vrrp[4337]: Opening file '/etc/keepalived/keepalived.conf'.
Aug 02 11:20:46 lb01 systemd[1]: Started LVS and VRRP High Availability Monitor.
Aug 02 11:20:46 lb01 Keepalived_healthcheckers[4336]: Opening file '/etc/keepalived/keepalived.conf'.
Aug 02 11:20:51 lb01 Keepalived_vrrp[4337]: (VI_1): Cannot start in MASTER state if not address owner
Aug 02 11:20:51 lb01 Keepalived_vrrp[4337]: iptc_commit returned 0: No chain/target/match by that name
Aug 02 11:20:51 lb01 Keepalived_vrrp[4337]: VRRP_Instance(VI_1) removing protocol VIPs.
Aug 02 11:20:51 lb01 Keepalived_vrrp[4337]: VRRP_Instance(VI_1) removing protocol iptable drop rule
Aug 02 11:20:51 lb01 Keepalived_vrrp[4337]: Using LinkWatch kernel netlink reflector...
Aug 02 11:20:51 lb01 Keepalived_vrrp[4337]: VRRP_Instance(VI_1) Entering BACKUP STATE
Aug 02 11:20:51 lb01 Keepalived_vrrp[4337]: VRRP sockpool: [ifindex(3), proto(112), unicast(0), fd(10,11)]
[root@lb01 ~]# ip addr|grep 12
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
    inet 192.168.55.12/24 scope global secondary eth1:1
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0

检查配置结果,查看是否有虚拟IP 192.168.55.12

[root@lb01 ~]# ip addr|grep 192.168.55.12
    inet 192.168.55.12/24 scope global secondary eth1:1

出现上述带有vip:192.168.55.12行的结果表示lb01的Keepalived服务单实例配置成功。

配置Keepalived备服务器lb02 BACKUP

[root@lb02 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     123@qq.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb02
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.55.12/24 dev eth1 label eth1:1
    }
}

配置完毕,启动Keepalived服务

[root@lb02 ~]# systemctl start keepalived

检查配置结果,查看是否有虚拟IP 192.168.55.12

[root@lb02 ~]# ip addr|grep 192.168.55.12
[root@lb02 ~]# 

  这里没有返回任何结果就对了,因为lb02为BACKUP,当主节点活着的时候,它不会接管VIP 192.168.55.12。

  过滤后有192.168.55.12的IP,则表示Keepalived工作不正常,同一个IP地址同一时刻应该只能出现一台服务器。

  如果查看BACKUP备节点VIP有如下信息,说明高可用裂脑了,裂脑是两台服务器争抢同一资源导致的,例如:两边都配置了同一个VIP地址。

[root@lb01 ~]# ip addr|grep 192.168.55.12
    inet 192.168.55.12/24 scope global secondary eth1:1

出现上述两台服务器争抢同一IP资源问题,一般要先考虑排查两个地方:

  • 主备两台服务器之间是否通信正常,如果不正常是否有iptables防火墙阻挡?
  • 主备两台服务器对应的keepalived.conf配置文件是否有错误?例如,是否同一实例的virtual_router_id配置不一致。

进行高可用主备服务器切换实验

停掉主服务器上的Keealived服务或关闭主服务器,操作及检查步骤如下:

[root@lb01 ~]# ip addr|grep 192.168.55.12
    inet 192.168.55.12/24 scope global secondary eth1:1
[root@lb01 ~]# systemctl stop keepalived
[root@lb01 ~]# ip addr|grep 192.168.55.12

可以看到VIP 192.168.55.12消失了,此时查看BACKUP备服务器,看是否会有VIP 192.168.55.12出现,操作及检查步骤如下:

[root@lb02 ~]# ip addr|grep 192.168.55.12
    inet 192.168.55.12/24 scope global secondary eth1:1

可以看到备节点lb02已经接管绑定了192.168.55.12这个VIP,这期间备节点还会发送ARP广播,让所有的客户端更新本地的ARP表,以便客户端访问新接管VIP服务的节点。

此时如果再启动主服务器的Keealived服务,主服务器就会接管回VIP 192.168.55.12,启动后可以观察下主备的IP漂移情况,备服务器是否释放了IP?主服务器是否又接管了IP?

主节点启动Keepalived服务后,发现很快就又接管了VIP192.168.55.12,操作及检查步骤如下:

[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# ip addr|grep 192.168.55.12
    inet 192.168.55.12/24 scope global secondary eth1:1

与此同时,备节点上的VIP 192.168.55.12则被释放了,如下:

[root@lb02 ~]# ip addr|grep 192.168.55.12
[root@lb02 ~]# 

Keepalived双实例双主模式配置

  Keepalived还支持多实例多业务双向主备模式,即A业务在lb01上是主模式,在lb02上是备模式,而B业务在lb01上是备模式,在lb02上是主模式,下面就以双实例为例讲解不同业务实现双主的配。

Keepalived双实例双主模式IP及VIP规划表
HOSTNAMEIP说明
lb01192.168.55.7VIP: 192.168.55.12(用于绑定A服务,如 ww.e.yyy)
lb02192.168.55.8VIP: 192.168.55.13(用于绑定B服务,如 bbs.e.yyy)

配置lb01 192.168.55.7的keeplived.conf,在单实例的基础上增加一个vrrp_instance VI_2,内容如下:

[root@lb01 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     123@qq.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb01
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 55
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.55.12/24 dev eth1 label eth1:1
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth1
    virtual_router_id 56
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.55.13/24 dev eth1 label eth1:1
    }
}

配置lb02 192.168.55.8的keepalived.conf,在单实例的基础上增加vrrp_instance VI_2实例,步骤及内容如下:

[root@lb02 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     123@qq.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb02
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.55.12/24 dev eth1 label eth1:1
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface eth1
    virtual_router_id 56
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.55.13/24 dev eth1 label eth1:1
    }
}

接着,在lb01、lb02上分别重启Keepalived服务,观察初始VIP设置情况。
参考 Keepalved高可用服务单实例 的 主备服务器切换实验,ip addr过滤。

参考文献

[1] 老男孩. 跟老男孩学Linux运维:Web集群实战[M]. 机械工业出版社,2016-03-01.
[2] Keepalived官网[DB|OL]. https://www.keepalived.org/manpage.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值