LVS 高可用性实现 -- ldirectord软件解决方案

一、lvs 高可用的必要性

LVS 不可用时 :

Director不可用,整个系统将不可用;SPoF Single Point of Failure
解决方案:高可用,keepalived、heartbeat/corosync

RS 不可用时:

某RS不可用时,Director依然会调度请求至此RS
解决方案: 由Director对各RS健康状态进行检查,失败时禁用,成功时启用
常用解决方案:

  • keepalived
  • heartbeat/corosync
  • ldirectord

ldirectord 检测方式:

  • 网络层检测:icmp
  • 传输层检测:端口探测
  • 应用层检测,请求某关键资源

RS全不用时可以设置backup server, sorry serve

二、ldirectord软件

ldirectord是专门为LVS监控而编写的,用来监控lvs架构中服务器池(server pool) 的服务器状态。ldirectord 运行在 IPVS 节点上, ldirectord作为一个守护进程启动后会对服务器池中的每个真是服务器发送请求进行监控,如果 服务器没有响应 ldirectord 的请求,那么ldirectord 认为该服务器不可用,ldirectord 会运行 ipvsadm 对 IPVS表中该服务器进行删除,如果等下次再次检测有相应则通过
ipvsadm 进行添加:

ldirectord:监控和控制LVS守护进程,可管理LVS规则

包名:ldirectord-3.9.6-0rc1.1.1.x86_64.rpm

下载:[http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-7/x86_64/]

三、 [LVS 高可用性实现 – ldirectord

1、lvs-dr环境部署

环境配置

rolehostipvipos
Director-Servernode01192.168.5.11192.168.5.100centos-7.8
Web1node02192.168.5.12192.168.5.100centos-7.8
Web1node3192.168.5.13192.168.5.100centos-7.8
ClientClientClient192.168.5.150rhel-7.2

Director-Server 配置

[root@node01 ~]# yum install ipvsadm -y
[root@node01 ~]# vim /etc/init.d/lvs_dr
#!/bin/sh
# 
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
# 
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
#   available server built on a cluster of real servers, with the load
#   balancer running on Linux.
# description: start LVS of DR
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.5.100
RIP1=192.168.5.12
RIP2=192.168.5.13
DipName=ens33

. /etc/rc.d/init.d/functions
start() {
		PID=`ipvsadm -Ln | grep ${VIP} | wc -l`
		if  [ $PID -gt 0 ];
		then
		    echo "The LVS-DR Server is already running !"
		else
            #Set the Virtual IP Address
            /sbin/ifconfig ${DipName}:100 $VIP broadcast $VIP netmask 255.255.255.255 up
            /sbin/route add -host $VIP dev ${DipName}:100
            #Clear IPVS Table
            /sbin/ipvsadm -C
            #Set Lvs
            /sbin/ipvsadm -At $VIP:80 -s rr
            /sbin/ipvsadm -at $VIP:80 -r $RIP1:80 -g
            /sbin/ipvsadm -at $VIP:80 -r $RIP2:80 -g
            /sbin/ipvsadm -at $VIP:80 -r $RIP3:80 -g
            /bin/touch $LOCK
            #Run Lvs
            echo "starting LVS-DR Server is ok !"
        fi
} 
stop()      {

            #clear Lvs and vip
            /sbin/ipvsadm -C
            /sbin/route del -host $VIP dev ${DipName}:100
            /sbin/ifconfig ${DipName}:100 down >/dev/null
            rm -rf $LOCK
            echo "stopping LVS-DR server is ok !"
} 
status() {
       if [ -e $LOCK ];
       then
            echo "The LVS-DR Server is already running !"
       else
            echo "The LVS-DR Server is not running !"
       fi
} 
case "$1" in
  start)
       start
       ;;
  stop)
       stop
       ;;
  restart)
       stop
       start
       ;;
  status)
       status
       ;;
*)
       echo "Usage: $1 {start|stop|restart|status}"
       exit 1
esac
exit 0


