CentOS 7.6 集群架构之部署LVS(DR模式)+Keepalive实现双机热备

一、LVS集群DR模式

LVS-DR 集群 LVS-DR(Linux Virtual Server Director Server)工作模式,是生产环境中最常用的一 种工作模式。

1、LVS-DR 工作原理

LVS-DR 模式,Director Server 作为群集的访问入口,不作为网关使用,节点 Director Server 与 Real Server 需要在同一个网络中,返回给客户端的数据不需要经过 Director Server。为了响应对整个群集的访问,Director Server 与 Real Server 都需要配置 VIP 地址
在这里插入图片描述

2、数据包流向分析

  1. 客户端发送请求到 Director Server,请求的数据报文(源 IP 是 CIP,目标 IP 是 VIP) 到达内核空间。
  2. Director Server 和 Real Server 在同一个网络中,数据通过二层数据链路层来传输。
  3. 内核空间判断数据包的目标 IP 是本机 VIP,此时 IPVS 比对数据包请求的服务是否 是集群服务,是集群服务就重新封装数据包。修改源 MAC 地址为 Director Server 的 MAC 地址,修改目标 MAC 地址为 Real Server 的 MAC 地址,源 IP 地址与目标 IP 地址没有改变,然后将数据包发送给 Real Server。
  4. 到达 Real Server 的请求报文的 MAC 地址是自身的 MAC 地址,就接收此报文。数 据包重新封装报文(源 IP 地址为 VIP,目标 IP 为 CIP),将响应报文通过 lo 接口传送给物理 网卡然后向外发出。 5. Real Server 直接将响应报文传送到客户端

3、LVS-DR 模式特点

  • Director Server 和 Real Server 必须在同一个物理网络中。
  • Real Server 可以使用私有地址,也可以使用公网地址。如果使用公网地址,可以通过互联网对 RIP 进行直接访问。
  • 所有的请求报文经由 Director Server,但回复响应报文不能经过 Director Server。
  • Real Server 的网关不允许指向 Director Server IP,即不允许数据包经过 Director Server。
  • Real Server 上的 lo 接口配置 VIP 的 IP 地址。

二、Keepalived双机热备

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

1、Keepalived 的热备方式

Keepalived 采用 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议) 热备份协议,以软件的方式实现 Linux 服务器的多机热备功能。

VRRP 是针对路由器的一种备份解决方案——由多台路由器组成一个热备组,通过共用的虚拟 IP 地址对外提供服务; 每个热备组内同一时刻只有一台主路由器提供服务,其他路由器处于冗余状态。

若当前在线的路由器失效,则其他路由器会自动接替(优先级决定接替顺序)虚拟 IP 地址,以继续提供服务,热备组内的每台路由器都可能成为主路由器,虚拟路由器的 IP 地址(VIP)可以在热备组内的路由器之间进行转移,所以也称为漂移 IP 地址。

使用 Keepalived 时,漂移地址的实现不需要手动建立虚接口配置文件(如 ens33∶0),而是由 Keepalived 根据配置文件自动管理。

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

三、案例部署

1、案例场景

公司内部有两台web服务器作为双机热备,共同提供网站服务,而web服务器的上面又有两台lvs服务器提供负载均衡的服务,可以调度两台web服务器一起轮询工作

2、准备工作

两台lvs服务器(dr):
dr1:192.168.192.204
dr2:192.168.192.205

两台web服务器:
web1:192.168.192.206
web2:192.168.192.207

客户机(win7):
192.168.192.100

全部主机网络都是仅主机模式,绑定vm1网卡

3、具体步骤

---------------------------------------------配置两台dr--------------------------------------------
安装keepalived和ipvsadm软件

[root@dr1 ~]# yum -y install keepalived ipvsadm

对于 DR 群集模式来说,由于 LVS 负载调度器和各节点需要共用 VIP 地址,应该关闭 Linux 内核的重定向参数响应。将相关参数写进sysctl.conf文件里

