LVS+ldirectord+nginx 负载均衡

2017年4月7日 1 条评论 1.02k 次阅读 0 人点赞

前期准备:

首先安装mini版的系统,安装nginx先做测试;

更换源为阿里云:

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
#CentOS 5
#wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
#CentOS 6
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
yum clean all
yum makecache

添加nginx的yum安装源:

echo '[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/6/$basearch/
gpgcheck=0
enabled=1' > /etc/yum.repos.d/nginx.repo
yum makecache
#将其中的centos替换成对应系统,6替换成系统版本。具体查看http://nginx.org/en/linux_packages.html

然后安装nginx:

yum install -y nginx
service nginx start
#iptables -I INPUT -p tcp --dport 80 -j ACCEPT
#service iptables stop

结构:

DR:192.168.253.82 VIP:192.168.253.80 nginx/1.10.3
RS1:192.168.253.83 nginx/1.10.3 RS2:192.168.253.84 nginx/1.11.12

DR上的设置:

IPVS

首先确认是否存在 ipvs模块:

# modprobe -l |grep ipvs
kernel/net/netfilter/ipvs/ip_vs.ko
kernel/net/netfilter/ipvs/ip_vs_rr.ko
kernel/net/netfilter/ipvs/ip_vs_wrr.ko
kernel/net/netfilter/ipvs/ip_vs_lc.ko
kernel/net/netfilter/ipvs/ip_vs_wlc.ko
kernel/net/netfilter/ipvs/ip_vs_lblc.ko
kernel/net/netfilter/ipvs/ip_vs_lblcr.ko
kernel/net/netfilter/ipvs/ip_vs_dh.ko
kernel/net/netfilter/ipvs/ip_vs_sh.ko
kernel/net/netfilter/ipvs/ip_vs_sed.ko
kernel/net/netfilter/ipvs/ip_vs_nq.ko
kernel/net/netfilter/ipvs/ip_vs_ftp.ko
kernel/net/netfilter/ipvs/ip_vs_pe_sip.ko

然后安装ipvsadm:

# yum install ipvsadm

采用shell脚本完全管理,如下:

# vim /etc/init.d/lvsDR
#!/bin/sh
# description: Start LVS of Director server
VIP=192.168.253.80
RIP1=192.168.253.83
RIP2=192.168.253.84
/etc/rc.d/init.d/functions
case "$1" in
    start)
        echo " start LVS of Director Server"
        # set the Virtual  IP Address and sysctl parameter
        /sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        echo "1" >/proc/sys/net/ipv4/ip_forward
        #Clear IPVS table
        /sbin/ipvsadm -C
        #set LVS
        /sbin/ipvsadm -A -t $VIP:80 -s rr -p 1
        #-p [timeout] 在某个Real Server上持续的服务时间。也就是说来自同一个用户的多次请求,将被同一个Real Server处理。此参数一般用于有动态请求的操作中,timeout 的默认值为300 秒。例如:-p 600,表示持续服务时间为600秒。
        #-s [rr|wrr|lc|wlc|lblc|lblcr|dh|sh] LVS使用的调度算法,此处为了测试出效果,使用rr轮询
        /sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g
        /sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g
        #Run LVS
        /sbin/ipvsadm
       ;;
    stop)
        echo "close LVS Directorserver"
        echo "0" >/proc/sys/net/ipv4/ip_forward
        /sbin/ipvsadm -C
        /sbin/ifconfig eth0:0 down
        ;;
    *)
        echo "Usage: $0 {start|stop}"
        exit 1
esac

以上参考http://ixdba.blog.51cto.com/2895551/554029

安装ldirectord

下载ldirectord安装包(找了很久没找到yum源,,,)http://rpm.pbone.net/index.php3/stat/4/idpl/23860919/dir/centos_6/com/ldirectord-3.9.5-3.1.x86_64.rpm.html

wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/x86_64/ldirectord-3.9.5-3.1.x86_64.rpm
rpm -ivh ldirectord-3.9.5-3.1.x86_64.rpm
# 提示有很有依赖包安装
yum install -y perl-MailTools "perl(IO::Socket::INET6)" "perl(LWP::Debug)" "perl(LWP::UserAgent)" perl-Net-SSLeay perl-libwww-perl
# 然后再安装即可
rpm -ivh ldirectord-3.9.5-3.1.x86_64.rpm
# 复制一份配置文件到/etc/ha.d/
cp `find / -name ldirectord.cf` /etc/ha.d/

配置ldirectord.cf

# Global Directives
checktimeout=20           #判定real server出错的时间间隔。
checkinterval=10          #指定ldirectord在两次检查之间的间隔时间。
fallback=127.0.0.1:80     #当所有的real server节点不能工作时,web服务重定向的地址。
autoreload=yes            #是否自动重载配置文件,选yes时,配置文件发生变化,自动载入配置信息。
logfile="/var/log/ldirectord.log"   #设定ldirectord日志输出文件路径。
quiescent=no              #当选择no时,如果一个节点在checktimeout设置的时间周期内没有响应,ldirectord将会从LVS的路由表中直接移除real server,此时,将中断现有的客户端连接,并使LVS丢掉所有的连接跟踪记录和持续连接模板,如果选择为yes,当某个real server失效时,ldirectord将失效节点的权值设置为0,新的连接将不能到达,但是并不从LVS路由表中清除此节点,同时,连接跟踪记录和程序连接模板仍然保留在Director上。
#注意:以上几行为ldirectord.cf文件的“全局”设置,它们可以应用到下面多个虚拟主机,下面是每个虚拟主机的配置。
# Sample for an http virtual service
virtual=192.168.253.80:80        #指定虚拟的IP地址和端口号,注意,在virtual行后面的行必
须缩进4个空格或以一个tab字符进行标记。
real=192.168.253.83:80 gate      #指定Real Server服务器地址和端口,同时设定LVS工作模式,
用gate表示DR模式,ipip表示TUNL模式,masq表示NAT模式。
real=192.168.253.84:80 gate
fallback=127.0.0.1:80 gate       
service=http                     #指定服务的类型,这里是对http服务做负载均衡。
request="test.html"             #ldirectord将根据指定的Real Server地址,结合该选项给出
的请求路径,发送访问请求,检查Real Server上的服务是否正
常运行,确保这里给出的页面地址是可访问的,不然ldirectord
会误认为此节点已经失效,发生错误监控现象。
receive="ok"              #指定检测的关键字,这里的设置表示测试访问index.html页面是否包含ok关键字,如果有则说明该节点正常,否则认定为故障。
scheduler=rr                     #指定调度算法,这里是rr(轮叫)算法。
protocol=tcp                     #指定协议的类型,LVS支持TCP和UDP协议。
checktype=negotiate              #指定Ldirectord的检测类型,默认为negotiate。
checkport=80                     #指定监控的端口号。
virtualhost=www.sevenfal.com        #虚拟服务器的名称,随便指定。

然后就可以启动ldirectord服务了,不过在此之前还需要配置一下RealServer

RS配置

2台RS配置一样,一下给出一份:

vim /etc/init.d/lvsRS
#!/bin/bash
#description : Start Real Server 
VIP=192.168.253.80
/etc/rc.d/init.d/functions
case "$1" in
    start)
        echo " Start LVS  of  Real Server"
 /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 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
        ;;
    stop)
        /sbin/ifconfig lo:0 down
        echo "close LVS Director server"
        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

然后设置一个用于ldirectord检测页面

vim /usr/share/nginx/html/test.html
ok

至此,启动所有服务即可(需要注意防火墙等设置)

如上设置,一直刷新http://192.168.253.80 的页面(需要在2台RS上分别定义不同的index.html内容),会显示出不同的结果一直轮换,如果把其中一个nginx服务stop或者把检测的页面移除,则在192.168.253.82上输入ipvsadm可以看到其中一台rs的weight被设置成了0

Sevenfal

这个人太懒什么东西都没留下

文章评论(1)

  • sevenfal

    DR可做RS,直接在启动脚本中添加一条为本机的即可,

    2017年4月7日