首页 > 代码库 > linux负载均衡软件LVS-使用LVS+keepalived

linux负载均衡软件LVS-使用LVS+keepalived

5.安装配置keepalived

Keepalived 是运行在 lvs 之上,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败切换 FailOver.lvs 结合 keepalived,就实现了 3 层、4 层、5/7 层交换的功能。下面进行LVS第二种用法,LVS+keepalived。其中ipvsadm的安装及验证同本文第4.2章节(这种方式不需要配置Director Server),Real Server的配置及验证同本文第4.4章节

*所有Director Server需要安装keepalived(已经安装了ipvsadm的主机)

5.1 准备工作

地址规划:与第一种方式类似。

服务器名

IP地址

网关

虚拟设备名

虚拟IP

Director Server:主

192.168.98.75

192.168.98.1

eth0

192.168.98.77

Director Server:备

192.168.98.118

192.168.98.1

eth0

192.168.98.77

Real Server 1

192.168.98.74

192.168.98.1

lo:0

192.168.98.77

Real Server 2

192.168.98.117

192.168.98.1

lo:0

192.168.98.77

Real Server n

..

..

5.2 安装keepalived

1. 解压keepalived-1.1.17.tar.gz软件包:

[root@localhost ~]# tar zxvf keepalived-1.1.17.tar.gz

2. 切换目录:

[root@localhost ~]# cd keepalived-1.1.17

3. 配置configure

[root@localhost ~]# ./configure –prefix=/usr/local/keepalived

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

4. 编译安装

[root@localhost ~]# make

[root@localhost ~]# make install

5.2.1 安装keepalived验证

Keepalived 安装完成后,会在安装目录/usr/local/keepalived 生成 bin,etc,sbin,share 这 4 个目录。其中 etc 为配置文件所在的目录,进入这个目录,看看里面都有些什么?

[root@ localhost ~]# cd /usr/local/keepalived/etc/

[root@ localhost etc]# ll

total 24

drwxr-xr-x 3 root root 4096 May 30 15:24 keepalived

drwxr-xr-x 3 root root 4096 May 30 15:24 rc.d

drwxr-xr-x 2 root root 4096 May 30 15:24 sysconfig

还有子目录,这里着重关注一下 keepalived 目录,它的下面包含一个完整的配置文件keepalived.conf(实际上是一个样例)以及一些单独的配置样例文件。

[root@ localhost etc]# cd keepalived/

[root@ localhost keepalived]# ll

total 16

-rw-r--r-- 1 root root 3562 May 30 15:24 keepalived.conf

drwxr-xr-x 2 root root 4096 May 30 15:24 samples

[root@ localhost keepalived]# tree -l

.

|-- keepalived.conf

`-- samples

|-- client.pem

|-- dh1024.pem

|-- keepalived.conf.HTTP_GET.port

|-- keepalived.conf.SMTP_CHECK

|-- keepalived.conf.SSL_GET

|-- keepalived.conf.fwmark

|-- keepalived.conf.inhibit

|-- keepalived.conf.misc_check

|-- keepalived.conf.misc_check_arg

|-- keepalived.conf.quorum

|-- keepalived.conf.sample

|-- keepalived.conf.status_code

|-- keepalived.conf.track_interface

|-- keepalived.conf.virtual_server_group

|-- keepalived.conf.virtualhost

|-- keepalived.conf.vrrp

|-- keepalived.conf.vrrp.localcheck

|-- keepalived.conf.vrrp.lvs_syncd

|-- keepalived.conf.vrrp.routes

|-- keepalived.conf.vrrp.scripts

|-- keepalived.conf.vrrp.static_ipaddress

|-- keepalived.conf.vrrp.sync

|-- root.pem

`-- sample.misccheck.smbcheck.sh

1 directory, 25 files

5.3 配置keepalived

5.3.1 开启路由转发功能

首先开启路由转发功能:

[root@ localhost ~]#echo "1">/proc/sys/net/ipv4/ip_forward

5.3.2 keepalived.conf配置

主服务器的配置文件:

