正在浏览 LVS 里的文章

简述:利用(LVS+Piranha)基于完整开源软件的架构可以提供一个简单的负载均衡及高可用的服务架构。LVS 集群采用 IP 负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率(在DR模式下),将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故 障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。

生产环境中使用效果图:

环境:CentOS 5.5  x64

lb01:  192.168.0.111
lb02:  192.168.0.112
VIP:   192.168.0.115
web01: 192.168.0.114
web02: 192.168.0.115

安装piranha:

yum -y install piranha ipvsadm

#通过piranha-passwd设置Piranha的管理员密码

piranha-passwd  

#启动piranha的WEB管理界面(可选)

/etc/init.d/piranha-gui start  

通过浏览器访问http://192.168.0.111:3636,单击"Login",使用用户名piranha及刚刚设定的密码进行登录

注:在此界面下可以图形化配置,也可不启用此WEB界面,直接编辑配置文件来配置

vi /etc/sysconfig/ha/lvs.cf

继续阅读

所需软件:

ipvsadm-1.24-10.x86_64.rpm
heartbeat-2.1.3-3.el5.centos.x86_64.rpm
heartbeat-pils-2.1.3-3.el5.centos.x86_64.rpm
heartbeat-stonith-2.1.3-3.el5.centos.x86_64.rpm
PyXML-0.8.4-4.x86_64.rpm

系统环境:
CentOS 5.4 64-bit

HA1                    10.0.0.108
HA1                    10.0.0.109
web1                   10.0.0.110
web2                   10.0.0.111
VIP                    10.0.0.100

ipvsadm-1.24安装

rpm -ivh ipvsadm-1.24-10.x86_64.rpm
/sbin/ipvsadm

heartbeat 安装

rpm -ivh heartbeat-pils-2.1.3-3.el5.centos.x86_64.rpm
rpm -ivh heartbeat-stonith-2.1.3-3.el5.centos.x86_64.rpm
rpm -ivh PyXML-0.8.4-4.x86_64.rpm
rpm -ivh heartbeat-2.1.3-3.el5.centos.x86_64.rpm

注:若heartbeat一次未安装好,再装一次

rpm -q heartbeat -d              //查看安装路径

echo "service heartbeat start" >> /etc/rc.local


配置heartbeat 继续阅读

LVS的监控

已有 2 条评论

一、利用ipvsadm命令

通常情况下lvs的运行情况以及资源使用情况是无法使用top或vmstat命令时来查看的。对于LVS-DR结构的LVS来说,其只会转发网络包。几乎不会耗费CPU资源,这时我们查看系统负载应该为0.00。

通过使用ipvsadm命令可以查看当前LVS的运行情况,如下:

[root@LVS-Master]# ipvsadm
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP localhost:https wlc persistent 50
-> localhost:https Route 1 0 0
-> localhost:https Route 1 0 0
TCP localhost:http wlc persistent 50
-> localhost:http Route 1 0 0
-> localhost:http Route 3 0 0

当有新连接过来时,其相关的计数就会增加。

查看连接数/进入包(字节)/输出包(字节):

命令:ipvsadm -Ln --stats -t |u|f service-address
-t, --tcp-service
-u, --udp-service
-f, --fwmark-service
-L, -l, --list List the virtual server table if no argument is specified.
-n, --numeric Numeric output.
--stats Output of statistics information.

示例:

[root@experiment ~]# ipvsadm -Ln --stats -t 192.168.108.180:80
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 192.168.108.180:80 5771754 101697K 0 5338M 0
-> 192.168.108.162:80 454297 13736280 0 761572K 0
-> 192.168.108.161:80 5317457 87961304 0 4576M 0

另外通过查看cat /proc/net/ip_vs_stats 也可以查看lvs信息,只不过这里的输出时16进制的。

[root@LVS-Master] # cat /proc/net/ip_vs_stats
Total Incoming Outgoing         Incoming         Outgoing
Conns  Packets  Packets            Bytes            Bytes
594BFC  6335751        0        145F90EC1                0

Conns/s   Pkts/s   Pkts/s          Bytes/s          Bytes/s
0              0             0                     0                     0

二、利用第三方软件以图形的形式查看LVS信息

网上查找了很多资料,只找到了2种比较简单的方法来实现LVS的图形化监控;
1、利用net-snmp-lvs-module 给net-snmp加个模块,然后配合cacti的相关模板来实现监控。由于针对64位系统的net-snmp-lvs-module只支持到rhel4因此放弃使用。

相关网址:net-snmp-lvs-module-0.0.4.tar.gz

