您的位置:首页 > 其它

如何利用LVS+keepalived(DR模式)实现高负载均衡

2017-03-29 10:25 645 查看
文章主要分为原理、架构、安装、配置和启动这个几个部分。文章有点长,前面部分是参考了 LVS+Keepalived实现高可用负载均衡 ,根据自己的实际工作花了两三个小时整理的,希望能对大家有点帮助吧。

一、原理

1、概要介绍

如果将TCP/IP划分为5层,则Keepalived就是一个类似于3~5层交换机制的软件,具有3~5层交换功能,其主要作用是检测web服务器的状态,如果某台web服务器故障,Keepalived将检测到并将其从系统中剔除,当该web服务器工作正常后Keepalived自动将其加入到服务器群中,这些工作全部自动完成,而不需要人工干预,只需要人工修复故障的web服务器即可。

2、工作原理

Keepalived基于VRRP协议来实现高可用解决方案,利用其避免单点故障,通常这个解决方案中,至少有2台服务器运行Keepalived,即一台为MASTER,另一台为BACKUP,但对外表现为一个虚拟IP,MASTER会发送特定消息给BACKUP,当BACKUP收不到该消息时,则认为MASTER故障了,BACKUP会接管虚拟IP,继续提供服务,从而保证了高可用性,具体如下图:



3层机理是发送ICMP数据包即PING给某台服务器,如果不痛,则认为其故障,并从服务器群中剔除。

4层机理是检测TCP端口号状态来判断某台服务器是否故障,如果故障,则从服务器群中剔除。

5层机理是根据用户的设定检查某个服务器应用程序是否正常运行,如果不正常,则从服务器群中剔除。

3、实际作用

主要用作RealServer的健康检查,以及负载均衡设备MASTER和BACKUP之间failover的实现。

二、架构

本系列文章以Red Hat Enterprise Linux 5.1为例,介绍用LVS+Keepalived实现高可用负载均衡。具体业务需求是用虚拟IP转发8080、25、21端口请求到后端的真实服务器来处业务逻辑,系统拓扑如下图所示:



客户端通过VIP(Virtual IP)(172.28.14.227/228/229)来访问负载均衡服务器,负载均衡服务器通过MASTER/172.28.19.92或BACKUP/172.28.19.93将请求分别转发给真实服务器(Web服务器/172.28.19.100/101/102、邮件服务器/172.28.19.103/104/105、文件服务器/172.28.19.106/107/108)。

负载均衡服务器的MASTER和BACKUP上都必须安装LVS+Keepalived,下面开始安装和配置之旅。

三、LVS集群安装及配置

3.1 主备LVS安装

3.1.1 LPVS安装

Red Hat Enterprise Linux 5.1内核已包含ipvs,所以只需安装ipvsadm,安装步骤如下:

1、http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz 获取ipvsadm

2、创建一个连接文件,其命令为:ln –sv /usr/src/kernels/2.6.18-128.el5-i686 /usr/src/linux,注意一定要与当前的运行的内核相一致,因为/usr/src/kernels 目录下可多个目录。如果

不创建这个连接文件,在编译时会出错,从而不能继续进行安装。

3、 解包。 tar zxvf ipvsadm-1.24

4、 编译并安装。 cd ipvsadm-1.24; make;make install 可执行文件被安装到/sbin/ipvsadm.

检验ipvsadm 是否被正确安装:

1、 执行ipvsadm,看是否有如下输出:

[root]# ipvsadm

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

2、 检查当前加载的内核模块,看是否存在ip_vs 模块。

[root]# lsmod|grep ip_vs

ip_vs 77569 0

注1、只有执行ipvsadm 以后,才会在内核加载ip_vs 模块。

注2、不能以查进程的方式判断ipvs 是否运行。

3.1.2 Keepalive安装

1、 下载最新稳定版 wget http://www.keepalived.org/software/keepalived-1.1.17.tar.gz

