一、集群的种类:

LB: Load Balancing      负载均衡       LVS、haproxy

HA: High Availability   高可用         heartbeat、RHCS、keepalived

HP: High Performance    高性能


二、LVS概述
LVS 是Linux virtual server的简称,是由中国Linux程序员章文嵩博士发起和领导的,基于Linux系统的服务器LB集群解决方案。Linux 2.6内核起已经安装了ipvs。LVS是调度器,它不真正提供服务,但它接受客户的访问,为整个集群提供一个唯一的入口,来和真实服务器(Real Server)通信。


三、LVS三种模式
VS/NAT: 网络地址转换模式,进站/出站的数据流量经过调度器
VS/DR: 直接路由模式,只有进站的数据流量经过调度器
VS/TUN: 隧道模式,只有进站的数据流量经过调度器


四、关于ipvsadm:

ipvsadm是运行于用户空间、用来与ipvs交互的命令行工具,常见用法如下:
ipvsadm -A|E -t|u  service-address [-s scheduler]
ipvsadm -D -t|u service-address

ipvsadm -a|e -t|u service-address -r server-address -g|i|m -w weight
ipvsadm -d -t|u service-address -r server-address

ipvsadm -C

-A|-E
新增一条Director规则 | 重新编辑一条Director规则
-t|-u
指定VIP:PORT,t是指TCP,u是指UDP
-s
指定调度算法
-D
删除一条虚拟服务器规则
-a|-e
新增一条真实服务器规则  |  修改一条真实服务器规则
-g|-i|-m
LVS-DR模式(默认)  |  LVS-TUN模式  |  LVS-NAT模式
-w
指定权重值
-d
删除一条真实服务器规则
-C
清除所有规则
-L|-l
查看所有的规则


五、部署

VIP(virtual IP): 调度器用来向客户端提供服务的IP

DIP(director IP): 调度器用来和真实服务器通信的IP

RIP(real IP): 真实服务器的IP地址

1. VS-NAT

LB集群--LVS部署_LVS

原理:当用户请求到达director之后,director将请求报文的目标地址(即VIP)改成选定的real server的RIP地址,同时将报文的目标端口也改成选定的real server的相应端口,最后将报文请求发送到指定的real server。在real server处理完请求后,将数据返给director,而director将报文的源地址和源端口改成VIP和相应端口,然后把数据发送给用户,完成整个负载调度过程。

环境:    director:VIP  192.168.2.98    DIP  172.16.1.1

         real server1(RIP1):172.16.1.100

         real server2(RIP2):172.16.1.200

[root@ipvs ~]# grep -i 'ip_vs' /boot/config-2.6.32-358.el6.x86_64
CONFIG_IP_VS=m    #可以看到ipvs是以模块化的方式编译在内核中

配置Director:

[root@ipvs ~]# echo 1 > /proc/sys/net/ipv4/ip_forward  #开启IP转发
[root@ipvs ~]# ipvsadm -A -t 192.168.2.98:80 -s wrr
[root@ipvs ~]# ipvsadm -a -t 192.168.2.98:80 -r 172.16.1.100:80 -m -w 1
[root@ipvs ~]# ipvsadm -a -t 192.168.2.98:80 -r 172.16.1.200:80 -m -w 2

配置real server:

只需简单配置2台httpd即可,创建index.html分别为WEB1和WEB2。

这样就算完成了LVS-NAT了。

[root@node2 ~]# ab -c 500 -n 2000 http://192.168.2.98/index.html
#在client上进行测试
[root@ipvs ~]# 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.2.98:http wrr
  -> 172.16.1.100:http            Masq    1      0          712
  -> 172.16.1.200:http            Masq    2      0          1380
#在Director上进行状态查看

小结:由于Director既需要接收client请求,又需要帮助real server发送数据,所以Director的负担就会比较重,会成为整个LB集群的性能瓶颈。


2. IPVS-DR

LB集群--LVS部署_keepalived_02

环境:     director:VIP  172.16.1.10    DIP  172.16.1.1

         real server1(RIP1):172.16.1.100

         real server2(RIP2):172.16.1.200

real server配置(两台配置一样):