2、利用lvs_rrd工具来生成图形
lvs_rrd 工具实现了网页的形式来查看lvs状态图功能。其主要有两个脚本组成:信息收集脚本和图像绘制脚本。信息收集脚本是将lvs的信息生成rrd格式的数据文件,然后利用图像绘制脚本生成图像,并生成一个php页面,这个页面中引用其所生成的图像,这样我们可以通过web页面的形式查看生成的php页面,就可以时时的查看lvs的状态信息了。

lvs_rrd部署
lvs_rrd需要部署在LVS-Master和LVS-Backup上,更准确的说lvs_rrd中的信息收集脚本一定要在LVS director 上运行。通过配置图像生成脚本和图像的生成目录,我们可以将他们时时的复制到其他的服务器中。这里为了方便起见我将它们部署到了LVS director上。

下面简单的介绍部署的步骤

(1).开启LVS director 的apache,配置相关参数,注意端口一定不能为80,我这里修改为9160。指定DocumentRoot 为 "/data/web"
(2).下载lvs_rrd软件。下载地址:lvs-rrd-v0.7.tar.gz
(3).将lvs-rrd-v0.7.tar.gz解压后将文件夹复制到/data/web/目录下并更名为lvs
(4).配置lvs.rrd.update文件
RRDTOOL="/usr/bin/rrdtool"
IPVSADM="/sbin/ipvsadm"
WORKDIR="/data/web/lvs"

配置graph-lvs.sh
WORKDIR="/data/web/lvs"
RRDTOOL="/usr/bin/rrdtool"
GRAPHS="$WORKDIR/graphs"
WEBPATH="/lvs/graphs"

这两个文件根据自己的情况设置一下就可以了。

(5). 将/data/web/lvs/graphs目录修改为apache可读可写。
# chown apache.apache /data/web/lvs/graphs -R
(6).将收集信息的脚本添加到计划任务中
# crontab -e
* * * * * /data/web/lvs/lvs.rrd.update 2> /dev/null > /dev/null

(7).等1分钟后,看lvs目录中是否生成了以rrd为扩展名的文件。如果有的话就可以启动apache通过http://ipaddress:9160/lvs/查看lvs的状态了。如下图:

上面的三张图是lvs_rrd官方给的,由于我搭建的是lvs的测试环境,没有实际使用那么多连接,生成的图像也不是很好看,在这里就贴一张吧:

原创文章,转载请注明: 转自 http://salogs.com

试验环境
192.168.108.108    Master-LVS-Director
192.168.108.109    Backup-LVS-Director
192.168.108.180     VIP
192.168.108.161    RealServer1
192.168.108.162    RealServer2

拓扑图
LVS-DR

安装ipvsadm
# yum install -y ipvsadm

安装keepalived

确认当前运行的内核
# name -r
2.6.18-128.4.1.el5xen
# ls -1 /usr/src/kernels
2.6.18-128.4.1.el5-x86_64
2.6.18-128.el5-x86_64

# wget http://www.keepalived.org/software/keepalived-1.1.17.tar.gz
# tar -xvzf keepalived-1.1.17.tar.gz
# cd keepalived-1.1.17
# ./configure --sysconfdir=/etc/ --sbindir=/usr/sbin/ --with-kernel-dir=/usr/src/kernels/2.6.18-128.4.1.el5-x86_64
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

# make && make install

配置keepalived 
# vi /etc/keepalived/keepalived.conf
下载 keepalived.conf

! Configuration File for keepalived

# 全局定义
global_defs {
notification_email {
13810955300@139.com
}
notification_email_from root@experiment.jobkoo.com

#smtp主机地址
smtp_server 127.0.0.1
smtp_connect_timeout 30

#运行Keepalived服务器的一个标识。发邮件时显示在邮件标题中的信息
router_id LVS_MASTER
}

#VIP
vrrp_instance VI_1 {

#指定实例的初始状态(角色)。在两台router都启动时马上会根据priority的高低开始竞选
#高priority为Master
state MASTER

#VT_1 实例绑定的网卡
interface eth0

#VRID 标记(0-255)
virtual_router_id 51

#优先级,BACKUP的值一定要低于MASTER
priority 100

#检查间隔
advert_int 1

#设置认证
authentication {
#认证类型
auth_type PASS
#认证密码
auth_pass 1111
}

#VIP 这个IP在发生MASTER 到 BACKUP切换时会随之add或del,所以每台服务器上可以不绑定
#虚拟地址,而都放入virtual_ipaddress块中(可以多个),keepalived会自动使用ip地址进
#行绑定(不需要依赖ifcfg-eth0),利用ip add show eth0可以看到加入的VIP
virtual_ipaddress {
192.168.108.180
}
}