[root@dr1 ~]# vim /etc/sysctl.conf
[root@dr1 ~]# 
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
[root@dr1 ~]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0

添加虚拟网卡vip:ens33:0

[root@dr1 ~]# cd /etc/sysconfig/network-scripts/
[root@dr1 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33:0
[root@dr1 network-scripts]# vim ifcfg-ens33:0
DEVICE=ens33:0
IPADDR=192.168.192.10
NETMASK=255.255.255.0
ONBOOT=yes

新建ipvs的service控制管理脚本,写入相关配置,可以用service直接启动并关闭ipvs服务和配置

[root@dr1 ~]# vim /etc/init.d/dr.sh
#!/bin/bash
GW=192.168.192.2    ##网关
VIP=192.168.192.10   ##虚拟ip
RIP1=192.168.192.206 ##真实web服务器ip
RIP2=192.168.192.207
case "$1" in
start)
                /sbin/ipvsadm --save > /etc/sysconfig/ipvsadm  ##保存配置
                systemctl start ipvsadm  ##启动ipvs服务
                /sbin/ifconfig ens33:0 $VIP broadcast $VIP netmask 255.255.255.255 broadcast $VIP up
##设置ens33:0地址,广播地址,子网掩码,并开启
                /sbin/route add -host $VIP dev ens33:0  ##添加路由网段信息
                /sbin/ipvsadm -A -t $VIP:80 -s rr ##指定虚拟服务访问入口,指定轮询算法
                /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g ##指定真实服务器,dr模式
                /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
                echo "ipvsadm starting --------------------[ok]"
                ;;
stop)
                /sbin/ipvsadm -C   ##清空缓存
                systemctl stop ipvsadm  ##关闭服务
                ifconfig ens33:0 down  ##关闭接口
                route del $VIP   ##删除路由信息
                echo "ipvsamd stoped----------------------[ok]"
                 ;;
status)
                if [ ! -e /var/lock/subsys/ipvsadm ];then  ##判断文件存在与否决定状态
                echo "ipvsadm stoped---------------"
                exit 1
                                else
                                echo "ipvsamd Runing ---------[ok]"
                fi
                ;;
*)
                echo "Usage: $0 {start|stop|status}"
                exit 1
esac
exit 0

给脚本添加执行权限

[root@dr1 ~]# chmod +x /etc/init.d/dr.sh

重启网卡,如果没有ens33:0,检查Networkmanager是否开启,建议开启

[root@dr1 ~]# systemctl restart network

启动ipvs服务

[root@dr1 ~]# service dr.sh start
ipvsadm starting --------------------[ok]

---------------------------------------配置2台web节点服务器---------------------------------

安装apache

[root@web1 ~]# yum -y install httpd

创建主页(为了验证轮询访问每台web服务器设置不同的web主页)

[root@web1 ~]# vim /var/www/html/index.html

<h1>this is yjs web</h1>   <-----web1网页内容为“this is yjs web”

[root@web2 ~]# vim /var/www/html/index.html

<h1>this is cloud web</h1>  <-----web2网页内容为“this is cloud web”

配置虚拟ip,需要在loopback口上做虚拟ip

[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# cp -p ifcfg-lo ifcfg-lo:0
[root@web1 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.192.10
NETMASK=255.255.255.0
ONBOOT=yes

配置抑制ARP响应并运行,否则会造成arp紊乱

vim /etc/init.d/web.sh
#!/bin/bash
VIP=192.168.192.10
                case "$1" in
                start)
                                ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
                                /sbin/route add -host $VIP dev lo:0
                                echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore   '//arp忽略'
                                echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
                                echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
                                echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
                                sysctl -p >/dev/null 2>&1
                                echo "RealServer Start OK "
                                ;;
                stop)
                                ifconfig lo:0 down
                                route del $VIP /dev/null 2>&1
                                echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore '//arp开启'
                                echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
                                echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
                                echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
                                echo "RealServer Stopd"
                                ;;
                *)
                                echo "Usage: $0 {start|stop}"
                                exit 1
                esac
                exit 0