[root@node01 ~]# chmod +x /etc/init.d/lvs_dr
[root@node01 ~]# /etc/init.d/lvs_dr start
Starting lvs_dr (via systemctl):                           [  OK  ]

Real Server配置 (node03配置雷同)

[root@node02 ~]# yum install httpd -y
[root@node02 ~]# echo "test web1 apge..." > /var/www/html/index.html
[root@node02 ~]# systemctl start httpd
[root@node02 ~]# curl localhost
test web1 apge...

[root@node02 ~]# vim  /etc/init.d/lvs_rs 
#!/bin/sh
# 
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
# 
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
#   available server built on a cluster of real servers, with the load
#   balancer running on Linux.
# description: start LVS of DR-RIP
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.5.100
. /etc/rc.d/init.d/functions
start() {
	 PID=`ifconfig | grep lo:100 | wc -l`
	 if [ $PID -ne 0 ];
	 then
	     echo "The LVS-DR-RIP Server is already running !"
	 else
	    /sbin/ifconfig lo:100 $VIP netmask 255.255.255.255 broadcast $VIP up
	    /sbin/route add -host $VIP dev lo:100
	    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
	    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
	    echo "1" >/proc/sys/net/ipv4/conf/ens33/arp_ignore
	    echo "2" >/proc/sys/net/ipv4/conf/ens33/arp_announce
	    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
	    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
	    /bin/touch $LOCK
	    echo "starting LVS-DR-RIP server is ok !"
	 fi
	 } 
	 
stop() {
       /sbin/route del -host $VIP dev lo:100
       /sbin/ifconfig lo:100 down >/dev/null
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/ens33/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/ens33/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       rm -rf $LOCK
       echo "stopping LVS-DR-RIP server is ok !"
}

status() {
     if [ -e $LOCK ];
     then
        echo "The LVS-DR-RIP Server is already running !"
     else
        echo "The LVS-DR-RIP Server is not running !"
     fi
} 

case "$1" in
   start)
        start
        ;;
   stop)
        stop
        ;;
   restart)
        stop
        start
        ;;
   status)
        status
        ;;
   *)
        echo "Usage: $1 {start|stop|restart|status}"
        exit 1
esac
exit 0


[root@node02 ~]# chmod +x /etc/init.d/lvs_rs
[root@node02 ~]# /etc/init.d/lvs_rs start
Reloading systemd:                                         [  OK  ]
Starting lvs_rs (via systemctl):                           [  OK  ]

测试:

2、故障出现

[root@node03 ~]# systemctl stop httpd
[root@node03 ~]# curl localhost
curl: (7) Failed connect to localhost:80; Connection refused

Client访问:

四、ldirectord 的应用

1、ldirectord的部署

[root@rhel7 ~]# ll ldirectord-3.9.6-0rc1.1.2.x86_64.rpm 
-rw-r--r--. 1 root root 100668 Feb 25  2021 ldirectord-3.9.6-0rc1.1.2.x86_64.rpm
[root@rhel7 ~]# yum install ldirectord-3.9.6-0rc1.1.2.x86_64.rpm -y
[root@node01 ~]# vim /etc/ha.d/ldirectord.cf 
checktimeout=3
checkinterval=1
#fallback=127.0.0.1:80
#fallback6=[::1]:80
autoreload=yes
#logfile="/var/log/ldirectord.log"
#logfile="local0"
#emailalert="admin@x.y.z"
#emailalertfreq=3600
#emailalertstatus=all
quiescent=no

# Sample for an http virtual service
virtual=192.168.5.100:80
	real=192.168.5.12:80 gate
	real=192.168.5.13:80 gate
	fallback=127.0.0.1:80 gate
	service=http
	scheduler=rr
	#persistent=600
	#netmask=255.255.255.255
	protocol=tcp
	checktype=negotiate
	checkport=80
	#request="index.html"
	#receive="Test Page"
	#virtualhost=www.x.y.z