[root@mysql ~]# ifconfig lo:1 172.16.1.10/32
[root@mysql ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@mysql ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

Director配置:

[root@ipvs ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@ipvs ~]# ifconfig lo:1 172.16.1.10/32
[root@ipvs ~]# ipvsadm -A -t 172.16.1.10:80 -s wlc
[root@ipvs ~]# ipvsadm -a -t 172.16.1.10:80 -r 172.16.1.100:80 -g -w 1
[root@ipvs ~]# ipvsadm -a -t 172.16.1.10:80 -r 172.16.1.200:80 -g -w 2

arp_ignore=1是让网卡收到ARP广播时,不要回应,直接忽略;

arp_announce=2是让网卡不要向外发送ARP广播。

原理:

⑴ 客户端向Director的VIP发出请求

⑵ Director收到请求后,根据负载均衡算法修改报文的目标MAC为其中一台real server的RIP的MAC,将报文发送出去

⑶ real server收到报文发现目标MAC是自己的RIP的MAC,目标IP是VIP,和自己的lo口上的IP一样,于是将报文处理后,以自己的VIP为源IP,client IP为目标IP,发送出去


3. LVS-TUN

由于NAT模式中,Director负担较重,易成为性能瓶颈,而DR模式中,所有群集服务器必须和Director在同一个网段,所以就出现了一个折中的方案---TUN模式,但是TUN模式并不是想象中的那么完美,因为可以跨网段,所以网络的拥堵会导致其性能下降,所以企业中一般还是用DR模式。

原理:当用户请求到达director之后,director将请求报文的目标地址(即VIP)改成选定的real server地址。然后,调度器采用ip隧道技术将用户请求发送到某个real server,而这个real server将直接相应用户的请求,不再经过director。此外,对realserver的地域位置没有要求,可以和director在不在同一网段都可以。


六、LVS的持久连接

无论基于什么样的算法,只要期望源于同一个客户端的请求都由同一台Real server响应时,就需要用到持久连接。当使用LVS的持久连接时,Director会用连接状态追踪hash表(通常被成为持久连接模版)将客户端请求以及对应的real server记录下来,从而确保这个客户端在某段时间内被分配到相同的real server上。

ipvsadm -p timeout    开启持久连接,并指定超时时间,单位为s,默认为300s。如果在指定时间内,用户连接并没有断开,通常会延长120s,直到用户退出为止。为了保证其时效性,Hash table中“连接追踪”信息被定义了“生存时间”。LVS为记录“连接超时”定义了三个计时器:

ipvsadm --set tcp tcpfin udp

tcp       TCP的超时时间间隔;
tcpfin    TCP握手的超时时间;
udp       无连接的UDP数据包(记录其两次发送数据包的时间间隔);

-Z
清空计数器
-lcn
查看LVS的连接状态
-f
指定iptables标记
-p
指定持久连接的超时时间

持久连接的类型:

Persistent client connections

(PCC)

将同一个客户端的请求始终定向到同一个Real Server上。

Persistent port connections

(PPC)

将来自同一个客户端对某个特定服务的请求定位到同一个Real Server上去。
Persistent Netfilter Marked Packetpersistence用iptables标记来实现将同一个用户对某几个特定端口(如:80和443)的请求,定位到同一台real Server上去。
FTP connections首先限定FTP的被动模式的端口,将这些端口和21端口用标记关联起来,然后定位到同一台Real Server上。


1. PCC配置

[root@ipvs ~]# ipvsadm -C
[root@ipvs ~]# ipvsadm -A -t 172.16.1.10:0 -s wlc -p 1200
[root@ipvs ~]# ipvsadm -a -t 172.16.1.10:0 -r 172.16.1.100 -g -w 10
[root@ipvs ~]# ipvsadm -a -t 172.16.1.10:0 -r 172.16.1.200 -g -w 20
[root@ipvs ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.1.10:0 wlc persistent 1200
  -> 172.16.1.100:0               Route   10     0          0      
  -> 172.16.1.200:0               Route   20     0          10


2. PPC配置

[root@ipvs ~]# ipvsadm -C
[root@ipvs ~]# ipvsadm -A -t 172.16.1.10:22 -s nq -p 1200
[root@ipvs ~]# ipvsadm -a -t 172.16.1.10:22 -r 172.16.1.100 -g -w 100
[root@ipvs ~]# ipvsadm -a -t 172.16.1.10:22 -r 172.16.1.200 -g -w 50


3. iptables标记

[root@ipvs ~]# vim /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
#首先在iptables上放行这2个端口
[root@ipvs ~]# service iptables restart
[root@ipvs ~]# iptables -A PREROUTING -i eth0 -t mangle -p tcp -d 172.16.1.10 --dport 80 -j MARK --set-mark 10
[root@ipvs ~]# iptables -A PREROUTING -i eth0 -t mangle -p tcp -d 172.16.1.10 --dport 443 -j MARK --set-mark 10
#为VIP 172.16.1.10的80和443端口都打上标记10,标记只有本机有效
[root@ipvs ~]# ipvsadm -C
[root@ipvs ~]# ipvsadm -A -f 10 -s wlc -p 1200
[root@ipvs ~]# ipvsadm -a -f 10 -r 172.16.1.100 -g -w 100
[root@ipvs ~]# ipvsadm -a -f 10 -r 172.16.1.200 -g -w 200


七、LVS+keepalived

keepalived简介

1、keepalived 是lvs 的扩展项目,因此它们之间具备良好的兼容性。

2、通过对服务器池对象的健康检查,实现对失效机器/服务的故障隔离。

3、负载均衡器之间的失败切换failover,是通过VRRP(Virtual Router Redundancy Protocol)实现的。


1. 安装keepalived

[root@ipvs ~]# tar xf keepalived-1.2.12.tar.gz
[root@ipvs ~]# cd keepalived-1.2.12
[root@ipvs ~]# ./configure --sysconfdir=/etc/ --prefix=/usr/local/keeplived
[root@ipvs ~]# make && make install


2. 清空ipvs的所有配置

[root@ipvs ~]# ipvsadm -C


3. 编辑keepalived的配置文件

[root@ipvs ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {
      baihu@163.com      #设置邮件报警的收件地址
   }
   notification_email_from root@localhost   #设置邮件报警的发件地址
   smtp_server 172.16.1.1   #设置发件的邮件服务器的地址  
   smtp_connect_timeout 30   #设置连接SMTP服务器的超时时间
   router_id LVS_MASTER    #运行Keepalived服务器的一个标识
}
vrrp_instance VI_1 {
    state MASTER      #指定Keepalived的角色
    interface eth0      #对外提供服务的网络接口
    virtual_router_id 51    #虚拟路由标识,主备需保持一致
    priority 100    #优先级,主应该大于备
    advert_int 1      #MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒。
    authentication {
        auth_type PASS
        auth_pass 1111  #主从之间的认证类型和密码,类型主要有PASS、AH 两种
    }
    virtual_ipaddress {
        172.16.1.10    #虚拟ip 地址,可以理解为LVS的VIP
    }
}
virtual_server 172.16.1.10 80 {
    delay_loop 6     #设置健康检查时间,单位是秒
    lb_algo wlc      #设置LVS的调度算法
    lb_kind DR       #设置LVS的工作模式
    persistence_timeout 1200     #持久连接的超时时间  
    protocol TCP     #指定上面的80端口为TCP的80端口
    real_server 172.16.1.100 80 {
        weight 1                 #指定权重
        TCP_CHECK {              #指定TCP检查
          connect_timeout 3      #连接超时时间
          nb_get_retry 3         #重试次数
          delay_before_retry 3   #重试间隔
        }
    }
    real_server 172.16.1.200 80 {
        weight 2
        TCP_CHECK {
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
        }
    }
}


4. 启动keepalived

[root@ipvs ~]# cd /usr/local/keeplived/sbin/
[root@ipvs sbin]# ./keepalived
#从服务器上也是这么配置的,改一下主配置文件就可以了


5. 测试

[root@ipvs ~]# ipvsadm -L
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.1.10:http wlc persistent 1200
  -> 172.16.1.100:http            Route   1      0          0        
  -> 172.16.1.200:http            Route   2      3          0        
[root@ipvs ~]# ifconfig eth0 down
[root@ipvs ~]# ifconfig eth0 up
#将master提供服务的网卡禁用再启用
[root@ipvs2 ~]# tail -f /var/log/messages
Mar  8 21:35:31 ipvs2 Keepalived_vrrp[2878]: VRRP_Instance(VI_1) Transition to MASTER STATE
Mar  8 21:35:32 ipvs2 Keepalived_vrrp[2878]: VRRP_Instance(VI_1) Entering MASTER STATE
Mar  8 21:51:39 ipvs2 Keepalived_vrrp[2878]: VRRP_Instance(VI_1) Received higher prio advert
Mar  8 21:51:39 ipvs2 Keepalived_vrrp[2878]: VRRP_Instance(VI_1) Entering BACKUP STATE
#在BACKUP服务器上查看主从切换的日志

然后就可以测试了^_^