#定义virtual_server (HTTP | 80)
virtual_server 192.168.108.180 80 {
delay_loop 6            # service polling的delay时间
lb_algo wlc             # 调度算法
lb_kind DR              # LVS工作方式
persistence_timeout 50  # 会话保持时间
protocol TCP            # 协议类型(TCP|UDP)

#定义rs1,每一个rs都需要下面的一个配置段
real_server 192.168.108.161 80 {
weight 1            # 权值 默认1,0为失效
# inhibit_on_failure    # 在服务器健康检查失败后不从IPVS中删除而将其权值标记为0

# TCP方式的健康检查
TCP_CHECK {
connect_timeout 10      # 连接超时时间
nb_get_retry 3          # 重试次数
delay_before_retry 3    # 重试间隔
connect_port 80         # 健康检查端口
}
}

# 定义rs2
real_server 192.168.108.162 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}

# 定义virtual_server (HTTPS | 443)
virtual_server 192.168.108.180 443 {
delay_loop 6
lb_algo wlc
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP

real_server 192.168.108.161 443 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 443
}
}

real_server 192.168.108.162 443 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 443
}
}
}

配置RS
为了方便起见我自己编写了一个启动脚本,如下:
下载 lvsRealServer.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/bin/bash
#Description : RealServer Start!
#Write by:Cooper
#Last Modefiy:2009.08.21
 
VIP=192.168.108.180
LVS_TYPE=DR
 
startrs()
{
echo "start LVS of REALServer"
 
if [ "$LVS_TYPE" == "DR" ];then
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
else
/sbin/ifconfig tunl0 $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev tunl0
fi
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
}
 
stoprs()
{
if [ "$LVS_TYPE" == "DR" ];then
/sbin/ifconfig lo:0 down
echo "close LVS Directorserver"
else
/sbin/ifconfig tunl0 down
echo "close LVS Tunnel server"
fi
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
}
 
# ============ Main ===========
 
case $1 in
"start")
startrs;;
"stop")
stoprs;;
"*")
echo "Usage $0 {start|stop}"
exit 1
esac

该脚本默认启动LVS/DR模式,通过修改脚本变量可以实现LVS/Tunnel模式的切换。

运行脚本进行RS设置后执行相关的服务

[root@rs-1]# sh lvsRealServer.sh
[root@rs-1]# service httpd restart
rs-2执行相同的操作

Master/Backup LVS启动keepalived 服务

[root@Master-LVS]# service keepalived start
Backup-LVS 同样执行如上命令启动keepalived

查看Master-LVS上eth0接口在启动keepalived前后变化

启动keepalived之前
# ip add show eth0
6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
link/ether 00:1d:7d:3d:1c:63 brd ff:ff:ff:ff:ff:ff
inet 192.168.108.108/24 brd 192.168.108.255 scope global eth0
inet6 fe80::21d:7dff:fe3d:1c63/64 scope link
valid_lft forever preferred_lft forever

启动之后
# ip add show eth0
6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
link/ether 00:1d:7d:3d:1c:63 brd ff:ff:ff:ff:ff:ff
inet 192.168.108.108/24 brd 192.168.108.255 scope global eth0
inet 192.168.108.180/32 scope global eth0
inet6 fe80::21d:7dff:fe3d:1c63/64 scope link
valid_lft forever preferred_lft forever

查看LVS运行情况

[root@Master-LVS]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.108.180:443 wlc persistent 50
-> 192.168.108.161:443          Route   1      0          0
-> 192.168.108.162:443          Route   1      0          0
TCP  192.168.108.180:80 wlc persistent 50
-> 192.168.108.161:80           Route   1      0          0
-> 192.168.108.162:80           Route   1      0          0

故障测试

RS故障

切换到其中的一台rs上,如192.168.108.161
# service httpd stop

这时查看Master/Backup LVS上的的日志输出
[root@Master-LVS]# tail -f /var/log/message

1
2
3
4
5
6
7
Sep  3 11:08:01 experiment Keepalived_healthcheckers: TCP connection to [192.168.108.161:80] failed !!!
Sep  3 11:08:01 experiment Keepalived_healthcheckers: Removing service [192.168.108.161:80] from VS [192.168.108.180:80]
Sep  3 11:08:01 experiment Keepalived_healthcheckers: Remote SMTP server [127.0.0.1:25] connected.
Sep  3 11:08:01 experiment Keepalived_healthcheckers: TCP connection to [192.168.108.161:443] failed !!!
Sep  3 11:08:01 experiment Keepalived_healthcheckers: Removing service [192.168.108.161:443] from VS [192.168.108.180:443]
Sep  3 11:08:01 experiment Keepalived_healthcheckers: Remote SMTP server [127.0.0.1:25] connected.
Sep  3 11:08:01 experiment Keepalived_healthcheckers: SMTP alert successfully sent.

[root@Backup-LVS]# tail -f /var/log/message

