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访问正常… …

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值