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

浙公网安备 33010602011771号