负载均衡之LVS部署实践

LVS安装部署实践

1.安装LVS准备
需要3台服务器或VM虚拟机
  1)数据库及memcache等对内业务的负载均衡环境

管理IP地址				角色					备注
10.0.0.19 		LVS调度器(Director)		对外提供服务的VIP为10.0.0.29
10.0.0.18		RS1
10.0.0.17		RS2

  2)web服务或web cache等负载均衡环境

外部IP地址			内部IP地址			角色					备注
192.168.1.19		10.0.0.19		LVS调度器(Director)	对外提供服务的VIP为10.0.0.29
192.168.1.17		RS1
192.168.1.18		RS2

2.安装依赖包
#检查是否安装ipvsadm
rpm -qa ipvsadm
3.yum 安装lvs
#3.1安装ipvsadm
yum install ipvsadm -y
#3.2因为lvs是工作在内核层面的所以要做个软连接
ln -s /usr/src/kernel/ `uname -r` /usr/src/linux
#3.3查看lvs内核
lsmod|grep ip_vs
#3.4如果grep的结果没有执行以下命令吧ip_vs模块加载到内核。
ipvsadm 或 modprobe ip_vs
4.配置负载均衡服务
#4.1添加VIP
ip addr add 10.0.0.3 dev eth0 label eth0:3
#4.2工作中还要做DNS域名解析
#查看配置LVS帮助

ipvsadm --help
-C --clear  清空之前全部的规则
-A --add-service  添加一个Virtual service
-E --edit-service  编辑一个Virtual service
-a --add-server   添加一个real server
--tcp-service -t service-address  指定服务的ip地址及端口
-w --weight  配置权重(轮询)
-g --gatewaying  配置直接路由模式(默认)
-i --ipip  配置tun模式(ip隧道模式)
-m --masquerading  配置NAT模式
-s --scheduler     调度算法
--set tcp tcpfin udp   设置连接超时时间;例如:ipvsadm --set 30 5 60

#4.3清空说有规则
ipvsadm -C
#4.4手工添加一个V server
ipvsadm -A -t 10.0.0.3:80 -s wrr
#4.5手工添加2个节点(RS)

ipvsadm a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
ipvsadm a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1

#4.6设置一个超时时间(–timeout(tcp\tcpfin\udp))
ipvsadm --set 30 5 60
#4.7查看配置
ipvaadm -Ln
3.手工绑定RS端VIP
#3.1每台 real server端执行
ip addr add 10.0.0.3/32 dev lo label lo:3
#3.2其实标准操作还可以加一条路由
route add -host 10.0.0.3 dev lo
#3.3抑制ARP(所有RS节点配置)

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

中文说明:
arp_ignore - INTEGER
定义对目标地址为本地IP的ARP询问不同的应答模式

 0 -(默认值):回应任何网络接口对任何本地地址的ARP查询请求
 1 -只回答目标IP地址是来访网络接口本地地址的ARP请求
 2 -只回答目标IP地址是来访问网络接口本地地址的arp查询请求,且来访IP必须在该网络接口的子网段内。
 3 -不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应。
 4-7 保留未使用
 8 -不回应所有(本地地址)的arp查询

arp_announce - INTEGER
  对网络接口上,本地IP地址的发出的ARP回应,作出相应级别的限制
  确定不同程度的限制,宣布对来自本地源IP地址发出ARP请求的接口

  0-(默认)在任意网络接口(eth0,eth1,lo)上任何本地地址
  1 -尽量避免不在该网络接口自网段的本地地址作出arp回应,当发起ARP请求的IP地址被设置应该由路由到达网络接口的时候很有用,此时会检查来访ip是否为所有接口上的自网段内IP之一,如果来访IP不属于各个网段接口上的子网段内,那么将采用级别2的方式来进行处理。
  2 -对查询目标使用最适当的本地地址,在此模式下忽略这个IP数据包的原地址并尝试与该地址通讯的本地地址

4.LB上检查结果
ipvsadm -Ln --stats或ipvsadm -Ln --sort
说明:LVS默认是健康检查及剔除的功能
LVS基本管理
#删除节点
ipvsadm -d -t 10.0.0.3:80 -r 10.0.0.8:80

