负载均衡之LVS--Shell脚本配置LVS

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介:

  本篇内容主要用三个脚本来实现LVS的配置。脚本1:lvs.sh 是配置在负载均衡端,脚本2:realserver.sh 是配置后端Real Server服务器上的。脚本3:check_lvs.sh 是用在负载均衡端上来测试后端服务器的健康状态的脚本,如有一个Real Server 宕机就会自动清除,如果恢复了就再加上,后端所有服务器都宕机了,会把负载均衡端提供的错误页面加到集群中来。


规划:

  负载均衡:

    DIP:192.168.1.11

    VIP:192.168.1.10

  后台Real Server有两个分别为:

    rs1:192.168.1.9 

    rs2:192.168.1.8


在192.168.1.11上安装ipvsadm和httpd服务,当在后端服务器都宕机时提供错误页面。

  yum install ipvsadm -y

在rs1,rs2上分别安装httpd服务,并启动服务,提供网页。

  yum install httpd -y


在192.168.1.11服务器上编写脚本lvs.sh

cd /opt/scripts

vim lvs.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/bin/bash
#
# LVS script for VS/DR
# chkconfig: - 90 10
#
/etc/rc .d /init .d /functions
#
  
VIP=192.168.1.10
DIP=192.168.1.11
RIP1=192.168.1.9
RIP2=192.168.1.8
PORT=80
RSWEIGHT1=2
RSWEIGHT2=5
  
case  "$1"  in
     start)
         /sbin/ifconfig  eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up 
         #启用eth0:0来配置VIP
         /sbin/route  add -host $VIP dev eth0:0
         #添加VIP路由信息
  
         echo  1 >  /proc/sys/net/ipv4/ip_forward
         #打开ip转发功能
  
         /sbin/iptables  -F
         /sbin/iptables  -Z
         #清空iptables规则
         
         /sbin/ipvsadm  -C
         /sbin/ipvsadm  -A -t $VIP:80 -s wlc
         /sbin/ipvsadm  -a -t $VIP:$PORT -r $RIP1:$PORT -g -w $RSWEIGHT1
         /sbin/ipvsadm  -a -t $VIP:$PORT -r $RIP2:$PORT -g -w $RSWEIGHT2
         
         #添加ipvs规则
         
         /bin/touch  /var/lock/subsys/ipvsadm  &>  /dev/null
         #创建锁文件
     ;;
  
     stop)
         echo  0 >  /proc/sys/net/ipv4/ip_forward
  
         /sbin/ipvsadm  -C
         /sbin/ifconfig  eth0:0 down
         /sbin/route  del $VIP
  
         /bin/rm  -f  /var/lock/subsys/ipvsadm
  
         echo  "ipvs is stopped...."
     ;;
  
     status)
         if  [ ! -e  /var/lock/subsys/ipvsadm  ];  then
             echo  "ipvsadm is stopped ..."
         else
             echo  "ipvs is running ..."
             ipvsadm -L -n
         fi
     ;;
  
     *)
         echo  "Usge: $0 {start|stop|status}"
     ;;
esac

此脚本可以加到系统服务列表中,并可以设置开机自动启动。


在后端服务器rs1和rs2中编写脚本realserver.sh如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/bin/bash
#
# Script to start LVS DR real server.
# chkconfig: - 90 10
# description: LVS DR real server
#
.   /etc/rc .d /init .d /functions
 
VIP=192.168.1.10
 
host=` /bin/hostname `
 
case  "$1"  in
     start)
         /sbin/ifconfig  lo down
         /sbin/ifconfig  lo up
         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/all/arp_ignore
         echo  2 >  /proc/sys/net/ipv4/conf/all/arp_announce
 
         /sbin/ifconfig  lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
         /sbin/route  add -host $VIP dev lo:0
     ;;
 
     stop)
         /sbin/ifconfig  lo:0 down
         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/all/arp_ignore
         echo  0 >  /proc/sys/net/ipv4/conf/all/arp_announce
     ;;
 
     status)
         islothere=` /sbin/ifconfig  lo:0 |  grep  $VIP`
         isrothere=` netstat  -rn |  grep  "lo:0"  grep  $VIP`
         if  [ !  "$islothere"  -o !  "isrothere"  ]; then
             # Either the route or the lo:0 device
             # not found.
             echo  "LVS-DR real server Stopped."
         else
             echo  "LVS-DR real server Running."
         fi
     ;;
 
     *)
         echo  "$0: Usage: $0 {start|status|stop}"
         exit  1
     ;;