1
2
3
4
5
6
7
Sep  3 11:08:02 localhost Keepalived_healthcheckers: TCP connection to [192.168.108.161:443] failed !!!
Sep  3 11:08:02 localhost Keepalived_healthcheckers: Removing service [192.168.108.161:443] from VS [192.168.108.180:443]
Sep  3 11:08:02 localhost Keepalived_healthcheckers: Remote SMTP server [127.0.0.1:25] connected.
Sep  3 11:08:02 localhost Keepalived_healthcheckers: TCP connection to [192.168.108.161:80] failed !!!
Sep  3 11:08:02 localhost Keepalived_healthcheckers: Removing service [192.168.108.161:80] from VS [192.168.108.180:80]
Sep  3 11:08:02 localhost Keepalived_healthcheckers: Remote SMTP server [127.0.0.1:25] connected.
Sep  3 11:08:03 localhost Keepalived_healthcheckers: SMTP alert successfully sent.

通过日志可以看出Master与Backup几乎同时感知了RS1服务器已经故障,并且从IPVS中移除故障rs(或者将其权值标记为0也就是不可用)。并且向指定的邮箱发送邮件,Master和Backup都会发送邮件,其邮件标题会根据router_id的值区分出Master和Backup

Master LVS-Router故障

停止Master-LVS的keepalived服务,人为造成故障
[root@Master-LVS]# service keepalived stop

这时查看Backup-LVS的log信息
[root@Backup-LVS]# tail -f /var/log/message

1
2
3
4
5
6
7
Sep  3 11:23:28 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Sep  3 11:23:29 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Sep  3 11:23:29 localhost Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs.
Sep  3 11:23:29 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.108.180
Sep  3 11:23:29 localhost Keepalived_vrrp: Netlink reflector reports IP 192.168.108.180 added
Sep  3 11:23:29 localhost Keepalived_healthcheckers: Netlink reflector reports IP 192.168.108.180 added
Sep  3 11:23:34 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.108.180

由日志可以看出,Backup-LVS监测到Master-LVS故障后立即将自己的身份切换为Master然后将VIP设置到自己的eth0端口上并发送ARP广播。

现在我手动将Master-LVS的keepalived的服务起来,然后再查看Backup-LVS的log信息
[root@Master-LVS]# service keepalived start

[root@Backup-LVS]# tail -f /var/log/message

1
2
3
4
5
Sep  3 11:30:44 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Received higher prio advert
Sep  3 11:30:44 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering BACKUP STATE
Sep  3 11:30:44 localhost Keepalived_vrrp: VRRP_Instance(VI_1) removing protocol VIPs.
Sep  3 11:30:44 localhost Keepalived_vrrp: Netlink reflector reports IP 192.168.108.180 removed
Sep  3 11:30:44 localhost Keepalived_healthcheckers: Netlink reflector reports IP 192.168.108.180 removed

由Backup-LVS的日志可以看到,其检测到比自己优先级高的实例后将自己的身份切换成了Backup,然后将VIP从eth0端口移除,并发送心跳给Master-LVS。

piranha与keepalived比较

经过比较得知,piranha的主-备的地位是相同的,也就是说主故障后备就会代替主,经其地位从备切换为主,而当先前的主恢复正常后则先前的主便成了备,其不会主动切换自己的身份为主,当前的备可以检测到先前的主已经恢复但并不会主动将自己的身份修改为备。

而keepalived则是主备分明的,其利用优先级的设置可以严格的制定主备身份。

参考文章

LVS-HOWTO
http://www.keepalived.org/documentation.html
http://bbs.linuxtone.org/thread-1077-1-1.html

资源下载
Keepalived-UserGuide    CN EN

本文doc文档下载

原创文章,转载请注明: 转自 http://salogs.com

一、背景知识

1、LVS架构的基本分类

(1)Virtual Server via Network Address Translation(VS/NAT)

通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端真实服务器;真实服务器的响应报文通过调度器时,报文源地址被重写再返回给客户,完成整个负载调度过程。

在Red Hat的官方网站上对采用LVS的基本结构和较为复杂与HA集群配合的三层结构其实都是利用NAT这种方式。这种情况的配置比较简单,但通常在流量比较大的情况下会造成调度器的瓶颈。因为服务数据的返回必须通过调度器出去。详情见下图:


同时在下面的链接有对基于NAT结构的LVS的官方说明:

http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5.2/html/Virtual_Server_Administration/s2-lvs-nat-VSA.html

(2)Virtual Server via Direct Routing(VS/DR)

VS/DR通过改写请求报文的MAC地址,将请求发送到真实服务器,而真实服务器将响应直接返回给客户。同VS/TUN技术一样,VS/DR技术可极大地提高集群系统的伸缩性这种方法没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器与真实服务器都有一块网卡连在同一物理网段上。也就是说,在这种结构中,数据从外部到内部真实服务器的访问会通过调度器进来,但是真实服务器对其的应答不是通过调度器出去。即在大多数情况下,真实服务器可以通过各自的网关或者专用的网关对数据进行外发,从而降低调度器负载。详情见下图:


