https://blog.51cto.com/soulboy/1299896
https://blog.51cto.com/lovelace/1550188
https://www.cnblogs.com/edisonchou/p/4281978.html
https://www.cnblogs.com/lixigang/p/5371815.html
集群的定义和分类
一、集群的定义
-
集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。
二、集群的分类
1、Scale ON(向上扩展)
-
物理扩展,提高硬件参数
-
缺点:硬件的参数增长比例所带来的性能提升,不是线性的,价格往往高于硬件参数的倍数,并且CPU数量越多,仲裁机制消耗的资源就越大。
2、Scale Out 向外扩展 数量扩展
-
增加服务器数量
-
优点:在不影响业务的情况下,可以实现动态的在线扩容,每台服务器的费用可以成正比的转化为性能。
-
High Availability()
-
保证服务永久在线可用的集群,通过健康检测机制,大幅度的增强服务的可用性,HA集群中一个资源只能被一个节点占用,节点数通常为奇数。
-
可用性衡量标准=在线时间/(在线时间+故障处理时间)
-
Load Balancing(负载均衡集群)
-
那用户的请求均摊到多台服务器上的机制叫做负载均衡,主要是增加处理能力。
-
调度算法:论调(Round Robin)、加权(WRR)等……
硬件
-
F5 BIG IP
-
Citrix Netscaler
-
A10 AX系列
软件
-
四层 不能处理应用层协议,工作性能好,支持的功能特性有限 LVS
-
七层 可以过滤和修改应用层协议,性能略差于四层设备 Nginx、Haproxy
-
High Performance
-
科学集群是并行计算的基础。通常,科学集群涉及为集群开发的并行应用程序,以解决复杂的科学问题。科学集群对外就好像一个超级计算机,这种超级计算机内部由十至上万个独立处理器组成,并且在公共消息传递层上进行通信以运行并行应用程序。
LVS简介和基本使用
一、LVS简介
-
LVS工作在内核空间的TCP/IP协议栈上,LVS监控在INPUT链上,当用户请求的是集群服务(套接字),ipvs钩子函数会根据定义的规则修改请求并送至POSTROUTING链上,LVS和iptbles不能同时使用。
-
ipvsadm是工作在用户空间的规则编写的命令行工具
-
ipvs是工作在内核空间INPUT链上的钩子函数
-
注意:调度器的实现基于套接字(IP+port),所以一个调度器可以调度多个不同类型的服务,但通常调度能力有限,通常都为一种服务实现集群调度功能。
LVS,ipvsadm,keepalived的关系:
ipvsadm来管理lvs
keepalived也可以管理lvs(keepalived也是调用ipvsadm来管理lvs的)
二、ipvsadm的用法
ipvsadm管理集群服务
其实LVS的本身跟iptables很相似,而且连命令的使用格式都很相似,其实LVS是根据iptables的框架开发的,那么LVS的本身分成了两个部分,第一部分是工作在内核空间的一个IPVS的模块,其实LVS的功能都是IPVS模块实现的,,第二部分是工作在用户空间的一个用来定义集群服务的一个工具ipvsadm, 这个工具的主要作用是将管理员定义的集群服务列表传送给工作在内核空间中的IPVS模块,下面来简单的介绍下ipvsadm命令的用法
添加 -A - t|u|f service-address [-s scheduler]默认调度算法是wlc
-t TCP 协议的集群
-u UDP 协议的集群
service-address IP:PORT
-f FireWallMark LVS持久连接
service-address MarkNumber
修改 -E
删除 -D - t|u|f service-address
ipvsadm管理集群服务中的realserver
添加 -a - t|u|f service-address -r server-address -[g|i|m] [-w weight]
在NAT模型中server-address可以是 IP:PORT
-g:DR 默认就是DR模型
-m:NAT
-i:TUN
修改 -e
删除 -d - t|u|f service-address -r server-address
ipvsadm查看
ipvsadm查看
- L|l 显示规则
-n 不反解析IP地址和端口,数字格式显示主机地址和端口号
--status 统计数据
--rate 速率
--timeout 显示tcp、tcpfin和udp的会话超时时长
--sort 显示当前的ipvs连接状况
-c 查看连接数
删除所有集群服务
-C 清空ipvs所有规则
保存ipvs规则
-S > /path/file 保存规则
service ipvsadm save
载入ipvs规则
-R < /path/somefile
LVS工作模型和调度算法
-
NAT
-
用户请求到达INPUT链由ivps的匹配规则并修改就客户端的目标IP为集群服务中的Realserver地址,DNAT的动态扩展,同样支持端口映射,向外提供的服务和内部服务端口可以不一致,Realserver的网关指向DIP。
-
缺点:由于Director为后端realserver网关,因此能够调度的Realserver有限,10个就已经差强人意了。
-
集群节点跟Director必须在同一物理网络中,因为它靠mac地址转发数据包,ARP广播包不允许跨路由
-
RIP可以不用是私有地址,实现便捷的远程原理
-
Director只负责入站请求,响应报文由Realserver直接发网客户端,请求报文很小,所以DR模式的LVS能带动100台Realserver
-
集群节点一定不能使用Director当做其默认网关
-
不支持端口映射
-
大多数的操作系统都可以用在Realserver,要求必须能隐藏VIP
-
TUN
-
集群节点可以跨越Intelnet
-
RIP必须是公网地址
-
Director仅负责入站请求,响应报文则由Realserver直接发网客户端
-
Realserver网关不能指向Director
-
只有支持隧道功能的OS才能用于Realserver
-
不支持端口映射
二、LVS的调度算法
lvs的10种调度算法
可以分为两大类
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1、静态调度方法(director不考虑realserver已建立的活动链接和非活动链接状况)
rr 轮询
-
调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
wrr 加权轮询
-
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
sh 源地址哈希
-
源地址hash,对请求的客户端IP进行hash计算,内部维持着一张hash表,它的主要功能用户实现session affinity,会话绑定,它在一定程度上破坏了负载均衡效果,但是为了现实应用的需求这种功能是必要的,如果每个realserver通过session sharing的集群机制共享session,就可以不适用source hash这种功能。
dh 目标地址哈希
-
“目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
2、动态调度方法
lc 最少连接数
-
调度器通过“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载,active*256+inactive。
wlc 加权最少连接数
-
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值(active*256+inactive)/weight。
sed 最短期望延迟
-
wlc的改进版,权重大的服务器事先被挑中,(active+1)*256/weight,权重大的服务器有很多的时候,权重小的服务器可能一个都没有。
nqnever queue 永不排队
-
无需队列,如果有台 realserver的连接数=0就直接分配过去,不需要在进行sed运算。
lblc 基于本地的最少连接
-
它的主要目的跟dh一样,只是dh并不考虑从但前cacheserver的连接数,lblc考虑而已。尽管要保证命中的提高,并同样的请求发网通一个cache server但也要考虑轮询新的连接用一个相对空闲的cache server来响应。
lblcr 基于本地的带复制功能的最少连接
-
“带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标 IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台服务器,将该服务器加入。
LVS-NAT
一、架构平台环境
1 2 3 4 5 6 7 |
|
二、LVS-NAT架构
三、LVS-NAT模型实现负载均衡的工作方式
NAT模型其实就是通过网络地址转换来实现负载均衡的,它的工作方式几乎跟DNAT一模一样的,目前的DNAT只能转发到一个目标地址,早期的DNAT是可以将请求转发到多个目标的,在LVS出现之后就将此功能从DNAT种去掉了,下面来说说NAT模型的工作方式或者说NAT模型是怎么实现负载均衡的,根据上图,
1.用户请求VIP(也可以说是CIP请求VIP)
2,Director Server 收到用户的请求后,发现源地址为CIP请求的目标地址为VIP,那么Director Server会认为用户请求的是一个集群服务,那么Director Server 会根据此前设定好的调度算法将用户请求负载给某台Real Server ;假如说此时Director Server 根据调度算法的结果会将请求分摊到RealServer1上去,那么Director Server 会将用户的请求报文中的目标地址,从原来的VIP改为RealServer1的IP,然后再转发给RealServer1
3,此时RealServer1收到一个源地址为CIP目标地址为自己的请求,那么RealServer1处理好请求后会将一个源地址为自己目标地址为CIP的数据包通过Director Server 发出去,
4.当Driector Server收到一个源地址为RealServer1 的IP 目标地址为CIP的数据包,此时Driector Server 会将源地址修改为VIP,然后再将数据包发送给用户,
四、LVS-NAT的性能瓶颈
在LVS/NAT的集群系统中,请求和响应的数据报文都需要通过负载调度器(Director),当真实服务器(RealServer)的数目在10台和20台之间时,负载调度器(Director)将成为整个集群系统的新瓶颈。大多数Internet服务都有这样的特点:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即在负载调度器(Director)中只负责调度请求而响应直接(RealServer)返回给客户,将极大地提高整个集群系统的吞吐量。
五、部署环境
1、准备工作
1 2 3 4 5 6 |
|
2、拓扑图地址规划
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 |
|
3、在RealServer上部署httpd服务并测试
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
4、在Director上部署ipvs服务并测试
(1)确定本机ip_vs模块是否加载,也就是是否支持lvs,2.4.2后都支持了;然后安装ipvsadm 用户操作命令
[root@LVS ~]# grep -i "ip_vs" /boot/config-3.10.0-693.21.1.el7.x86_64
CONFIG_IP_VS=m #将ipvs定义成模块
CONFIG_IP_VS_IPV6=y # CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12
CONFIG_IP_VS_PROTO_TCP=y #IPVS支持哪些集群服务
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y
CONFIG_IP_VS_RR=m #ipvs支持的十种调度算法
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
CONFIG_IP_VS_FTP=m #支持代理ftp协议的
(2)安装ipvsadm
[root@LVS ~]# yum -y install ipvsadm
(3)添加集群服务
[root@LVS ~]# ipvsadm -A -t 192.168.0.200:80 -s rr #定义一个集群服务
[root@LVS ~]# ipvsadm -a -t 192.168.0.200:80 -r 172.16.100.10 -m #添加RealServer并指派调度算法为NAT
[root@LVS ~]# ipvsadm -a -t 192.168.0.200:80 -r 172.16.100.11 -m #添加RealServer并指派调度算法为NAT
[root@LVS ~]# ipvsadm -L -n #查看ipvs定义的规则列表
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.200:80 rr
-> 172.16.100.10:80 Masq 1 0 0
-> 172.16.100.11:80 Masq 1 0 0
[root@LVS ~]# cat /proc/sys/net/ipv4/ip_forward #查看Linux是否开启路由转发功能
0
[root@LVS ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #启动Linux的路由转发功能
[root@LVS ~]# cat /proc/sys/net/ipv4/ip_forward
1
(4)测试访问http页面
[root@LVS ~]# curl http://192.168.0.200/index.html
RS2-web2 Allentuns.com #第一次是web2
[root@LVS ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com #第二次是web1
[root@LVS ~]# curl http://192.168.0.200/index.html
RS2-web2 Allentuns.com #第三次是web1
[root@LVS ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com #第四次是web2
(5)更改LVS的调度算并压力测试,查看结果
[root@LVS ~]# ipvsadm -E -t 192.168.0.200:80 -s wrr
[root@LVS ~]# ipvsadm -e -t 192.168.0.200:80 -r 172.16.100.10 -m -w 3
[root@LVS ~]# ipvsadm -e -t 192.168.0.200:80 -r 172.16.100.11 -m -w 1
[root@LVS ~]# 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.0.200:80 wrr
-> 172.16.100.10:80 Masq 3 0 2
-> 172.16.100.11:80 Masq 1 0 2
[root@LVS ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com
[root@LVS ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com
[root@LVS ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com
[root@LVS ~]# curl http://192.168.0.200/index.html
RS2-web2 Allentuns.com
[root@LVS ~]# curl http://192.168.0.200/index.html
RS1-web1 Allentuns.com
(6)永久保存LVS规则并恢复
第一种方法:
[root@LVS ~]# service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [确定]
第二种方法:
[root@LVS ~]# ipvsadm -S > /etc/sysconfig/ipvsadm.s1
模拟清空ipvsadm规则来恢复
[root@LVS ~]# ipvsadm -C
[root@LVS ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@LVS ~]# ipvsadm -R < /etc/sysconfig/ipvsadm.s1
[root@LVS ~]# 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.0.200:80 wrr
-> 172.16.100.10:80 Masq 3 0 0
-> 172.16.100.11:80 Masq 1 0 0
NAT方式被代理服务器无需做任何操作
六、LVS-NAT服务控制脚本部署在Director上
#!/bin/bash
#
# chkconfig: - 88 12
# description: LVS script for VS/NAT
# . /etc/rc.d/init.d/functions # VIP=192.168.0.200
DIP=172.16.100.1
RIP1=172.16.100.10
RIP2=172.16.100.11
#
case "$1" in
start)
# /sbin/ifconfig eth1:0 $VIP netmask 255.255.255.0 up
# Since this is the Director we must be able to forward packets
echo 1 > /proc/sys/net/ipv4/ip_forward
# Clear all iptables rules.
/sbin/iptables -F
# Reset iptables counters.
/sbin/iptables -Z
# Clear all ipvsadm rules/services.
/sbin/ipvsadm -C
# Add an IP virtual service for VIP 192.168.0.219 port 80
# In this recipe, we will use the round-robin scheduling method.
# In production, however, you should use a weighted, dynamic scheduling method.
/sbin/ipvsadm -A -t $VIP:80 -s rr
# Now direct packets for this VIP to
# the real server IP (RIP) inside the cluster
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m
/bin/touch /var/lock/subsys/ipvsadm.lock
;;
stop) # Stop forwarding packets
echo 0 > /proc/sys/net/ipv4/ip_forward
# Reset ipvsadm
/sbin/ipvsadm -C
# Bring down the VIP interface
ifconfig eth1:0 down
rm -rf /var/lock/subsys/ipvsadm.lock
;;
status)
[ -e /var/lock/subsys/ipvsadm.lock ] && echo "ipvs is running..." || echo "ipvsadm is stopped..."
;;
*)
echo "Usage: $0 {start|stop}"
;; esac
七、分享LVS-NAT一键安装脚本
#!/bin/bash
#
# 一键安装lvs-nat脚本,需要注意的是主机名成和ip的变化稍作修改就可以了
HOSTNAME=`hostname`
Director='LVS'
VIP="192.168.0.200"
RIP1="172.16.100.10"
RIP2="172.16.100.11"
RealServer1="web1"
RealServer2="web2"
Httpd_config="/etc/httpd/conf/httpd.conf"
#Director Server Install configure ipvsadm
if [ "$HOSTNAME" = "$Director" ];then
ipvsadm -C
yum -y remove ipvsadm
yum -y install ipvsadm
/sbin/ipvsadm -A -t $VIP:80 -s rr
/sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m
/sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "========================================================" echo "Install $Director sucess Tel:13260071987 Qq:467754239" echo "========================================================" fi
#RealServer Install htpd
if [ "$HOSTNAME" = "$RealServer1" ];then
yum -y remove httpd
rm -rf /var/www/html/index.html
yum -y install httpd
echo "web1 Allentuns.com" > /var/www/html/index.html
sed -i '/#ServerName www.example.com:80/a\ServerName localhost:80' $Httpd_config
service httpd start
echo "========================================================" echo "Install $RealServer1 success Tel:13260071987 Qq:467754239" echo "========================================================" fi
if [ "$HOSTNAME" = "$RealServer2" ];then
yum -y remove httpd
rm -rf /var/www/html/index.html
yum -y install httpd
echo "web2 Allentuns.com" > /var/www/html/index.html
sed -i '/#ServerName www.example.com:80/a\ServerName localhost:80' $Httpd_config
service httpd start
echo "Install $RealServer2"
echo "=========================================================" echo "Install $RealServer1 success Tel:13260071987 Qq:467754239" echo "=========================================================" fi
LVS-DR
一、LVS-DR架构.虚拟VIP地址 与 端口,DR架构WEB端口和虚拟端口监听一致。否则将无法访问,无法实现端口映射
一、实现原理
-
客户端发出请求报文至路由网关,路由网关eth1发出ARP解析请求,请求数据包目标IP(192.168.1.200)的MAC地址是多少,所有realserver均收到APR请求,此时为了让解析的MAC为Director的MAC,需要对所有realserver做出设置如下:
######所有realserver配置信息 sysctl -w net.ipv4.conf.eth0.arp_announce=2 sysctl -w net.ipv4.conf.all.arp_announce=2 sysctl -w net.ipv4.conf.eth0.arp_ignore=1 sysctl -w net.ipv4.conf.all.arp_ignore=1 #######解释说明 arp_ignore 接收到别人请求后的响应级别 0 只要本机配置有相应地址就给予相应 1 仅在请求目标地址配置在请求到达的接口上的时候,才给予相应 arp_annonce 主动向外通告过自己IP地址和MAC地址对应关系的通告级别 0 将本机任何接口上的任何地址向外通过 1 试图仅向目标网络通告与其网络匹配的地址信息 2 仅向目标网络通告与其网络匹配的地址信息是
-
客户端成功解析VIP的MAC地址为Director的MAC,将报文转发至调度器。
-
Director根据调度算法和规则选择为Realserver_one,并发出APR解析请求得到RIP对应的MAC地址,并重新封装数据报文的帧首部,将源MAC地址改为自己,目标MAC地址改为解析到的RIP的MAC地址,并发送报文至Realserver_one。
-
Realserver_one收到Director发来的报文处理并相应此请求报文,响应报文的源IP地址,必须是请求报文的目标IP(VIP)地址,需要对realserver做如下设置:
ifconfiglo:0 192.168.1.200 broadcast 192.168.1.200 netmask 255.255.255.255 route add -host 192.168.1.200 dev lo:0
-
此后整个传输过程数据包源IP为VIP,目标IP位CIP,数据报文沿着路由器转发至客户端,完成整个请求和相应过程。
二、DR模型实现负载均衡的工作方式,
上面说了NAT模型的实现方式,那么NAT模型有个缺陷,因为进出的每个数据包都要经过Director Server,当集群系统负载过大的时候Director Server将会成为整个集群系统的瓶颈,那么DR模型就避免了这样的情况发生,DR模型在只有请求的时候才会经过Director Server, 回应的数据包由Real Server 直接响应用户不需要经过Director Server,其实三种模型中最常用的也就是DR模型了,下面来说DR模型具体是怎么实现负载均衡的,根据上图,
1, 首先用户用CIP请求VIP,
2, 根据上图可以看到,不管是Director Server还是Real Server上都需要配置VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求数据包的源地址为CIP目标地址为VIP,此时路由器会发广播问谁是VIP,那么我们集群中所有的节点都配置有VIP,此时谁先响应路由器那么路由器就会将用户请求发给谁,这样一来我们的集群系统是不是没有意义了,那我们可以在网关路由器上配置静态路由指定VIP就是Director Server,或者使用一种机制不让Real Server 接收来自网络中的ARP地址解析请求,这样一来用户的请求数据包都会经过Director Servre,
3,当Director Server收到用户的请求后根据此前设定好的调度算法结果来确定将请求负载到某台Real Server上去,假如说此时根据调度算法的结果,会将请求负载到Real Server 1上面去,此时Director Server 会将数据帧中的目标MAC地址修改为Real Server1的MAC地址,然后再将数据帧发送出去,
4,当Real Server1 收到一个源地址为CIP目标地址为VIP的数据包时,Real Server1发现目标地址为VIP,而VIP是自己,于是接受数据包并给予处理,当Real Server1处理完请求后,会将一个源地址为VIP目标地址为CIP的数据包发出去,此时的响应请求就不会再经过Director Server了,而是直接响应给用户
编辑DR有三种方式
第一种方式:在路由器上明显说明vip对应的地址一定是Director上的MAC,只要绑定,以后再跟vip通信也不用再请求了,这个绑定是静态的,所以它也不会失效,也不会再次发起请求,但是有个前提,我们的路由设备必须有操作权限能够绑定MAC地址,万一这个路由器是运行商操作的,我们没法操作怎么办?第一种方式固然很简便,但未必可行。
第二种方式:在给别主机上(例如:红帽)它们引进的有一种程序arptables,它有点类似于iptables,它肯定是基于arp或基于MAC做访问控制的,很显然我们只需要在每一个real server上定义arptables规则,如果用户arp广播请求的目标地址是本机的vip则不予相应,或者说相应的报文不让出去,很显然网关(gateway)是接受不到的,也就是director相应的报文才能到达gateway,这个也行。第二种方式我们可以基于arptables。
第三种方式:在相对较新的版本中新增了两个内核参数(kernelparameter),第一个是arp_ignore定义接受到ARP请求时的相应级别;第二个是arp_announce定义将自己地址向外通告是的通告级别。【提示:很显然我们现在的系统一般在内核中都是支持这些参数的,我们用参数的方式进行调整更具有朴实性,它还不依赖于额外的条件,像arptables,也不依赖外在路由配置的设置,反而通常我们使用的是第三种配置】
arp_ignore:定义接受到ARP请求时的相应级别
0:只要本地配置的有相应地址,就给予响应。
1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应
2:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3:不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7:保留未使用
8:不回应所有(本地地址)的arp查询
arp_ignore
设置为1,当别人的arp请求过来的时候,如果接收的设备上面没有这个ip,就不响应,默认是0,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送MAC地址应答。
arp_announce:定义将自己地址向外通告是的通告级别;
0: 将本地任何接口上的任何地址向外通告
1:试图仅想目标网络通告与其网络匹配的地址
2:仅向与本地借口上地址匹配的网络进行通告
补充LVS-DR原理......
无论是学习一门编程语言也好,学习一门专业也好,在或者是学习一门手艺也罢!
记得!!!
学习的基础就是理论,理论是非常重要的,在几年的运维中,我一直都把理论放在第一位、说不上为什么,可能是几年的额感悟吧!
言归正传,学习lvs最好的方法就是学习它的工作原理,学习它的内部架构等等,lvs的部署是很简单的,但是在原理和理解方面往往都会有很大的偏差。在这里,我相信如果大家把这篇博文仔仔细细的看一遍,对lvs一定会有一个深入的体会和了解,中秋三天送给博友的礼物!哈哈 咱就不提月饼了。嘿嘿 同时也祝自己面试成功 夜已黑 2014-09-09 01:45:00
后续还会继续补充,希望能和大家共同学习。
所有的Director和RealServer都在同一个物理网络中(交换机)并且都只有一块网卡,交换机前面有个路由器,这个路由器可能是我们机房内部的,也有可能是网络运行商的。
当客户端的请求被送到R2和Switch之间的时候,这个时候源ip是cip,目标地址是vip。vip一定在Director上是毋庸置疑的,所以这个报文就背送到Director的vip网卡上。
当客户端的请求被送到Switch和Director之间的时候,这个时候源ip仍然是cip,目标地址是vip。Director发现当前本机配置的有vip地址,所以请求的一定是当前主机
所以报文经过Prerouting链到达Input链,而监控在Input链上的ipvs规则发现请求的是一个集群服务,比如监听在80端口的web集群服务。这个时候lvs要根据ipvs规则
等等要修改报文了,在LVS-DR模型下报文送到Director上的时候,Director不会拆它的IP首部,也不会拆它的TCP首部,Director只要将MAC地址或者帧首部拆掉了。
为什么Director要拆开帧首部MAC地址呢?因为报文的目的地址就是Director本地主机,只要到达目的主机,网卡就会拆开帧首部的。因为目标MAC就是本地主机。
拆掉帧首部以后,查看IP首部和TCP首部,它发现请求的报文访问的是一个集群服务。
因此为了实现LVS-DR模型的效果,在源有的IP首部之上(切记源IP、目标IP、源端口、目标端口等等没有动),仅仅是在原有的报文外面又重新封装了一个MAC地址帧首部
帧首部有源MAC和目标MAC,这个时候发送的主机是Director。于是Director把本地网卡的MAC地址作为整个报文的源MAC地址,而目的MAC就是选择的后端某台RealServer
[选择后端的某台RealServe是Director根据它的一些调度算法(rr,wrr...)选择的]。假如选择的是RealServer2,那么会找到RealServer2 IP对应的MAC地址,于是找到了
RealServer2网卡对应的MAC地址,它是通过ARP地址解析找到的RealServer2对应的MAC地址。
那么Director到RealServer2之间的报文传送是源MAC地址是Director网卡对应的MAC地址,目标MAC地址是RealServer2网卡对应的MAC地址。
RealServer2接收到报文以后,发现请求的报文真的是自已,于是拆掉了MAC的帧首部,拆掉后发现请求的报文源地址是cip,目标地址是VIP。如果RealServer2上没有VIP
,那么RealServer2是不会接受这个报文的,因此必须在每个RealServer上配置VIP地址。因为RealServer2上有VIP地址,报文被接收下来,拆掉了IP首部,发现了报文
请求的是一个服务,比如80 因为传输层没有做任何修改,用户请求的是80服务,那么RealServer2接收到的报文也是请求的80服务。如果RealServer2上有80服务,于是
RealServer2把这个请求转交给用户空间的进程,由用户空间处理完成后,向外响应的。而请求报文的源地址是CIP,目标地址是VIP。那么尽可能让它使用CIP是目标地址
VIP是源地址,于是这个响应报文直接被发送到了交换机上。
当RealServer2响应报文到达Switch的时候,这个时候源地址是VIP,目标地址是CIP。
因为目标地址是CIP,假如VIP和CIP不在同一个网段当中,这个时候要根据目标地址CIP做路由选择,比如默认路由,网关才能响应CIP的报文请求
大家都知道目标地址CIP是互联网地址,那么每个RealServer的网关要指向哪呢??????
要指向能够访问互联网的设备,不应该指向Director的DIP地址。而是直接指向了能够访问互联网的路由设备。所有(很有可能)指向的是R2路由的私有地址做网关。
为什么是很有可能而不是说一定呢????
当报文被送到Switch和R2的时候,这个时候的源地址是VIP,目标地址是CIP。那么这个时候报文被送到R2网关的时候,R2发现目标地址是互联网的地址CIP,它会通过
路由NAT然后被送到CIP上的。
这里要考虑一个问题,为了实现每台RealServer在向外发送响应报文的时候,可以把VIP作为源地址,因此我们在每台RealServer上配置了VIP地址。
假如客户端发送请求报文被送到R2路由器的时候,那么R2路由器会拆开客户端的请求报文发现源地址是CIP,目标地址是VIP;无论是将请求送给Director还是RealServer,必须要根据
MAC地址向内转发,因为在同一网段,那么它怎么知道VIP对应的MAC地址是什么呢????
那么将进行广播说:‘我知道有一个家伙的VIP地址,那么请告诉我它对应的MAC地址’,那么它发送的广播请求,同一网段的所有主机都能收到,于是配置有VIP地址的所有主机都进行相应并告诉自已的MAC地址,那么如果所有的主机都进行相应,那么前端的路由设备就混乱了,它就无法分辨谁才是VIP对应的MAC地址。
默认情况下,谁相应的快,就会把客户端的请求报文发送给那台主机,如果被送到RealServer2 那么就不符合我们负载均衡的条件了。
那么我们在这里需要做一个非常重要的事情,就是每台配置有RealServer的VIP地址不给予ARP响应。那么我们如果屏蔽它不能响应呢?
那么所有的RealServer上都要关闭对ARP广播的响应。
要达到的目的:让我们的前端路由或者网关,实现报文发送的时候,仅仅能够将报文对目标IP为VIP发送给Director?
实现的方式有以下三种:
1、在R2路由器的内部接口上手动绑定一个静态的解析地址,明确指明目标是VIP的MAC一定是Director的MAC
那么以后发送报文的时候就不用再次请求了,可以由指定的静态解析地址直接发送给Director
这个绑定是静态的也不会失效
缺点:
R2路由是内部路由器,那么VIP是私有地址;如果R2是网络运营商提供的路由设备,也就是VIP是公网地址,我们就无法再R2上进行静态绑定了。
2、arptables:
基于MAC地址做访问控制的,我们只需要在每台RealServer上定义arptables规则,如果用户的arp广播请求的目标地址是本机的VIP则不给予响应或者响应的报文不出去。
那么这个情况所有的RealServer上不响应arp广播请求,只有Director响应给路由则报文就必然被发送给Director。
3、kernel paramter:
arp_ignore
arp_announce
作用:限定我们的Linux主机对arp广播请求的响应级别,以及向外通告自已ip地址的通告级别的。
二、配置过程
Director配置
10.30.30.125 | lvs+keepalived | ||
10.30.30.126 | lvs+keepalived | ||
10.30.30.125(我节点不够了) | nginx | ||
10.30.30.126(我节点不够了) | nginx | ||
10.30.30.128 | tomcat | ||
10.30.30.129 | tomcat |
也可以nginx和tomcat在一起,也可以nginx单独,随意开心就好~~
125节点:
ipvsadm方式如下:
vim dr.sh
echo 1 > /proc/sys/net/ipv4/ip_forward
net_card="eno16780032"
ipv=/usr/sbin/ipvsadm
vip=10.30.30.200
rs1=10.30.30.128
rs2=10.30.30.129
ifconfig ${net_card}:1 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ${net_card}:1
$ipv -C
$ipv -A -t $vip:8080 -s wrr
$ipv -a -t $vip:8080 -r $rs1:8080 -g -w 1
$ipv -a -t $vip:8080 -r $rs2:8080 -g -w 1
#$ipv -a -t $vip:80 -r $rs1:8080 -m -w 1
#$ipv -a -t $vip:80 -r $rs2:8080 -m -w 1
DR模式:
注意lvs的端口要和被代理服务的端口一致才可以
lvs可以代理nginx,nginx在代理tomcat。此时lvs端口要和nginx一致
也可以lvs直接代理tomcat,此时端口要和tomcat保持一致
或
keepalived方式如下
[root@k8s-test-125 keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
#acassen@firewall.loc
#failover@firewall.loc
#sysadmin@firewall.loc
test@163.com
}
#notification_email_from Alexandre.Cassen@firewall.loc
notification_email_from test@163.com
#smtp_server 192.168.200.1
#smtp_connect_timeout 30
#smtp_server smtp.163.com
#smtp_connect_timeout 30
router_id LVS_DEVEL
#vrrp_skip_check_adv_addr
#vrrp_strict
#vrrp_garp_interval 0
#vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface eno16780032
#interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.30.30.200/32
}
}
virtual_server 10.30.30.200 80 { #:虚拟VIP地址 与 端口,DR架构WEB端口和虚拟端口监听一致。否则将无法访问,无法实现端口映射
delay_loop 6
#lb_algo rr|wrr|lc|wlc|sed|lblc|sh|dh
lb_algo wrr
#lb_kind NAT|DR|TUN
lb_kind DR
nat_mask 255.255.255.0
#persistence_timeout 50
persistence_timeout 0
protocol TCP
real_server 10.30.30.125 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 10.30.30.126 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
端口要一致,同上一样
systemctl start keepalived
可以查看ipvsadm -S
realserver端配置
125/126/128/129
需要lvs代理那里节点就在那里节点上面执行如下脚本
vim web.sh
#!/bin/bash
SNS_VIP=10.30.30.200
NET_CAR="lo:1"
source /etc/rc.d/init.d/functions
case "$1" in
start)
ifconfig ${NET_CAR} $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
/sbin/route add -host $SNS_VIP dev ${NET_CAR}
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
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
ifconfig ${NET_CAR} down
route del $SNS_VIP >/dev/null 2>&1
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
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
此时就可以使用了 10.30.30.200 访问了
DR模式需要所有几点在同一个网络中
LVS-TUN模式
TUN的工作机制跟DR一样,只不过在转发的时候,它需要重新包装IP报文。这里的real server(图中为RIP)离得都比较远。用户请求以后,到director上的VIP上,它跟DR模型一样,每个realserver上既有RIP又有VIP,Director就挑选一个real server进行响应,但是director和real server并不在同一个网络上,这时候就用到隧道了,director进行转发的时候,一定要记得CIP和VIP不能动。我们转发是这样的,让它的CIP和VIP不动,在它上面再加一个IP首部,再加的IP首部源地址是DIP,目标地址的RIP的IP地址。收到报文的RIP,拆掉报文以后发现了里面还有一个封装,它就知道了,这就是隧道。
其实数据转发原理和DR是一样的,不过这个我个人认为主要是位于不同位置(不同机房);LB是通过隧道进行了信息传输,虽然增加了负载,可是因为地理位置不同的优势,还是可以参考的一种方案;
优点:负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理很巨大的请求量,这种方式,一台负载均衡能为超过100台的物理服务器服务,负载均衡器不再是系统的瓶颈。使用VS-TUN方式,如果你的负载均衡器拥有100M的全双工网卡的话,就能使得整个Virtual Server能达到1G的吞吐量。
不足:但是,这种方式需要所有的服务器支持"IP Tunneling"(IP Encapsulation)协议;
LVS的健康状态检查
在LVS模型中,director不负责检查RS的健康状况,这就使得当有的RS出故障了,director还会将服务请求派发至此服务器,这种情况对用户、企业都是很不爽的,哪个用户倒霉说不定就遇到类似了,为了让director更人性化、可靠还要给director提供健康检查功能;如何实现?Director没有自带检查工具,只有手动编写脚本给director实现健康状态检查功能!
#!/bin/bash
# VIP=172.16.100.100
CPORT=80
FAIL_BACK=127.0.0.1
RS=("172.16.100.10" "172.16.100.11")
declare -a RSSTATUS
RW=("2" "1")
RPORT=80
TYPE=g
CHKLOOP=3
LOG=/var/log/ipvsmonitor.log
addrs() {
ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
[ $? -eq 0 ] && return 0 || return 1
}
delrs() {
ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
[ $? -eq 0 ] && return 0 || return 1
}
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 I in ${RS[*]}; do if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; then
RSSTATUS[$COUNT]=1
else
RSSTATUS[$COUNT]=0
A++
Dir[0]=$A fi let COUNT++
done
}
initstatus while :; do let COUNT=0 for I 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 %H:%M:%S'`, $I is back." >> $LOG
fi else if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then
delrs $I
[ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG
fi fi
let COUNT++ done sleep 5 done
LVS持久连接
一、定义
持久连接是指无论LVS使用什么算法,LVS持久都能实现在一定时间内,将来自同一个客户端请求派发至此前选定的RS
二、原理
无论使用LVS任何调度算法,LVS持久连接都能实现在一定时间内,将来自同一个客户端请求派发至此前选定的服务器;当一个新的客户端请求连接时,LVS就会在内存的缓冲区内记录客户端的IP以及所选的服务器,在一定时间内用户再次访问时,LVS会通过内存缓冲区来查找是否有此用户记录,如果有将直接连接到已选定的服务器上,否则记录IP及连接的服务器;这个内存缓冲区称之为持久连接模板,它存储了每一个客户端,及分配给它的RS的映射关系。
持久连接在一定环境下还是非常有用的,由于在SSL会话中,比如当用户和服务器好不容易建立了SSL会话,用户一不小心刷新了页面,director有给用户分发了一个新的服务器,用户还要从新建立SSL连接请求,这是很不爽的!这种连接方式称为持久端口连接(PPC),将来自于同一个客户端对同一个集群服务的请求,始终定向至此前选定的RS。
持久连接还会将同个用户的其他服务请求连接到已建立连接的服务器上,比如当用户访问web服务时,还要能实现https认证,如果访问web时,分配了一个RS,要通过https认证则又分配了一个RS;这样就产生了矛盾,它认证的不是一个RS,使得访问无法安全进行;因此持久连接是必不可少的,这种称为持久客户端连接(PCC),将来自于同一个客户端对所有端口的请求,始终定向至此前选定的RS;把所有端口统统定义为集群服务,一律向RS转发!
持久防火墙标记连接(PNMPP):定义端口间的姻亲关系,将特定端口定义在同一个RS上。这是通过在防火墙内部PREROUTING链上,将规定的端口打上标记;比如:80端口标记为10,23端口也标记为10;这样在写规则时只需将端口该为10即可,80和23端口就会在同一个RS上响应了
三、持久连接的分类
1、PPC 将来自于同一个客户端对同一个集群服务的请求,始终定向至此前选定的RS; 持久端口连接
2、PCC 将来自于同一个客户端对所有端口的请求始终定向至此前选定的RS 持久客户端连接
把所有端口统统定义为集群服务,一律向RS转发:
定义所有的服务
3、PNMPP 持久防火墙标记连接
定义部分服务
四、持久连接的命令
ipvsadm -A|E ... -p timeout:
timeout:持久连接时长,默认300秒:单位是秒
五、额外的补充
持久连接模板(内存缓冲区)
持久连接模板记录了:每一个客户端IP及分配给它的RS的映射关系
查看持久连接模板
ipvsadm -L -c #显示当前的每一个连接模板
ipvsadm -L --persistent-conn #显示当前的持久连接数
{
[root@LVS ~]# ipvsadm -L -c
IPVS connection entries
pro expire state source virtual destination
[root@LVS ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.100.100:80 wlc
-> 172.16.100.10:80 Route 1 0 0
-> 172.16.100.11:80 Route 2 0 0
}
PNMPP的语法
PREROUTING
80:标记10
23:标记10
语法: /sbin/iptables -F -t mangle
/sbin/iptables -A PREROUTING -i eth0 -t mangle -p tcp -d 172.16.100.6 --dport 80 -j MARK -set-mark 1
/sbin/iptables -A PREROUTING -i eth0 -t mangle -p tcp -d 172.16.100.6 --dport 443 -j MARK -set-mark 1
/sbin/ipvsadm -A -f 1 -s rr -p 3600
/sbin/ipvsadm -a -f 1 -r 172.16.100.10 -g -w 2
/sbin/ipvsadm -a -f 1 -r 172.16.100.11 -g -w 1
六、部署
假如后端有多台RS;同时定义了两个集群服务,web服务和telnet服务
目的:前端用户访问80端口的时候会同时负载后端的多台RS上,并且23号端口的访问也会同时负载到多台RS上。
描述:后端有多台RS。每台RS上同时提供web服务和telnet服务。我们希望前端用户访问的时候,对80端口发起的访问请求会分别负载到多台RS上。
同时对23号端口的访问也会负载到多台RS上。所以说,它们同时提供了两类集群服务,那么就是Dirctor同时提供两种集群服务的负载均衡。
结论:
持久连接有这种功能
比如,user1访问80端口服务的时候,Director把报文转发RS1上;当user1下次在访问23号端口的时候,Director还是会把报文转发RS1上的。
1、ipvsadm轮询算法rr
[root@LVS ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.100.100:80 rr
-> 172.16.100.10:80 Route 1 0 0
-> 172.16.100.11:80 Route 2 0 0
结论:通过上面的轮询算法rr;用浏览器访问的结果是
第一次被定向到RS1上面
第二次被定向到RS2上面
第三次被定向到RS1上面
第四次被定向到RS2上面
......
2、ipvsadm的持久连接web服务(PPC)
[root@LVS ~]# ipvsadm -E -t 172.16.100.100:80 -s rr -p 600
[root@LVS ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.100.100:80 rr persistent 600
-> 172.16.100.10:80 Route 1 0 0
-> 172.16.100.11:80 Route 2 0 0
结论:通过上面的持久连接;用浏览器访问的结果是
如果此时定向到RS1上,那么刷新页面之后被定向到RS2上,以后你无论怎么刷新都被定向到RS2上面。
[root@LVS ~]# ipvsadm -L --persistent-conn
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Weight PersistConn ActiveConn InActConn
-> RemoteAddress:Port
TCP 172.16.100.100:http rr persistent 600
-> 172.16.100.10:http 1 0 0 0
-> 172.16.100.11:http 2 1 0 16
[root@LVS ~]# ipvsadm -L -c
IPVS connection entries
pro expire state source virtual destination
TCP 00:00 FIN_WAIT 172.16.100.2:52083 172.16.100.100:http 172.16.100.11:http
TCP 00:10 FIN_WAIT 172.16.100.2:52086 172.16.100.100:http 172.16.100.11:http
TCP 00:00 FIN_WAIT 172.16.100.2:52071 172.16.100.100:http 172.16.100.11:http
TCP 00:00 FIN_WAIT 172.16.100.2:52085 172.16.100.100:http 172.16.100.11:http
TCP 08:00 NONE 172.16.100.2:0 172.16.100.100:http 172.16.100.11:http
TCP 00:00 FIN_WAIT 172.16.100.2:52084 172.16.100.100:http 172.16.100.11:http
3、ivpsadm的持久连接telnet服务(PPC)
注意:telnet是不允许超级管理员root直接远程登陆的
{ #安装、启动telnet服务
# yum -y install telnet-server
# chkconfig --add telnet
# chkconfig telnet on
# useradd jerry
# passwd jerry
# netstat -tnlp |grep :23 }
{ #定义telnet集群服务
ipvsadm -C
ipvsadm -A -t 172.16.100.100:23 -s rr
ipvsadm -a -t 172.16.100.100:23 -r 172.16.100.10 -g -w 2
ipvsadm -a -t 172.16.100.100:23 -r 172.16.100.11 -g -w 1
测试1
Xshell:\> telnet 172.16.100.100
login: jerry
Password: jerry
[jerry@web2 ~]$ #RS2
看主机名称可以辨别出连接的是哪一台RS,然后退出后在此登陆
Xshell:\> telnet 172.16.100.100
login: jerry
Password: jerry
[jerry@web1 ~]$ #RS1
支持持久连接的telnet服务
[root@LVS ~]# ipvsadm -E -t 172.16.100.100:23 -s rr -p 3600
[root@LVS ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.100.100:23 rr persistent 3600
-> 172.16.100.10:23 Route 2 0 0
-> 172.16.100.11:23 Route 1 0 1
测试2
Xshell:\> telnet 172.16.100.100
login: jerry
Password: jerry
[jerry@web1 ~]$ #RS1
退出后再次登陆
Xshell:\> telnet 172.16.100.100
login: jerry
Password: jerry
[jerry@web1 ~]$ #RS1
结论:telnet集群服务的持久连接成功
}
4、ipvsadm持久连接(PCC)
{ #把0端口定义成集群服务,这意味所有的端口都是集群服务
ipvsadm -C
ipvsadm -A -t 172.16.100.100:0 -s rr -p 600
ipvsadm -a -t 172.16.100.100:0 -r 172.16.100.10 -g -w 2
ipvsadm -a -t 172.16.100.100:0 -r 172.16.100.11 -g -w 1
测试 浏览器、telnet、ssh
浏览器访问被定向到比如RS2
telnet测试被定向到RS2
Xshell:\> telnet 172.16.100.100
login: jerry
Password: jerry
[jerry@web2 ~]$ #RS2
ssh 172.16.100.100
[root@web2 ~]#
看下连接的模板
[root@LVS ~]# ipvsadm -L -c
IPVS connection entries
pro expire state source virtual destination
TCP 14:32 ESTABLISHED 172.16.100.2:52735 172.16.100.100:ssh 172.16.100.11:ssh
TCP 00:09 NONE 172.16.100.2:0 172.16.100.100:0 172.16.100.11:0
TCP 04:11 NONE 172.16.100.2:0 172.16.100.100:telnet 172.16.100.10:telnet
TCP 14:55 ESTABLISHED 172.16.100.2:52499 172.16.100.100:telnet 172.16.100.11:telnet
}
5、ivpsadm持久连接(PCC)
现在把23端口和80端口的定义成一个集群服务
22端口的是另外一个集群服务
ipvsadm -C
service ipvsadm restart
ipvsadm -L -n
iptables -A PREROUTING -i eth2 -t mangle -p tcp -d 172.16.100.100 --dport 80 -j MARK --set-mark 8
iptables -A PREROUTING -i eth2 -t mangle -p tcp -d 172.16.100.100 --dport 23 -j MARK --set-mark 8
ipvsadm -A -f 8 -s rr [-p 600]
ipvsadm -a -f 8 -r 172.16.100.10 -g -w 2
ipvsadm -a -f 8 -r 172.16.100.11 -g -w 1
结论:
由于22端口的ssh服务没有被定义成集群服务,所以在登陆的时候是Director来响应
Xshell:\> ssh 172.16.100.100
[root@LVS ~]#
由于80服务和23服务都被定义集群服务,所以在访问的时候应该是调度算法轮询来响应的
Xshell:\> telnet 172.16.100.100
login: jerry
Password:
[jerry@web2 ~]$
退出再次访问
Xshell:\> telnet 172.16.100.100
login: jerry
Password:
[jerry@web1 ~]$
浏览器访问也是一样的,轮询这响应请求
第一次响应的是RS1
第二次响应的是RS2
第三次响应的是RS1
第四次响应的是RS2
问题清单
keepalived配置,解决vip无法ping通,虚拟服务器端口无法访问的问题
keepalived网上教程很多,通过yum install keepalived下载安装后,在/etc/keepalived/keepalived.conf默认配置很详细,很方便新手基于该配置修改成自己所想要的配置文件,相应keepalived配置教程很多,按照配置教程基于keepalived.conf修改很容易出现配置好的vip无法ping通,或者vip可ping通,但映射的端口无法访问。
vip无法ping通
keepalived.conf中vip配置好后,通过ip addr可以看到vip已经顺利挂载,但是无法ping通,并且防火墙都已关闭,原因是keepalived.conf配置中默认vrrp_strict打开了,需要把它注释掉。重启keepalived即可ping通。
映射端口无法访问
vip可ping通后,访问vip映射端口无法访问,直接访问real_server的ip和端口可访问。
解决这个问题需要对lvs相关知识进行初步了解,详见《LVS手册》http://www.linuxidc.com/Linux/2016-03/129233.htm
在keepalived.conf中对virtual_server配置有
lb_kind可以设置为NAT、DR、TUN。这个选项直接关系到你做的 virtual_server和real_server能否进行正确映射。
NAT模式和路由器NAT模式类似,用于访问client和real_server在不同网段实现通信。如果你在一个局域网内做负载均衡选用NAT,那恭喜你,你肯定是无法访问。可以做个NAT模式的测试,需要在keepalived主机上配置双网卡,分别在两个不同网段中,如keepalived主机网卡对client地址为10.0.0.0/24,对real_server的地址为192.168.2.0/24。vip设置为10.0.0.164,real_server为192.168.2.67,可采用下面的keepalived.conf配置
vrrp_instance VI_1 {
state MASTER
interface ens37
virtual_router_id 66
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.164/24
}
}
virtual_server 10.0.0.164 80 {
delay_loop 6
lb_algo rr
lb_kind NAT
protocol TCP
real_server 192.168.2.67 80
{
weight 1
}
}
配置正确后在keepalived主机上执行systemctl restart keepalived.service。从client上执行curl 10.0.0.164发现还是无法访问。这是由于real_server在接收到请求包后找不到路由进行数据返回,此时需要将keepalived主机作为网关,在real_server上添加回程路由route add default gw 192.168.2.65。192.168.2.65即为keepalived主机。考虑keepalived主机一般双机,因此此处可以用keepalived主机的虚拟IP。 现在再执行curl 10.0.0.164就可以正常返回。
DR模式是在局域网内最简单的映射模式,原理可参见《LVS手册》。但只在keepalived主机上配置lb_kind DR是无法访问到real_server的,DR模式会将目标地址为虚拟IP地址原封不动的传给real_server。real_server发现这不是我的IP,因此会丢弃掉该包,所以这边得欺骗一下real_server,让他认为这是他的地址。做法很简单,在real_server的lo回环口上添加那个虚拟IP,这样real_server就会认为自己就是VIP这台服务器。切记在lo上设置,不要在真实网卡上设置,道理留给大家思考。
https://blog.csdn.net/charthyf/article/details/81456872
详细文档不错:https://blog.csdn.net/Michaelwubo/article/details/95214504