简介
[root@salt-node01 ~]# lsmod | grep ip_vs ip_vs_rr 12600 0 ip_vs 141092 2 ip_vs_rr nf_conntrack 111302 7 ip_vs,nf_nat,nf_nat_ipv4,nf_nat_ipv6,xt_conntrack,nf_conntrack_ipv4,nf_conntrack_ipv6 libcrc32c 12644 2 xfs,ip_vs You have new mail in /var/spool/mail/root
管理工具(均可通过yum来安装):
ipvsadm、keepalived、 Piranha(RedHat提供的)
术语:
CIP、VIP、DIP、RIP
集群组成:
利用LVS搭建的集群系统由3部分组成:最前端的是负载均衡层,中间层是服务器集群层,最后层是共享存储层。共字存储层是为所有Real Server提供共亨存储空问和内容一致性的存储区域,一般由磁盘阵列设备组成。为了提俱内容的一致性,一般可以通过NFS网络义件系统共 亨数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件 系统,例如Red Hat的GFS文件系统,Oracle提供的OS2文件系统等。此文章不对共享存储层做详细介绍,详情可参照后边的文章。如下图所示
模式:
A.NAT 作用于4层,传输层
流程:初始是CIP:VIP 经过LB时,LB根据调度算法选择合适的后端RealServer,并将数据包的vip修改为realserver的ip地址,并写到hash记录表中;此时数据包变为了CIP:RIP。将数据包发送给RIP,RIP进行处理后将数据包(RIP:CIP)发送给LB,LB根据hash记录表,将RIP修改为VIP,然后将数据包发送给CIP。来访问是DNAT的过程,返回是SNAT的过程。
LB:需要在指定网卡绑定vip
RS:需要将网关设置为LB的IP地址
优点:可对指定后端rs的端口,即可以更改端口
缺点:进出数据包都会经过LB,LB的网卡流量会是瓶颈
适用场景:非高并发请求场景,10个RS以内;可隐藏内部的DIP和RIP地址;
B.DR 作用于二层,数据链路层
流程:初始数据包目标MAC地址是LB的MAC,经过LB时,LB根据调度算法选择合适的后端RealServer,并将数据包的目标MAC地址修改为realserver的MAC地址,此时数据包的目标地址是RS的MAC,数据包在LB经过泛洪,发送到RS,RS处理时,发现数据IP是自己Lo的IP地址,所以可以进行处理不会丢弃;RS处理数据包后,将数据包VIP:CIP直接发送给CIP
LB:需要在指定网卡绑定VIP
RS:需要抑制ARP,且LB和RS要在一个广播域
缺点:不能更改端口,LB和RS必须在一个广播域,需要关闭RS的arp解析,绑定vip
优点:负载能力比NAT强,LB流量不会是瓶颈
场景:因为响应报文不经过Director,极大的减轻了Director的负载压力,故Director可以支持更大的并发访问,一般RS在100台以内;
C.IP TUN
D.FULLNAT
调度算法:
--scheduler -s scheduler one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq, the default scheduler is wlc.
rr:Round Robin # 即轮询 wrr:Weighted RR # 即加权轮询 sh:Source Hashing # 即来源IP地址hash dh:Destination Hashing # 即目标地址hash(不常用,仅用于前端多防火墙的场景,保证防火墙的连接追踪功能有效)
动态算法:
lc:Least Connection # 评判标准:Overhead=Active*256+Inactive # Overhead最小者胜出 wlc:Weighted LC # 评判标准:Overhead=(Active*256+Inactive)/weight # Overhead最小者胜出 sed:Shortest Expect Delay # 评判标准:Overhead=(Active+1)*256/weight # Overhead最小者胜出 nq:Never Queue # 集群开始时工作时,每台服务器都至少分配一个连接请求,然后再根据sed算法调度; lblc:Locality-based Least Connection # 类似于dh+lc lblcr:Relicated and Locality-based Least Connection # 主要用于后端服务器是缓存服务器时
IPVSADM命令参数详解:
ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p [timeout]] [-M netmask] ipvsadm -D -t|u|f virtual-service-address ipvsadm -C ipvsadm -R ipvsadm -S [-n] ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight] ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f service-address] ipvsadm --set tcp tcpfin udp ipvsadm --start-daemon state [--mcast-interface interface] ipvsadm --stop-daemon ipvsadm -h 命令选项解释: 有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都可以。 -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 显示内核虚拟服务器表 userver 列表; -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 默认的模式) DR模型 -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 显示统计信息 ipvsadm –Ln --state 总共的数量 --rate 显示速率信息 ipvsadm –Ln --rete 平均值 --sort 对虚拟服务器和真实服务器排序输出 --numeric -n 输出IP 地址和端口的数字形式
集群相关参数:
-A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。 -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] -s --scheduler scheduler 使用的调度算法,有这样几个选项 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是:wlc. -p --persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。 持久连接; -E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。 修改定义过的集群服务 -D :删除指定集群服务
RS相关参数:
-a --add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器 向指定的CS中添加RS -r --real-server server-address 真实的服务器[Real-Server:port],只有支持端口映射的LVS类型才允许此处使用跟集群服务中不同的端口 LVS 类型: -g : gateway,DR # 指定集群类型为LVS/DR -i ipip,TUN # 指定集群类型为LVS/TUN -m:masquerade,NAT # 指定集群类型为 NAT -w:指定RS权重: -e:修改指定的RS属性 -d :从指定的集群服务中删除某RS
DR模式配置实例:
LB:lvs服务端启停脚本
[root@salt-node01 sbin]# cat ipvs ##CONSTANT VIP=192.168.142.140 INTERFACE=ens33 SUBINTERFACE=$INTERFACE:`echo ${VIP} | awk -F "." '{print $4}'` PORT=80 METHOD=rr RETVAR=0 RIPS=( 192.168.68.150 192.168.68.152 ) ##COMMAND OF ABS PATH IP=/usr/sbin/ip IPVSADM=/usr/sbin/ipvsadm . /etc/init.d/functions function Usage(){ echo "Usage: $0 {start|stop|status|restart}" return 1 } function ipvsStart(){ $IP addr add $VIP/24 dev ${INTERFACE} label $SUBINTERFACE $IPVSADM -C #add vip instance $IPVSADM -A -t $VIP:$PORT -s $METHOD #echo ${#RIPS[*]} for((i=0;i<`echo ${#RIPS[*]}`;i++)) do $IPVSADM -a -t $VIP:$PORT -r ${RIPS[$i]}:$PORT -g done RETVAR=$? if [ $RETVAR -eq 0 ] then action "Ipvsadm started sucessed" /bin/true else action "Ipvsadm started failed" /bin/false fi } function ipvsStop(){ #clear virtual server $IPVSADM -C #clear number of connection $IPVSADM -Z $IP addr del $VIP/24 dev ${INTERFACE} label $SUBINTERFACE &>/dev/null RETVAR=$? if [ $RETVAR -eq 0 ] then action "Ipvsadm stopped" /bin/true else action "Ipvsadm stopped" /bin/false fi return $RETVAR } main(){ #Judge argv num if [ $# -ne 1 ]; then Usage $0 fi echo $1 case "$1" in start) ipvsStart ;; restart) ipvsStop ipvsStart ;; *) Usage $0 ;; esac } main $*
健康检查:
Q:lvs rr算法,但是请求不均,
调整会话保持时间:lvs会话保持时间和后端RS的会话保持时间
Q: 更换防火墙IP,造成旧节点无法访问
IDC机房刷新arp缓存表时间较长
Q:LVS RS下架,用作其他服务用;lo口绑定vip
完善下线机制