如何编写LVS对Real Server的健康状态检测脚本
一、集群概述
什么是集群?
一组各自相互独立且又相互依赖的,通过高速网络互联的计算机组成的一个计算机组, 以单一的系统模式加以管理, 为用户提供服务, 对用户来说, 用户只会认为对方是一个服务. 这个里面, 一组计算机的一台计算机就是集群的一个节点
集群的特性:
可伸缩性, 可靠性, 可管理性
集群的种类:
集群系统主要分为
负载均衡(Load Balance)集群,简称LB
高可用(High Availability)集群,简称 HA 集群
高性能计算(High Perfermance Computing)集群,简称 HPC 集群
LB实现手段
硬件的实现: – F5 负载均衡器
软件的实现: – LVS(4层,传输层) – Nginx(7层,应用层)
二、LVS集群
1.LVS(Linux Virtual Server)
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一,是根据iptables的实现来开发的,所以使用时候会和iptables相当类似
官网:http://www.linuxvirtualserver.org/
中文站点: http://zh.linuxvirtualserver.org/
2.LVS 集群工作结构图
图1:LVS集群的体系结构
LVS 集群工作结构图
三层主要组成部分为:
负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行, 而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
调度器是服务器集群系统的唯一入口点(Single Entry Point),它可以采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。
. 在IP负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。
当客户请求到达时,调度器只根据服务器负载情况和设定的调度算法从服务器池中选出一个服务器,
将该请求转发到选出的服务器,并记录这个调度;当这个请求的其他报文到达,也会被转发到前面选出的服务器。
. 在基于内容请求分发技术中,服务器可以提供不同的服务,当客户请求到达时,调度器可根据请求的内容选择服务器执行请求。
因为所有的操作都是在Linux操作系统核心空间中将完成的,它的调度开销很小,所以它具有很高的吞吐率。
**服务器池的结点数目是可变的。
当整个系统收到的负载超过目前所有结点的处理能力时,可以在服务器池中增加服务器来满足不断增长的请求负载。
对大多数网络服务来说,请求间不存在很强的相关性,请求可以在不同的结点上并行执行,
所以整个系统的性能基本上可以随着服务器池的结点数目增加而线性增长。**
**共享存储通常是数据库、网络文件系统或者分布式文件系统。
服务器结点需要动态更新的数据一般存储在数据库系统中,同时数据库会保证并发访问时数据的一致性。
静态的数据可以存储在网络文件系统,如:NFS,
但网络文件系统的伸缩能力有限。
对于规模较大的集群系统,可以考虑用分布式文件系统
分布式文件系统可为各服务器提供共享的存储区,它们访问分布式文件系统就像访问本地文件系统一样,
同时分布式文件系统可提供良好的伸缩性和可用性。**
负载调度器、服务器池和共享存储系统通过高速网络相连接,如1000Mbps交换网络等。
使用高速的网络,主要为避免当系统规模扩大时互联网络成为整个系统的瓶颈。
集群中各结点是通过高速网络相连接
三、LVS-NAT模式及工作原理
NAT: 网络地址转换
DNAT: 目标地址转换 改变的是目标地址
SNAT: 原地址转换 改变的是原地址
LVS-NAT 就是使用的SNAT和DNAT完成报的转发
NAT方式可支持任何的操作系统,以及私有网络,并且只需一个Internet IP地址,但是整个系统的性能受到限制。
因为执行NAT每次需要重写包,有一定的延迟;
另外,大部分应用有80%的数据是从服务器流向客户机,也就是用户的请求非常短,而服务器的回应非常大,对负载均衡器形成很大压力,成为了新的瓶颈。
LVS-NAT 模式工作原理:
客户端访问调度器时,调度器通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回给客户,完成整个负载调度过程。
四、配置LVS-NAT
4.1.环境准备CentOs7.5操作系统最小安装
1、准备3台主机
2、iptables -F , 清除规则
3、/etc/selinux/config,关SELinux
#getenforce
Disabled
4.2、192.168.31.62配置成分发器:
0、打开路由转发功能
[root@ShuaiJhou ~]# vim /etc/sysctl.conf
改:net.ipv4.ip_forward = 0
为:net.ipv4.ip_forward = 1
让配置生效:
[root@ShuaiJhou ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@ShuaiJhou ~]#
1、配置网络环境:
添加一个网卡(需要两张网卡), 配置成以下网络环境:
eth0 192.168.31.62 模式:br0 模拟公网
eth1 192.168.1.62 模式:vmnet4 模拟内网
[root@ShuaiJhou ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
[root@ShuaiJhou ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens37
[root@ShuaiJhou ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens3
ifcfg-ens33 ifcfg-ens37
[root@ShuaiJhou ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens37
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens37"
DEVICE="ens37"
ONBOOT="yes"
IPADDR="192.168.1.62"
PREFIX="24"
IPV6_PRIVACY="no"
[root@ShuaiJhou ~]# systemctl restart network
[root@ShuaiJhou ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.31.62 netmask 255.255.255.0 broadcast 192.168.31.255
inet6 fe80::afe7:2633:1ea7:9cba prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:76:f8:44 txqueuelen 1000 (Ethernet)
RX packets 4292 bytes 286391 (279.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 624 bytes 82687 (80.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.62 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::6f85:c19:5d87:cf90 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:76:f8:4e txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 111 bytes 18184 (17.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@ShuaiJhou ~]#
2.安装: LVS管理工具: ipvsadmin
[root@ShuaiJhou ~]# yum -y install ipvsadm
3.ipvsadm工具的简单使用
ipvsadm:
管理集群服务
添加:-A -t|u|f service-address [-s scheduler]
-t: TCP协议的集群
-u: UDP协议的集群
service-address: IP:PORT
-f: FWM: 防火墙标记
service-address: Mark Number
修改:-E
删除:-D -t|u|f service-address
[root@ShuaiJhou ~]# ipvsadm -A -t 192.168.31.62:80 -s rr
管理集群服务中的RS
添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-t|u|f service-address:事先定义好的某集群服务
-r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;
[-g|i|m]: LVS类型
-g: DR模型
-i: TUN模型
-m: NAT模型
[-w weight]: 定义服务器权重
修改:-e
删除:-d -t|u|f service-address -r server-address
[root@ShuaiJhou ~]# ipvsadm -a -t 192.168.31.62:80 -r 192.168.1.63 -m
[root@ShuaiJhou ~]# ipvsadm -a -t 192.168.31.62:80 -r 192.168.1.64 -m
查看
-L|l
-n: 数字格式显示主机地址和端口
--stats:统计数据
--rate: 速率
--timeout: 显示tcp、tcpfin和udp的会话超时时长
-c: 显示当前的ipvs连接状况
删除所有集群服务
-C:清空ipvs规则
保存规则
-S
# ipvsadm -S > /path/to/somefile
载入此前的规则:
-R
# ipvsadm -R < /path/form/somefile
4.使用ipvsadm命令设置规则
#管理集群服务
[root@ShuaiJhou ~]# ipvsadm -A -t 192.168.31.62:80 -s rr
选项:
-A 添加虚拟服务器
-t 表示TCP的服务 VIP:PORT
-s 指定调度算法 rr表示round-robin 轮循
# 管理集群服务中的RS
[root@ShuaiJhou ~]# ipvsadm -a -t 192.168.31.62:80 -r 192.168.1.63 -m
[root@ShuaiJhou ~]# ipvsadm -a -t 192.168.31.62:80 -r 192.168.1.64 -m
选项:
-a 表示添加real server的地址
-r 指定real server的IP地址
-m 表示masquerade 也就是NAT方式的LVS
查看并保存:
Ipvsadm命令,用于配置及查看内核IPVS表和算法的工具,类似于iptables
[root@ShuaiJhou ~]# ipvsadm -A -t 192.168.31.62:80 -s rr
[root@ShuaiJhou ~]# ipvsadm -a -t 192.168.31.62:80 -r 192.168.1.63 -m
[root@ShuaiJhou ~]# ipvsadm -a -t 192.168.31.62:80 -r 192.168.1.64 -m
[root@ShuaiJhou ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.31.62:80 rr
-> 192.168.1.63:80 Masq 1 0 0
-> 192.168.1.64:80 Masq 1 0 0
[root@ShuaiJhou ~]#
保存配置或规则
[root@ShuaiJhou ~]# ipvsadm --save > /etc/sysconfig/ipvsadm
[root@ShuaiJhou ~]# ipvsadm -S
-A -t ShuaiJhou:http -s rr
-a -t ShuaiJhou:http -r 192.168.1.63:http -m -w 1
-a -t ShuaiJhou:http -r 192.168.1.64:http -m -w 1
[root@ShuaiJhou ~]#
5.设置所有的RS服务器的网关为调度器的ip地址--- 配置真实服务器
5.1.给那个RS服务器安装http服务并测试
#192.168.1.63
[root@ZhouShuai ~]# yum -y install httpd
[root@ZhouShuai ~]# systemctl restart httpd
[root@ZhouShuai ~]# echo "<h1>63号JhouShuai</h1>" > /var/www/html/index.html
#192.168.1.64
[root@ShuaiZhou ~]# yum install httpd
[root@ShuaiZhou ~]# systemctl restart httpd
[root@ShuaiZhou ~]# echo "<h1>64号JhouShuai</h1>" > /var/www/html/index.html
5.2.配置IP:REAL SERVER自己的网络相关信息配置成如下
192.168.1.63: eth0: vmnet4 : 192.168.1.63 网关: 192.168.1.62
192.168.1.64: eth0: vmnet4 : 192.168.1.64 网关: 192.168.1.62
测试:
[root@ShuaiJhou ~]# yum -y install elinks
[root@ShuaiJhou ~]# elinks 192.168.1.64 --dump
64号JhouShuai
[root@ShuaiJhou ~]# elinks 192.168.1.63 --dump
63号JhouShuai
[root@ShuaiJhou ~]#
-----------------完成---------------------------------------------------------------
扩展ipvsadm 更多参数说明
-L -n ==> 查看规则,显示内核虚拟服务器表
-L -n -c ==> 查看客户端连接分发器和real server 的情况
[root@ShuaiJhou ~]# ipvsadm -L -n -c
IPVS connection entries
pro expire state source virtual destination
TCP 01:35 TIME_WAIT 192.168.31.14:58926 192.168.31.62:80 192.168.1.64:80
TCP 00:22 TIME_WAIT 192.168.31.62:34432 192.168.31.62:80 192.168.1.64:80
TCP 01:35 TIME_WAIT 192.168.31.14:58921 192.168.31.62:80 192.168.1.63:80
TCP 01:21 TIME_WAIT 192.168.31.14:58907 192.168.31.62:80 192.168.1.64:80
TCP 00:21 TIME_WAIT 192.168.31.62:34430 192.168.31.62:80 192.168.1.63:80
TCP 01:24 TIME_WAIT 192.168.31.14:58909 192.168.31.62:80 192.168.1.64:80
TCP 01:14 TIME_WAIT 192.168.31.14:58908 192.168.31.62:80 192.168.1.63:80
TCP 00:23 TIME_WAIT 192.168.31.62:34434 192.168.31.62:80 192.168.1.63:80
TCP 00:20 TIME_WAIT 192.168.31.62:34428 192.168.31.62:80 192.168.1.64:80
[root@ShuaiJhou ~]#
选项:
-L -n --stats ==> 查看分发情况
-L -n --rate ==> 查看速率
-Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)
[root@ShuaiJhou ~]# ipvsadm -Z
[root@ShuaiJhou ~]# ipvsadm -L -n --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.31.62:80 0 0 0 0 0
-> 192.168.1.63:80 0 0 0 0 0
-> 192.168.1.64:80 0 0 0 0 0
[root@ShuaiJhou ~]#
选项:
-Z --clear 清空IPVS的数据、等信息
[root@ShuaiJhou ~]# ipvsadm -C
选项:
-C 清空所有规则
LVS的规则配置文件:/etc/sysconfig/ipvsadm
附录:ipvsadm命令选项解释:
-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
-E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D --delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C --clear 清除内核虚拟服务器表中的所有记录。
-R --restore 恢复虚拟服务器规则
-S --save 保存虚拟服务器规则,输出为-R 选项可读的格式
-a --add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e --edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录
-d --delete-server 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l --list 显示内核虚拟服务器表
-Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)
--set tcp tcpfin udp 设置连接超时值
--start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived的VRRP 功能。
--stop-daemon 停止同步守护进程
-h --help 显示帮助信息
其他的选项:
-t --tcp-service service-address 说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port]
-u --udp-service service-address 说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port]
-f --fwmark-service fwmark 说明是经过iptables 标记过的服务类型。
-s --scheduler scheduler 使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc.
-p --persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。
-M --netmask netmask persistent granularity mask
-r --real-server server-address 真实的服务器[Real-Server:port]
-g --gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
-i --ipip 指定LVS 的工作模式为隧道模式
-m --masquerading 指定LVS 的工作模式为NAT 模式
-w --weight weight 真实服务器的权值
--mcast-interface interface 指定组播的同步接口
-c --connection 显示LVS 目前的连接 如:ipvsadm -L -c
--timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
--daemon 显示同步守护进程状态
--stats 显示统计信息
--rate 显示速率信息
--sort 对虚拟服务器和真实服务器排序输出
--numeric -n 输出IP 地址和端口的数字形式
超时时间用ipvsadm --set tcp tcpfin udp设置,比如
#ipvsadm --set 120 20 100
表示tcp空闲等待时间为120 秒
客户端关闭链接等待时间为20秒
udp空闲等待为100秒
网友评论