返回介绍

11.2 Keepalived 安装与配置

发布于 2025-04-21 21:33:25 字数 11901 浏览 0 评论 0 收藏

11.2.1 Keepalived 的安装过程

Keepalived 的安装非常简单,下面通过源码编译的方式介绍 Keepalived 的安装过程。首先打开 Keepalived 的官方网址 http://www.keepalived.org,从中可以下载到各种版本的 Keepalived,这里下载的是 keepalived-1.2.12.tar.gz。以操作系统环境 CentOS6.3 为例,Keepalived 安装步骤如下:

[root@keepalived-master app]# tar zxvf keepalived-1.2.12.tar.gz
[root@keepalived-master app]# cd keepalived-1.2.12
[root@keepalived-master keepalived-1.2.12]# ./configure   --sysconf=/etc \
> --with-kernel-dir=/usr/src/kernels/2.6.32-431.5.1.el6.x86_64
[root@keepalived-master keepalived-1.2.12]# make
[root@keepalived-master keepalived-1.2.12]# make install
[root@keepalived-master keepalived-1.2.12]# ln -s /usr/local/sbin/keepalived  /sbin/
[root@keepalived-master keepalived-1.2.12]# chkconfig  --add keepalived
[root@keepalived-master keepalived-1.2.12]# chkconfig  --level 35 keepalived on

在编译选项中,“--sysconf”指定了 Keepalived 配置文件的安装路径,即路径为/etc/Keepalived/Keepalived.conf;“--with-kernel-dir”是个很重要的参数,但这个参数并不是要把 Keepalived 编译进内核,而是指定使用内核源码中的头文件,即 include 目录。只有在使用 LVS 时,才需要用到“--with-kernel-dir”参数,其他时候是不需要的。

在安装完成后,会得到如图 11-2 所示的内容。

图 11-2 Keepalived 编译输出模块信息

图 11-2 显示的是 Keepalived 输出的加载模块信息,其中:

- Use IPVS Framework 表示使用 IPVS 框架,也就是负载均衡模块,后面的“Yes”表示启用 IPVS 功能。一般在搭建高可用负载均衡集群时会启用 IPVS 功能,如果只是使用 Keepalived 的高可用功能,则不需要启用 IPVS 模块,可以在编译 Keepalived 时通过“--disable-lvs”关闭 IPVS 功能。

- IPVS sync daemon support 表示启用 IPVS 的同步功能,此模块一般和 IPVS 模块一起使用,如果需要关闭,可在编译 Keepalived 时通过“--disable-lvs-syncd”参数实现。

- IPVS use libnl 表示使用新版的 libnl。libnl 是 NETLINK 的一个实现,如果要使用新版的 libnl,需要在系统中安装 libnl 和 libnl-devel 软件包。

- Use VRRP Framework 表示使用 VRRP 框架,这是实现 Keepalived 高可用功能必需的模块。

- Use VRRP VMAC 表示使用基础 VMAC 接口的 xmit VRRP 包,这是 Keepalived 在 1.2.10 版本及以后新增的一个功能。

至此,Keepalived 的安装介绍完毕。下面开始进入 Keepalived 配置的讲解。

11.2.2 Keepalived 的全局配置

在上节安装 Keepalived 的过程中,指定了 Keepalived 配置文件的路径为/etc/Keepalived/Keepalived.conf,Keepalived 的所有配置均在这个配置文件中完成。由于 Keepalived.conf 文件中可配置的选项比较多,这里根据配置文件所实现的功能,将 Keepalived 配置分为三类,分别是:全局配置(Global Configuration)、VRRPD 配置和 LVS 配置。下面将主要介绍下 Keepalived 配置文件中一些常用配置选项的含义和用法。

Keepalived 的配置文件都是以块(block)的形式组织的,每个块的内容都包含在{}中,以“#”和“!”开头的行都是注释。全局配置就是对整个 Keepalived 都生效的配置,基本内容如下:

! Configuration File for keepalived
global_defs {
   notification_email {
     dba.gao@gmail.com
     ixdba@163.com
   }
   notification_email_from Keepalived@localhost
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL   
}

全局配置以“global_defs”作为标识,在“global_defs”区域内的都是全局配置选项,其中:

- notification_email 用于设置报警邮件地址,可以设置多个,每行一个。注意,如果要开启邮件报警,需要开启本机的 Sendmail 服务。

- notification_email_from 用于设置邮件的发送地址。

- smtp_server 用于设置邮件的 smtp server 地址。

- smtp_connect_timeout 用于设置连接 smtp server 的超时时间。

- router_id 表示运行 Keepalived 服务器的一个标识,是发邮件时显示在邮件主题中的信息。

11.2.3 Keepalived 的 VRRPD 配置

