lvs :
ipvs scheduler:
根据其调度时是否考虑各RS当前的负载状态,可分为静态方法和动态方法两种:
1、静态方法:仅根据算法本身进行调度;
-
RR:roundrobin,轮询;
-
WRR:Weighted RR,加权轮询;
-
SH:Source Hashing,实现session sticy,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定;
-
DH:Destination Hashing;目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的RS;
2、动态方法:主要根据每RS当前的负载状态及调度算法进行调度;
Overhead= LC:least connections Overhead=activeconns*256+inactiveconns WLC:Weighted LC Overhead=(activeconns*256+inactiveconns)/weight SED:Shortest Expection Delay Overhead=(activeconns+1)*256/weight NQ:Never Queue LBLC:Locality-Based LC,动态的DH算法; LBLCR:LBLC with Replication,带复制功能的LBLC;
ipvsadm/ipvs:
ipvs:
查看系统是不是已经编译了ipvs
~]# grep -i -C 10 "ipvs" /boot/config-3.10.0-327.el7.x86_64
支持的协议工作在传输层:TCP, UDP, AH, ESP, AH_ESP, SCTP;
定义ipvs集群:
-
定义集群服务
定义哪一类请求(协议)是属于负载均衡集群,要根据协议的目标IP和端口, 来判定集群类型!
-
添加服务上的RS
ipvsadm命令:
1.管理集群服务:增、改、删;
-
增A、改E:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-
删:-D
ipvsadm -D -t|u|f service-address service-address:定义的集群服务本身的地址。 -t|u|f: -t: TCP协议的端口,VIP:TCP_PORT -u: TCP协议的端口,VIP:UDP_PORT -f:firewall MARK,定义在PREROUTING,是一个数字,用来打标记;以便于定义多个端口的服务为一个集群! [-s scheduler]:指定集群的调度算法,默认为wlc;
2.管理集群上的RS:增、改、删;
-
增a、改e:
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-
删:
ipvsadm -d -t|u|f service-address -r server-address server-address: Rserver rip[:port] 选项: lvs类型: -g: gateway, dr类型 -i: ipip, tun类型 -m: masquerade, nat类型 -w weight:权重;
3.清空定义的所有内容:
ipvsadm -C
这就能清空所有的集群服务!
4.查看:
ipvsadm -L|l [options] --numeric, -n:显示端口不要去解析 --exact:显示精确值,不要做单位换算 --connection, -c:显示每一个主机上当前连接的数量 --stats:统计数据 --rate :output of rate information
5.保存和重载:
ipvsadm -S == ipvsadm-save ipvsadm -R == ipvsadm-restore
实例1.lvs-net模式实验
1.实验前提
(1)调度器:centos6.8,双网卡 eth0 10.1.6.68;eth1为vmnet1模式 192.168.0.1;安装ipvsadm打开核心转发功能
~]# echo 1 > /proc/sys/net/ipv4/ip_forward
ifconfig eth1 192.168.22.1/24 up
(2)RealServer:均为centos7.2安装好相应的服务网卡为vmnet1模式ip 192.168.22.11 ip 192.168.22.22
添加默认路由
route add default gw 192.168.22.1
2、测试
RealServer开通web服务并添加测试页面
用10.1.6.68主机测试发现正常
3.添加集群服务
4.测试
5.换个算法再测试一下
–
负载均衡集群的设计要点:
(1) 是否需要会话保持; (2) 是否需要共享存储; 共享存储:NAS, SAN, DS(分布式存储) 数据同步: 课外作业:rsync+inotify实现数据同步
lvs-nat:
设计要点: (1) RIP与DIP在同一IP网络, RIP的网关要指向DIP; (2) 支持端口映射; 实践作业(博客):负载均衡一个php应用; 测试:(1) 是否需要会话保持;(2) 是否需要共享存储;
lvs-dr:
这种模型就是负载均衡器接收到报文时在报文的首部添加一层MAC地址,再通过交换机(这里只能是交换机)转发到后端主机,后端主机接收到报文拆解后发现目标地址是lo上的地址就经lo进入input链进行响应,响应的结果就又从lo接口出去,这样就保证了源ip为请求ip,发送到路由器到客户端。这里可以不经过交换机。
dr模型中,各主机上均需要配置VIP,解决地址冲突的方式有三种:
-
(1) 在前端网关做静态绑定;
-
(2) 在各RS使用arptables;
-
(3) 在各RS修改内核参数,来限制arp响应和通告的级别;
限制响应级别:arp_ignore0:默认值,表示可使用本地任意接口上配置的任意地址进行响应; 1: 仅在请求的目标IP配置在本地主机的接收到请求报文接口上时,才给予响应;
限制通告级别:arp_announce
0:默认值,把本机上的所有接口的所有信息向每个接口上的网络进行通告; 1:尽量避免向非直接连接网络进行通告; 2:必须避免向非本网络通告;
RS的预配置脚本:个Rs均适用
#!/bin/bash # vip=10.1.0.5 mask='255.255.255.255' case $1 in start) echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce ifconfig lo:0 $vip netmask $mask broadcast $vip up route add -host $vip dev lo:0 ;; stop) ifconfig lo:0 down echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce ;; *) echo "Usage $(basename $0) start|stop" exit 1 ;; esac
测试web
-
V server配置
–
-
客户端测试
测试mysql
VS的配置脚本:
#!/bin/bash # vip='10.1.0.5' iface='eno16777736:0' mask='255.255.255.255' port='80' rs1='10.1.0.7' rs2='10.1.0.8' scheduler='wrr' type='-g' case $1 in start) ifconfig $iface $vip netmask $mask broadcast $vip up iptables -F ipvsadm -A -t ${vip}:${port} -s $scheduler ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1 ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1 ;; stop) ipvsadm -C ifconfig $iface down ;; *) echo "Usage $(basename $0) start|stop" exit 1 ;; esac 课外扩展作业:vip与dip/rip不在同一网段的实验环境设计及配置实现; 博客作业:lvs的详细应用 讲清楚类型、调度方法;并且给出nat和dr类型的设计拓扑及具体实现;
FWM:FireWall Mark
借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度;
打标记方法(在Director主机):
# iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER 基于标记定义集群服务: # ipvsadm -A -f NUMBER [options]
环境为之前环境
不过这样两个集群是分离的
定义为同一个集群,利用iptables
我们一般建议http和https两个集群绑定在一块
lvs persistence:持久连接
持久连接模板:实现无论使用任何算法,在一段时间内,实现将来自同一个地址的请求始终发往同一个RS;
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] port Affinity: 每端口持久:每集群服务单独定义,并定义其持久性; 每防火墙标记持久:基于防火墙标记定义持久的集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity; 每客户端持久:基于0端口定义集群服务,即将客户端对所有应用的请求统统调度至后端主机,而且可使用持久连接进行绑定;这种0端口只能适用于持久连接 -p。
保存及重载规则:
因为在此服务在centos中有系统启动脚本用rpm -ql 就能看到 /usr/lib/systemd/system/ipvsadm.service
,要是启动不了可能是没有/etc/sysconfig/ipvsadm文件 touch一下就好了
保存:建议保存至/etc/sysconfig/ipvsadm
ipvsadm-save > /PATH/TO/IPVSADM_FILE ipvsadm -S > /PATH/TO/IPVSADM_FILE systemctl stop ipvsadm.service 重载: ipvsadm-restore < /PATH/FROM/IPVSADM_FILE ipvsadm -R < /PATH/FROM/IPVSADM_FILE systemctl restart ipvsadm.service
考虑:
(1) Director不可用,整个系统将不可用;SPoF 解决方案:高可用 keepalived :在用到ipvs时用这个 heartbeat/corosync (2) 某RS不可用时,Director依然会调度请求至此RS; 解决方案:对各RS的健康状态做检查,失败时禁用,成功时启用; keepalived heartbeat/corosync, ldirectord 检测方式: (a) 网络层检测;意味着ping通 (b) 传输层检测,端口探测;扫描端口。 (c) 应用层检测,请求某关键资源; ok --> failure failure --> ok
原创文章,作者:qzx,如若转载,请注明出处:http://www.178linux.com/56332