#本文欢迎转载,转载请注明出处和作者。
理论部分,在之前的文章已经说明过了,详见《【理论研究】业务系统高可用及负载均衡》。
上一篇已经讲述通过对2台Nginx服务器安装Keepalived软件+Nginx服务检测脚本,做高可用HA的配置。
本篇介绍通过增加LVS服务器,对2台Nginx服务器做负载均衡。
一般的系统,如果在私有云,企业会购买硬件负载均衡器(如F5、Radware、Array等),或者用服务器+LVS,再最外面弄一层网络负载均衡,这个通常是所有业务系统/服务共用的,属于IT基础实施。而每个业务系统/服务,会自己用服务器+Nginx,做自己的应用负载均衡/反向代理,这个通常是业务系统/服务自己使用的,不同业务系统自行搭建不同的Nginx服务器。
1、LVS
LVS的控制端,叫director,负责VIP以及分发流量。
后端被分发的服务器,叫做RealServer。有时候为了节省,机器可以既做Director也做Realserver。
实验中,我们增加1台LVS服务器(10.1.30.40)1做director,原来的2台Nginx服务器30.26、30.27做Realserver。
1.1检查LVS模块
用lvs分发到2台nginx服务器(此处nginx仅当作web服务器使用)
Centos6.5自带lvs模块,用如下命令可以检查
modprobe -l | grep ipvs
1.2安装依赖
yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt*
1.3安装lvs管理工具
管理工具叫ipvsadm,ipvsadm-1.26.tar.gz拷贝至/usr/local/下
cd /usr/local
tar -zxvf ipvsadm-1.26.tar.gz
cd ipvsadm-1.26
make & make install
2、Nginx服务测试预设置
由于实现负载均衡后,直接访问VIP,发现业务能够正常访问,并且能够负载均衡到apache01、02,但是由于Nginx01、02设置了负载均衡到Apache,所以访问VIP屏蔽了Nginx01、02,无法看出到底VIP有没有负载到Nginx01、02,因此需要提前做些修改,方便测试。
2.1 临时取消Nginx负载均衡Apahce设置
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
vi /usr/local/nginx/conf/nginx.conf
删除
upstream site{
server 10.1.30.24;
server 10.1.30.25;
}
proxy_pass http://site;
#在location / {}里面
修改会话保持时间
keepalive_timeout 0;
#原有#去掉,否则连续访问VIP,会65秒内连续分发到同一台Nginx服务器
#keepalive_timeout 65;
#加上#注释掉
详见之前《【实战演练】Linux操作系统13-Nginx实现WEB服务器负载均衡》的4.1-5)
重启nginx服务
service nginx restart
此时单独访问Nginx01、02会显示Nginx的默认页面。
2.2 修改Nginx默认页面
修改Nginx01、02的默认欢迎页面,默认主页是/usr/local/nginx/html/index.html
mv /usr/local/nginx/html/index.html /usr/local/nginx/html/index.html.bak
vi /usr/local/nginx/html/index.html
#Nginx01设置为
This is Nginx01 10.1.30.26
#Nginx02设置为
This is Nginx02 10.1.30.27
单独访问Nginx01、02的IP进行测试
2.3 关闭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
sysctl -p
#使用修改生效
3、LVS Director配置
3.1 脚本自动配置
vi /etc/init.d/lvsdr
内容如下
#!/bin/sh
# 定义虚拟ip
VIP=10.1.30.31 #虚拟 ip根据需求修改
# 定义realserver,并已空格分开,根据需求修改
RIPS="10.1.30.26 10.1.30.27"
# 定义提供服务的端口
SERVICE=80
# 调用init.d脚本的标准库
. /etc/rc.d/init.d/functions
case $1 in
start)
echo "Start LVS of DR Mode"
# 开启ip转发
echo "1" > /proc/sys/net/ipv4/ip_forward
# 绑定虚拟ip
ifconfig eth1:0 $VIP broadcast $VIP netmask 255.255.255.255 up
route add -host $VIP dev eth1:0
# 清除lvs规则
ipvsadm -C
# 添加一条虚拟服务器记录
# -p指定一定的时间内将相同的客户端分配到同一台后端服务器
# 用于解决session的问题,测试时或有别的解决方案时建议去掉
ipvsadm -A -t $VIP:$SERVICE -s rr
# 添加真实服务器记录
for RIP in $RIPS
do
echo $RIP:$SERVICE;
ipvsadm -a -t $VIP:$SERVICE -r $RIP:$SERVICE -g
done
# 设置tcp tcpfin udp的超时连接值
ipvsadm --set 30 120 300
ipvsadm
;;
stop)
echo "Stop LVS DR"
ifconfig eth1:0 down
ipvsadm -C
;;
*)
echo "Usage:$0 {start ¦ stop}"
exit 1
esac
保存后增加执行权限
chmod 777 /etc/init.d/lvsdr
启动LVS服务
service lvsdr start
3.2 手工配置(如果已经做了脚本自动配置,就不需要再做手工配置了)
3.2.1 绑定VIP
绑定虚拟IP(注意网卡按照机器实际网卡更改,如eth0,则改eth1为eth0)
ifconfig eth1:0 10.1.30.31 broadcast 10.1.30.31 netmask 255.255.255.255 up
3.2.2添加路由规则
route add -host 10.1.30.31 dev eth1:0
3.2.3启动包转发功能
echo "1" >/proc/sys/net/ipv4/ip_forward
3.2.4清除原有转发规则
ipvsadm --clear
3.2.5添加虚拟IP规则
ipvsadm -A -t 10.1.30.31:80 -s rr
-s rr表示采用轮询策略。
:80表示负载转发的端口是80
3.2.6在虚拟IP中添加服务规则
ipvsadm -a -t 10.1.30.31:80 -r 10.1.30.26:80 -g
ipvsadm -a -t 10.1.30.31:80 -r 10.1.30.27:80 -g
在新加虚拟IP记录中添加两条新的Real Server记录,-g表示指定LVS 的工作模式为直接路由模式。
lvs进行负载转发需要保证lvs负载的端口要和nginx服务的端口的一致,这里都为80。
3.2.7重启LVS
Ipvsadm
4、Realserver配置(2台Nginx服务器)
4.1 脚本自动配置
vi /etc/init.d/lvsdr
内容如下:
#!/bin/sh
VIP=10.1.30.31 #虚拟ip,根据需求修改
. /etc/rc.d/init.d/functions
case $1 in
start)
echo "lo:0 port starting"
# 为了相应lvs调度器转发过来的包,需在本地lo接口上绑定vip
ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
# 限制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
;;
stop)
echo "lo:0 port closing"
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 "Usage: $0 {start ¦ stop}"
exit 1
esac
增加执行权限
chmod 777 /etc/init.d/lvsdr
然后可以直接使用service lvsdr start/stop进行启停。
service lvsdr start
4.2 手工配置(如果已经做了脚本自动配置,就不需要再做手工配置了)
4.2.1环回接口绑定VIP
ifconfig lo:0 10.1.30.31 broadcast 10.1.30.31 netmask 255.255.255.255 up
/sbin/route add -host 10.1.30.31 dev lo:0
4.2.2关闭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
sysctl -p
使用修改生效
5、测试
通过VIP(10.1.30.31)访问业务,并且不断刷新,发现能够早Ngix01与02之间负载均衡。
网友评论