LVSj实现负载均衡

来源:互联网 发布:handler源码解析 编辑:程序博客网 时间:2024/05/19 18:46
8章-LVS负载均衡
一、为什么要使用这个负载均衡技术?
考虑一个问题:
  比如某公司有一台服务器目前支撑了2000左右的用户,但是随着用户的业务扩展,用户量爆增到5000.或者一万,
  这个时候。怎么处理?
     两种处理方法:
     (1)向上扩展,提高当前服务器的硬件性能,硬件的提升并不能完全解决问题,
     (2)向外扩展  也称为横向扩展,增加服务器数量,通过负载均衡均匀的分配用户
    负载均衡技术(Load Balancing:LB).
    (1)系统的高可用性
    (2)系统扩展性
    (3)负载均衡能力.
LVS+Keepalived很好的实现了以上的需求,LVS提供均衡能力,Keepalived提供健康检查故障转移,提供高系统的可用性。
  采用这样的架构以后,很荣对现有的系统进行扩展,只要后端增加或者减少(realServer),只要更改lvs的配置文件,就可是实现
  无缝配置变更.


二、LVS工作模式介绍
 (1)LVS是一个开源的软件,可以实现Linux平台的负载均衡,LVS是Linux Virtual Server的缩写,意思就是Linux虚拟服务器。
 LVS目前有三种IP负载技术(VS/NAT, VS/TUN, VS/DR)。八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)
 
NAT负载模式:
  NAT本来是因IPV4的公网地址不足,把内部的私有地址映射成公网地址实现,内部机器可以访问互联网.
  
  
   用户 
   |
   |
---LVS-----
|        |
|        |
WEB      WEB
   


(1)用户向LVS发起数据访问,
(2)LVS把这个数据访问定向到内部WEB服务器
(3)WEB服务器最后把数据返回给LVS
(4)再有LVS把数据返回给用户.
不管是出去还是进来的流量都需要经过LVS。这样的LVS负载压力非常之大。


NAT模式:
集群节点跟Direcator 必须在同一个IP网络中。
RIP通常是私有地址,仅仅用于个集群之间通信。
director位于Client和real server之间,并负责处理进出的所有通信。
realservet必须将网关指向DIP。同时也支持端口影射
Realserver可以使用任意OS
在较大应用规模当中,单个Director会出现瓶颈
大概可以带10个左右的SERVER就会出现瓶颈。








LVS负载均衡模式 直接路由模式(DR)
直接路由模式比较特别,很难说和什么方面相似,前NAT基本上都是工作在网络层上(三层),而直接路由模式则应该是工作在数据链路层上(二层)。其原理 为,DR和REALSERVER都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有REALSERVER对本身这个IP的ARP请求保持静 默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的REALSERVER,把目的MAC地址改为 REALSERVER的MAC并发给这台REALSERVER。这时REALSERVER收到这个数据包,则等于直接从客户端收到这个数据包无异,处理后 直接返回给客户端。由于DR要对二层包头进行改换,所以DR和REALSERVER之间必须在一个广播域,也可以简单的理解为在同一台交换机上。




 DR模式:
   个集群节点跟dr必须在同一个物理网络(局域网)当中(dr和web不能隔了有路由器)
   VIP可以使用公网地址,实现远程管理和监控
   director只负责处理进站请求,响应的请求封装后直接由Relserver发给客户端。
   Realserver不能将Direc当成网关。只能选择前当网关。
   Direc不能支持端口映射。VIP的端口必须和WEB服务端口一致
   大多数的操作系统都可以应用在relserver上。
   Direc性能比NAT要好很多。处理速度提高N倍
   
   


LVS负载均衡的八种调度算法
RR算法
LVS负载均衡算法1.轮叫调度(Round-RobinScheduling)  


WRR算法
LVS负载均衡算法2.加权轮叫调度(WeightedRound-RobinScheduling)


LC算法
LVS负载均衡算法3.最小连接调度(Least-ConnectionScheduling)


WLC算法:
LVS负载均衡算法4.加权最小连接调度(WeightedLeast-ConnectionScheduling)


