lvs+keepalived负载均衡架构(DR模式)

LVS+keepalived能很好的实现:系统高可用性 、系统可扩展性 、负载均衡能力;LVS提供负载均衡,keepalived提供健康检查,故障转移,提高系统的可用性!采用这样的架构以后很容易对现有系统进行扩展。

LVS目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR),此文档采用DR模式,DR模式具有较好的性能,也是目前大型网站使用最广泛的一种负载均衡模式。

lvs支持8种不同的调度算法轮叫(rr)、加权轮叫(wrr)、最小连接(lc)、加权最小连接(wlc)、基于局部性最小连接(lblc)、带复制的基于局部性最少链接(lblcr)、目标地址散列(dh)和源地址散列(sh).

 

 

仿真环境搭建的必要性:

线上环境lvs+keepalived对http(2台nginx)做负载均衡架构,仿真环境目前只是1台nginx,在仿真环境搭建lvs+keepalived负载均衡高可用架构,让仿真环境更接近线上环境,有利于重现开发环境无法重现的BUG,测试环境可以验证安装软件的全过程。即进行安装测试,用以检查安装文件是否有错漏,软件在指定的操作系统下能否正常安装,各种配置项是否有错漏等。搭建一个与线上环境配置一致的测试环境是有效测试的重要前提。

 

环境描述

操作系统     CentOS release 6.7

主调度器     172.20.101.63

备调度器     172.20.101.64

漂移IP         172.20.101.66

后端real server:  172.20.101.65、172.20.101.68

keepalived版本    1.2.19

 

keepalived官网:http://www.keepalived.org

ipvsadm官网:http://www.linuxvirtualserver.org

 

 

 

一、lvs安装配置:

 

主/备lvs(调度器)安装

 

1、加载LVS的内核模块(ip_vs)

 

LVS现在已经集成在Linux内核模块中,但整个LVS环境又分为内核层与用户层,内核层负责核心算法的实现用户层需要安装ipvsadm工具,通过命令将管理员需要的工作模式与实现算法传递给内核来实现。LVS的内核模块名称为ip_vs,

#lsmod  | grep ip_vs  //查看是否加载ip_vs模块,这里已经默认安装好了

 

 

#modprobe ip_vs    //加载ip_vs模块

#modprobe ip_vs_wlc  //lvs调度算法模式有rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,这里选择 wlc模式,记载wlc模块

 

 

2、安装ipvsadm工具

可以通过yum安装ipvsadm或官网下载源码安装

#yum -y install gcc popt popt-devel popt-static libnl libnl-devel

#cd ipvsadm-1.26 && make && make install

 

能够显示ipvsadm命令,则表示安装成功

 

 

 

/keepalived安装:

 

1、keepalived安装

 

# yum -y install gcc openssl-devel popt-devel libnl libnl-devel kernel-devel

#cd keepalived-1.2.19

# ./configure

 

Keepalived configuration

------------------------

Keepalived version       : 1.2.19

Compiler                 : gcc

Compiler flags           : -g -O2 -DFALLBACK_LIBNL1

Extra Lib                : -lssl -lcrypto -lcrypt  -lnl 

Use IPVS Framework       : Yes

IPVS sync daemon support : Yes

IPVS use libnl           : Yes

Use VRRP Framework       : Yes

Use VRRP VMAC            : Yes

SNMP support             : No

SHA1 support             : No

Use Debug flags          : No

 

# make

# make install

 

# cp /usr/local/sbin/keepalived /usr/sbin/

#cp  keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

#cp keepalived/etc/init.d/keepalived.init /etc/init.d/keepalived

#cp keepalived/etc/init.d/keepalived.sysconfig /etc/sysconfig/keepalived

#/etc/init.d/keepalived start

 

2、keepalived配置

[root@huiyewang ~]# vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

XXXXXX@qq.com

   }

   notification_email_from XXXXXXX@qq.com

   smtp_server 127.0.0.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL            //表示运行Keepalived服务器的一个标识。发邮件时显示邮件主题的信息

}

 

# VIP1