/usr/local/keepalive/etc/keepalived/keepalived.conf

#global define

global_defs {

router_id LVS_TEST_1 #本服务器的名称,备份组内唯一

}

############################################

# vvrp_instance define #

############################################

vrrp_instance DR_CACHE { #VRRP热备实例名

state MASTER #热备状态,MASTER(主);BACKUP(备份)

interface eth0 #承载VIP地址的物理接口

lvs_sync_daemon_inteface eth0 #负载均衡器之间的监控接口(DR模式中同interface)

virtual_router_id 51 #虚拟路由器的ID号,组内保存一致

priority 180 #优先级,数值越大优先级越高,MASTER应该高于BACKUP

advert_int 5 #主备之间的通告间隔秒数(心跳频率)

authentication { #认证信息,每个热备组保持一致

auth_type PASS #认证类型,主备切换时的验证

auth_pass 123 #密码字串

}

virtual_ipaddress { #指定虚拟地址(VIP),可以有多个

192.168.98.77

}

}

#############################################

# virtual machine setting #

#############################################

# setting port 2200 forward

virtual_server 192.168.98.77 2200 { #虚拟服务器地址(VIP)、端口,中间用空格隔开

delay_loop 6 #健康检查的间隔时间(秒)

lb_algo wlc #lvs 调度算法,这里使用加权最少链接

lb_kind DR #lvs 负载均衡机制,这里使用直连路由

persistence_timeout 20 #同一IP连接20秒内被分配到同一台服务器(会话保持时间)

protocol TCP #用 TCP 协议检查 realserver 状态

real_server 192.168.98.74 2200 { #第一个real server节点的地址、端口

weight 100 #权重

TCP_CHECK { #健康检查方式

connect_timeout 3 #故障重试秒数(即连接超时)

nb_get_retry 3 #重试延迟(即重试次数)

delay_before_retry 3 #重试间隔(秒)

connect_port 2200 #检查的目标端口

}

}

real_server 192.168.98.117 2200 {

weight 100

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 2200

}

}

}

备用服务器配置文件:

/usr/local/keepalive/etc/keepalived/keepalived.conf

#global define

global_defs {

router_id LVS_TEST_2

}

################################################################

# vvrp_instance define #

################################################################

vrrp_instance DR_CACHE {

state BACKUP

interface eth0

lvs_sync_daemon_inteface eth0

virtual_router_id 51

priority 150

advert_int 5

authentication {

auth_type PASS

auth_pass 123

}

virtual_ipaddress {

192.168.98.77

}

}

##############################################################

# virtual machine setting #

##############################################################

# setting port 2200 forward

virtual_server 192.168.98.77 2200 {

delay_loop 6

lb_algo wlc

lb_kind DR

persistence_timeout 20

protocol TCP

real_server 192.168.98.74 2200 {

weight 100

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 2200

}

}

real_server 192.168.98.117 2200 {

weight 100

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 2200

}

}

}

主负载均衡器(MASTER) 与备份负载均衡器(BACKUP)配置文件的差异一共只有 3 处: 全局定义的 route_id、vrrp_instance的state 以及vrrp_instance 的优先级 priority。

5.3.3 将keepalived配置成系统服务

