【实战演练】Linux操作系统15-LVS实现Nginx服务器负载均衡

#本文欢迎转载,转载请注明出处和作者。

理论部分,在之前的文章已经说明过了,详见《【理论研究】业务系统高可用及负载均衡》。

上一篇已经讲述通过对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之间负载均衡。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354