vrrp_instance VI_2 {

    state MASTER|BACKUP

    interface eth0

    lvs_sync_daemon_inteface eth0

    virtual_router_id 54       //保持主从服务器一致
    priority 100|90            //优先级 (主服务器较高)
    advert_int 5               //心跳广播间隔

    authentication {

        auth_type PASS

        auth_pass snto123

    }

    virtual_ipaddress {

        172.20.101.66

    }

 

      notify_master "/usr/local/shell/arp.sh 172.20.101.66"//刷新网关arp缓存脚本

}

#REAL_SERVER_1

virtual_server 172.20.101.66 80 {

    delay_loop 3              //健康检查时间间隔,单位是秒

    lb_algo wlc               //负载均衡调度算法

    lb_kind DR               //负载均衡转发规则

    persistence_timeout 60    //会话保持时间,单位是秒

    protocol TCP        

 

    real_server 172.20.101.65 80 {

        weight 100          //权重

        TCP_CHECK {         //健康检查的方式TCP_CHECK

        connect_timeout 3   //连接超时时间

        nb_get_retry 3      //表示重试次数

        delay_before_retry 3  //表示重试间隔

        connect_port 80      //检测TCP 80端口

        }

    }

#REAL_SERVER_2

    real_server 172.20.101.68 80 {

        weight 30

        TCP_CHECK {

        connect_timeout 3

        nb_get_retry 3

        delay_before_retry 3

        connect_port 80

 

        }

    }

 

}

 

 

红色标注的分别为主从的配置区别

 

网关的arp缓存刷新脚本:

[root@fzlvss keepalived]# cat /usr/local/shell/arp.sh

#!/bin/bash

VIP=$1

GATEWAY=172.20.101.254

/sbin/arping -I eth0 -c 5 -s $VIP $GATEWAY &> /dev/null

 

然后重启keepalived,让配置生效

#/etc/init.d/keepalived start

 

查看LVS规则表

# ipvsadm -Ln

 

 

查看当前IPVS调度状态

# ipvsadm -Lnc

 

 

查看虚拟IP,通过执行 ip add 即可看见 vip 已经被绑定在指定的网络接口(注意:ifconfig 不能显示 vip)。这里172.20.101.66随着keepalived的启动也添加了

# ip add show

 

 

●虚拟服务器 virtual_server 定义块

虚拟服务器定义是 keepalived 框架最重要的项目了,是 keepalived.conf 必不可少的部分。

1、虚拟服务器 virtual_server. 这个 ip 来自于 vrrp 定义块的第“4”步,后面一个空格,然

后加上端口号。定义一个 vip,可以实现多个 tcp 端口的负载均衡功能。

(1) delay_loop。健康检查时间间隔,单位是秒。

(2) lb_algo. 负载均衡调度算法,互联网应用常使用 wlc 或 rr。

(3) lb_kind. 负载均衡转发规则。一般包括 DR,NAT,TUN3 种,在我的方案中,都使用

DR 的方式。

(4) persistence_timeout.会话保持时间,单位是秒。这个选项对动态网站很有用处:当用

户从远程用帐号进行登陆网站时,有了这个会话保持功能,就能把用户的请求转发

给同一个应用服务器。在这里,我们来做一个假设,假定现在有一个 lvs 环境,使

用 DR 转发模式,真实服务器有 3 个,负载均衡器不启用会话保持功能。当用户第

一次访问的时候,他的访问请求被负载均衡器转给某个真实服务器,这样他看到一

个登陆页面,第一次访问完毕;接着他在登陆框填写用户名和密码,然后提交;这

时候,问题就可能出现了—登陆不能成功。因为没有会话保持,负载均衡器可能会

把第 2 次的请求转发到其他的服务器。

(5)转发协议 protocol.一般有 tcp 和 udp 两种。实话说,我还没尝试过 udp 协议类的转发。

●失败切换(FailOver)测试

正常情况下,当主负载均衡器(MASTER)失效时,备份负载均衡器(BACKUP)能立即

接替转发任务(接替时间由 keepalived.conf 文件的 advert_int 指定)。

 

 

后端real server

 

1、因为调度器和真实服务器都设置了vip地址,所以要求所有真实服务器要禁止对VIP地址的ARP响应,

通过arp_ignore和arp_announce实现;

 

net/ipv4/conf/all/arp_announce=2

net/ipv4/conf/all/arp_ignore=1          

net/ipv4/conf/lo/arp_announce=2

net/ipv4/conf/lo/arp_ignore=1

 

2、配置虚拟IP地址