LBLC算法
LVS负载均衡算法5.基于局部性的最少链接(Locality-BasedLeastConnectionsScheduling)


LBLCR算法
LVS负载均衡算法6.带复制的基于局部性最少链接(Locality-BasedLeastConnectionswithReplicationScheduling)


DH算法
LVS负载均衡算法7.目标地址散列调度(DestinationHashingScheduling)


SH算法
LVS负载均衡算法8.源地址散列调度(SourceHashingScheduling)


       (2)、keepalived
       Keepalived 是运行在lvs 之上,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败 切换,提高系统的可用性




     
     
三、LVS的安装
环境描述:
LVS server1 (Master):10.0.0.202-虚拟IP为:10.0.0.210
LVS server2 ( Slave ) :10.0.0.203虚拟IP为:10.0.0.210
WEB server1: 10.0.0.201  网关为:10.0.0.254
WEB server2; 10.0.0.204  网关为:10.0.0.254
注意:所有集群服务器时间要一致


2.2、安装LVS
注意此动作。否则MAKE直接报错。
# ln -s /usr/src/kernels/2.6.32-279.el6.x86_64/ /usr/src/linux
# tar -xvf ipvsadm-1.24.tar.gz 
# cd ipvsadm-1.24
# make && make install
# ipvsadm -L
如果/usr/src/kernels为空,没有文件?
解决方法如下:
#yum -y install kernel-devel-2.6.32-279.el6.x86_64


配置文件说明:
! Configuration File for keepalived
global_defs {  #全局定义
   notification_email { #定义邮件
      alvin@126.com  #定义邮件地址
   }
   notification_email_from alvin@126.com #定义邮件地址
   smtp_server mail.126.com #邮件服务器
   smtp_connect_timeout 30 #邮件超时时间
   router_id LVS_DEVEL #route_id标识 
}


vrrp_instance VI_1 { #定义VRR组,
    state MASTER  #定义为MASTER主
    interface eth1 #对外访问的网络接口
    virtual_router_id 100 #虚拟路由标识。注意主从要一致
    priority 100 #主从优先级,主的优先级要高于从。注意
    advert_int 1 #:广播周期秒数
    authentication {
        auth_type PASS
        auth_pass 2209
    }
    virtual_ipaddress {
        10.0.0.210 #:虚拟VIP地址,真实环境这里应该是公网IP
 }


}
virtual_server 10.0.0.210 80 { #:虚拟VIP地址 与 端口,DR架构WEB端口要和虚拟端口监听一致。否则将无法访问
    delay_loop 6 #健康检查时间间隔,单位是秒
    lb_algo rr   #调用算法为RR
    lb_kind DR   #调用架构模式为DR
    persistence_timeout 0 #:同一IP 50秒内的请求都发到同个real server
    protocol TCP  #使用TCP协议
   
    real_server 10.0.0.201 80 {#:真实WEB服务器地址与端口
        weight 1 #:转发伐值,越高调用的越多
        TCP_CHECK {
        connect_timeout 10   #:连接超时为10秒
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80  #连接端口为80,要和上面的保持一致

    }
    real_server 10.0.0.204 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}




2.3、安装Keepalived
# tar  -xvf keepalived-1.1.20.tar.gz
# cd keepalived-1.1.20
#./configure  --prefix=/usr/local/keepalived
# make && make install
# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/rc.d/init.d/
# cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/
# mkdir /etc/keepalived
# cp usr/local/keepalived/etc/keepalived/keepalived.conf  /etc/keepalived/
# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/


Master配置
# vim /etc/keepalived/keepalvied.conf
! Configuration File for keepalived


global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}


vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.210
    }
}


virtual_server 10.0.0.210 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.0.0
    persistence_timeout 15
    protocol TCP


  real_server 10.0.0.202 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }


  real_server 10.0.0.223 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }


 }








2.3、LVS从的配置:
#vim/etc/keepalvied 
! Configuration File for keepalived


global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}


vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.210
    }
}


virtual_server 10.0.0.210 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.0.0
    persistence_timeout 15
    protocol TCP


  real_server 10.0.0.202 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }


  real_server 10.0.0.223 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }


 }


#/etc/init.d/keepalived restart
0 0