VRRPD 配置是 Keepalived 所有配置的核心,主要用来实现 Keepalived 的高可用功能。从结构上来看,VRRPD 配置又可分为 VRRP 同步组配置和 VRRP 实例配置。

这里首先介绍同步组实现的主要功能。同步组是相对于多个 VRRP 实例而言的,在多个 VRRP 实例的环境中,每个 VRRP 实例所对应的网络环境会有所不同,假设一个实例处于网段 A,另一个实例处于网段 B,而如果 VRRPD 只配置了 A 网段的检测,那么当 B 网段主机出现故障时,VRRPD 会认为自身仍处于正常状态,进而不会进行主备节点的切换,这样问题就出现了。同步组就是用来解决这个问题的,将所有 VRRP 实例都加入同步组中,这样任何一个实例出现问题,都会导致 Keepalived 进行主备切换。

下面是两个同步组的配置样例:

vrrp_sync_group G1 {
  group {
    VI_1
    VI_2
    VI_5
  }
  notify_backup "/usr/local/bin/vrrp.back arg1 arg2"
  notify_master "/usr/local/bin/vrrp.mast arg1 arg2"
  notify_fault "/usr/local/bin/vrrp.fault arg1 arg2"
  notify_stop "/usr/local/bin/vrrp.stop arg1 arg2"
}
vrrp_sync_group G2 {
  group {
    VI_3
    VI_4
  }
}

其中,G1 同步组包含 VI_1、VI_2、VI_5 三个 VRRP 实例,G2 同步组包含 VI_3、VI_4 两个 VRRP 实例。这 5 个实例将在 vrrp_instance 段进行定义。另外,在 vrrp_sync_group 段中还出现了 notify_master、notify_backup、notify_fault 和 notify_stop 四个选项,这是 Keepalived 配置中的一个通知机制,也是 Keepalived 包含的四种状态。下面介绍每个选项的含义。

- notify_master:指定当 Keepalived 进入 MASTER 状态时要执行的脚本,这个脚本可以是一个状态报警脚本,也可以是一个服务管理脚本。Keepalived 允许脚本传入参数,因此灵活性很强。

- notify_backup:指定当 Keepalived 进入 BACKUP 状态时要执行的脚本,同理,这个脚本可以是一个状态报警脚本,也可以是一个服务管理脚本。

- notify_fault:指定当 Keepalived 进入 FAULT 状态时要执行的脚本,脚本功能与前两个类似。

- notify_stop:指定当 Keepalived 程序终止时需要执行的脚本。

下面正式进入 VRRP 实例的配置,也就是配置 Keepalived 的高可用功能。VRRP 实例段主要用来配置节点角色(主或从)、实例绑定的网络接口、节点间验证机制、集群服务 IP 等。下面是实例 VI_1 的一个配置样例。

vrrp_instance VI_1 {
    state MASTER                
    interface eth0              
    virtual_router_id 51        
    priority 100        
    advert_int 1        
    mcast_src_ip <IPADDR>
    garp_master_delay  10 
 track_interface {
   eth0 
   eth1
   }
    authentication {
        auth_type PASS
        auth_pass qwaszx
    }
    virtual_ipaddress {         
     #<IPADDR>/<MASK>  brd  <IPADDR>  dev <STRING>  scope <SCOPT>  label <LABEL>
        192.168.200.16
        192.168.200.17 dev eth1
        192.168.200.18 dev eth2
    }
    virtual_routes {
   #src  <IPADDR>  [to] <IPADDR>/<MASK>  via|gw  <IPADDR>  dev <STRING>  scope <SCOPE>
        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
        192.168.113.0/24 via 192.168.100.252 or 192.168.100.253
    }
    nopreempt 
    preemtp_delay  300
}

以上 VRRP 配置以“vrrp_instance”作为标识,在这个实例中包含了若干配置选项,分别介绍如下。

- vrrp_instance 是 VRRP 实例开始的标识,后跟 VRRP 实例名称。

- state 用于指定 Keepalived 的角色,MASTER 表示此主机是主服务器,BACKUP 表示此主机是备用服务器。

- interface 用于指定 HA 监测网络的接口。

- virtual_router_id 是虚拟路由标识,这个标识是一个数字,同一个 VRRP 实例使用唯一的标识,即在同一个 vrrp_instance 下,MASTER 和 BACKUP 必须是一致的。

- priority 用于定义节点优先级,数字越大表示节点的优先级就越高。在一个 VRRP_instance 下,MASTER 的优先级必须大于 BACKUP 的优先级。

- advert_int 用于设定 MASTER 与 BACKUP 主机之间同步检查的时间间隔,单位是秒。

- mcast_src_ip 用于设置发送多播包的地址,如果不设置,将使用绑定的网卡所对应的 IP 地址。