[root@localhost ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

[root@localhost ~]# cp /usr/local/keepalived /etc/sysconfig/keepalived /etc/sysconfig/

[root@localhost ~]# mkdir /etc/keepalived/

[root@localhost ~]# cp /usr/local/keepalived /etc/keepalived/keepalived.conf /etc/keepalived/

[root@localhost ~]# cp /usr/local/keepalived /sbin/keepalived /usr/sbin/

[root@localhost ~]# service keepalived start | stop

启动或者停止keepalived服务。

通过以下命令将keepalived配置成随系统启动的服务(两个运行级别)

[root@localhost ~]# ln -s /etc/init.d/keepalived /etc/rc.d/rc3.d/S98keepalived

[root@localhost ~]# ln -s /etc/init.d/keepalived /etc/rc.d/rc5.d/S98keepalived

5.3.4 配置验证

启动服务后,使用以下命令,在主备服务器上查看ip地址情况

[root@ localhost ~]# ip addr

可以看到主服务器的eth0网卡多了个ip,就是我们刚才配置的虚拟ip,而备用服务器上的还没有,因为他是备用的嘛。

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

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

link/ether 00:50:56:91:43:e4 brd ff:ff:ff:ff:ff:ff

inet 192.168.98.75/24 brd 192.168.98.255 scope global eth0

inet 192.168.98.77/32 scope global eth0

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:50:56:91:14:81 brd ff:ff:ff:ff:ff:ff

inet 192.168.98.118/24 brd 192.168.98.255 scope global eth0

inet6 fe80::250:56ff:fe91:1481/64 scope link

在主服务器上执行命令

[root@ localhost ~]# service keepalived stop

再次查看ip地址情况。就可以看到主服务器上的虚拟ip没了,而备用服务器上多个了虚拟ip。

然后访问192.168.98.77的2200端口(可以telnet),

然后使用以下命令查看

[root@ localhost ~]# ipvsadm

查看tcp连接情况。

[root@localhosst etc]# ipvsadm

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.98.77:2200 wlc persistent 20

-> 192.168.98.117: 2200 Route 100 0 6

-> 192.168.98.74: 2200 Route 100 0 0

[root@ localhost ~]# ipvsadm –lcn

查看测试机的请求被转发到哪个服务器。

[root@localhost etc]# ipvsadm -lcn

IPVS connection entries

pro expire state source virtual destination

TCP 14:16 ESTABLISHED 192.168.10.176:53564 192.168.98.77:2200 192.168.98.117:2200

TCP 14:16 ESTABLISHED 192.168.10.176:53563 192.168.98.77:2200 192.168.98.117:2200

TCP 00:36 NONE 192.168.10.176:0 192.168.98.77:2200 192.168.98.117:2200

TCP 14:16 ESTABLISHED 192.168.10.176:53562 192.168.98.77:2200 192.168.98.117:2200

TCP 14:16 ESTABLISHED 192.168.10.176:53559 192.168.98.77:2200 192.168.98.117:2200

TCP 14:16 ESTABLISHED 192.168.10.176:53561 192.168.98.77:2200 192.168.98.117:2200

TCP 14:16 ESTABLISHED 192.168.10.176:53560 192.168.98.77:2200 192.168.98.117:2200

[root@ localhost ~]# ipvsadm –lcn|grep 192.168.98.117

查看某真实服务器被转方法情况

[root@netscan etc]# ipvsadm -lcn |grep 192.168.98.117

TCP 14:56 ESTABLISHED 192.168.10.176:53564 192.168.98.77:2200 192.168.98.117:2200

TCP 14:56 ESTABLISHED 192.168.10.176:53563 192.168.98.77:2200 192.168.98.117:2200 TCP 00:16 NONE 192.168.10.176:0 192.168.98.77:2200 192.168.98.117:2200

TCP 14:56 ESTABLISHED 192.168.10.176:53562 192.168.98.77:2200 192.168.98.117:2200

TCP 14:56 ESTABLISHED 192.168.10.176:53559 192.168.98.77:2200 192.168.98.117:2200

TCP 14:56 ESTABLISHED 192.168.10.176:53561 192.168.98.77:2200 192.168.98.117:2200

TCP 14:56 ESTABLISHED 192.168.10.176:53560 192.168.98.77:2200 192.168.98.117:2200

6 附录:配置说明

6.1 主机规划说明

本例规划中使用了4台主机,其实Director Server和Real Server可以是同一台主机。做法中需要注意的是,Director Server:主作为其中之一的Real Server时不必要做Real Server配置,即不需要执行lvsRS*.sh。

6.2 Real server 配置说明

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

2、 vip 被绑定在环回接口 lo0:0 上,其广播地址是其本身,子网掩码是 255.255.255.255。这与标准的网络地址设置有很大的不同。采用这种可变长掩码方式把网段划分成只含一个主机地址的目的是避免 ip 地址冲突。

3、 echo “1”,echo “2” 这段的作用是抑制 arp 广播。如果不做 arp 抑制,将会有众多的机器向其他发arp包宣称自己是真的,这样就乱套了。

6.3 Keepalived.conf 配置说明

说明:一个功能比较完整的 keepalived 的配置文件,其配置文件 keepalived.conf 可以包含三个文本块:全局定义块、 VRRP 实例定义块及虚拟服务器定义块。全局定义块和虚拟服务器定义块是必须的,如果在只有一个负载均衡器的场合,就不须 VRRP 实例定义块。主服务器和备用服务器上安装ipvsadm和keepalived的方法都一样,主要的差别在于配置文件keepalived.conf上。

● 全局定义块

global_defs {

notification_email {

test@sina.com    #故障接受联系人

}

notification_email_from admin@test.com  #故障发送人

smtp_server 127.0.0.1  #本机发送邮件

smtp_connect_timeout 30

router_id LVS_MASTER  #BACKUP上修改为LVS_BACKUP

}

可以添加通过邮件通知故障,本例中没有配置

1、 email 通知。作用:有故障,发邮件报警。这是可选项目,建议不用,用 nagios 全面监控代替之。

2、 花括号“{}”。用来分隔定义块,因此必须成对出现。如果写漏了,keepalived 运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这点要特别注意。

● VRRP 定义块

1、 同步 vrrp 组 vrrp_sync_group。作用:确定失败切换(FailOver)包含的路由实例个数。即在有 2 个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪些?

2、 实例组 group.至少包含一个 vrrp 实例。

3、 vrrp 实例 vrrp_instance.实例名出自实例组 group 所包含的那些名字。

(1) 实例状态 state.只有 MASTER 和 BACKUP 两种状态,并且需要大写这些单词。其中MASTER 为工作状态,BACKUP 为备用状态。当 MASTER 所在的服务器失效时,BACKUP 所在的系统会自动把它的状态有 BACKUP 变换成 MASTER;当失效的MASTER 所在的系统恢复时,BACKUP 从 MASTER 恢复到 BACKUP 状态。

(2) 通信接口 interface。对外提供服务的网络接口,如 eth0,eth1.当前主流的服务器都有2 个或 2 个以上的接口,在选择服务接口时,一定要核实清楚。

(3) lvs_sync_daemon_inteface。负载均衡器之间的监控接口。在 DR 模式中,lvs_sync_daemon_inteface 与服务接口 interface 使用同一个网络接口。

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

(5) 优先级 priority.这是一个数字,数值愈大,优先级越高。在同一个 vrrp_instance里,MASTER 的优先级高于 BACKUP。若 MASTER 的 priority 值为 150,那么 BACKUP的 priority 只能是 140 或更小的数值。

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

(7) 验证 authentication。包含验证类型和验证密码。类型主要有 PASS、AH 两种,通常使用的类型为 PASS,据说 AH 使用时有问题。验证密码为明文,同一 vrrp 实例MASTER 与 BACKUP 使用相同的密码才能正常通信。

4、 虚拟 ip 地址 virtual_ipaddress . 可以有多个地址,每个地址占一行,不需要指定子网掩码。注意:这个 ip 必须与我们在 lvs 客户端(real server)设定的 vip 相一致!

● 虚拟服务器 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 两种。

2、 真实服务器 real_server.也即服务器池。 Real_server 的值包括 ip 地址和端口号。

(1) 权重 weight.权重值是一个数字,数值越大,权重越高。使用不同的权重值的目的在于为不同性能的机器分配不同的负载,性能较好的机器,负载分担大些;反之,性能差的机器,则分担较少的负载,这样就可以合理的利用不同性能的机器资源。

(2) Tcp 检查 tcp_check。

参考资料:

http://www.keepalived.org/pdf/sery-lvs-cluster.pdf

http://www.cnblogs.com/mchina/archive/2012/08/27/2644391.html

http://blog.51cto.com/tag-lvs%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE.html

http://www.keepalived.org/documentation.html

linux负载均衡软件LVS-使用LVS+keepalived