简介
[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
完善下线机制