案例:LVS+Keepalived集群

目录

Keepalived

原理

Keepalived案例

双机高可用热备案例

配置

修改配置文件

测试

严格模式测试

修改配置文件

测试

模拟故障测试

LVS+Keepalived高可用

案例拓扑图

初步配置

关闭服务

主调度器配置

健康状态检查的方式

调整内核参数

从调度器配置

服务器池配置

模拟故障


Keepalived

LVS集群的缺点就是不具备健康状态检查,而通过Keepalived就可以实现LVS的健康状态检查,如果发现有服务器故障了,就在调度策略中删除该服务器的策略

  • 是专为LVS和HA设计的一款健康状态检查工具
  • 支持故障自动切换(Failover)
  • 支持节点健康状态检查(Health Checking)

原理

  • Keepalived采用VRRP热备份协议来实现Linux服务器的多机热备功能
  • 每个热备组可以有多台服务器
  • 热备组的故障切换是由虚拟IP地址的漂移来实现,适用于各种应用服务器

Keepalived案例

  • 企业应用中,单台服务器存在单点故障的问题,单点故障一旦发生,企业服务将会中断

双机高可用热备案例

本案例用于初步了解keepalived,如果想要直接结合LVS,请往下看第二个案例

双机热备的故障切换是由虚拟IP地址的漂移来实现,适用于各种应用服务器

  • 漂移地址:192.168.10.72
  • 主、备服务器:192.168.10.101、192.168.10.102
  • 提供的应用服务:Web

操作系统

IP 地址

角色

CentOS7.9

192.168.10.101

Web服务器

CentOS7.9

192.168.10.102

Web服务器

配置

开启两个Linux虚拟机,连接上XShell,然后右键XShell终端空白处,开启会话同步

在101(Master)操作

关闭防火墙和内核安全机制,然后安装keepalived

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install keepalived

cd进入keepalived安装目录下,该工具的配置文件就在该目录下,为了防止误操作,可以备份一份配置文件

