LVS负载均衡

1.1 LVS简介

LVS是Linux Virtual Server的简写,意思就是Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。该项目在1998年5月由章文嵩博士组织成立,是中国国内最早出现的自由软件项目之一。

LVS项目介绍:

LVS项目主页:http://www.linuxvirtualserver.org/

LVS项目介绍:http://www.linuxvirtualserver.org/zh/lvs1.html

LVS集群的体系结构:http://www.linuxvirtualserver.org/zh/lvs2.html

LVS集群中的IP负载均衡技术:http://www.linuxvirtualserver.org/zh/lvs3.html

LVS集群的负载调度:http://www.linuxvirtualserver.org/zh/lvs4.html

LVS负载均衡调度技术是在Linux内核中实现的,因此,被称之为Linux虚拟服务器(Linux Virtual Server)。我们使用该软件配置LVS时候,不能直接配置内核中的ipvs,而需要使用ipvs的管理工具ipvsadm进行管理。

q  LVS技术点小结:

1、真正实现调度的工具是IPVS,工作在Linux内核层面。

2、LVS自带的IPVS命令行管理工具是ipvsadm。

3、keepalived实现管理IPVS及负载均衡器的高可用。

4、Red hat工具Piranha WEB管理实现调度的工具IPVS。

1.2 简单术语介绍

术语简写

术语含义

CIP

客户端的IP地址,client ip

DIP

负载均衡器对应的实际IP地址

VIP

需在均衡器提供服务的地址

RIP

提供服务的节点地址

LB

负载均衡服务器

RS

节点服务器,Real   Server

1.3 DR模式介绍(Direct Routing)

1、通过在调度器LB上修改数据包的目的MAC地址实现转发,注意,源IP地址任然是CIP,目的地址任然是VIP。

2、请求报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此,并发访问量大时使用效率很高(和NAT模式比)。

3、因DR模式是通过MAC地址的改写机制实现的转发,因此,所有的RS节点和调度器LB只能在一个局域网LAN中(小缺点)。

4、需要注意RS节点的VIP的绑定(lo:vip/32,lo1:vip/32)和ARP抑制问题。

5、强调下:RS节点的默认网关不需要是调度器LB的DIP,而是直接IDC机房分配的上级路由器的IP(这是RS带有外网IP地址的情况),理论讲:只要RS可以出网即可,不是必须要配置外网IP。

6、由于DR模式的调度器仅进行了目的的MAC地址的改写,因此,调度器LB无法改变请求报文的目的端口(和NAT要区别)。

7、当前,调度器LB支持几乎所有的UNIX,LINUX系统,但目前不支持WINDOWS系统。真实服务器RS节点可以是WINDOWS系统。

8、总的来说DR模式效率很高,但是配置也比较麻烦,因此,访问量不是特别大的情况下可以用haproxy或者nginx取代。这符合运维的原则:简单、易用、高效。日1000-2000W PV或并发1万以下都可以考虑使用haproxy/nginx(LVS NAT模式)。

9、直接对外的访问业务,例如:web服务做RS节点,RS最好用公网IP地址。如果不直接对外的业务,例如:MySQL,存储系统RS节点,最好只用内部IP地址。

注:直接路由,最大的特点是不更改源IP和目标IP,改变的是MAC地址

1.4 LVS集群算法

算法

说明

rr

轮循调度(Round-Robin),它将请求依次分配不同的RS节点,也就是在RS节点中均摊请求。这种算法很简单,但是只适合于RS节点处理性能相差不大的情况。

wrr

加权轮循调度(Weighted   Round-Robin),它将依据不同的RS节点的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值较低的RS节点更多。相同权值的RS得到相同数目的连接数。

wlc

加权最小连接数调度(Weighted   Least-Connection)假设各台RS的权值依次为Wi(I=1..n),当前的TCP连接次数依次为Ti(I=1..n),依次选取Ti/Wi为最小的RS作为下一个分配的RS。

dh

目的地址哈希调度,以目的地址为关键字查找一个静态hash表来获得需要的RS。

sh

源地址哈希调度,以源地址为关键字查找一个静态hash表来获得需要的RS。

第2章 LVS的安装与配置

2.1 服务规划

2.1.1 服务器规划表

LVS服务器

2台

负载转发四层TCP请求

HTTP服务器

2台

负载提供HTTP服务

说明:总共需要4台服务器完成本次项目

2.1.2 主机IP规划表

服务器说明

IP地址

主机名称规则

LVS服务器

10.0.0.18/24

lb01

LVS服务器

10.0.0.19/24

lb02

Nginx服务器

10.0.0.16/24

nginx

Apache服务器

10.0.0.17/24

apache

 

10.0.0.21/24

虚拟IP地址

2.1.3 主机名解析

172.16.1.16    nginx

172.16.1.17    apache

172.16.1.18    lb01

172.16.1.19    lb02

2.2 安装环境

q  操作系统版本

[root@server ~]# cat /etc/redhat-release
CentOS release 6.5 (Final)
[root@server ~]# uname -r
2.6.32-431.el6.x86_64
[root@server ~]# uname -m
x86_64
 

q  LVS软件版本

[root@lb02 ~]# rpm -qa ipvsadm
ipvsadm-1.26-4.el6.x86_64
 

2.3 软件安装

2.3.1 安装LVS服务