#ifconfig lo:0 172.20.101.66 netmask 255.255.255.255 

vip 被绑定在环回接口 lo0:0 上,其广播地址是其本身,子网掩码是 255.255.255.255。这

与标准的网络地址设置有很大的不同。采用这种可变长掩码方式把网段划分成只含一个

主机地址的目的是避免 ip 地址冲突。

 

基于方便,直接写个脚本实现:

启动lvs的客户端配置脚本:

# cat /usr/local/shell/realserver.sh

#!/bin/sh

VIP=172.20.101.66

#/etc/init.d/functions

 

case "$1" in

start)

echo "start LVS of realserver"

/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up

/sbin/route add -host $VIP dev lo:0      //VIP基于响应添加一条主机路由

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 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

 

 

启动客户端配置脚本:/usr/local/shell/realserver.sh start

加到/etc/rc.local里开机启动:

 

 

这时就搭建完毕,主服务器故障或主服务器上的keepalived一旦关闭,那么从服务器马上变为主服务器,为用户提供服务,

 

 

测试:

当关闭后端机器(172.20.101.65),就会在ipvs里去除,恢复后自动添加进来提供服务,如下图:

关闭nginx服务(172.20.101.65 ):

[root@huiye ~]# /usr/local/nginx/sbin/nginx -s stop

 

调度器keepalived日志:

 

 

查看LVS规则表去除了172.20.101.65:

 

 

启动nginx服务(172.20.101.65 ):

[root@huiye ~]# /usr/local/nginx/sbin/nginx

 

调度器keepalived日志:

 

 

 

 

 

 

总结:如果只是单独配置lvs,没有配置keepalived高可用,则利用ipvsadm命令行形式添加虚拟ip和真实ip(但是需要将命令

添加到/etc/rc.local开机启动),如下所示:

# ipvsadm -A -t 172.20.101.66:80 -s wlc -p 60

# ipvsadm -a -t 172.20.101.66:80 -r 172.20.101.65:80 -g -w 100  //

如果配置lvs+keepalived,则虚拟ip和真实ip相关配置在keepalived配置文件里面配置

 

健康检查功能(故障隔离)测试:

 

注意:1、关闭 lvs 的客户端配置脚本/usr/local/shell/realserver.sh。这个测试不会成功,关闭真实机器的vip 以后,负载均衡器依然会把用户请求转发过来,可是 tcp 连接却不能成功,部分用户的访问失败。因此在部署和运维 lvs 环境时,要特别注意这一点。

2、启动keepalived服务,默认配置为/etc/keepalived/keepalived.conf且不会针对配置文件进行语法等检测,所以配置的时候特别注意少“括号”等错误

 

问题?

1、lvs调度算法模式及区别?

参考文档:http://blog.csdn.net/gzh0222/article/details/6735953

 

2、keepalived健康检查的方式?

Vip 对应的服务状态检查。一般通过

  • ·TCP_CHECK 加端口号的形式实现如果 web 集群,
  • ·HTTP_GET:向指定的URL执行http请求,更精确的检查
  • ·SSL_GET:跟HTTP_GET相似,不同的只是用SSL连接
  • ·MISC_CHECK:用脚本来检测
  • ·SMTP_CHECK:用来检测邮件服务的smtp

 

3、keepalived主备切换后的arp问题(http://hxl2009.blog.51cto.com/779549/1073177)

问题描述:keepalived故障切换至备机,备机显示绑定了VIP。仿真环境同网段的服务器(172.20.101.0/24)可以访问,但是此时公司(172.40.0.0/16)不能访问。其实就是网关的arp缓存没有及时刷新。

 

在服务器上执行一下就行了

arping -I eth0 -c 5 -s VIP GATEWAY

 

可以修改keepalived的配置文件添加:

 

vrrp_sync_group VG1 {

    group {

          VI_1

    }

notify_master "/usr/local/shell/arp.sh 172.20.101.66"   #当状态切换为MASTER时,运行的脚本

}

 

[root@fzlvss keepalived]# cat /usr/local/shell/arp.sh

#!/bin/bash

VIP=$1

GATEWAY=172.20.101.254

/sbin/arping -I eth0 -c 5 -s $VIP $GATEWAY &> /dev/null

posted @ 2018-01-27 10:10  飞鹰之歌  阅读(210)  评论(0)    收藏  举报