[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# ls
keepalived.conf
[root@localhost keepalived]# cp keepalived.conf  keepalived.conf.bak
修改配置文件

打开keepalived的配置文件,修改下面几个参数,然后启动服务

[root@localhost keepalived]# vim keepalived.conf
router_id LVS_01    # 第12行,router_id用于区分设备,可以重复但不建议(不影响使用)
interface ens33     # 第21行,填写本机网卡插槽名
virtual_router_id 51 # 第22行,虚拟路由id,用于划分主机到同一个热备组
192.168.10.172    # 第30行
[root@localhost keepalived]# systemctl start keepalived

然后来到第33行,切换为命令模式,按下小写字母d,再按下大写G,删除剩下的内容。

这里我们只是为2个主机做高可用的环境,那么上面的配置就够了,删除的行是为服务做健康状态检查的

关闭会话同步,为102修改作为备份服务器的配置

在102(Backup)操作

修改以下内容,启动服务

[root@localhost keepalived]# vim keepalived.conf
state BACKUP    # 第20行,角色
priority 90
    # 第23行,Backup的优先级必须比Master低
[root@localhost keepalived]# systemctl start keepalived

在101、102分别操作

在两个主机分别在启动服务后,都使用ip a命令查看有没有虚拟ip

[root@localhost keepalived]# ip a

确保101主机显示虚拟IP(192.168.10.172)而102不显示

因为Master主机才会承载虚拟IP,除非Master故障,虚拟IP漂移到Backup主机

101主机(Master):
ens33:
    inet 192.168.10.101/24
    inet 192.168.10.172/32
102主机(Backup):
ens33: 
    inet 192.168.10.102/24

测试

由于我们没有配置针对服务做健康状态检查的参数,所以我们这里需要手动暂停101(Master)主机,来模拟故障

在102(Backup)操作

然后来到Backup主机使用ip a命令,可以看到虚拟IP就过来了

2: ens33:
    inet 192.168.10.102/24
    inet 192.168.10.172/32

但是此时如果再恢复101主机,然后重启keepalived会发现虚拟IP并没有从原Backup主机回到原Master主机

[root@localhost ~]# systemctl restart keepalived

在101、102分别操作

如果为两个主机关闭NetworkManager服务

[root@localhost ~]# systemctl stop NetworkManager

然后再次模拟故障,等待101恢复正常后,再重启keepalived服务,此时虚拟IP就能飘回优先级高的主机了

[root@localhost ~]# systemctl restart keepalived    # 分别输入
101主机
2: ens33:
    inet 192.168.10.102/24
    inet 192.168.10.172/32
102主机:
2: ens33:
    inet 192.168.10.102/24

严格模式测试

此时再打开一台虚拟机(192.168.10.103)作为客户端来测试

在101、102分别操作

然后为101和102主机都安装httpd服务,启动httpd服务,关闭防火墙

[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd

在101(Master)操作

再为两个主机添加不同的网站内容

[root@localhost ~]# echo "Test Web 01" > /var/www/html/index.html

在102(Backup)操作

[root@localhost keepalived]# echo "Test Web 02" > /var/www/html/index.html

在103(客户端)测试

在客户端如果访问两个服务器的真实IP就可以访问到Web服务,但是如果访问虚拟IP,就访问不到Web服务(包括ping命令)

[root@localhost ~]# curl 192.168.10.101
Test Web 01
[root@localhost ~]# curl 192.168.10.102
Test Web 02
[root@localhost ~]# curl 192.168.10.172
^C
修改配置文件

因为keepalived是默认开启VRRP的严格模式的,严格模式启用的情况下,VRRP协议生成的VIP是不支持单播的通信

所以我们去两台主机的keepalived配置文件中把严格模式的行注释掉或者删除,然后重启服务

在101、102分别操作

[root@localhost ~]# vim /etc/keepalived/keepalived.conf
#vrrp_strict    # 第14行
保存并退出
[root@localhost ~]# systemctl restart keepalived
测试

在103(客户端)测试

此时去客户端测试,可以与虚拟IP通信了

[root@localhost ~]# curl 192.168.10.172
Test Web 01
[root@localhost ~]# ping 192.168.10.172
PING 192.168.10.172 (192.168.10.172) 56(84) bytes of data.
64 bytes from 192.168.10.172: icmp_seq=1 ttl=64 time=0.357 ms
64 bytes from 192.168.10.172: icmp_seq=2 ttl=64 time=0.219 ms
模拟故障测试

此时再暂停101(原Master)主机,让虚拟IP飘到102主机

再去客户端测试,仍然可以访问到服务,只是网页内容变了

在103(客户端)测试

[root@localhost ~]# curl 192.168.10.172
Test Web 02
[root@localhost ~]# ping 192.168.10.172
PING 192.168.10.172 (192.168.10.172) 56(84) bytes of data.
64 bytes from 192.168.10.172: icmp_seq=1 ttl=64 time=0.201 ms
64 bytes from 192.168.10.172: icmp_seq=2 ttl=64 time=0.224 ms

如果此时再恢复101主机的状态,那么访问的网页内容就会又变成101主机的内容了

这就是高可用


LVS+Keepalived高可用

案例拓扑图

这里我们简化一下案例,不再实现NFS共享存储的服务器,105作为客户端来测试

操作系统

IP 地址

角色

CentOS7.9

192.168.10.101

主调度器

CentOS7.9

192.168.10.102

从调度器

CentOS7.9

192.168.10.103

Web服务器①

CentOS7.9

192.168.10.104

Web服务器②

CentOS7.9

192.168.10.105

客户端(测试机)

本案例需要5台Linux虚拟机,全部恢复系统最初的快照

初步配置

本次案例使用DR模式作为工作模式

启动5台虚拟机并全部使用XShell连接

关闭服务

开启除了客户端的会话同步 统一关闭防火墙和内核安全机制

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
主调度器配置

关闭103和104的会话同步

只开启两个调度器服务器的会话同步(101、102)

在101(主调度器)操作

关闭NetworkManager服务,安装keepalived

[root@localhost ~]# systemctl stop NetworkManager
[root@localhost ~]# yum -y install keepalived

打开keepalived配置文件,修改以下内容

[root@localhost ~]# vim /etc/keepalived/keepalived.conf
   router_id LVS_01
   #vrrp_strict
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    virtual_ipaddress {
        192.168.10.172
    }

因为要针对服务进行负载均衡,所以在33行后的内容要配置好集群和真实服务器

我们这里用TCP的方式检查健康状态,所以删除一些内容,然后改为TCP_CHECK

virtual_server 192.168.10.172 80 {
    delay_loop 6  # 回环延迟时间
    lb_algo wrr   # 调度算法
    lb_kind DR    # 负载均衡的工作模式
    #persistence_timeout 50 会话保持时间
    protocol TCP

    real_server 192.168.10.103 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.10.104 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
# 剩下的内容删除
# 命令模式下:d + G
保存并退出
健康状态检查的方式
  • SSL_GET
    • 通过SSL,GET一下网站根目录的网页文件,如果有内容,就是正常的
  • TCP_CHECL
    • 工作在第4层,keepalived向后端服务器发起一个tcp连接请求,如果后端服务器没有响应或超时,那么这个后端将从服务器池中移除。
  • HTTP_GET
    • 工作在第5层,向指定的URL执行http请求,将得到的结果用md5加密并与指定的md5值比较看是否匹配,不匹配则从服务器池中移除;此外还可以指定http返回码来判断检测是否成功。HTTP_GET可以指定多个URL用于检测,在一台服务器有多个虚拟主机的情况下使用。
  • MISC_CHECK
    • 用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内,根据脚本的返回值来判断
调整内核参数
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.ens33.send_redirects=0
[root@localhost ~]# sysctl -p
从调度器配置

关闭会话同步

在102(从调度器)操作

再次打开配置文件,修改作为从调度器的参数

[root@localhost ~]# vim /etc/keepalived/keepalived.conf
router_id LVS_02
state BACKUP
priority 99
保存并退出

在keepalived配置文件中配置了集群和真实服务器的参数,其实就是配置好了调度策略,所以不用再使用管理工具添加调度策略了

在101、102分别操作

分别开启两个调度器的keepalived服务,然后使用ip a命令查看虚拟IP是否正常

[root@localhost ~]# systemctl start keepalived
[root@localhost ~]# ip a

服务器池配置

为103和104开启会话同步

在103(Web服务器①)操作

创建本地回环虚拟网卡,改为虚拟IP

[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.10.172
NETMASK=255.255.255.255
#NETWORK=127.0.0.0
#BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

保存退出后,重启服务。然后使用ifconfig查看是否创建成功

[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ifconfig
lo:0:
        inet 192.168.10.172

添加路由条目,如果访问的IP是172那么就交给lo:0设备处理

然后修改内核配置文件,添加以下内容,让后端服务器不参与ARP的应答

最后使用sysctl -p应用内核设置

[root@localhost ~]# route add -host 192.168.10.172 dev lo:0
[root@localhost ~]# vim /etc/sysctl.conf 
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@localhost ~]# sysctl -p

安装Apache网站服务,启动服务

[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd

关闭全部会话同步

在103(Web服务器①)操作

使用重定向在存放网站文件的目录下创建测试网页

[root@localhost ~]# echo "web01" > /var/www/html/index.html

在104(Web服务器②)操作

[root@localhost ~]# echo "web02" > /var/www/html/index.html

在105(客户端)操作

测试网站服务是否实现负载均衡

[root@localhost ~]# curl 192.168.10.172
web02
[root@localhost ~]# curl 192.168.10.172
web01
模拟故障

此时把101主机(主调度器)暂停

再测试,可以看到在几秒后, 服务可以正常访问,实现高可用(主调度器和备调度器之间切换Master和VIP)

[root@localhost ~]# curl 192.168.10.172
web02

此时再开启101主机,然后在102使用ipvsadm -ln可以看到keepalived帮我们创建出对应的LVS策略

[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.10.172:80 rr
  -> 192.168.10.103:80            Route   1      0          0         
  -> 192.168.10.104:80            Route   1      0          0 
  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值