Keepalived 双机热备

本章主要内容:

  • Keepalived 双机热备基础知识
  • 学会构建双机热备系统
  • 学会构建LVS+HA 高可用群集

简介

        在这个高度信息化的IT时代,企业的生产系统,业务运营,销售和支持,以及日常管理等环节越来越依赖于计算机和服务,对于高可用(HA)技术的应用需求不断提高,以便提供持续的,不间断的计算机系统或网络服务。

        本章将学习如何使用 Keepalived 实现双机热备,包括针对IP地址的故障切换,以及在 LVS 高可用群集中的热备应用

1.1 Keepalived 双机热备基础知识

        Keepalived 起初是专门针对LVS 设计的一款强大的辅助工具,主要用来提供故障切换(Failover)和健康检查(Health Checking)功能——判断 LVS 负载调度器,节点服务器的可用性,及时隔离并替换新的服务器,当故障主机恢复后将其重新加入群集

1.1.1Keepalived 概述及安装

        Keepalived 的官方网站位于 http://www.keepalived.org/ 本章将以yum 方式讲解 Keepalived 的安装,配置和使用过程,在非 LVS 群集环境中使用时,Keepalived 也可以作为热备软件使用。

1.Keepalived 的热备方式

        Keepalived 采用 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)热备份,以软件的方式实现 Linux 服务器的多机热备功能,VRRP 时针对路由器的一种备份解决方案--由多台路由器组成一个热备组,通过共用的虚拟IP 地址对外提供服务:每个热备组内同一时只有一台路由器提供服务,其他路由器处于冗余状态,若当前在线的路由器失效,则其他路由器会自动接替(优先级决定接替顺序)虚拟IP,以继续提供服务 如图所示

Keepalived 双机热备_第1张图片

        热备组内的每台路由器都可能成为主路由器,虚拟路由器的IP地址(VIP)可以在热备组的路由器之间进行转移,所以也称为漂移IP地址。使用Keepalived 时,漂移地址的实现不需要手动建立虚接口配置文件(如上一章讲解的ens33:0)而是由Keepalived 根据配置文件自动管理。

2.Keepalived 的安装与服务控制
1)安装Keepalived

        在CentOS7 系统中,使用YUM 方式安装 keepalived 会自动安装keepalived 所需的软件包。除此之外,在LVS 群集环境中应用时,也需要用到 ipvsadm 管理工具

[root@Keepalived01 ~]# yum -y install keepalived ipvsadm
2)控制 Keepalived 服务

YUM 安装 keepalived 后,执行以下命令将 keepalived 服务设置为开机启动。

[root@Keepalived01 ~]# systemctl enable keepalived.service 

1.1.2 使用 Keepalived 实现双机热备

        基于 VRRP 的热备方式,Keepalived 可以用作服务器的故障切换,每个热备组可以有多台服务器——当然,最常用的就是双机热备了。在这种双机热备方案中,故障切换主要针对虚拟IP地址的漂移来实现,因此能够适用于各种应用服务器(不管 Web,FTP,Mail,还是SSH,DNS.....)

        本小结将通过一个简单的案例来说明 Keepalived 双机热备的配置方法。其中,主,备服务器的IP地址为 192.168.182.100 和 192.168.182.101,基于漂移地址 192.168.182.200 提供Web服务

Keepalived 双机热备_第2张图片

        主,备服务器中都需要安装 Keepalived,具体步骤参考1.1.1节,使用YUM方式安装 httpd 提供web服务

1.主服务器的配置

        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]# 
2.备份服务器的配置

        在同一个keepalived热备组内所有的服务器的keepalived配置文件基本相同,包括虚拟路由器的id号认证信息、漂移地址、心跳帧率等,不同之处主要在于路由器名称、热备状态、优先级、

  • 路由器名称(router_id)建议为每个参与热备份服务器指定不同的名称
  • 热备状态(state)至少应有一台主服务器,将状态设为 MASTER;可以有多台备用的服务器,将状态设置为 BACKUP
  • 优先级(priority)数值越大取得VIP 控制权的优先级越高,因此主服务器的优先级应该设为最高;其他备用服务器的优先级可以依次减递,但不要相同,以免争夺 VIP 控制权时发生冲突

        配置备用服务器(可以有多台)时,可以参考主服务器的 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]# 
3.测试双机热备功能

        Keepalived 的日志消息保存在 /var/log/messages 文件中,在测试主,备故障自动切换功能时,可以跟踪此日志文件来观察备份状态的变化。以针对连通性和 Web 服务的测试为例,主要操作如下所述。

1)测试连通性

        在客户机中执行 ping -t 192.168.182.200 命令,能够正常,持续ping通,根据以下操作继续观察测试结果

Keepalived 双机热备_第3张图片