2、 解包 tar zxvf keepalived-1.1.17.tar.gz

3、 切换目录 cd keepalived-1.1.17

4、 配置 ./configure -prefix=/usr/local/keepalive 因为keepalived 运行在ipvs 之上,因此这两个软件一定要安装在一个系统里面。如果configure 操作能正常进行,运行完毕后将有如下的汇总输出:

Keepalived configuration

——————————————

Keepalived version : 1.1.17

Compiler : gcc

Compiler flags : -g -O2

Extra Lib : -lpopt -lssl -lcrypto

Use IPVS Framework : Yes

IPVS sync daemon support : Yes

Use VRRP Framework : Yes

Use LinkWatch : No

Use Debug flags : No

5、 编译和安装 make ; make install

Keepalived 安装完成后,会在安装目录/usr/local/keepalive 生成 bin,etc,man,sbin 这4 个目录。其中etc 为配置文件所在的目录。

3.2 主用LVS配置

编辑Keepalive配置文件(/etc/keepalived/keepalived.conf):

#guration File for keepalived

#global define

global_defs {

#负载均衡标志在一个网络内写成唯一

router_id LVS_CNC_1

}

vrrp_sync_group VGM {

group {

#这个标志要与下面vrrp_instance定义的一致

VI_CACHE

}

}

#vvrp_instance define #

#这个模块的作用就是用来确定失败切换(FailOver)包含的路由实例个数。一个实例组group.至少包含一个vrrp 实例#

vrrp_instance VI_CACHE {

#实例状态state只有MASTER 和BACKUP 两种状态 ,其中

MASTER 为工作状态,BACKUP 为备用状态。#

state MASTER

#通信接口interface,对外提供服务的网络接口。 #

interface eth0

# lvs_sync_daemon_inteface,负载均衡器之间的监控接口。 #

lvs_sync_daemon_inteface eth0

#虚拟路由标识virtual_router_id.这个标识是一个数字,并且同一个vrrp 实例使用唯一的标识。即同一个vrrp_stance,MASTER 和BACKUP 的virtual_router_id 是一致的,同时在整个vrrp 内是唯一的。 #

virtual_router_id 51

# 优先级priority.这是一个数字,数值愈大,优先级越高。在同一个vrrp_instance里,MASTER 的优先级高于BACKUP。 #

priority 180

#同步通知间隔 advert_int .MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒 #

advert_int 5

# 验证authentication,包含验证类型和验证密码。这一栏是不用管的#

authentication {

auth_type PASS

auth_pass 1111

}

# 虚拟ip 地址virtual_ipaddress . 可以有多个地址,每个地址占一行,不需要指定子网掩码#

virtual_ipaddress {

172.30.254.220
4000

}

}

# virtual machine setting #

# setting port 80 forward #

virtual_server 172.30.254.220 80 {

# 健康检查时间间隔,单位是秒 #

delay_loop 6

# 负载均衡调度算法 #

lb_algo wlc

# 负载均衡转发规则 #

lb_kind DR

# 会话保持时间,单位是秒#

persistence_timeout 300

# 转发协议#

protocol TCP

# 真实服务器real_server,也即服务器池。Real_server 的值包括ip 地址和端口号,有多少个服务器使用了虚拟IP,要配置多少个real_server #

real_server 172.30.254.17 80 {

# 权重值越大,处理的请求越多#

weight 100

# 注意TCP_CHECK和{之间的空格,如果没有的话只会添加第一个realserver#

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

# 这里的端口号要与real_server那里的端口号一致#

connect_port 80

}

}

real_server 172.30.254.18 80 {

weight 100

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

}

注:在这样只有一个vrrp_instance 的环境里,主负载均衡器(MASTER)与备份负载均衡器(BACKUP)配置文件的差异一共只有3 处: 全局定义的route_id、vrrp_instance state、vrrp_instance 的优先级priority。备份负载均衡器的配置文件就不再写了。