同时在下面的链接有对基于DR结构的LVS的官方说明:

http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5.2/html/Virtual_Server_Administration/s2-lvs-directrouting-VSA.html

(3)Virtual Server via IP Tunneling(VS/TUN)

采用NAT技术时,由于请求和响应报文都必须经过调度器地址重写,当客户请求越来越多时,调度器的处理能力将成为瓶颈。为了解决这个问题,调度器把请求报文通过IP隧道转发至真实服务器,而真实服务器将响应直接返回给客户,所以调度器只处理请求报文。由于一般网络服务应答比请求报文大许多,采用VS/TUN技术后,集群系统的最大吞吐量可以提高10倍。

但事实上使用Tunnel技术实现LVS的做法,根据我们在工作环境中Debug LVS的经验,实际上是三种结构中配置最复杂、排错最困难且同时也是性能最低的一种。之所以有生存空间,从个人角度理解实际上是因为在一些特殊的网络环境中客户有特殊的要求。否则大多数情况下也都是使用基于NAT或者DR的方式来实现LVS

2、Linux Virtual Server工作原理与核心组件:

LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。

为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。一般来说,LVS集群采用三层结构,三层主要组成部分为:

负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。

服务器池(server pool),是一组真正执行客户请求的服务器,服务有WEB、MAIL、FTP和DNS等。

共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。

调度器是服务器集群系统的唯一入口点(Single Entry Point),它可以采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。在IP负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。当客户请求到达时,调度器只根据服务器负载情况和设定的调度算法从服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度;当这个请求的其他报文到达,也会被转发到前面选出的服务器。在基于内容请求分发技术中,服务器可以提供不同的服务,当客户请求到达时,调度器可根据请求的内容选择服务器执行请求。因为所有的操作都是在Linux操作系统核心空间中将完成的,它的调度开销很小,所以它具有很高的吞吐率。

服务器池的结点数目是可变的。当整个系统收到的负载超过目前所有结点的处理能力时,可以在服务器池中增加服务器来满足不断增长的请求负载。对大多数网络服务来说,请求间不存在很强的相关性,请求可在不同的结点上并行执行,所以整个系统的性能基本上可随着服务器池的结点数目增加而线性增长。

共享存储通常是数据库、网络文件系统或者分布式文件系统。负载调度器、服务器池和共享存储系统通过高速网络相连接,如100Mbps交换网络、Myrinet和Gigabit网络等。使用高速的网络,主要为避免当系统规模扩大时互联网络成为整个系统的瓶颈。在具体实施过程中,在红帽企业版Linux上对LVS集群的定义和配置提供了更加详细的方案。

另外在红帽的LVS中还有一个比较关键的东西是LVS的组件:

LVS的组件中服务包括pulse,lvs,ipvsadm以及nany;另外还包括配置文件/etc/sysconfig/ha/lvs.cf,配置工具piranha configuration tooly以及服务IP进行浮动之前arp欺骗手段中的send_arp。

pulse是LVS的控制进程,该进程用于启动和控制所有的其他LVS相关的守护进程。该进程的配置文件是/etc/sysconfig/ha/lvs.cf。在主router上pulse用于启动LVS守护进程,在备份router上pulse通过定期收发心跳信号监控主router的状态。如果一旦主router失效,在备份router上的pulse进程将关闭所有主router上的LVS服务,并且开启send_arp程序来重新指派浮动IP到备份router的MAC上。

lvs进程运行在主router上,主要读取/etc/sysconfig/ha/lvs.cf文件,调用lvsadm工具来建立与维护ipvs路由表并对每一个LVS服务指派nanny进程。如果nanny报告一个真实服务器失效,lvs进程将调用ipvsadm工具将失效真实服务器从IPVS路由表中删除。

ipvsadm用于升级kernel中的IPVS路由表,该进程主要用于更改、添加、删除IPVS路由表的条目。nanny监控的进程运行在主LVS Router上,主LVS Router会通过他来监控每一个真实服务器的状况。另外piranha configuration tool提供了一个图形接口用于修改/etc/sysconfig/ha/lvs.cf文件,而send_arp会在浮动IP向不同的LVS router进行切换时发送

arp广播。

二、Linux Virtual Server(LVS)的具体配置

1、VS/NAT架构


VS/NAT拓扑图

拓扑结构如上图所示:

我的全部操作系统使用RHEL5u3,用两台双网卡主机充当Primary和Backup LVS Router,这两台LVS Router将采用NAT方式来分发来自客户端请求到真实服务器上,然后应答由真实服务器沿原路返回LVS Router

首先配置网络参数:

在Primary LVS Router上的基本参数:

[root@primary-lvs ~]# ifconfig | grep inet
inet addr:192.168.1.10 Bcast:192.168.1.255 Mask:255.255.255.0

inet addr:10.0.0.10 Bcast:10.0.255.255 Mask:255.255.0.0

[root@ primary-lvs~]# sysctl -a | grep ip_forward

net.ipv4.ip_forward = 1

[root@ primary-lvs~]# sysctl –p

在Backup LVS Router上的基本参数:
[root@backup-lvs~]# ifconfig | grep inet

inet addr:192.168.1.20 Bcast:192.168.1.255 Mask:255.255.255.0

inet addr:10.0.0.20 Bcast:10.0.255.255 Mask:255.255.0.0

[root@ backup-lvs~]# sysctl -a | grep ip_forward

net.ipv4.ip_forward = 1

[root@ primary-lvs~]# sysctl –p

在Real Server上的基本参数:
第一台:

[root@rs-1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0

# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]

DEVICE=eth0

ONBOOT=yes

BOOTPROTO=static

HWADDR=00:0c:29:b2:60:a5

IPADDR=10.0.0.100

NETMASK=255.255.0.0

GATEWAY=10.0.0.254

第二台:

[root@rs-2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]

DEVICE=eth0

ONBOOT=yes

BOOTPROTO=static

HWADDR=00:0c:29:b2:60:a5

IPADDR=10.0.0.200

NETMASK=255.255.0.0

GATEWAY=10.0.0.254

在基本配置完成之后可以在Primary LVS Router上安装LVS所需要的软件包和启用图形化的LVS配置工具Piranha:
[root@primary-lvs~]# yum install -y ipvsadm

[root@primary-lvs~]# yum install -y piranha

完成之后为piranha-gui设置密码并启动服务:

[root@primary-lvs~]# /usr/sbin/piranha-passwd
New Password:

Verify:

Updating password for user piranha

[root@primary-lvs~]# service piranha-gui restart
Shutting down piranha-gui: [ OK ]

Starting piranha-gui: [ OK ]

[root@primary-lvs~]# chkconfig piranha-gui on
完成之后进入图形界面并在浏览器中输入:http://localhost:3636,输入用户名:piranha和刚才定义的密码,即可进入piranha configuration tool的配置界面:


具体的配置是:

在该界面中第一个要设置的地方是CONTROL/MONITORING,在该界面中将MONITOR中的选项:Auto update勾选上,Update Interval将自动定义为10s,在服务没有启动之前LVS

ROUTING TABLE和LVS PROCESS都不可见。完成之后选择Update information now。如下图:


Piranha cgi monitor配置

在该界面的第二个要设置的地方是GLOBAL SETTINGS,在该界面中:
Primary server public IP
:    192.168.1.10 (真实外部地址)

Primary server private IP
:  10.0.0.10 (真实内部地址)

Use network type
:                   NAT (LVS方式)

NAT Router IP
:                         10.0.0.254 (内部浮动IP)
NAT Router MASK
:     255.255.0.0 (内部浮动掩码)

NAT Router Device
:               eth1:1 (运行浮动IP的设备)

如下图:


LVS Global Setting

填写完成后点击"ACCEPT"按钮

REDUNDANCY 配置

在该界面的第三个要设置的地方REDUNDANCY添加冗余配置:

Redundant server public IP :    192.168.1.20 (Backup-LVS 外部地址)
Redundant server private IP
:    10.0.0.20 (Backup-LVS内部地址)
Heartbeat Interval(seconds)
:    2 (心跳间隔)

Assume dead after(seconds)
:    5 (3次心跳无响应则切换主从)
Heartbeat runs on port
:    539 (心跳端口)

Monitor NIC links for failure
:    不勾选

Syncdaemon
:    不勾选

如下图:


Backup-LVS 设置

填写完成后点击"ACCEPT"保存配置

VIRTUAL SERVERS 配置

每一个Virtual Servers代表所提供的一种服务,暂时先设置HTTP服务,所以点击ADD按钮如下图:


点击ADD按钮后出现新的Virtual Servers如下图:


然后再点击EDIT按钮,出现如下页面:


在提示中输入下面的信息:

Name:                    HTTP (Virtual Server 名称)
Application port
:            80 (端口)

Protocal
:                TCP (协议)
Virtual Server Address
:    192.168.1.250 (虚拟服务IP地址)

Virtual IP Network Mask
:    255.255.255.0 (子网掩码)

Firewall Mark
Device
:                    eth0:1 (设备名)

Re-entry Time
:            5 (重新加入时间)
Service Timeout
:            2 (服务超时时间)

Quiesce
:                No

Load Monitor Tool
:        none

Scheduling
:                Weighted least-connections 加权最小连接算法(默认)

Persistence

Persistence Network Mask
Unused

确认无误后点击"ACCEPT"按钮保存配置

设置Real Server


添加Real Server


编辑Real Server


配置rs-1

利用相同的步骤添加并配置rs-2

Name:        web_1
Address
:    10.0.0.100

Weighted
:    1

Name
:        web_2
Address
:    10.0.0.200

Weighted
:    1

保存并激活RS

添加rs后点击ACTIVATE按钮激活rs

在上图的界面上还有关于MONITORING SCRIPTS的设置,保持默认即可。

完成之后确认所有的配置都已经保存,这个LVS/NAT结构基本上就配置完成。最后的工作是在LVS的Router上启动主服务:

[root@ primary-lvs ~]# service pulse start
[root@ primary-lvs ~]# chkconfig pulse on

这个时候可以看到eth0:1和eth1:1已经自动建立:

[root@ primary-lvs ~]# ifconfig

eth0:1 Link encap:Ethernet HWaddr 00:0C:29:08:A1:62
inet addr:192.168.1.250 Bcast:192.168.1.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

eth1:1 Link encap:Ethernet HWaddr 00:0C:29:08:A1:6C

inet addr:10.0.0.254 Bcast:10.0.255.255 Mask:255.255.0.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

Interrupt:19 Base address:0x2080

并且相关服务也开启了:

[root@ primary-lvs ~]# service ipvsadm status

IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.1.250:80 wlc

-> 10.0.0.200:80 Masq 1 0 0
-> 10.0.0.100:80 Masq 1 0 15

[root@ primary-lvs ~]# ps -ef | grep nanny | grep -v grep

root 3614 3596 0 23:09 ? 00:00:03 /usr/sbin/nanny -c -h 10.0.0.100 -p 80 -s GET / HTTP/1.0\r\n\r\n -x HTTP -a 15 -I /sbin/ipvsadm -t 6 -w 1 -V 192.168.1.250 -M m -U none --lvs
root 3615 3596 0 23:09 ? 00:00:03 /usr/sbin/nanny -c -h 10.0.0.200 -p 80 -s GET /HTTP/1.0\r\n\r\n -x HTTP -a 15 -I /sbin/ipvsadm -t 6 -w 1 -V 192.168.1.250 -M m -U none --lvs

同时开启两台真实服务器上的http服务,并在两台主机上的服务目录中分别建立同样的测试页面。

[root@web-1 ~]# chkconfig httpd on
[root@web-1 ~]# service httpd start

现在通过在客户端上访问LVS服务器进行测试:http://192.168.1.250,这次的测试是针对访问是否可以被LVS Router轮询,通过该刚才的访问可以看到real server给出了页面。而这里为了便于进一步看到测试效果,实际上可以在Real Server1和Real Server2上都开启HTTP服务,但为网站主目录设置不同的index.html文件。这样如果在客户端多刷新几次的话会发现访问被平均分配到两台真实服务器。

或者我们也可以在客户端上发起一个简单的压力测试:

执行命令:

[root@client ~]# ab -c 1000 -n 100000 http://192.168.1.250/index.html

这样在LVS Router上获得的LVS ROUTING TABLE如下:

[root@ primary-lvs ~]# ipvsadm -l

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.1.250:80 wlc

-> 10.0.0.200:80 Masq 1 0 317

-> 10.0.0.100:80 Masq 1 0 1007

访问量貌似在不同的服务器上的分布不太一样。事实上是由于采用了加权最小连接算法,所以负载在轮询的同时也会按照真实服务器的空闲状况分布。因此LVS Router的轮询功能已经可以正常工作。这样的话,一个基本的运行HTTP的LVS就算成功,也就是说LVS的架子搭建起来了。

接着我们再来测试LVS Router的主备切换功能。测试的方法很简单,第一台LVS Router现在是primary,那么正常情况下他提供服务,而备份lvs router开启pulse进程对第一台状态进行监控。现在将第一台LVS Router关闭,在短时间内客户端访问虚拟服务器将受到影响。但是在大概6秒左右的时间就可以访问成功,此时可以看到备份LVS Router已经成为primary并提供服务。如果此时再将已经关闭的第一台LVS Router开启,那么他将再次成为主LVS Router。

2、VS/DR架构

拓扑图


[root@ primary-lvs ~]# vi /etc/sysconfig/ha/lvs.cf

serial_no = 102
primary = 192.168.108.108

service = lvs

backup_active = 1

backup = 192.168.108.109

heartbeat = 1

heartbeat_port = 539

keepalive = 2

deadtime = 3

network = direct

debug_level = NONE

monitor_links = 0

syncdaemon = 0

virtual lvs_server {

active = 1

address = 192.168.108.180 eth0:1

vip_nmask = 255.255.255.0

port = 80

persistent = 30

send = "GET / HTTP/1.0\r\n\r\n"

expect = "HTTP"

use_regex = 0

load_monitor = none

scheduler = wlc

protocol = tcp

timeout = 2

reentry = 5

quiesce_server = 0

server web_1 {

address = 192.168.108.161

active = 1

weight = 1

}

server web_2 {

address = 192.168.108.162

active = 1

weight = 1

}

}

该配置文件使用web页面进行配置,完成之后将配置文件复制到backup-lvs的相应目录下。

配置系统,启动LVS Route 上的pulse服务

Primary-LVS
[root@ primary-lvs ~]vi /etc/sysctl.conf

net.ipv4.ip_forward = 1

[root@ primary-lvs ~]# sysctl -p

[root@ primary-lvs ~]# service pulse start

[root@ primary-lvs ~]# scp /etc/sysconfig/ha/lvs.cf 192.168.108.109:/etc/sysconfig/ha/lvs.cf

backup-lvs做相同操作
[root@ backup-lvs ~] vi /etc/sysctl.conf

net.ipv4.ip_forward = 1

[root@ backup-lvs ~]# sysctl -p

[root@ backup-lvs ~]# service pulse start

Real Server所做的操作我已经写了一个shell脚本,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash
#Description : RealServer Start!
#Write by:Cooper
#Last Modefiy:2009.08.21
 
VIP=192.168.108.180
 
startDR()
{
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
echo "1" &gt;/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" &gt;/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" &gt;/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" &gt;/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p &gt;/dev/null 2&gt;&amp;1
}
 
startTunnel()
{
/sbin/ifconfig tunl0 $VIP netmask 255.255.255.255 broadcast $VIP up
/sbin/route add -host $VIP dev tunl0
echo "1" &gt;/proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "2" &gt;/proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "1" &gt;/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" &gt;/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p &gt;/dev/null 2&gt;&amp;1
}
 
# ============ Main ===========
echo -n "please choose lvs type.(dr|tunnel) : "
read LVSTYPE
LVSTYPE=`echo $LVSTYPE | tr 'A-Z' 'a-z'`
 
case "$LVSTYPE" in
        "dr")
                startDR;;
        "tunnel")
                startTunnel;;
        *)
                echo -e "please input \"dr\" or \"tunnel\""
