分享

lvs负载均衡测试手记(原创)

 richsky 2012-05-07

lvs负载均衡测试手记(原创)

(2009-04-01 11:25:59)
标签:

it

分类: Linux集群
今天没事顺手就来测试一下LVS负载均衡,呵呵。说不定以后业务量大了可以应用到。我两台实体机和一台虚拟机。都是安装的centos5。2的系统。

IP分别为:
192.168.0.10 (MASTER)  VIP:192.168.0.13
192.168.0.12
192.168.0.205

说明一下,LVS的三种包转发方式

  LVS提供了三种包转发方式:NAT(网络地址映射)、IP Tunneling(IP隧道)、Direct Routing(直接路由)。不同的转发模式决定了不同的cluster的网络结构,下面对三种转发方式分别介始:

  NAT(网络地址映射)

   NAT方式可支持任何的操作系统,以及私有网络,并且只需一个Internet IP地址,但是整个系统的性能受到限制。因为执行NAT每次需要重写包,有一定的延迟;另外,大部分应用有80%的数据是从服务器流向客户机,也就是用户 的请求非常短,而服务器的回应非常大,对负载均衡器形成很大压力,成为了新的瓶颈。

  IP Tunneling(IP隧道)

   director分配请求到不同的real server。real server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。IP Tunneling技术极大地提高了director的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过100个节点。real server可以在任何LAN或WAN上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。服务器必须拥有正式的IP地址用于与客户机直接通 信,并且所有服务器必须支持IP隧道协议。

  Direct Routing(直接路由)

  与IP Tunneling类似,负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。Direct Routing与IP Tunneling相比,没有IP封装的开销,但由于采用物理层(修改MAC地址)技术,所有服务器都必须在一个物理网段。

  3. LVS的八种调度算法

  LVS已实现了以下八种调度算法:

    * rr   轮叫(Round Robin)
      调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务 器,而不管服务器上实际的连接数和系统负载。

    * wrr   加权轮叫(Weighted Round Robin)
      调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

    * lc   最少链接(Least Connections)
      调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。

    * wlc   加权最少链接(Weighted Least Connections)
      在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

    * lblc   基于局部性的最少链接(Locality-Based Least Connections)
      "基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务器,将请求发送到该服务器。

    * lblcr   带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
      " 带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

    * dh   目标地址散列(Destination Hashing)
      "目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

    * sh   源地址散列(Source Hashing)
      "源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。 

 注:如果想了解关于以上几点的技术细节,LVS的主页查询。LVS的主页是:

  http://www.LinuxVirtualServer.org/
  http://www./

  了解了LVS的三个要点之后,接下来我们来配置一个采用Direct Routing包转发方式、轮循方式。