(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]#

 Keepalived 双机热备_第4张图片

 可以看到备用服务器已经夺取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 地址的控制权

Keepalived 双机热备_第5张图片

再次使用 ip addr show dev ens33 查看主,备服务器可以看到VIP已经重新被主服务器夺回控制权 

2)Web 访问测试

在客户机中访问 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 地址

3)查看日志记录

        在执行主,备服务器故障切换的过程中,分别观察各自的 /var/log/messages 日志文件,可以看到MASTER,SLAVE 状态迁移记录

(1)主服务器中 Keepalived 服务状态先变为 stop 移除 VIP 地址,恢复后重新变更为 MASTER

[root@Keepalived01 keepalived]# less /var/log/messages

        通过上述测试过程,可以发现双机热备已经正常,客户机只要通过 VIP 地址就可以访问服务器所提供的 Web 等应用,其中任何一台服务器失效,另一台将会立即接替服务,从而实现调高可用性。实际应用时,注意主,备服务器所提供的 Web 服务内容要保存一致

1.2 LVS+Keepalived 高可用群集

        Keepalived 的设计目标时构建高可用的 LVS 负载均衡群集,可以调用 ipvsadm 工具来创建虚拟服务器,管理服务器池,而不仅仅用作双机热备,使用,Keepalived 构建 LVS 群集更加简单易用,主要优势体现在:对 LVS 负载调度器实现热备切换,提高可用性:对服务器池中的节点进行健康检查,自动移除失效节点,恢复后再重新加入

        在基于LVS+Keepalived 群集结构中,至少包括两台热备的负载均衡调度器,三台以上的节点服务器。本节将以 DR 模式的 LVS 群集为基础,增加一台从负调度器,使用 Keepalived 来实现主,从调度器的热备,从而构建兼有负载均衡,糕可用两种能力的 LVS 网站群集平台,如图

Keepalived 双机热备_第6张图片

        使用 Keepalived 构建 LVS 群集时,也需要用到 ipvsadm 管理工具,但大部分工作会由 Keepalived 自动完成,不需要手动执行 ipvsadm (除了查看和监控群集以为)

1.配置主调度器

1)配置全局。热备配置

首先为主,从调度器实现热备功能,漂移地址使用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 ~]# 
2)Web 服务器池配置

        在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
        }
    }
}

3)重启Keepalived fuwu
[root@Keepalived01 ~]# systemctl restart keepalived.service 

2.配置从调度器

        从调度器的配置与主调度器基本相同,也包括全局配置,热备配置,服务器池配置,只需要调整 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

3.主/从服务器的参数配置

1)主服务器
[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 
 2)从服务器
[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

4.Web 服务池参数配置

[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]# 

5.配置NFS共享存储

1)安装 nfs-utils,rpcbind 软件包

        提供 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
2)设置共享目录

        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)
3)启动NFS 服务程序
[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 ~]# 
4)查看本机发布的NFS 共享目录
[root@NFS ~]# showmount -e
Export list for NFS:
/aaa 192.168.182.0/24
[root@NFS ~]# 

6.在客户机中访问 NFS 共享存储

        NFS 协议的目标是提供一种网络文件系统,因此对 NFS 共享的访问也使用 mount 命令来进行挂载,对应的文件系统类型为 nfs。既可以手动挂载,也可以加入/etc/fstab 配置文件来实现开机自动挂载。考虑到群集系统中的网络稳定性,NFS 服务器与客户机之间最好使用专有网络进行连接。


1)Web池安装 rpcbind 软件包,并启动 rpcbind 服务

        若要正常访问 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 ~]# 

1.3 Web池安装 httpd 创建测试网页

1)Web池安装httpd,创建测试网页的命令如下
[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/
2)Web池启动httpd 服务程序
[root@node01 ~]# systemctl enable httpd
[root@node01 ~]# systemctl start httpd
3)Web服务器池配置 fstab 自动挂载

        修改/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 ~]# 

 

1.4 测试 LVS+Keepalived 高可用群集

        在客户机的浏览器中,能够通过LVS+Keepalived 群集的 VIP 地址(192.168.182.200)正常访问Web 页面内容。当主,从调度器任何一个失效时,Web站点任然何以访问(可能需要刷新或者重新打开浏览器)只需服务器池有两台及以上的真实服务器可用,就可以实现访问量的负载均衡。

        通过主,从调度器的 /var/log/messages 日志文件,可以追踪故障切换过程,若要查看负载分配情况,可以执行 ipvsadm-ln     或 ipvsadm -lnc 等操作。最终可以验证 LVS+Keepalived 高可用负载均衡群集的健壮性

Keepalived 双机热备_第7张图片

[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 ~]#

你可能感兴趣的:(服务器,数据库,运维)