3.4 Real Server配置

Real Server不需要安装任何软件,只需建立如下脚本,负责服务的启动、停止:

1、编辑脚本lvs_real:

# /usr/local/bin/lvs_real#

# vip(virtual ip)。直接路由模式的vip 必须跟服务器对外提供服务的ip 地址在同一个网段,并且lvs 负载均衡器和其他所有提供相同功能的服务器都使用这个vip.#

VIP=172.30.254.220

/etc/rc.d/init.d/functions

case “1”instart)echo”startLVSofREALServer”/sbin/ifconfiglo:0VIP broadcast VIPnetmask255.255.255.255upecho“1”>/proc/sys/net/ipv4/conf/lo/arpignoreecho“2”>/proc/sys/net/ipv4/conf/lo/arpannounceecho“1”>/proc/sys/net/ipv4/conf/all/arpignoreecho“2”>/proc/sys/net/ipv4/conf/all/arpannounce;;stop)/sbin/ifconfiglo:0downecho“closeLVSDirectorserver”echo“0”>/proc/sys/net/ipv4/conf/lo/arpignoreecho“0”>/proc/sys/net/ipv4/conf/lo/arpannounceecho“0”>/proc/sys/net/ipv4/conf/all/arpignoreecho“0”>/proc/sys/net/ipv4/conf/all/arpannounce;;∗)echo“Usage:0 {start|stop}”

exit 1

esac

2、打开脚本执行权限:

#chmod u+x /usr/local/bin/lvs_real

四、启动

1、启动LVS脚本,分别在2台Real Server上分别启动配置脚本,执行命令 /usr/local/bin/lvs_real start,然后再用命令ip add查看网络状态:

[root]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet 172.30.254.220/32 brd 172.30.254.220 scope global lo:0
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:21:5e:c6:f6:54 brd ff:ff:ff:ff:ff:ff
inet 172.30.254.17/16 brd 172.30.255.255 scope global eth0
inet6 fe80::221:5eff:fec6:f654/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
link/ether 00:21:5e:c6:f6:56 brd ff:ff:ff:ff:ff:ff
4: usb0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
link/ether 02:21:5e:ca:f0:7f brd ff:ff:ff:ff:ff:ff
5: sit0: <NOARP> mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0


从inet 172.30.254.220/32 brd 172.30.254.220 scope global lo:0可以看出, lo0:0 确实绑定了我们指定的vip 地址172.30.254.220。

2、启动Keepalived:/usr/local/keepalived/sbin/keepalived -D

注意:Keepalive配置文件keepalived.conf必须在/etc/keepalived/下,否则需要-f 指定。验证Keepalived是否启动的命令: ps aux | grep keepalived,如果keepalived的进程在则说明启动成功。

3、验证是否工作正常:

<font size=4>#ip add</font>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:21:5e:c6:f6:64 brd ff:ff:ff:ff:ff:ff
inet 172.30.254.15/16 brd 172.30.255.255 scope global eth0
inet 172.30.254.220/32 brd 172.30.254.220 scope global eth0:1
inet6 fe80::221:5eff:fec6:f664/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
link/ether 00:21:5e:c6:f6:66 brd ff:ff:ff:ff:ff:ff
4: usb0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 1000
link/ether 02:21:5e:ca:f2:4f brd ff:ff:ff:ff:ff:ff
5: sit0: <NOARP> mtu 1480 qdisc noop
link/sit 0.0.0.0 brd 0.0.0.0


从inet 172.30.254.15/16 brd 172.30.255.255 scope global eth0和inet 172.30.254.220/32 brd 172.30.254.220 scope global eth0:1可以看到VIP172.30.254.15和172.30.254.220已经生效。备LVS的启动方法同主LVS的是一样的,但是启动备的LVS以后,VIP是不会生效的。只有在主的LVS挂掉以后,备的LVS才会生效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息