本文共 7981 字,大约阅读时间需要 26 分钟。
背景:最近公司上了一个项目,项目主要是实现手机终端访问WEB页面,但是用户量较大,需要实现负载均衡,经过方案选型,最终选择了用Piranha+LVS+nginx来实现。
环境:
操作系统 Centos 6.6 _X64
WEB nginx
结构:
LVS-ACTIVE:10.6.1.210
LVS-BACKUP: 10.6.1.211 LVS-VIP: 10.6..1.214 Realsever: 10.6.1.212,10.6.1.213
一.Piranha方案基本简绍. 1.Piranha方案优点: 1.1.1配置简洁高效:配置简便一个lvs.conf配置文件即可搞定(类keepalived方案.) 1.1.2WEB配置界面. WEB配置对于那些不懂LVS配置的人员来说非常吸引力,你几乎只要花15分钟就可以配置好一个完美的负载均衡及高可用性方案. 1.1.3完整的功能:主备LVS (Load Balancer)的Heartbeat和HA (pulse,send_arp)LoadBalancer和Real Server间进程服务的Heartbeat (nanny)IPVS功能 (lvsd)IPVS的管理 (ipvsadm) 2.Piranha方案原理结构描述: Piranha方案是基于LVS基础上设计的一套负载均衡高可用解决方案. LVS运行在一对有相似配置的计算机上:一个作为活动LVS Router(Active LVS Router),一个作为备份LVS Router(Backup LVS Router)。活动LVS Router服务有两个角色: * 均衡负载到真实服务器上。 * 检查真实服务器提供的服务是否正常。备份LVS Router用来监控活动的LVS Router,以备活动的LVS Router失败时由备份LVS Router接管。
Pulse:
Pulse进程运行在活动LVS Router和备份LVS Router上。
在备份LVS Router上,pulse发送一个心跳(heartbeat)到活动LVS Router的公网接口上以检查活动LVS Router是否正常。
在活动LVS Router上,pulse启动lvs进程并响应来自于备份LVS Router的心跳。
lvsd:
lvs进程调用ipvsadm工具去配置和维护IPVS路由表,并为每一个在真实服务器上的虚拟服务启动一个nanny进程。
nanny:
每一个nanny进程去检查真实服务器上的虚拟服务状态,并将故障情况通知lvs进程。假如一个故障被发现,lvs进程通知ipvsadm在IPVS路由表中将此节点删除。
send_arp:
如果备份LVS Router未收到来自于活动LVS Router的响应,
它将调用send_arp将虚拟IP地址再分配到备份LVS Router的公网接口上。
并在公网接口和局域网接口上分别发送一个命令去关掉活动LVS Router上的lvs进程。同时启动自己的lvs进程来调度客户端请求。
3.Piranha方案基本套件安装:
3.1 #yum install ipvsadm modcluster piranha system-config-cluster php php-cli php-common
3.2 # piranha-passwd 输入一个密码,要记住,后面登录WEB管理页面要用到。
3.3 # /etc/init.d/piranha-gui start 启动piranha页面服务。
3.4 在浏览器里输入http://10.6.1.210:3636 , 点击login . 用户名:piranha 密码:redhat (就是刚才设置的密码)
4.配置文件介绍及常用命令:
/etc/sysconfig/ha/lvs.cf //由http://ip:3636 web界面配置的配置文件写入此文件.
/etc/init.d/piranha-gui start //启动piranha服务的WEB配置界面.
/etc/init.d/pulse start //启动piranha服务读取的就是/etc/sysconfig/ha/lvs.cf.
/etc/init.d/pulse stop //停止LVS服务
二。 Piranha配置
配置主备LVS服务器(主备Server都要提前按3步骤安装Piranha).
# vi /etc/sysctl.conf找到下面行 //启用数据转发.
net.ipv4.ip_forward = 0将0 改成1,net.ipv4.ip_forward = 1
执行如下命令来应用:sysctl -p
通过WEB界面配置Piranha服务.
http://10.6.1.210:3636, 用户名:piranha 密码:redhat
登陆后,选择Global Settings 这是对LVS的配置
Primary server public IP 输入公网IP:10.6.1.210,应用后按ACCEPT按钮保存设置。
通过WEB配置主LVS的信息
1. 配置主LVS
2.配置备份LVS
3. 配置添加LVS( VIP信息)
4.配置Realserver
点击”编辑”添加具体的Realsever信息.
5.启动LVS服务pulse
# /etc/init.d/pulse start
如果不报错,表示启动成功!到此LVS的服务器已经配置完成了启动两个程序
1、piranha-gui 是用来配置LVS的
2、pulse 是用来启动LVS的
6.备份LVS安装与配置
备份LVS安装同主LVS安装方法同样.直接将lvs.conf拷贝到相应的目录下:
#scp lvs.cf :/etc/sysconfig/ha/
注: 主备服务器上lvs.cf配置文件内容是一样的。
在LVS-BACKUP 10.6.1.211上启动LVS服务.
# /etc/init.d/pulse start 启动服务即可.
7.安装配置Realserver, 主要在realserver上安装nginx服务和配置nginx文件等,此处省略。
注:LVS网络模式选择DR,即直接路由; 且选择不同的模式,相应的realserver执行的脚本是不同的,此处只对DR做配置。
有两种方法,任取其一即可,推荐方法二。
方法一:
1)
通过iptables实现Real Server的目标地址重定向:
[root@server3 ~]# iptables -t nat -A PREROUTING -d 10.6.1.214/32 -p tcp -m tcp --dport 80 -j REDIRECT
[root@server3 ~]# /etc/init.d/iptables save
[root@server3 ~]# chkconfig iptables on
要求在所有Real Server中通过iptables在防火墙的nat链中加入规则,将所有通过80端口外发数据包的目标地址模拟成虚拟IP的地址 10.6.1.214,然后发送给用户端,以便用户端可以正常接收此返回信息。因此请确保没有其他iptables规则与此规则冲突,并保证所有 通过80端口外发的包都经过了此规则的处理。
2) 把下面的写成脚本,加入/etc/rc.local中开机执行
##################################################################
#!/bin/bash
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
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
或者把下面命令写入/etc/sysctl.conf文件中,然后执行sysctl -p命令,使生效。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
+++++++++++++++++++++++++++++++++++++++++++++
方法二:
写如下脚本,命名为realserver, 放入目录/etc/init.d/realserver,
启动脚本
service realserver start
把该脚本加入系统自动启动
chkconfig realserver on
####################################################################
#!/bin/bash
# description: Config realserver
#Written by shixl
# chkconfig: 2345 10 90
# description: realserver ...
SNS_VIP=10.6.1.169
. /etc/rc.d/init.d/functions
case "$1" in
start)
/sbin/ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP up
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
echo "RealServer Start OK"
;;
stop)
/sbin/ifconfig lo:0 down
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
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
####################################################################
到此配置完成。
三。 测试。
说明: 可以通过停止主LVS,看备LVS能否接管服务; 可以停止其中一台realserver,看连接状态里是否还能看到停止的服务器,多注意日志的变化并分析。
下面有几个命令可查看状态:
查看LVS的连接情况:ipvsadm -L -n
查看LVS的吞吐量情况: ipvsadm -L -n --rate
查看LVS的统计信息:ipvsadm -L -n --stats
实时查看LVS连接状态变化: watch ipvsadm -ln
ipvsadm –ln //查看LVS连接状态.
[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.6.1.214:80 wlc persistent 600 -> 10.6.1.212:80 Route 1 0 0 -> 10.6.1.213:80 Route 1 0 0查看日志。tail -f /var/log/messages
Sep 28 16:03:03 localhost kernel: IPVS: stopping backup sync thread 7242 ...
Sep 28 16:03:04 localhost nanny[7302]: [ active ] making 10.6.1.213:80 available Sep 28 16:03:04 localhost kernel: IPVS: sync thread started: state = MASTER, mcast_ifn = eth0, syncid = 0 Sep 28 16:03:04 localhost kernel: send_arp uses obsolete (PF_INET,SOCK_PACKET) Sep 28 16:03:04 localhost nanny[7301]: [ active ] making 10.6.1.212:80 available Sep 28 16:03:05 localhost ntpd[1546]: Listen normally on 21 eth0:1 10.6.1.214 UDP 123 Sep 28 16:03:05 localhost ntpd[1546]: peers refreshed Sep 28 16:03:09 localhost pulse[7309]: gratuitous lvs arps finished Sep 28 16:32:11 localhost nanny[7301]: [inactive] shutting down 10.6.1.212:80 due to connection failure Sep 28 16:33:11 localhost nanny[7301]: [ active ] making 10.6.1.212:80 available分析:
如日志中出现: gratuitous lvs arps finished, 表示LVS启动成功。
如日志中出现:[inactive] shutting down 10.6.1.212:80 due to connection failure,我把一台realserver停止了。
如日志中出现:ocalhost nanny[7301]: [ active ] making 10.6.1.212:80 available ,我把realserver又启动了。
——————————————————————————————————————
备机LVS处于监听状态,主LVS关闭后,备机在设定的时间内接替主服务,如下日志显示。
Sep 29 11:59:20 localhost kernel: IPVS: sync thread started: state = BACKUP, mcast_ifn = eth0, syncid = 0
Sep 29 12:00:08 localhost pulse[16199]: partner dead: activating lvs Sep 29 12:00:08 localhost lvsd[16212]: starting virtual service WEB_LVS active: 80 Sep 29 12:00:08 localhost lvsd[16212]: create_monitor for WEB_LVS/WEB_A running as pid 16216 Sep 29 12:00:08 localhost lvsd[16212]: create_monitor for WEB_LVS/WEB_B running as pid 16217 Sep 29 12:00:08 localhost nanny[16216]: starting LVS client monitor for 10.6.1.214:80 -> 10.6.1.212:80 Sep 29 12:00:08 localhost nanny[16217]: starting LVS client monitor for 10.6.1.214:80 -> 10.6.1.213:80 Sep 29 12:00:08 localhost kernel: IPVS: stopping backup sync thread 16204 ... Sep 29 12:00:08 localhost kernel: IPVS: sync thread started: state = MASTER, mcast_ifn = eth0, syncid = 0 Sep 29 12:00:09 localhost nanny[16217]: [ active ] making 10.6.1.213:80 available Sep 29 12:00:09 localhost nanny[16216]: [ active ] making 10.6.1.212:80 available Sep 29 12:00:10 localhost ntpd[1672]: Listen normally on 9 eth0:1 10.6.1.214 UDP 123 Sep 29 12:00:10 localhost ntpd[1672]: peers refreshed Sep 29 12:00:13 localhost pulse[16223]: gratuitous lvs arps finished—————————————————————————————————————————
【注】服务切换测试:
测试过程中多注意分析日志.在Linuxtone网站编写heartbeat+lvs方案的时候还需要自己送一个arping命令告诉网关我的MAC发生变化了.但是Piranha方案能自动送一个arp命令.在测试的过程中,我本机访问VIP 时,总是访问到realserver10.6.1.212 上,换浏览器也是一样,我以为配置有问题,后来才发现:原来同一个IP访问的请求会分配到同一台服务器上。 你换个IP访问就OK了。
本文转自pizibaidu 51CTO博客,原文链接:http://blog.51cto.com/pizibaidu/1699080,如需转载请自行联系原作者