[root@web1 ~]# chmod +x /etc/init.d/web.sh

启动各服务

重启网卡
[root@web1 ~]# systemctl restart network
运行web.sh
[root@web1 ~]# service web.sh start
启动apache
[root@web1 ~]# systemctl start httpd

-----------------------------------------两台dr配置keepalived--------------------------------

vim /etc/keepalived/keepalived.conf    <------keepalived配置文件

! 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 127.0.0.1    <-----修改为本机
   smtp_connect_timeout 30
   router_id LVS_01   <-----每台节点的router_id不能一样
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {     
    state MASTER    <-----一台为MASTER另一台配置为BACKUP
    interface ens33  <-----指定监测网络的接口
    virtual_router_id 10   <-----虚拟id两台必须一样
    priority 100   <-----master的优先级要高于backup的
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.192.10  <-----指定虚拟ip地址
        }
}

virtual_server 192.168.192.10 80 {   <-----指定虚拟ip和监听端口
    delay_loop 6
    lb_algo rr
    lb_kind DR     <-----LVS集群模式,本次测试使用的是DR
    persistence_timeout 50
    protocol TCP

    real_server 192.168.192.206 80 {   <-----指定web服务器的真实地址和监听端口
        weight 1   <-----设置权重,权值大小用数字表示,数字越大,权值越高
           TCP_CHECK {    <-----状态检测设置部分,单位是秒
           connect_port 80    <-----连接端口
           connect_timeout 3   <-----3秒无响应超时
           retry 3   <-----重试次数
           delay_before_retry 3   <-----重试间隔
}
        }



    real_server 192.168.192.207 80 {   <-----指定web服务器的真实地址和监听端口
        weight 1
           TCP_CHECK {
           connect_port 80
           connect_timeout 3
           retry 3
           delay_before_retry 3
}
        }

}

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

在默认情况下,Keepalived在启动时会查找/etc/Keepalived/Keepalived.conf配置文件,如果你的配置文件放在了其它路径下,可以通过“Keepalived -f”参数指定你所在的配置文件路径即可。

scp 把keepalived.conf拷贝到第二台dr

[root@dr1 ~]# scp /etc/keepalived/keepalived.conf root@192.168.192.205:/etc/keepalived/
The authenticity of host '192.168.192.205 (192.168.192.205)' can't be established.
ECDSA key fingerprint is SHA256:QCOsA0XD57k2co0SRRBP24vCukCX71mIL+kiueadeFI.
ECDSA key fingerprint is MD5:9c:16:7b:db:88:5f:22:30:d3:5a:3d:a6:8e:ac:5c:e4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.192.205' (ECDSA) to the list of known hosts.
root@192.168.192.205's password: 
keepalived.conf                                                                            100% 1175   970.6KB/s   00:00    

修改配置文件的以下3个值

vim /etc/keepalived/keepalived.conf
router_id LVS_02
state BACKUP
priority 90

两台dr启动keepalived

[root@dr1 ~]# systemctl start keepalived.service 

4、客户机验证

首先ping虚拟ip可以ping通

在这里插入图片描述

访问虚拟ip网页,分别显示了2个页面

在这里插入图片描述

在这里插入图片描述
这时,我们关闭其中一台web2的apache服务,查看日志
在这里插入图片描述
再次访问虚拟ip,可以看到访问的是web1的主页
在这里插入图片描述
然后也关闭web1的apache服务,访问不到网页了,因为两台web服务器都挂了
在这里插入图片描述
这时,我们重新开启web1的apache服务,可以从日志看到,keepalive立即检测到该地址
在这里插入图片描述
客户机再次访问虚拟ip的网页,显示了web1的网页
在这里插入图片描述
故障排查见这篇博客:故障排错——LVS+Keepalive高可用集群架构部署

猜你喜欢

转载自blog.csdn.net/shengjie87/article/details/108354409