我先配置192.168.0.10 的DR
先检查一下是否要加载到LVS支持的内核IPVS
[root@hehe ~]# modprobe -l | grep ipvs
/lib/modules/2.6.18-92.el5xen/kernel/net/ipv4/ipvs/ip_vs.ko
/lib/modules/2.6.18-92.el5xen/kernel/net/ipv4/ipvs/ip_vs_dh.ko
/lib/modules/2.6.18-92.el5xen/kernel/net/ipv4/ipvs/ip_vs_ftp.ko
/lib/modules/2.6.18-92.el5xen/kernel/net/ipv4/ipvs/ip_vs_lblc.ko
/lib/modules/2.6.18-92.el5xen/kernel/net/ipv4/ipvs/ip_vs_lblcr.ko
/lib/modules/2.6.18-92.el5xen/kernel/net/ipv4/ipvs/ip_vs_lc.ko
/lib/modules/2.6.18-92.el5xen/kernel/net/ipv4/ipvs/ip_vs_nq.ko
/lib/modules/2.6.18-92.el5xen/kernel/net/ipv4/ipvs/ip_vs_rr.ko
/lib/modules/2.6.18-92.el5xen/kernel/net/ipv4/ipvs/ip_vs_sed.ko
/lib/modules/2.6.18-92.el5xen/kernel/net/ipv4/ipvs/ip_vs_sh.ko
/lib/modules/2.6.18-92.el5xen/kernel/net/ipv4/ipvs/ip_vs_wlc.ko
/lib/modules/2.6.18-92.el5xen/kernel/net/ipv4/ipvs/ip_vs_wrr.ko
如果这样显示就对了。说明已经支持了。如果不支持的话就要重新编译内核了。
具体就不再详细说明了。
linux-2.6.22.1.tar.bz2 [http:///pub/linux/kernel/v2.6/linux-2.6.22.1.tar.bz2]
内核下载地址

然后得安装LVS的主要软件ipvsadm  可以直接使用yum 安装。也同样可以在官方官网去下载
ipvsadm-1.24.tar.gz [http://www./software/kernel-2.6/ipvsadm-1.24.tar.gz]
我是直接在官网下载的。
 ipvsadm 安装:
# tar zxvf ipvsadm-1.24.tar.gz -C /usr/src/
# cd /usr/src/ipvsadm-1.24
# make all
# make install
# ipvsadm --version

这样就OK再编写脚本来启动DR如下:


#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
#echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects
LVSADM='/sbin/ipvsadm'
$LVSADM -C
$LVSADM -A -t 192.168.0.13:80 -s rr
$LVSADM -a -t 192.168.0.13:80 -r 192.168.0.12:80 -g -w 1
$LVSADM -a -t 192.168.0.13:80 -r 192.168.0.205:80 -g -w 1

-a 表示往一个服务内增加一个real server

-r 指定real server的IP地址

-w 表示权重

-g 表示使用DR方式,-m表示NAT方式,-i表示tunneling方式。

不知道这些参数什么意思的话也可以直接使用ipvsadm -h查看

Commands:
Either long or short options are allowed.
  --add-service     -A        add virtual service with options
  --edit-service    -E        edit virtual service with options
  --delete-service  -D        delete virtual service
  --clear           -C        clear the whole table
  --restore         -R        restore rules from stdin
  --save            -S        save rules to stdout
  --add-server      -a        add real server with options
  --edit-server     -e        edit real server with options
  --delete-server   -d        delete real server
  --list            -L|-l     list the table
  --zero            -Z        zero counters in a service or all services
  --set tcp tcpfin udp        set connection timeout values
  --start-daemon              start connection sync daemon
  --stop-daemon               stop connection sync daemon
  --help            -h        display this help message

Options:
  --tcp-service  -t service-address   service-address is host[:port]
  --udp-service  -u service-address   service-address is host[:port]
  --fwmark-service  -f fwmark         fwmark is an integer greater than zero
  --scheduler    -s scheduler         one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|                                                                                                  nq,
                                      the default scheduler is wlc.
  --persistent   -p [timeout]         persistent service
  --netmask      -M netmask           persistent granularity mask
  --real-server  -r server-address    server-address is host (and port)
  --gatewaying   -g                   gatewaying (direct routing) (default)
  --ipip         -i                   ipip encapsulation (tunneling)
  --masquerading -m                   masquerading (NAT)
  --weight       -w weight            capacity of real server
  --u-threshold  -x uthreshold        upper threshold of connections
  --l-threshold  -y lthreshold        lower threshold of connections
  --mcast-interface interface         multicast interface for connection sync
  --syncid sid                        syncid for connection sync (default=255)
  --connection   -c                   output of current IPVS connections
  --timeout                           output of timeout (tcp tcpfin udp)
  --daemon                            output of daemon information
  --stats                             output of statistics information
  --rate                              output of rate information
  --thresholds                        output of thresholds information
  --persistent-conn                   output of persistent connection info
  --sort                              sorting output of service/server entries
  --numeric      -n                   numeric output of addresses and ports


保存后记得加上可执行权限chmod +x ipvsadm
然后执行ipvsadm即可。
可以使用命令ipvsadm -ln查看其状态像这样:

[root@hehe]# 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.0.13:80 rr
  -> 192.168.0.205:80             Route               0
  -> 192.168.0.12:80              Route               0

显示LVS 目前的连接 如:ipvsadm -L -c
[root@erictest ha.d]# ipvsadm -L -c
IPVS connection entries
pro expire state       source             virtual            destination
TCP 01:58  FIN_WAIT    192.168.0.66:4963  192.168.0.13:http  192.168.0.12:http
TCP 00:25  SYN_RECV    192.168.0.66:4936  192.168.0.13:http  192.168.0.205:http
TCP 00:26  SYN_RECV    192.168.0.66:iad1  192.168.0.13:http  192.168.0.205:http

--timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout
--daemon 显示同步守护进程状态
--stats 显示统计信息
--rate 显示速率信息
--sort 对虚拟服务器和真实服务器排序输出
--numeric -n 输出IP 地址和端口的数字形式
同样可以上面参数也有说到。
ipvsadm -L --stats

[root@erictest ha.d]# ipvsadm -L --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes
  -> RemoteAddress:Port
TCP  192.168.0.13:http                 207     1583         105538        0
  -> 192.168.0.205:http                104      312          14976        0
  -> 192.168.0.12:http                 103     1271          90562        0


好了DR机器配置好后,再直接来配置Real服务器
当然先得让此机器内核支持IPVS方法同上直接编写脚本:

#!/bin/bash
ifconfig lo:0 192.168.0.13 netmask 255.255.255.255 broadcast 192.168.0.13 up //增加VIP的IP在环回接口上
route add -host 192.168.0.13 dev lo:0  增加到环回接口的路由
echo 0 > /proc/sys/net/ipv4/ip_forward
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
保存执行即可,另外的一台同样设置就行了。
最主要的是上面阻止ARP包的响应。
行然后测试。将12和205的WEB服务启用。直接输入vip的地址不停的刷新你将会看到不同页面的切换。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多