Linux Lvs负载均衡集群技术(二)
转载:http://www.cnblogs.com/lycn/articles/3261078.html
1.6安装LVS软件
1.6.1 安装LVS的准备
1.6.1.1
需要三台服务器或VM虚拟主机
1、数据库及memcache等对内业务的负载均衡环境
管理IP地址 |
角色 |
备注 |
10.0.0.51 |
LVS(负载均衡器) |
对外提供VIP 10.0.0.56 |
10.0.0.55 |
RS1(真实服务器) |
|
10.0.0.57 |
RS2(真实服务器) |
|
2、web服务或web cache等负载均衡环境
管理IP地址 |
内部IP地址 |
角色 |
备注 |
192.168.1.51 |
10.0.0.51 |
LVS(负载均衡器) |
对外提供VIP 10.0.0.56 |
192.168.1.55 |
10.0.0.55 |
RS1(真实服务器) |
|
192.168.1.57 |
10.0.0.57 |
RS2(真实服务器) |
|
注意:将10网段为内网卡,192假设为外网卡。
1.6.1.2 LVS安装配置
#查看ip_vs是否在内核存在 [root@tty-lvs tools]# lsmod |grep ip_vs #查看系统版本 [root@tty-lvs tools]# cat /etc/redhat-release CentOS release 5.8 (Final) #查看系统内核号 [root@tty-lvs tools]# uname -r 2.6.18-308.el5 #查看系统位 [root@tty-lvs tools]# uname -m x86_64 #做内核链接 [root@tty-lvs tools]# ln -s /usr/src/kernels/2.6.18-308.el5-x86_64/ /usr/src/linux [root@tty-lvs tools]# ls -l /usr/src/ |grep linux lrwxrwxrwx 1 root root 39 Aug 5 12:30 linux -> /usr/src/kernels/2.6.18-308.el5-x86_64/ 注意事项: 1、此ln命令的链接路径要和uname -r输出结果内核版本对应,工作中可能有多个内核路径。 2、如果没有/usr/src/kernels/2.6.18-308.el5-x86_64/,是因为缺少kernel-devel-2.6.18-308.el5软件包,可通过yum -y install kernel-devel 安装 --------------------------------------------------------------------------------------------------------------------------- #进入软件目录 [root@tty-lvs ~]# cd /tools/ #查看内核版本 [root@tty-lvs tools]# uname -r 2.6.18-308.el5 #下载软件1.24 [root@tty-lvs tools]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz --2013-08-05 12:24:03-- http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz Resolving www.linuxvirtualserver.org... 69.56.251.119, 2001:470:1f0f:297::2 Connecting to www.linuxvirtualserver.org|69.56.251.119|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 36598 (36K) [application/x-gzip] Saving to: `ipvsadm-1.24.tar.gz‘ 100%[===============================================================>] 36,598 --.-K/s in 0.06s 2013-08-05 12:24:12 (578 KB/s) - `ipvsadm-1.24.tar.gz‘ saved [36598/36598] [root@tty-lvs tools]# ls -l ipvsadm-1.24.tar.gz -rw-r--r-- 1 root root 36598 Dec 11 2005 ipvsadm-1.24.tar.gz [root@tty-lvs tools]# tar zxf ipvsadm-1.24.tar.gz [root@tty-lvs tools]# cd ipvsadm-1.24 [root@tty-lvs ipvsadm-1.24]# make [root@tty-lvs ipvsadm-1.24]# make install #检测安装是否成功 [root@tty-lvs ipvsadm-1.24]# echo $? 0 [root@tty-lvs ipvsadm-1.24]# #启动ipvs,进行查看确认 [root@tty-lvs ipvsadm-1.24]# ipvsadm或者 modprobe ip_vs IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn [root@tty-lvs ipvsadm-1.24]# lsmod |grep ip_vs ip_vs 122113 0 提示:执行ipvsadm命令就会把ip_vs加载到内核中 提示:ipvsadm 1.26的版本适用于kernel 2.6.28之后的版本,若符合此环境yum install libnl* popt* -y安装依赖库。
1.7手动配置LVS负载均衡服务-DR模式
1.7.1 手动添加LVS转发
1)用户访问:www.123456.com -->vip:10.0.0.56 ==>这个步骤是在DNS里配置。 2)配置LVS虚拟IP(VIP) [root@tty-lvs ipvsadm-1.24]# ifconfig eth0:0 10.0.0.56 netmask 255.255.255.0 up [root@tty-lvs ipvsadm-1.24]# ifconfig eth0:0 eth0:0 Link encap:Ethernet HWaddr 00:50:56:31:04:2E inet addr:10.0.0.29 Bcast:10.0.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 -->非必须的(添加路由) [root@tty-lvs ipvsadm-1.24]# route add -host 10.0.0.56 dev eth0 [root@tty-lvs ipvsadm-1.24]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 10.0.0.29 0.0.0.0 255.255.255.255 UH 0 0 0 eth0 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 0.0.0.0 10.0.0.2 0.0.0.0 UG 0 0 0 eth0 3)配置后的检查结果 ping 10.0.0.56查看是否通 4)手工执行配置添加LVS服务并增加两台RS #清空ipvs所有的表记录 [root@tty-lvs ipvsadm-1.24]# ipvsadm -C #设置超时参数:tcp tcpfin udp [root@tty-lvs ipvsadm-1.24]# ipvsadm --set 30 5 60 #添加虚拟服务和负载算法: wrr 权重轮询 [root@tty-lvs ipvsadm-1.24]# ipvsadm -A -t 10.0.0.56:80 -s wrr -p 20 #查看添加的虚拟服务 [root@tty-lvs ipvsadm-1.24]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.0.56:80 wrr persistent 20 #添加RS主机 [root@tty-lvs ipvsadm-1.24]# ipvsadm -a -t 10.0.0.56:80 -r 10.0.0.55:80 -g -w 1 [root@tty-lvs ipvsadm-1.24]# ipvsadm -a -t 10.0.0.56:80 -r 10.0.0.57:80 -g -w 1 [root@tty-lvs ipvsadm-1.24]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.0.0.29:80 wrr persistent 20 -> 10.0.0.57:80 Route 1 0 0 -> 10.0.0.55:80 Route 1 0 0 [删除RS方法] [root@tty-lvs ipvsadm-1.24]# ipvsadm -d -t 10.0.0.56:80 -r 10.0.0.55:80 LB端配置command ifconfig eth0:0 10.0.0.56 netmask 255.255.255.0 up ifconfig eth0:0 route add -host 10.0.0.56 dev eth0:0 route -n ipvsadm -C ipvsadm --set 30 5 60 ipvsadm -A -t 10.0.0.56:80 -s wrr -p 20 ipvsadm -a -t 10.0.0.56:80 -r 10.0.0.55:80 -g -w 1 ipvsadm -a -t 10.0.0.56:80 -r 10.0.0.57:80 -g -w 1 ipvsadm -L -n
1.7.2 手工在RS端绑定VIP
1、每台RS端执行 [root@tty-rs1 ~]# ifconfig lo:55 10.0.0.56 netmask 255.255.255.255 up <==子网掩码为255.255.255.255 [root@tty-rs1 ~]# route add -host 10.0.0.56 dev lo [root@tty-rs2 ~]# ifconfig lo:57 10.0.0.56 netmask 255.255.255.255 up <==子网掩码为255.255.255.255 [root@tty-rs2 ~]# route add -host 10.0.0.56 dev lo
2、RS上执行抑制ARP响应方法如下: 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 RS端配置command ifconfig lo:55 10.0.0.56 netmask 255.255.255.255 up route add -host 10.0.0.56 dev lo 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 ifconfig lo:57 10.0.0.56 netmask 255.255.255.255 up route add -host 10.0.0.56 dev lo 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
1.7.3 脚本实现自动配置
LB自动化配置脚本
#!/bin/bash . /etc/init.d/functions VIP=10.0.0.56 RIP=( 10.0.0.55 10.0.0.57 ) NETMASK=255.255.255.0 RETVAL=0 IFCONFIG=/sbin/ifconfig ROUTE=/sbin/route IPVSADM=/sbin/ipvsadm SUBETH=eth0:`echo $VIP|awk -F "." ‘{print $4}‘` PORT=80 function checkCMD(){ if [ $# -ne 1 ];then echo "Usage: /bin/sh $0 {start|stop}" fi } function checkSubnet(){ $IFCONFIG |grep "$1"|wc -l } function start_lvs(){ #if [ $(checkSubnet $SUBETH) -ne 0 ];then # $IFCONFIG $SUBETH down #fi $IFCONFIG $SUBETH $VIP netmask $NETMASK up $IPVSADM -C $IPVSADM --set 30 5 60 $IPVSADM -A -t $VIP:$PORT -s wrr -p 20 for((i=0;i<`echo ${#RIP[@]}`;i++)) do $IPVSADM -a -t $VIP:$PORT -r ${RIP[$i]} -g -w 1 done RETVAL=$? [ $RETVAL -eq 0 ] && action "start lvs" /bin/true || action "start lvs" /bin/false return $RETVAL } function stop_lvs(){ $IFCONFIG $SUBETH $VIP netmask $NETMASK down $IPVSADM -C $IPVSADM -Z RETVAL=$? [ $RETVAL -eq 0 ] && action "stop lvs" /bin/true || action "stop lvs" /bin/false return $RETVAL } case "$1" in start) start_lvs ;; stop) stop_lvs ;; *) checkCMD ;; esac RS自动化配置脚本 #!/bin/bash . /etc/init.d/functions RVIP=10.0.0.56 NETMASK=255.255.255.255 RETVAL=0 case "$1" in start) interface="lo:`echo $RVIP|awk -F . ‘{print $4}‘`" /sbin/ifconfig $interface $RVIP netmask $NETMASK 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 RETVAL=$? [ $RETVAL -eq 0 ]&& action "Start LVS of RearServer" /bin/true || action "Start LVS of RearServer" /bin/false ;; stop) interface="lo:`echo $RVIP|awk -F . ‘{print $4}‘`" /sbin/ifconfig $interface $RVIP netmask $NETMASK down done 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 RETVAL=$? [ $RETVAL -eq 0 ]&& action "Stop LVS of RearServer" /bin/true || action "Stop LVS of RearServer" /bin/false ;; *) echo "Usage: $0 {start|stop}" exit 1 esac LB上对RS的健康检查脚本 #!/bin/bash VIP=10.0.0.56 RIP=( 10.0.0.55 10.0.0.57 ) PORT=80 while true do for((i=0;i<`echo ${#RIP[@]}`;i++)) do COUNT=`nmap ${RIP[$i]} -p $PORT |grep open |wc -l` if [ $COUNT -eq 1 ] then if [ `ipvsadm -L -n|grep ${RIP[$i]}|wc -l` -ne 1 ];then ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]}:$PORT fi else if [ `ipvsadm -L -n|grep ${RIP[$i]}|wc -l` -eq 1 ];then ipvsadm -d -t $VIP:$PORT -r ${RIP[$i]}:$PORT fi fi done sleep 2 done
1.7.4 ARP抑制技术参数说明
arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式0 0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求 1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求 2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应 4-7 - 保留未使用 8 -不回应所有(本地地址)的arp查询
arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口 0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址 1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理. 2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
1.8 LVS负载均衡-附
1.8.1
手工实现LVS负载均衡器的高可用
高可用脑裂问题及解决方案
(1)、导致裂脑发生的原因
1.高可用服务器之间心跳链路故障,导致无法相互检查心跳
2.高可用服务器上开启了防火墙,阻挡了心跳检测
3.高可用服务器上网卡地址等信息配置不正常,导致发送心跳失败
4.其他服务配置不当等原因,如心跳方式不同,心跳广播冲突,软件BUG等
(2)、防止裂脑一些方案
1.加冗余线路
2.检测到裂脑时,强行关闭心跳检测(远程关闭主节点,控制电源的电路fence)
3.做好脑裂的监控报警
4.报警后,备节点在接管时设置比较长的时间去接管,给运维人员足够的时间去处理(人为处理)
5.启动磁盘锁,正在服务的一方锁住磁盘,裂脑发生时,让对方完全抢不走"共享磁盘资源"
磁盘锁存在的问题:
使用锁磁盘会有死锁的问题,如果占用共享磁盘的一方不主动"解锁"另一方就永远得不到共享磁盘,假如服务器节点突然死机或崩溃,就不可能执行解锁命令,备节点也就 无法接管资源和服务了,有人在HA中设计了智能锁,正在提供服务的一方只在发现心跳全部断开时才会启用磁盘锁,平时就不上
1.8.2
常见的LVS负载均衡高可用解决方案
1.通过开发脚本解决
2.hearbeat+lvs+ldirectord脚本配置方案(复杂、不易控制)
heartbeat
and
ldirectord方案资料:
http://www.linuxvirtualserver.org/docs/ha/heartbeat_ldirectord.html
http://www.linuxvirtualserver.org/docs/ha/ultramonkey.html
3.通过Redhat提供的工具piranha来配置LVS
The
Piranha Solution
:http://www.linuxvirtualserver.org/docs/ha/piranha.html
4.keepalived方案(推荐的当前最优方案)
http://www.keepalived.org/
The
Keepalived Solution:
http://www.linuxvirtualserver.org/docs/ha/keepalived.html
5.其他
...
1.8.3 LVS分发请求RS不均衡生产环境解决
①persistent
<会话保持造成的原因>
②reload重启keepalived
其他导致负载均衡不均衡的原因可能有:
1.LVS自身的会话保持参数设置(-p 300, persistent
300)。优化:大公司尽量用cookie替代session。
2.LVS调度算法设置,例如:rr,wrr,wlc,lc,dh,sh算法。
3.后端RS节点的会话保持设置参数,例如:apache的keepalive参数。
4.访问量较少的情况,不均衡的现象更加明显。
5.用户请求时间长短,请求资源多少。
1.8.4 LVS故障排查理论
1.调度器上LVS调度规则及IP的正确性。
2.RS节点上VIP绑定和抑制的检查。
处理思路:1、对绑定的VIP进行实时监控,出问题报警或者自动处理后报警。 2、把绑定的VIP做成配置文件,例如:vim
/etc/sysconfig/network-scripts/lo:0
ARP抑制的配置思路:
1.如果是单个VIP,那么可以用通过脚本传参arp_ignore/arp_announce设置为0;
2.如果RS端有多个VIP绑定,此时一定不要置0,即使是停止VIP绑定,也一定不要置0.
3.RS节点上自身提供服务的检查。
4.辅助工具有tcpdump,ping等。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。