- garp_master_delay 用于设定在切换到 MASTER 状态后延时进行 Gratuitous arp 请求的时间。

- track_interface 用于设置一些额外的网络监控接口,其中任何一个网络接口出现故障,Keepalived 都会进入 FAULT 状态。

- authentication 用于设定节点间通信验证类型和密码,验证类型主要有 PASS 和 AH 两种,在一个 vrrp_instance 下,MASTER 与 BACKUP 必须使用相同的密码才能正常通信。

- virtual_ipaddress 用于设置虚拟 IP 地址(VIP),又叫做漂移 IP 地址。可以设置多个虚拟 IP 地址,每行一个。之所以称为漂移 IP 地址,是因为 Keepalived 切换到 MASTER 状态时,这个 IP 地址会自动添加到系统中,而切换到 BACKUP 状态时,这些 IP 又会自动从系统中删除。Keepalived 通过“ip address add”命令的形式将 VIP 添加进系统中。要查看系统中添加的 VIP 地址,可以通过“ip add”命令实现。virtual_ipaddress 段中添加的 IP 形式可以多种多样,例如可以写成“192.168.16.189/24 dev eth1”这样的形式,而 Keepalived 会使用 IP 命令“ip addr add 192.168.16.189/24 dev eth1”将 IP 信息添加到系统中。因此,这里的配置规则和 IP 命令的使用规则是一致的。

- virtual_routes 和 virtual_ipaddress 段一样,用来设置在切换时添加或删除相关路由信息。使用方法和例子可以参考上面的示例。通过“ip route”命令可以查看路由信息是否添加成功,此外,也可以通过上面介绍的 notify_master 选项来代替 virtual_routes 实现相同的功能。

- nopreempt 设置的是高可用集群中的不抢占功能。在一个 HA Cluster 中,如果主节点死机了,备用节点会进行接管,主节点再次正常启动后一般会自动接管服务。这种来回切换的操作,对于实时性和稳定性要求不高的业务系统来说,还是可以接受的,而对于稳定性和实时性要求很高的业务系统来说,不建议来回切换,毕竟服务的切换存在一定的风险和不稳定性,在这种情况下,就需要设置 nopreempt 这个选项了。设置 nopreempt 可以实现主节点故障恢复后不再切回到主节点,让服务一直在备用节点工作,直到备用节点出现故障才会进行切换。在使用不抢占时,只能在“state”状态为 BACKUP 的节点上设置,而且这个节点的优先级必须高于其他节点。

- preemtp_delay 用于设置抢占的延时时间,单位是秒。有时候系统启动或重启之后网络需要经过一段时间才能正常工作,在这种情况下进行主备切换是没必要的,此选项就是用来设置这种情况发生的时间间隔。在此时间内发生的故障将不会进行切换,而如果超过 preemtp_delay 指定的时间,并且网络状态异常,那么才开始进行主备切换。

11.2.4 Keepalived 的 LVS 配置

由于 Keepalived 属于 LVS 的扩展项目,因此,Keepalived 可以与 LVS 无缝整合,轻松搭建一套高性能的负载均衡集群系统。下面介绍 Keepalived 配置文件中关于 LVS 配置段的配置方法。

LVS 段的配置以“virtual_server”作为开始标识,此段内容由两部分组成,分别是 real_server 段和健康检测段。下面是 virtual_server 段常用选项的一个配置示例:

virtual_server 192.168.12.200 80 {        
  delay_loop 6
  lb_algo rr    
  lb_kind DR 
  persistence_timeout 50
  persistence_granularity  <NETMASK>
  protocol TCP
  ha_suspend
  virtualhost  <string>   
  sorry_server <IPADDR>  <PORT>

上述示例中每个选项的含义如下。

- virtual_server:是设置虚拟服务器开始的标识,后面跟虚拟 IP 地址和服务端口,IP 与端口之间用空格隔开。

- delay_loop:设置健康检查的时间间隔,单位是秒。

- lb_algo:设置负载调度算法,可用的调度算法有 rr、wrr、lc、wlc、lblc、sh、dh 等,常用的算法有 rr 和 wlc。

- lb_kind:设置 LVS 实现负载均衡的机制,有 NAT、TUN 和 DR 三个模式可选。

- persistence_timeout:会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的 session 共享提供了一个很好的解决方案。有了这个会话保持功能,用户的请求会一直分发到某个服务节点,直到超过这个会话的保持时间。需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果在 50s 内没有执行任何操作,那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受 50s 的时间限制。

- persistence_granularity:此选项是配合 persistence_timeout 的,后面跟的值是子网掩码,表示持久连接的粒度。默认是 255.255.255.255,也就是一个单独的客户端 IP。如果将掩码修改为 255.255.255.0,那么客户端 IP 所在的整个网段的请求都会分配到同一台 real server 上。

- protocol:指定转发协议类型,有 TCP 和 UDP 两种可选。

- ha_suspend:节点状态从 MASTER 到 BACKUP 切换时,暂不启用 real server 节点的健康检查。

- virtualhost:在通过 HTTP_GET/SSL_GET 做健康检测时,指定的 Web 服务器的虚拟主机地址。

- sorry_server:相当于一个备用节点,在所有 real server 失效后,这个备用节点会启用。

下面是 real_server 段的一个配置示例:

real_server 192.168.12.132 80 {
weight 3
inhibit_on_failure
notify_up  <STRING> | <QUOTED-STRING>
notify_down <STRING> | <QUOTED-STRING>
}

上述示例中每个选项的含义如下。

- real_server:是设置 real_server 段开始的标识,用来指定 real server 节点,后面跟的是 real server 的真实 IP 地址和端口,IP 与端口之间用空格隔开。

- weight:用来配置 real server 节点的权值。权值大小用数字表示,数字越大,权值越高。设置权值的大小可以为不同性能的服务器分配不同的负载,为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源。

- inhibit_on_failure:表示在检测到 real server 节点失效后,把它的“weight”值设置为 0,而不是从 IPVS 中删除。

- notify_up:此选项与上面介绍过的 notify_maser 有相同的功能,后跟一个脚本,表示在检测到 real server 节点服务处于 UP 状态后执行的脚本。

- notify_down:表示在检测到 real server 节点服务处于 DOWN 状态后执行的脚本。

健康检测段允许多种检查方式,常见的有 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK、MISC_CHECK。首先看 TCP_CHECK 检测方式示例:

TCP_CHECK  {
            connect_port 80
            connect_timeout  3 
            nb_get_retry  3 
            delay_before_retry  3 
        }  

上述检测示例中每个选项的含义如下。

- connect_port:健康检查的端口,如果不指定,默认是 real_server 指定的端口。

- connect_timeout:表示无响应超时时间,单位是秒,这里是 3s 超时。

- nb_get_retry:表示重试次数,这里是 3 次。

- delay_before_retry:表示重试间隔,这里是间隔 3s。

下面是 HTTP_GET 和 SSL_GET 检测方式的示例:

HTTP_GET |SSL_GET
  {
         url  {         
         path  /index.html
         digest  e6c271eb5f017f280cf97ec2f51b02d3
         status_code   200 
}
  connect_port 80
  bindto  192.168.12.80 
  connect_timeout  3
  nb_get_retry  3 
  delay_before_retry  2 
} 

上述示例中每个选项的含义如下。

- url:用来指定 HTTP/SSL 检查的 URL 信息,可以指定多个 URL。

- path:后跟详细的 URL 路径。

- digest:SSL 检查后的摘要信息,这些摘要信息可以通过 genhash 命令工具获取。例如:genhash -s 192.168.12.80-p 80-u/index.html。

- status_code:指定 HTTP 检查返回正常状态码的类型,一般是 200。

- bindto:表示通过此地址来发送请求对服务器进行健康检查。

下面是 MISC_CHECK 检测方式的示例:

MISC_CHECK
{
misc_path  /usr/local/bin/script.sh
misc_timeout  5
!misc_dynamic
}

MISC 健康检查方式可以通过执行一个外部程序来判断 real server 节点的服务状态,使用非常灵活。以下是常用的几个选项的含义。

- misc_path:用来指定一个外部程序或者一个脚本路径。

- misc_timeout:设定执行脚本的超时时间。

- misc_dynamic:表示是否启用动态调整 real server 节点权重,“!misc_dynamic”表示不启用,相反则表示启用。在启用这个功能后,Keepalived 的 healthchecker 进程将通过退出状态码来动态调整 real server 节点的 weight 值,如果返回状态码为 0,表示健康检查正常,real server 节点权重保持不变;如果返回状态码为 1,表示健康检查失败,那么将 real server 节点权重设置为 0;如果返回状态码为 2~255 之间任意数值,表示健康检查正常,但 real server 节点的权重将被设置为返回状态码减 2,例如返回状态码为 10,real server 节点权重将被设置为 8(10-2)。

到这里为止,Keepalived 配置文件中常用的选项已经介绍完毕。在默认情况下,Keepalived 在启动时会查找/etc/Keepalived/Keepalived.conf 配置文件,如果配置文件放在其他路径下,通过“Keepalived -f”参数指定配置文件的路径即可。

在配置 Keepalived.conf 时,需要特别注意配置文件的语法格式,因为 Keepalived 在启动时并不检测配置文件的正确性,即使没有配置文件,Keepalived 照样能够启动,所以一定要保证配置文件正确。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。