esac


完成后可以启动脚本了。


LVS自身没有对后端服务器的健康状态检测功能,下面在192.168.1.11服务器上来使用脚本来每5s种检测下后台服务器健康状态,并实现自动清除宕机的服务器,恢复后可以自动添加。


vim check_lvs.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/bin/bash
#
#
VIP=192.168.19.211
CPORT=80
FAIL_BACK=127.0.0.1
RS=( "192.168.19.245"  "192.168.19.219" #定义一个数组并赋值
declare  -a RSSTATUS  #定义一个空数组
RW=( "2"  "1" )
RPORT=80
TYPE=g  #定义为DR模型
CHKLOOP=3
LOG= /var/log/ipvsmonitor .log
 
  #定义一个添加规则的函数 
addrs() {
     if  ipvsadm -L -n |  grep  "$1:$RPORT"  &>  /dev/null ; then
         return  0
     else
         ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
         [ $? - eq  0 ] &&  return  0 ||  return  1
     fi
}
  
#定义删除规则的函数 
delrs() {
     if  ipvsadm -L -n |  grep  "$1:$RPORT"  &>  /dev/null ; then
         ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
         [ $? - eq  0 ] &&  return  0 ||  return  1
     else
         return  0
     fi
}
  
#定义是否要添加错误页面的规则的函数 
ifaddls() {
     if  [ ${RSSTATUS[0]} - eq  0 ]; then
         if  [ ${RSSTATUS[1]} - eq  0 ]; then
             if  ipvsadm -L -n |  grep  "127.0.0.1:80"  &>  /dev/null ; then
                 echo  "`date '+%F %T'` All RS is Down and Local web is up"  >> $LOG
             else
                 ipvsadm -a -t $VIP:$CPORT -r 127.0.0.1:80 -$TYPE
                 [ $? - eq  0 ];  echo  "`date '+%F %T'` All RS is Down! Local 127.0.0.1:80 is up!!!"  >> $LOG
             fi
         else
             if  ipvsadm -L -n |  grep  "127.0.0.1:80"  &>  /dev/null ; then
                 ipvsadm -d -t $VIP:$CPORT -r 127.0.0.1:80
             fi
         fi
     else
         if  ipvsadm -L -n |  grep  "127.0.0.1:80"  &>  /dev/null ; then
             ipvsadm -d -t $VIP:$CPORT -r 127.0.0.1:80
         fi
     fi
}
  
#定义检测后端服务器服务健康状态的函数  
checkrs() {
     local  I=1
     while  [ $I - le  $CHKLOOP ]; do
         if  curl --connect-timeout 1 http: // $1 &>  /dev/null then
             return  0
         fi
         let  I++
     done
     return  1
}
 
#检测脚本初始化函数  
initstatus() {
     local  I
     local  COUNT=0
     for  in  ${RS[*]}; do
         if  ipvsadm -L -n |  grep  "$I:$RPORT"  && >  /dev/null then
             RSSTATUS[$COUNT]=1
         else
             RSSTATUS[$COUNT]=0
         fi
         let  COUNT++
     done
}
#脚本开始执行: 
initstatus
ifaddls
  
while  :;  do  #无限循环
     let  COUNT=0
     for  in  ${RS[*]}; do
         if  checkrs $I;  then
             if  [ ${RSSTATUS[$COUNT]} - eq  0 ]; then
                 addrs $I ${RW[$COUNT]}
                 [ $? - eq  0 ] && RSSTATUS[$COUNT]=1 &&  echo  "`date '+%F %T'`, $I is back."  >> $LOG
             fi
         else
             if  [ ${RSSTATUS[$COUNT]} - eq  1 ];  then
                 delrs $I
                 [ $? - eq  0 ] && RSSTATUS[$COUNT]=0 &&  echo  "`date '+%F %T'`, $I is gone."  >> $LOG
             fi
         fi
         let  COUNT++
     done
     ifaddls
     sleep  #睡眠5s再循环
done




本文转自 ZhouLS 51CTO博客,原文链接:http://blog.51cto.com/zhou123/1683975


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
2月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
419 9
|
2月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
308 2
|
5月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
269 60
|
2月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
8月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
4月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
556 0
|
6月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
182 17
|
6月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
197 4
|
6月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
400 3
|
7月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
624 25