esac

运行脚本会出现选择LVS结构的提示,根据提示输入 dr或tunnel即可来完成dr或tunnel结构的LVS

查看LVS-Router状态

[root@ primary-lvs ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP localhost:http wlc persistent 30

-> localhost:http Route 1 0 0

-> localhost:http Route 1 0
0

[root@ primary-lvs ~]# tail -f /var/log/message

Sep 1 17:34:41 experiment pulse[6661]: STARTING PULSE AS MASTER
Sep 1 17:34:44 experiment lvs[6664]: starting virtual service lvs_server active: 80

Sep 1 17:34:44 experiment nanny[6669]: starting LVS client monitor for 192.168.108.180:80

Sep 1 17:34:44 experiment lvs[6664]: create_monitor for lvs_server/web_1 running as pid 6669

Sep 1 17:34:44 experiment nanny[6670]: starting LVS client monitor for 192.168.108.180:80

Sep 1 17:34:44 experiment nanny[6670]: [ active ] making 192.168.108.162:80 available

Sep 1 17:34:44 experiment lvs[6664]: create_monitor for lvs_server/web_2 running as pid 6670

Sep 1 17:34:44 experiment nanny[6669]: [ active ] making 192.168.108.161:80 available

Sep 1 17:34:49 experiment pulse[6666]: gratuitous lvs arps finished

Real Server 的apache日志

[root@ web-1 ~]# tail -f /var/log/httpd/accesss.log

192.168.108.108 - - [01/Sep/2009:17:36:52 +0800] "GET / HTTP/1.0" 200 24718 "-" "-"
192.168.108.108 - - [01/Sep/2009:17:36:54 +0800] "GET / HTTP/1.0" 200 24718 "-" "-"

192.168.108.108 - - [01/Sep/2009:17:36:56 +0800] "GET / HTTP/1.0" 200 24718 "-" "-"

192.168.108.108 - - [01/Sep/2009:17:36:58 +0800] "GET / HTTP/1.0" 200 24718 "-" "-"

192.168.108.108 - - [01/Sep/2009:17:37:00 +0800] "GET / HTTP/1.0" 200 24718 "-" "-"

192.168.108.108 - - [01/Sep/2009:17:37:02 +0800] "GET / HTTP/1.0" 200 24718 "-" "-"

192.168.108.108 - - [01/Sep/2009:17:37:04 +0800] "GET / HTTP/1.0" 200 24718 "-" "-"

这些访问记录即为Primary-LVS 上的nanny进程发起的监控操作。

原创文章,转载请注明: 转自 http://salogs.com