Keeplived管理LVS部署实践

1.Keepalived的三大功能

  1.管理LVS节点(直接管理非调用LVS的管理命令)
  2.健康检查
  3.实现负载均衡高可用

keepalived.conf的3大块儿

  1.GLOBAL CONFIGURATION
  2.VRRPD CONFIGUATION
  3.LVS CONFIGUATION

2.keepalived.conf的配置(url)

#ipvsadm -A -t 10.0.0.3:80 -s wrr
virtual_server 192.168.200.100 443 {
	delay_loop 6
	lb_algo rr
	lb_kind DR
	nat_mask 255.255.255.0
	persistence_timeout 50
	protocol TCP
#ipvsadm a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
	real_server 10.0.0.7 80 {
		weight 1
		SSL_GET
			url {
			   path /
			   digest ff20ad2481f97b1754ef3el2ecd3a9cc
			}
			url {
			   path /
			   digest 9b3a0c85a887a256d6939da88aabd8cd
			}
			connect_timeout 3
			nb_get_retry 3
			delay_before_retry 3
	  }
   }
}

3.keepalived.conf的配置(端口)

#ipvsadm -A -t 10.0.0.3:80 -s wrr
virtual_server 192.168.200.100 443 {
	delay_loop 6
	lb_algo rr
	lb_kind DR
	nat_mask 255.255.255.0
	persistence_timeout 50
	protocol TCP
#ipvsadm a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
    real_server 10.0.0.7 80 {
    weight 1
    TCP_CHECK {
    connect_timeout 5
    nb_get_retry 3
    delay_before_retry 3
    connect_port 80
    }
  }
    real_server 10.0.0.8 80 {
    weight 1
    TCP_CHECK {
    connect_timeout 5
    nb_get_retry 3
    delay_before_retry 3
    connect_port 80
    }
  }
}

5.LVS集群故障排查

问题:两边curl不同的内容,两边都不轮询
解答:
  1.做了会话保持
  2.LVS设计本身问题
  3.不能在负载均衡器crul

6.开发脚本配置LVS RS服务器节点

#!/bin/bash
#Written by www.liuliya.com
#description:Config realserver lo and applay noarp
VIP=(
     10.0.0.3
)
. /etc/rc.d/init.d/functions
case "$1" in
start)
      for ((i=0; i<`echo ${#VIP[*]}`; i++))
        do
          interface="lo;`echo ${VIP[$i]}|awk -F . '{print $4}'`"
          /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 up
        done
            echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
            echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
            echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
            echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
            action "Start LVS of RealServer.by liuliya"
            ;;
stop)
      for ((i=0; i<`echo ${#VIP[*]}`; i++))
        do
          interface="lo;`echo ${VIP[$i]}|awk -F . '{print $4}'`"
          /sbin/ifconfig $interface ${VIP[$i]} broadcast ${VIP[$i]} netmask 255.255.255.255 down
        done
        echo "close LVS Directorserver"
        if [ ${#VIP[*]} -eq 1 ];then
          echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
          echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
          echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
          echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
        fi
           action "Close LVS of RealServer.by liuliya"
           ;;
*)
           echo "Usage: $0 {start|stop}"
           exit 1
esac

7.开发脚本配置LVS RS健康检查

cat health_check
#!/bin/sh
VIP=10.0.0.3
PORT="80"
RIP=(
    10.0.0.7
	10.0.0.8
)
while true
do
  for ((i=0; i< `echo ${#RIP[*]}`;i++))
do
  PORT_COUNT=`nmap ${RIP[$i]} -p $PORT|grep open|wc -l`
  [ $PORT_COUNT -ne 1 ] && {
  ipvsadm -d -t $RIP -r ${RIP[$i]}:$PORT
  echo "${RIP[$i]}" >>/tmp/rs.log
  }
  done
  sleep 10
done

提示:此法缺点
  1)端口检查不准确(但是使用的特别多)
  2)nmap检查时间有点长

3 条评论

发表评论

*