LVS 类型:NAT(-m地址转换)、DR(-g直接路由)、TUN(-i隧道),一般使用DR类型。
NAT:
集群节点跟director必须在同一个IP网络中;
RIP通常是私有地址,仅用于各集群节点间的通信;
director位于client和real server之间,并负责处理进出的所有通信;
realserver必须将网关指向DIP;支持端口映射;realserver可以使用任意OS;
较大规模应该场景中,director易成为系统瓶颈;
DR:集群节点跟director必须在同一个物理网络中;
RIP可以使用公网地址,实现便捷的远程管理和监控;
director仅负责处理入站请求,响应报文则由realserver直接发往客户端;
realserver不能将网关指向DIP;不支持端口映射;
TUN:集群节点可以跨越Internet;RIP必须是公网地址;
director仅负责处理入站请求,响应报文则由realserver直接发往客户端;
realserver网关不能指向director;只有支持隧道功能的OS才能用于realserver;
不支持端口映射;
LVS调度方式:rr(轮询)、wrr(加权轮询)、dh(目标地址hash)、sh(源地址hash);
lc(最少连接)、wlc(加权最少连接)、sed(最短期望延迟)、nq(永不排队)
LBLC(基于本地的最少连接)、LBLCR(基于本地的带复制功能的最少连接)
默认调度方式:wlc
一、以DR类型为例配置LVS服务器集群系统。
Director
VIP:192.168.1.30
DIP:192.168.1.50
realserver
RIP1:192.168.1.31
RIP2:192.168.1.32
1、Realserver配置。
[root@localhost ~]# sysctl -w net.ipv4.conf.eth0.arp_announce=2 [root@localhost ~]# sysctl -w net.ipv4.conf.all.arp_announce=2 [root@localhost ~]# sysctl -w net.ipv4.conf.all.arp_ignore=1 [root@localhost ~]# sysctl -w net.ipv4.conf.eth0.arp_ignore=1 arp_ignore: 定义接收到ARP请求时的响应级别; 0:只要本地配置的有相应地址,就给予响应; 1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应; arp_announce:定义将自己地址向外通告时的通告级别; 0:将本地任何接口上的任何地址向外通告; 1:试图仅向目标网络通告与其网络匹配的地址; 2:仅向与本地接口上地址匹配的网络进行通告; [root@localhost ~]# ifconfig lo:0 192.168.1.50 broadcast 192.168.1.50 netmask 255.255.255.255 up [root@localhost ~]# route add -host 192.168.1.50 dev lo:0 [root@localhost ~]# echo "server1.example.com" >/var/www/html/index.html
2、LVS服务器配置。
[root@localhost ~]# ntpdate us.pool.ntp.org #同步网络时间 [root@localhost ~]# sysctl -w net.ipv4.ip_forward=1 #打开IP转发功能 [root@localhost ~]# curl http://192.168.1.31 server1.example.com [root@localhost ~]# curl http://192.168.1.32 server2.example.com [root@localhost ~]# ifconfig eth0:0 192.168.1.50/24 up [root@localhost ~]# route add -host 192.168.1.50 dev eth0:0 [root@localhost ~]# ipvsadm -A -t 192.168.1.50:80 -s wlc [root@localhost ~]# ipvsadm -a -t 192.168.1.50:80 -r 192.168.1.31 -g -w 3 [root@localhost ~]# ipvsadm -a -t 192.168.1.50:80 -r 192.168.1.32 -g -w 1 [root@localhost ~]# service ipvsadm save [root@localhost ~]# ipvsadm -L -n --stats #查看状态的几个参数 --rate --timeout --sort --daemon
3、Realserver健康状态检查脚本,检查Realserver服务状态,自动增删。
#!/bin/bash # VIP=192.168.10.3 CPORT=80 FAIL_BACK=127.0.0.1 RS=("192.168.10.7" "192.168.10.8") 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 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
4、LVS持久连接
无论使用算法,LVS持久都能实现在一定时间内,将来自同一个客户端请求派发至此前选定的RS。
持久连接模板(内存缓冲区):
[root@localhost ~]# ipvsadm -A -t 192.168.1.50:80 -s rr -p 600 #持久端口连接 [root@localhost ~]# ipvsadm -A -t 192.168.1.50:0 -s rr -p 600 #持久客户端连接
timeout: 持久连接时长,默认300秒;单位是秒;
在基于SSL,需要用到持久连接;
PPC:将来自于同一个客户端对同一个集群服务的请求,始终定向至此前选定的RS;持久端口连接
PCC:将来自于同一个客户端对所有端口的请求,始终定向至此前选定的RS;持久客户端连接;把所有端口统统定义为集群服务,一律向RS转发;
PNMPP:持久防火墙标记连接,把若干个端口标记为一个集群资源,例:
[root@localhost ~]# iptables -t mangle -A PREROUTING -d 192.168.1.50 -i eth0 -p tcp --dport 80 -j MARK --set-mark 10 [root@localhost ~]# iptables -t mangle -A PREROUTING -d 192.168.1.50 -i eth0 -p tcp --dport 443 -j MARK --set-mark 10 [root@localhost ~]# ipvsadm -A -f 10 -s rr [root@localhost ~]# ipvsadm -a -f 10 -r 192.168.1.31 -g [root@localhost ~]# ipvsadm -a -f 10 -r 192.168.1.32 -g