LVS可以通过yum命令安装,或者通过源码编译的方式安装,在此选择yum安装。分别在两台LVS服务器安装LVS服务,安装过程如下:

q  查看是否已安装inotify

[root@lb02 ~]# rpm -qa ipvsadm
[root@lb02 ~]#
 

#<==这里如果没有任何返回值就表明没有安装

q  使用yum命令安装软件

[root@nginx ~]# yum -y install ipvsadm
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
*****自动安装过程略****  
Installed:
  ipvsadm.x86_64 0:1.26-4.el6                                                                                                                                                
 
Complete!    #<==安装完成
[root@lb01 ~]# ln -s /usr/src/kernels/2.6.32-431.el6.x86_64/ /usr/src/linux    #<==创立软链接
[root@lb01 ~]# ll /usr/src/linux
 

注:如果没有/usr/src/kernels/2.6.32-431.el6.x86_64路径,可能是因为缺少kernel-devel-2.6.18-164.el5软件包,可以通过命令yum -y install kernerl-devel 安装。

q  检测是否安装完毕

[root@lb02 ~]# rpm -qa ipvsadm
ipvsadm-1.26-4.el6.x86_64
 

q  查看内核是否有ip_vs服务运行

[root@lb01 ~]# lsmod | grep ip_vs
ip_vs                 125220  0
libcrc32c               1246  1 ip_vs
ipv6                  317340  285 ip_vs
 

注:如果没有以上三个输出,可以使用命令ipvsadm或者modprobe ip_vs重新加载。

2.3.2 安装其他服务

1)在nginx服务器安装nginx服务,能正常提供访问;

2)在apache服务器安装apache服务,能正常提供访问;

3)在lb01和lb02安装keepalived服务。

[root@lb02 ~]# curl nginx
www
[root@lb02 ~]# curl apache
apache.www
 

第3章 配置LVS集群

3.1 手动配置LVS服务

3.1.1 服务端配置

为LVS服务器添加一个虚拟IP地址:

ip addr add 10.0.0.21/24 dev eth0 label eth0:0

清空以前的旧配置:

ipvsadm --help          #<==查看ipvsadm的配置参数
ipvsadm -C              #<==清空所有配置
 

添加一个虚拟vserver:

ipvsadm -A -t 10.0.0.21:80 -s wrr

参数说明:

-A:--add-service,表示添加一个虚拟服务器

-t:--tcp-service,指定这是一个tcp的虚拟服务器

-u:--udp-service,指定这是一个udp的虚拟服务器

10.0.0.21:80:表示提供服务的ip地址以及端口号

-s:--scheduler,指定调度器,“rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq”选择一种,默认是wlc

为服务器添加real server:

ipvsadm -a -t 10.0.0.21:80 -r 10.0.0.16:80 -g -w 1
ipvsadm -a -t 10.0.0.21:80 -r 10.0.0.17:80 -g -w 1
 

3.1.2 节点端配置

需要添加到LVS负载均衡器的节点都需做如下配置:

q  绑定VIP

在网卡lo绑定虚拟IP,该虚拟IP同LVS服务器的虚拟IP,即10.0.0.21/24

ip addr add 10.0.0.21/32 dev lo label lo:0
route add -host 10.0.0.21 dev lo
 

q  设置ARP抑制

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
 

q  抑制参数说明

arp_ignore:定义目标地址为本地IP的ARP询问不同的应答模式

0

默认值,回应任何网络接口上对任何本地IP地址的arp查询请求

1

只回答目标IP地址是来访网络接口本地地址的ARP查询请求

2

只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内。

3

不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应。

4-7

 保留未使用。

8

不回应所有(本地地址)的arp查询

 

arp_announce:对网络接口上,本地IP地址发出的,ARP回应,作出相应级别的限制。确定不同程序的限制,宣布对来自本地源IP地址发出的ARP请求接口。

0

默认值,在任意网络接口(eth0,eth1,lo)上任何本地地址。

1

尽量避免不在该网络子网段的地址作出arp回应。当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用,此时会检查来访IP是否为所有接口上的子网段内IP之一。如果该来访者IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理。

2

对查询目标使用最适当的本地地址,在此模式下忽略这个IP数据包的源地址并尝试选择能与该地址通信的本地地址,首要是选择所有网络接口的子网中外出访问子网中包目标IP地址的本地地址。如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送,限制了使用本地VIP地址作为优先的网络接口

3.1.3 结果服务验证

访问10.0.0.21:80,查看结果是否轮循。

[root@lb02 ~]# curl 10.0.0.21:80
apache.www
[root@lb02 ~]# curl 10.0.0.21:80
www
[root@lb02 ~]# curl 10.0.0.21:80
apache.www
[root@lb02 ~]# curl 10.0.0.21:80
www
 

3.2 keepalived配置LVS服务

除了手动配置LVS服务器之外,使用keepalived管理LVS是一种更好的选择。keepalived默认就集成了管理LVS的功能,其配置LVS虚拟服务器内容如下:

###############################
#      LVS的配置部分        #
###############################
virtual_server 10.0.0.21 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    #persistence_timeout 50
    protocol TCP
 
    real_server 10.0.0.16 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 5
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
          }
        }
 
    real_server 10.0.0.17 80 {
        weight 1
        TCP_CHECK {
        connect_timeout 5
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
          }
        }
}
posted @ 2020-11-29 23:21  shadow-obk  阅读(104)  评论(0编辑  收藏  举报