本章主要内容:
在这个高度信息化的IT时代,企业的生产系统,业务运营,销售和支持,以及日常管理等环节越来越依赖于计算机和服务,对于高可用(HA)技术的应用需求不断提高,以便提供持续的,不间断的计算机系统或网络服务。
本章将学习如何使用 Keepalived 实现双机热备,包括针对IP地址的故障切换,以及在 LVS 高可用群集中的热备应用
Keepalived 起初是专门针对LVS 设计的一款强大的辅助工具,主要用来提供故障切换(Failover)和健康检查(Health Checking)功能——判断 LVS 负载调度器,节点服务器的可用性,及时隔离并替换新的服务器,当故障主机恢复后将其重新加入群集
Keepalived 的官方网站位于 http://www.keepalived.org/ 本章将以yum 方式讲解 Keepalived 的安装,配置和使用过程,在非 LVS 群集环境中使用时,Keepalived 也可以作为热备软件使用。
Keepalived 采用 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)热备份,以软件的方式实现 Linux 服务器的多机热备功能,VRRP 时针对路由器的一种备份解决方案--由多台路由器组成一个热备组,通过共用的虚拟IP 地址对外提供服务:每个热备组内同一时只有一台路由器提供服务,其他路由器处于冗余状态,若当前在线的路由器失效,则其他路由器会自动接替(优先级决定接替顺序)虚拟IP,以继续提供服务 如图所示
热备组内的每台路由器都可能成为主路由器,虚拟路由器的IP地址(VIP)可以在热备组的路由器之间进行转移,所以也称为漂移IP地址。使用Keepalived 时,漂移地址的实现不需要手动建立虚接口配置文件(如上一章讲解的ens33:0)而是由Keepalived 根据配置文件自动管理。
在CentOS7 系统中,使用YUM 方式安装 keepalived 会自动安装keepalived 所需的软件包。除此之外,在LVS 群集环境中应用时,也需要用到 ipvsadm 管理工具
[root@Keepalived01 ~]# yum -y install keepalived ipvsadm
YUM 安装 keepalived 后,执行以下命令将 keepalived 服务设置为开机启动。
[root@Keepalived01 ~]# systemctl enable keepalived.service
基于 VRRP 的热备方式,Keepalived 可以用作服务器的故障切换,每个热备组可以有多台服务器——当然,最常用的就是双机热备了。在这种双机热备方案中,故障切换主要针对虚拟IP地址的漂移来实现,因此能够适用于各种应用服务器(不管 Web,FTP,Mail,还是SSH,DNS.....)
本小结将通过一个简单的案例来说明 Keepalived 双机热备的配置方法。其中,主,备服务器的IP地址为 192.168.182.100 和 192.168.182.101,基于漂移地址 192.168.182.200 提供Web服务
主,备服务器中都需要安装 Keepalived,具体步骤参考1.1.1节,使用YUM方式安装 httpd 提供web服务
Keepalived 服务的配置目录位于 /etc/keepalived/ 其中,Keepalived.conf 是主配置文件:另外包括一个子目录 samples/ 提供了许多配置详例作为参考。在Keepalived 的配置文件中,使用 global_defs {....} 区段指定全局参数,使用 vrrp_instance 实例名称 {....} 区段指定VRRP 热备参数,注释文件以 “ !”号开头
[root@Keepalived01 ~]# systemctl stop firewalld
[root@Keepalived01 ~]# cd /etc/keepalived/
[root@Keepalived01 keepalived]# cp keepalived.conf keepalived.conf.bak
[root@Keepalived01 keepalived]# vim keepalived.conf
global_defs {
router_id Keepalived01 //本路由器(服务器)的名称
}
vrrp_instance VI_1 { //定义VRRP 热备实例
state MASTER //热备状态,MASTER 表示主服务器
interface ens33 //承载VIP接口的 ID 号,每个热备组保存一致
virtual_router_id 1 //虚拟路由器的ID号,每个热备组保持一致
priority 100 //优先级,数值越大优先级越高
advert_int 1 //通告间隔秒数(心跳频率)
authentication { //认证信息,每个热备组保持一致
auth_type PASS //认证类型
auth_pass 1111 //密码字串
}
virtual_ipaddress {
192.168.182.200 //指定漂移地址(VIP)可以多有个
}
}
确认上述配置无误,然后启动Keepalived 服务,实际状态为 master 的主服务器将为 ens33 接口自动添加 VIP 地址,通过 ip 命令可以查看(注意:ifconfig 命令看不到)
[root@Keepalived01 keepalived]# systemctl start keepalived.service //启动服务
[root@Keepalived01 keepalived]# ip addr show dev ens33
2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e8:c0:2b brd ff:ff:ff:ff:ff:ff
inet 192.168.182.100/24 brd 192.168.182.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.182.200/32 scope global ens33 //自动设置的VIP地址
valid_lft forever preferred_lft forever
inet6 fe80::8898:d4ee:8e2f:474b/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@Keepalived01 keepalived]#
在同一个keepalived热备组内所有的服务器的keepalived配置文件基本相同,包括虚拟路由器的id号认证信息、漂移地址、心跳帧率等,不同之处主要在于路由器名称、热备状态、优先级、
配置备用服务器(可以有多台)时,可以参考主服务器的 keepalived.conf 配置文件内容,只要修改路由器名称,热备状态,优先级就可以了
[root@Keepalived02 ~]# systemctl stop firewalld.service
[root@Keepalived02 ~]# cd /etc/keepalived/
[root@Keepalived02 keepalived]# cp keepalived.conf keepalived.conf.bak
[root@Keepalived02 keepalived]# vim keepalived.conf
global_defs {
router_id keepalived02 //本路由器(服务器)名称
}
vrrp_instance VI_1 {
state BACKUP //备份状态为BACKUP
interface ens33
virtual_router_id 1
priority 99 //优先级,数值低于主服务器
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.182.200
}
}
确认配置无误,一样需要启动 Keepalived 服务,此时主服务器任然在线,VIP地址实际上任然由主服务器控制,其他服务器处于备用状态,因此在备用服务器中将不会有 ens33 添加VIP 地址
[root@Keepalived02 keepalived]# systemctl start keepalived.service
[root@Keepalived02 keepalived]# ip addr show dev ens33
2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:10:f2:b6 brd ff:ff:ff:ff:ff:ff
inet 192.168.182.101/24 brd 192.168.182.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::47b8:3cc0:3783:e45f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@Keepalived02 keepalived]#
Keepalived 的日志消息保存在 /var/log/messages 文件中,在测试主,备故障自动切换功能时,可以跟踪此日志文件来观察备份状态的变化。以针对连通性和 Web 服务的测试为例,主要操作如下所述。
在客户机中执行 ping -t 192.168.182.200 命令,能够正常,持续ping通,根据以下操作继续观察测试结果
(1)停止启用主服务器的Keepalived 服务器,发现ping测试只中断了 1 或 2 个包即恢复正常,说明已有其他服务器接替 VIP地址,并及时响应客户机请求。可以看到主服务器没用ens33这个VIP控制权了
[root@Keepalived01 keepalived]# systemctl stop keepalived.service
[root@Keepalived01 keepalived]# ip addr show dev ens33
2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e8:c0:2b brd ff:ff:ff:ff:ff:ff
inet 192.168.182.100/24 brd 192.168.182.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::8898:d4ee:8e2f:474b/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@Keepalived01 keepalived]#
可以看到备用服务器已经夺取VIP控制权
[root@Keepalived02 keepalived]# ip addr show dev ens33
2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:10:f2:b6 brd ff:ff:ff:ff:ff:ff
inet 192.168.182.101/24 brd 192.168.182.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.182.200/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::47b8:3cc0:3783:e45f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@Keepalived02 keepalived]#
(2)重新启动主服务器的 Keepalived 服务,发现 ping 测试只中断了 1 或 2 个包即恢复正常,说明主服务器已恢复正常,并夺回 VIP 地址的控制权
再次使用 ip addr show dev ens33 查看主,备服务器可以看到VIP已经重新被主服务器夺回控制权
在客户机中访问 http://192.168.182.200 ,将看到由主服务器 192.168.182.100 提供的网页文档
(1)停止启用主服务器的 Keepalived 服务,再次访问上述 Web 服务,将看到由备用服务器192.168.182.101 提供的网页文档,说明 VIP 地址以切换至备用服务器
(2)在重启启用主服务器的 Keepalived 服务,再次访问上述 Web 服务,将看到重新由主服务器192.168.182.100 提供的晚饭也文档,说明主服务器已重新夺取VIP 地址
在执行主,备服务器故障切换的过程中,分别观察各自的 /var/log/messages 日志文件,可以看到MASTER,SLAVE 状态迁移记录
(1)主服务器中 Keepalived 服务状态先变为 stop 移除 VIP 地址,恢复后重新变更为 MASTER
[root@Keepalived01 keepalived]# less /var/log/messages
通过上述测试过程,可以发现双机热备已经正常,客户机只要通过 VIP 地址就可以访问服务器所提供的 Web 等应用,其中任何一台服务器失效,另一台将会立即接替服务,从而实现调高可用性。实际应用时,注意主,备服务器所提供的 Web 服务内容要保存一致
Keepalived 的设计目标时构建高可用的 LVS 负载均衡群集,可以调用 ipvsadm 工具来创建虚拟服务器,管理服务器池,而不仅仅用作双机热备,使用,Keepalived 构建 LVS 群集更加简单易用,主要优势体现在:对 LVS 负载调度器实现热备切换,提高可用性:对服务器池中的节点进行健康检查,自动移除失效节点,恢复后再重新加入
在基于LVS+Keepalived 群集结构中,至少包括两台热备的负载均衡调度器,三台以上的节点服务器。本节将以 DR 模式的 LVS 群集为基础,增加一台从负调度器,使用 Keepalived 来实现主,从调度器的热备,从而构建兼有负载均衡,糕可用两种能力的 LVS 网站群集平台,如图
使用 Keepalived 构建 LVS 群集时,也需要用到 ipvsadm 管理工具,但大部分工作会由 Keepalived 自动完成,不需要手动执行 ipvsadm (除了查看和监控群集以为)
首先为主,从调度器实现热备功能,漂移地址使用LVS 群集的 VIP地址
[root@Keepalived01 ~]# vim /etc/keepalived/keepalived.conf
[root@Keepalived01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id Keepalived01
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 1
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.182.200
}
}
[root@Keepalived01 ~]#
在Keepalived 的热备配置基础上添加 virtual_server VIP 端口 {.....} 区段来配置虚拟服务器主要包括对负载调度算法,群集工作模式,健康检查间隔,真实服务器地址等参数的设置
[root@Keepalived01 ~]# vim /etc/keepalived/keepalived.conf
virtual_server 192.168.182.200 80 { //虚拟服务器地址(VIP)端口
delay_loop 15 //健康检查的时间间隔(秒)
lb_algo rr //轮询rr调度算法
lb_kind DR //直接路由DR群集工作模式
persistence_timeout 60 //连接保持时间(秒) 若启用请去掉!号
protocol TCP //应用服务器采用的是TCP协议
real_server 192.168.182.102 80 { //第一个Web节点的地址,端口
weight 1 //节点的权重
TCP_CHECK{ //检查健康方式
connect_port 80 //检查的目标端口
connect_timeout 3 //连接超时(秒)
nb_get_retry 3 //重试次数
delay_before_retry 4 //重试间隔(秒)
}
}
real_server 192.168.182.103 80 { //第二个Web节点的地址,端口
weight 1
TCP_CHECK{
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
}
[root@Keepalived01 ~]# systemctl restart keepalived.service
从调度器的配置与主调度器基本相同,也包括全局配置,热备配置,服务器池配置,只需要调整 router_id state priority 参数即可,其余内容完全相同。配置完成以后重启 Keepalived 服务
[root@Keepalived02 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id keepalived02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 1
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.182.200
persistence_timeout 60
protocol TCP
real_server 192.168.182.102 80 {
weight 1
TCP_CHECK{
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
real_server 192.168.182.103 80 {
weight 1
TCP_CHECK{
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 4
}
}
}
[root@Keepalived02 ~]# systemctl restart keepalived.service
[root@Keepalived01 ~]# vim /etc/sysctl.conf
[root@Keepalived01 ~]# cat /etc/sysctl.conf | grep net
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@Keepalived01 ~]# sysctl -p
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@Keepalived01 ~]# systemctl restart keepalived.service
[root@Keepalived02 ~]# cat /etc/sysctl.conf | grep net
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@Keepalived02 ~]# sysctl -p
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@Keepalived02 ~]# systemctl restart keepalived.service
[root@node01 ~]# vim /etc/sysctl.conf
[root@node01 ~]# cat /etc/sysctl.conf | grep net
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@node01 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@node01 ~]# cd /etc/sysconfig/network-scripts/
[root@node01 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@node01 network-scripts]# vim ifcfg-lo:0
[root@node01 network-scripts]# vim ifcfg-lo:0
[root@node01 network-scripts]# cat ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.182.200
NETMASK=255.255.255.255
ONBOOT=yes
[root@node01 network-scripts]# ifup ifcfg-lo:0
[root@node01 network-scripts]# ifconfig lo:0
lo:0: flags=73 mtu 65536
inet 192.168.182.200 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
[root@node01 network-scripts]#
提供 RPC 支持的服务为 rpcbind,提供 NFS 共享的服务为 nfs,完成安装以后建议调整这两个服务的自启动状态,以便每次开机后自动启用。手动加载 NFS 共享服务时,应该先启动 rpcbind,再启动 nfs。
[root@NFS ~]# yum -y install nfs-utils rpcbind
[root@NFS ~]# systemctl enable nfs
[root@NFS ~]# systemctl enable rpcbind
NFS 的配置文件为/etc/exports,文件内容默认为空(无任何共享)。在 exports 文件中设置共享资源时,记录格式为“目录位置客户机地址(权限选项)”。例如,若要将文件夹/opt/wwwroot 共享给 192.168.182.0/24 网段使用,允许读写操作,具体配置如下所示
[root@NFS ~]# mkdir /aaa
[root@NFS ~]# vim /etc/exports
[root@NFS ~]# cat /etc/exports
/aaa 192.168.182.0/24(rw,sync,no_root_squash)
[root@NFS ~]# systemctl start rpcbind
[root@NFS ~]# systemctl start nfs
[root@NFS ~]# netstat -anpt | grep rpc
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 67104/rpcbind
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 67238/rpc.mountd
tcp 0 0 0.0.0.0:33982 0.0.0.0:* LISTEN 67235/rpc.statd
tcp6 0 0 :::50091 :::* LISTEN 67235/rpc.statd
tcp6 0 0 :::111 :::* LISTEN 67104/rpcbind
tcp6 0 0 :::20048 :::* LISTEN 67238/rpc.mountd
[root@NFS ~]#
[root@NFS ~]# showmount -e
Export list for NFS:
/aaa 192.168.182.0/24
[root@NFS ~]#
NFS 协议的目标是提供一种网络文件系统,因此对 NFS 共享的访问也使用 mount 命令来进行挂载,对应的文件系统类型为 nfs。既可以手动挂载,也可以加入/etc/fstab 配置文件来实现开机自动挂载。考虑到群集系统中的网络稳定性,NFS 服务器与客户机之间最好使用专有网络进行连接。
若要正常访问 NFS 共享资源,客户机中也需要安装 rpcbind 软件包,并启动 rpcbind 系统服务。另外,为了使用 showmount 查询工具,建议将 nfs-utils 软件包也一并装上
[root@node01 ~]# yum -y install rpcbind nfs-utils
[root@node01 ~]# systemctl enable rpcbind
[root@node01 ~]# systemctl start rpcbind
如果已经安装了 nfs-utils 软件包,则客户机也可以使用 showmount 查看 NFS 服务器端共享了哪些目录,查询格式为“showmount -e 服务器地址
[root@node01 ~]# showmount -e 192.168.182.105
Export list for 192.168.182.105:
/aaa 192.168.182.0/24
[root@node01 ~]#
[root@node01 ~]# yum -y install httpd
[root@node01 ~]# mount 192.168.182.105:/aaa /var/www/html/
[root@node01 ~]# vim /var/www/html/index.html
[root@node01 ~]# cat /var/www/html/index.html
Hello Word
[root@node01 ~]#
[root@node02 ~]# mount 192.168.182.105:/aaa /var/www/html/
[root@node01 ~]# systemctl enable httpd
[root@node01 ~]# systemctl start httpd
修改/etc/fstab 配置文件,加入 NFS 共享目录的挂载设置。注意将文件系统类型设为 nfs,挂载参数建议添加_netdev(设备需要网络)。若添加 soft、intr 参数可以实现软挂载,允许在网络中断时放弃挂载。这样,客户机就可以在每次开机后自动挂载 NFS 共享资源了。
[root@node01 ~]# vim /etc/fstab
[root@node01 ~]# cat /etc/fstab | grep nfs
192.168.182.105:/aaa /var/www/html nfs defaults,netdev 0 0
[root@node01 ~]#
在客户机的浏览器中,能够通过LVS+Keepalived 群集的 VIP 地址(192.168.182.200)正常访问Web 页面内容。当主,从调度器任何一个失效时,Web站点任然何以访问(可能需要刷新或者重新打开浏览器)只需服务器池有两台及以上的真实服务器可用,就可以实现访问量的负载均衡。
通过主,从调度器的 /var/log/messages 日志文件,可以追踪故障切换过程,若要查看负载分配情况,可以执行 ipvsadm-ln 或 ipvsadm -lnc 等操作。最终可以验证 LVS+Keepalived 高可用负载均衡群集的健壮性
[root@Keepalived01 ~]# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 00:28 NONE 192.168.182.1:0 192.168.182.200:80 192.168.182.102:80
TCP 00:52 FIN_WAIT 192.168.182.1:59054 192.168.182.200:80 192.168.182.102:80
TCP 01:21 FIN_WAIT 192.168.182.1:59194 192.168.182.200:80 192.168.182.102:80
TCP 00:50 FIN_WAIT 192.168.182.1:59193 192.168.182.200:80 192.168.182.102:80
[root@Keepalived01 ~]#