[root@node01 ~]# systemctl restart ldirectord
[root@node01 ~]# systemctl is-active ldirectord
active
[root@node01 ~]# 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.5.100:80 rr
  -> 192.168.5.12:80              Route   1      0          0 

Client访问:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kJEiLhi0-1642067634629)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220113174916677.png)]

Client访问正常… …

2、故障恢复时

[root@node03 ~]# curl localhost
curl: (7) Failed connect to localhost:80; Connection refused
[root@node03 ~]# systemctl start httpd
[root@node03 ~]# curl localhost
test web2 apge...

Director-Server重新将故障恢复节点加入调度转发池

[root@node01 ~]# 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.5.100:80 rr
  -> 192.168.5.12:80              Route   1      0          0         
  -> 192.168.5.13:80              Route   1      0          0

Client访问:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tp1hXWl9-1642067634630)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20220113175317323.png)]

Client访问正常… …

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Heartbeat + LVS + ldirectord构建可伸缩网络服务 ... by srsman ... 2 月前 ... 149次点击 Heartbeat + LVS + ldirectord构建可伸缩网络服务 网络环境: 机器数量:2 操作系统:Centos 5.0,Centos 5.2 机器名:centos50,centos52 机器IP: Centos 5.0: 10.2.20.15 Centos 5.2: 10.2.20.88 虚拟IP: 10.2.20.17 需要的软件: httpd:提供web服务 LVS:对web服务器按照一定的规则进行转发 Heartbeat:提供ip漂移服务,在主服务器宕机后,备份服务器接管虚拟ip ldirectord:提供lvs控制,监控真实服务器,出现问题后,对轮循列表进行更新,去除出现问题的服务器 机器角色: centos50:主负载均衡器+真实服务器 centos52:备份负载均衡器+真实服务器 实现功能: 两台服务器做为负载均衡器进行主从互备,并充当真实服务器功能,对外提供服务,当真实服务器出现问题后,主负载均衡器能够检测到,并从负载均衡轮循列表清除有问题的真实服务器。 当主负载均衡器出现问题后,备份负载均衡器能够接管负载均衡服务,使服务不受影响。 1.最小化安装操作系统; 2.在两台机器上配置机器名 在/etc/hosts文件中添加主机名记录,确保两台机器能够通过主机名相互ping通 3.安装httpd,heartbeat,ldirectord centos 5.2内核已经包含lvs,不用安装,只安装httpd,heartbeat,ldirectord yum install httpd,heartbeat,heartbeat-ldirector
实现基于 Keepalived + LVS高可用集群,您可以按照下面的步骤操作: 1. 安装 Keepalived 和 LVS 您需要在每个服务器上安装 Keepalived 和 LVS。Keepalived 是一个实现 VRRP 协议的工具,用于实现服务器之间的故障切换。LVS 是一个 Linux 负载均衡器,可以将流量分发到多个后端服务器上。 2. 配置 LVS 在配置 LVS 之前,您需要先确定负载均衡器的 IP 地址和后端服务器的 IP 地址。您可以在 LVS 上配置虚拟 IP 地址,然后将请求转发到后端服务器上。 3. 配置 Keepalived 在配置 Keepalived 之前,您需要确定一个主节点和多个备份节点。主节点将拥有虚拟 IP 地址,并将请求转发到后端服务器上。如果主节点发生故障,备份节点将接管虚拟 IP 地址,并继续转发请求。 在每个节点上,您需要配置 Keepalived 的配置文件,以实现 VRRP 协议和故障切换。在主节点上,您需要将 VRRP 的优先级设置为最高,以确保它成为主节点。在备份节点上,您需要将优先级设置为较低,以确保它只在主节点发生故障时接管虚拟 IP 地址。 4. 测试集群 在完成上述步骤后,您需要测试集群是否正常工作。您可以使用 curl 或浏览器访问虚拟 IP 地址,以确保请求能够正确地转发到后端服务器上。 以上就是基于 Keepalived 和 LVS高可用集群实现的大致步骤。需要注意的是,配置过程可能会因环境而异,您需要根据实际情况进行适当的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值