持久连接 PPC模式、PCC模式、防火墙标记
【LVS】我的是X86的系统
ipvsadm 功能类似Iptables
管理集群服务 增删改
管理RS增删改
查看 –L
【磨刀不误砍柴工】看清楚,不要配置错了
两台RS都安装 192.168.3.123 192.168.3.87
网关都一样
route add default gw 192.168.3.77
【做不同端口持久连接测试用】
yum -y install telnet-server yum -y install httpd setenforce 0 service iptables stop
测试网页
务必保证时间的统一性
看网页
curl localhost
看头部
curl -I localhost
DR -LVS主机双网卡172.16.0.43192.168.3.77
yum -y install ipvsadm
必须关闭iptables
iptables service iptables stop
打开网卡转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
****************改为wr规则 **********************
添加-本机-rr规则
ipvsadm -A -t 172.16.0.43:80 -s rr ipvsadm -a -t 172.16.0.43:80 -r 192.168.3.87 -m ipvsadm -a -t 172.16.0.43:80 -r 192.168.3.123 -m
查看
ipvsadm -l –n
【Ok 测试成功,成功调度两个主机】
查看状态
ipvsadm -l -n --stats
**************改为wr规则 权重**************
E | e 为修改
ipvsadm -E -t 172.16.0.43:80 -s wrr ipvsadm -e -t 172.16.0.43:80 -r 192.168.3.87 -m -w 6 ipvsadm -e -t 172.16.0.43:80 -r 192.168.3.123 -m -w 1
=======本机压力测试
yum -y install httpd*
打开 web服务
service httpd start
静态压力测试
ab -c 100 -n 10000 http://172.16.0.43/index.html
能看出每个主机的次数
ipvsadm -l -n –stats
保存写的规则
service ipvsadm save ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [ OK ]
看看还在连接的
ipvsadm -L –c
********************DR 模型*****************
VIP 172.16.0.1
DIP 172.16.0.2
【这三个连接在一个交换机】
【DR:】
eth0: 172.16.0.2
eth0:0 172.16.0.1 别名
【RS 1:】
eth0: 172.16.0.7
default gw 172.16.0.111
【RS 2:】
eth0: 172.16.0.8
default gw 172.16.0.111
【删除添加错误的路由】
route del -net 0.0.0.0/32 gw 192.168.3.4
关闭RS1的ARP 请求
cd /proc/sys/net/ipv4/conf/ #sysctl -w net.ipv4.conf.eth0.arp_announce=2 #sysctl -w net.ipv4.conf.all.arp_announce=2 #echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore #echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 查看cat /proc/sys/net/ipv4/conf/eth0/arp_ignore 查看cat /proc/sys/net/ipv4/conf/all/arp_ignore
改VIP ARP测试
ifconfig lo:0 172.16.0.1/16【与Derectory的主机同IP】
win7 来ping 172.16.0.1
显示可以ping 的通,
在win7 查这个IP是哪个MAC来响应的
arp –a
接口: 172.16.0.100 --- 0xb
Internet 地址 物理地址 类型
172.16.0.1 00-0c-29-01-2a-5e 动态
00-0c-29-01-2a-5e对应的是Derectory的MAC 而不是RS1的
测试成功!
关闭RS2的ARP 请求
#echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce # echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce # echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore # echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore # ifconfig lo:0 172.16.0.1/16 up
还是一样,ping的不是RS的网卡
【继续配置RS1】
全是网络地址,只有自己一个在内网 广播也是自己
#ifconfig lo:0 down # ifconfig lo:0 172.16.0.1 broadcast 172.16.0.1 netmask 255.255.255.255 up # route add -host 172.16.0.1 dev lo:0
【继续配置RS2】
全是网络地址,只有自己一个在内网 广播也是自己
#ifconfig lo:0 down # ifconfig lo:0 172.16.0.1 broadcast 172.16.0.1 netmask 255.255.255.255 up # route add -host 172.16.0.1 dev lo:0 【目标是172.16.0.1的lo:0作为出口设备】
【Direc主机】
ipvsadm -L –n 查看
#route add -host 172.16.0.1 dev eth1:0
【Directory测试RS1和RS2】
[root@localhost ~]# curl 172.16.0.7 <h1> S2 192.168.3.123 </h1> [root@localhost ~]# curl 172.16.0.8 <h1> LCL 192.168.3.87 </h1> Ok!
****************** wlc规则 ******************
【Directory DIP的设置】
添加-本机-wlc规则
# ipvsadm -A -t 172.16.0.1:80 -s wlc # ipvsadm -a -t 172.16.0.1:80 -r 172.16.0.7:80 -g -w 5 # ipvsadm -a -t 172.16.0.1:80 -r 172.16.0.8:80 -g -w 2 # 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.0.1:80 wlc -> 172.16.0.7:80 Route 5 0 0 -> 172.16.0.8:80 Route 2 0 0 # service iptables stop # echo 1 > /proc/sys/net/ipv4/ip_forward # setenforce 0 win7 访问 172.16.0.1 成功调度RS1 和RS2
【shell数组练习】
[root@localhost ~]# RS=("192.168.0.1" "172.168.0.4") [root@localhost ~]# echo ${RS} 192.168.0.1 [root@localhost ~]# echo ${#RS} 11 [root@localhost ~]# echo ${#RS[0]} 11 [root@localhost ~]# echo ${#RS[*]} 2 [root@localhost ~]# echo ${#RS[*]} [root@localhost ~]# echo ${RS[*]} 192.168.0.1 172.168.0.4
********** DR模型 LVS ************
【缺点】随便宕掉一台RS机,当DIP指向这台机器时,浏览器就无响应,不支持健康状态检查
【拓展】删除的使用方法例如
ipvsadm -d -t 172.16.0.1:80 -r 127.0.0.1
把本机的 DIP 172.16.0.2 也加入 VIP 172.16.0.1
果断开启本机web服务测试
ipvsadm -a -t 172.16.0.1:80 -r 172.16.0.2:80 -g -w 5 ipvsadm -a -t 172.16.0.1:80 -r 127.0.0.1 -g -w 5
这两条效果是一样的
ipvsadm -L –n 查看
*********LVS健康管理***********
ipvsadm -L –n 查看
bash -x health.sh 执行
RS 是后面的服务器VIP
可以根据RS的健康状况,自动增加,剔除机器
前提是,自己初始化好两个正在执行的服务,不然就自动加不上去
[root@localhost ~]# 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.0.1:80 wlc -> 172.16.0.7:80 Route 2 0 0 -> 172.16.0.8:80 Route 1 0 0
RS健康状态检查脚本示例第一版:------------------------------------------------
#!/bin/bash VIP=172.16.0.1 CPORT=80 FAIL_BACK=127.0.0.1 RS=("172.16.0.7" "172.16.0.8") RSTATUS=("1" "1") RW=("2" "1") RPORT=80 TYPE=g add() { ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2 [ $? -eq 0 ] && return 0 || return 1 } del() { ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT [ $? -eq 0 ] && return 0 || return 1 } while : ; do let COUNT=0 for I in ${RS[*]} ; do if curl --connect-timeout 1 http://$I &> /dev/null ;then if [ ${RSTATUS[$COUNT]} -eq 0 ] ;then add $I ${RW[$COUNT]} [ $? -eq 0] && RSTATUS[$COUNT]=1 fi else if [ ${RSTATUS[$COUNT]} -eq 1 ];then del $I [ $? -eq 0 ] && RSTATUS[$COUNT]=0 fi fi let COUNT++ done sleep 5 done ******************************************************************
RS健康状态检查脚本示例第二版:
检查次数CHKLOOP=3再踢你出去
tail -f /var/log/ipvsmonitor.log
什么时候消失,什么时候回来的 都有记录
#!/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 ************************************************************
【持久连接 PPC模式】
默认 300秒
[root@localhost ~]# ipvsadm -L -c IPVS connection entries pro expire state source virtual destination TCP 01:50 FIN_WAIT 172.16.0.100:58792 172.16.0.1:http 172.16.0.7:http
修改调度算法为轮询
ipvsadm -E -t 172.16.0.1:80 -s rr
修改调度算法为轮询,默认-p 300秒可以不写,改为600秒
ipvsadm -E -t 172.16.0.1:80 -s rr -p 600
现在无论我怎么刷新页面http://172.16.0.1/ 都一直是一个不变的网页
查看持久连接状况
ipvsadm -L -n --persistent-conn
配置RS服务机,两台都要配置一下
chkconfig telnet on service xinetd restart netstat -tnlp 看23端口启动了没有,默认不允许root登录,添加一个普通用户hadoop useradd hadoop passwd hadoop
两台都做连接测试
连接测试 Xshell:\> telnet 172.16.0.8
查看网卡信息 $ /sbin/ifconfig
把telnet服务做进LVS
# ipvsadm -A -t 172.16.0.1:23 -s rr # ipvsadm -a -t 172.16.0.1:23 -r 172.16.0.7 -g -w 3 # ipvsadm -a -t 172.16.0.1:23 -r 172.16.0.8 -g -w 1
登录测试 Xshell:\> telnet 172.16.0.1 多测试几次 /sbin/ifconfig可以看到哪个RS提供服务
tletnet持久连接 ipvsadm -E -t 172.16.0.1:23 -s rr -p 4000
Xshell:\> telnet 172.16.0.1第一次就会持久
4000秒内不管再登录多少次,依然是这个RS为你提供服务
此时是PPC 模式,只对一个端口持久,同IP访问不同服务端口,不是持久的
-----------------------------------------------------------------
看持久连接信息
ipvsadm -l -n -c IPVS connection entries pro expire state source virtual destination TCP 14:19 ESTABLISHED 172.16.0.100:59564 172.16.0.1:23 172.16.0.8:23 TCP 00:47 ESTABLISHED 172.16.0.100:59441 172.16.0.1:23 172.16.0.8:23
持久连接 PCC模式
清空 ipvsadm –C
ps -aux 看有没有捣乱的bash脚本
0端口把所有端口定义为集群服务,一律向RS转发
# ipvsadm -A -t 172.16.0.1:0 -s rr -p 600 # ipvsadm -a -t 172.16.0.1:0 -r 172.16.0.7 -g -w 2 # ipvsadm -a -t 172.16.0.1:0 -r 172.16.0.8 -g -w 2 # 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.0.1:0 rr persistent 600 -> 172.16.0.7:0 Route 2 0 0 -> 172.16.0.8:0 Route 2 0 0 [root@localhost ~]#
现在不管你是打开web,telnet,ssh,服务,对于你的IP都是一个固定的RS为你服务
看持久连接信息
ipvsadm -l -n -c IPVS connection entries pro expire state source virtual destination TCP 14:19 ESTABLISHED 172.16.0.100:59564 172.16.0.1:23 172.16.0.8:23 TCP 00:47 ESTABLISHED 172.16.0.100:59441 172.16.0.1:23 172.16.0.8:23
防火墙标记
清空规则
标记号0-99,只要不重复就可以
网卡看清楚再写!-w 2 权重也可以不写,暂时没有持久连接
ipvsadm -C iptables -F -t mangle iptables -t mangle -A PREROUTING -d 172.16.0.1 -i eth1 -p tcp --dport 80 -j MARK --set-mark 8 iptables -t mangle -A PREROUTING -d 172.16.0.1 -i eth1 -p tcp --dport 23 -j MARK --set-mark 8 ipvsadm -A -f 8 -s rr ipvsadm -a -f 8 -r 172.16.0.7 -g -w 2 ipvsadm -a -f 8 -r 172.16.0.8 -g -w 2
此时我的IP访问telnet和web都将会是同一个RS来提供
此时才是持久连接的
ipvsadm -A -f 8 -s rr -p 600
原文地址:http://990487026.blog.51cto.com/10133282/1693925