LVS实现负载均衡

LVS实现负载均衡

一、LVS群集技术基础

根据企业的环境不同,群集所提供的功能也是各不相同。采用的技术也是各有千秋,然而他们从整体上来看,需要了解一些关于集群的供共同特征。

1、群集的类型

无论是那种群集第一点都是不必须使用两台服务器,而对外就是一个整体,只提供一个访问入口。集群可以分为以下三种

clip_image001 负载均衡群集:主要的作用是提高对客户端的响应能力,均匀的调用服务器资源。将来自客户端的请求分发给多个服务器节点,从而缓解整个系统的压力。

clip_image001[1] 高可用群集:这种群集技术主要是实现网络中服务器的单点故障,服务的连续性以及减少服务的中断时间。

clip_image001[2] 高性能运算群集:这类群集是将所有服务器的CPU资源进行整合从而能够提高CPU的运算速度,这种群集适合大数据处理

2、群集负载均衡的分层结构

clip_image003

图1典型的负载均横群集结构

第一层,负载调度器:这是访问群集的唯一入口,也就是说客户端的访问请求的目标地址都是这个负载调度器,对外使用的所有服务器都使用一个共有的VIP也就是群集IP,通常会配置主从两台服务器来实现。

第二层,服务器池:群集所提供的应用服务(如HTTP、FTP等),其中每个节点都有自己的真实IP,只处理调度器分配的客户端请求,当某个节点宕机时,调度器将会将其隔离,等待错误排除之后再重新加入到服务器池。

第三层,共享存储:为服务器池中的节点提供存储,确保服务器池内的主机提供的内容都是相同的。在Linux/UNIX中,共享存储可以使用NAS设备,或者是提供NFS的共享服务器。

3、负载均横的工作模式

关于群集的负载调度技术,可以基于IP、端口进行分发,其中基于IP的是效率最高的。基于IP的负载平衡模式中,常见的有地址转换、IP隧道和直接路由三种工作模式

clip_image005

图2三种负载均横模式示意图比较

clip_image001[3] 地址转换:简称NAT模式,类似于防火墙的私有网络结构,负载调度器作为所有服务器的网关,即作为客户端的访问入口,也是各个节点应答的出口,服务器使用私网地址与调度器位于同一物理网络,这种工作模式安全性比较好,但是当访问量过大时将会成为整个网络的瓶颈。

clip_image001[4] IP隧道:简称TUN模式,采用开放式的网络结构,调度器仅作为客户端的访问入口,各个节点分布在互联网的其他不同位置,具有独立的公网IP地址,通过专用的IP隧道与负载调度器通信,这种工作模式其性能较差,安全也得不到保障。

clip_image001[5] 直接路由方式:采用半开放式的网络结构,必须与调度器在一个物理网络中的同一网段内。这种工作模式也是最常用的,性能最好的,安全性也能够得到保障。

二、LVS虚拟服务器

Linux Virtual Server 是针对linux内核开发的一个负载均衡项目,由我国的章文嵩不博士在1988年5月创建,官方站点位于http://www.linuxvritualserver.org/。LVS实际上就是相当于一个IP地址的虚拟化应用,未基于IP地址和内容请求分发的负载均衡提出了一种高效的解决办法。

LVS现在已经成为了Linux内核的一部分,默认编译模块为ip_vs模块,必要时能够自动调用。在Cetnos6中一下操作可以加载ip_vs模块,并查看当前系统中ip_vs模块的版本信心。

[root@centos1 ~]# modprobe ip_vs

[root@centos1 ~]# cat /proc/net/ip_vs

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

[root@centos1 ~]#

下面介绍一下LVS负载均衡主要的调度算法,以及如何使用Ipvsadm工具管理工具

1LVS的负载均衡算法

针对不同的网络和服务器配置需求,LVS调度器提供多种不同的负载均衡调度算法,其中最常用的四种算法分别是轮询、加权轮询、最少连接以及加权最少连接

轮询:将接收到的客户端请求顺序分配到各个服务器节点,不管服务器的真实负载

加权轮询:根据真实的服务器处理能力轮流分配收到的访问请求,调度器根据服务器的真实负载动态的调整权重。

最少连接:根据服务器的真实连接数而将客户端请求分配给连接最少的服务器节点

加权最少连接:在服务器节点性能差异较大时建议使用,权重高的节点可以承担更大的连接负载。

我个人认为第一种不是特别好,剩下的三种都是比较不错的算法。

2、安装ipvsadm管理工具

ipvsadm是在负载调度器上使用的LVS群集管理工具,通过调用ip_vs模块来添加、删除服务器节点。在centos6中需要手动安装ipvsadm-1.26.2.e16.x86_64软件包

[root@centos1 ~]# yum -y install ipvsadm

[root@centos1 ~]# ipvsadm -v

ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1)

接下来我们先不介绍ipvsadm工具的使用,我们首先利用nfs建立一个共享存储在搭建一个环境来进行讲解。

3、安装nfs-utilsrpcbind软件包

root@centos2 ~]# yum -y install nfs-utils rpcbind

[root@centos2 ~]# chkconfig nfs on

[root@centos2 ~]# chkconfig rpcbind on

在启动服务时应先启动rpcbind再启动nfs,因为nfs依赖于rpcbind

3.1建立共享目录以及共享目录

[root@centos2 ~]# mkdir /opt/html

vi /etc/exports

/opt/html 192.168.1.0/24(rw,sync,no_root_squash)

第一个字段为共享目录

第二个字段为访问源IP(也就是可以被那些IP地址访问)小括号比分内是权限列表这些IP地址都具有那些权限。

rw具有读写 ro内容只读 sync表示同步写入(内存和硬盘之间同步写入) no_root_squash表示当客户端使用root访问时赋予本地root的权限,当一个目录分配给不同主机时可以使用空格隔开。以下是赋予不同权限的格式(不是我这个共享所需要的格式,这里只是演示)

/opt/html 192.168.1.150(rw) 192.168.1.200(ro)

接下来我们将这两个服务启动

[root@centos2 ~]# service rpcbind start

[root@centos2 ~]# service nfs start

可以通过一下方式验证,查看一下本机的NFS目录

[root@centos2 ~]# showmount -e 127.0.0.1

Export list for 192.168.1.1:

/opt/html 192.168.1.0/24

由于默认的nfs监听端口是动态的,我们无法建立防火墙规则,所以我们通过修改/etc/sysconfig/nfs文件将其端口固定。

vim /etc/sysconfig/nfs

MOUNTD_PORT="825"

STATD_PORT="909"

LOCKD_TCPPORT="4004"

LOCKD_UPPORT="4004"

RQUOTAD_PORT="909"

通过lsof -nPi 查看使用mount需要通过哪些端口

[root@centos2 ~]# lsof -nPi

rpc.mount 1834 root 7u IPv4 15868 0t0 UDP *:825

rpc.mount 1834 root 8u IPv4 15872 0t0 TCP *:825 (LISTEN)

rpc.mount 1834 root 9u IPv6 15876 0t0 UDP *:825

rpc.mount 1834 root 10u IPv6 15880 0t0 TCP *:825 (LISTEN)

可以看出TCP的 825号端口正在监听mount操作,所以我们在防火墙上建立825允许入站的规则

[root@centos2 ~]# iptables -I INPUT -p tcp --dport 825 -j ACCEPT

建立一个测试页到共享目录下

[root@centos2 ~]# echo "test lvs Cluster" > /opt/html/index.html

这样我们的共享存数就搭建完成了,这时我们就可以搭建我们的实验环境了。

三、搭建NET模式的LVS负载均衡群集。

实验拓扑

clip_image007

图3

上图的实验拓扑为NET模式,后面我们会演示DR模式的LVS

我们使用两台web服务器作为节点,一台服务器作为调度器同时作为网关,一台服务器最为存储服务器。其中调度器为双网卡,一个链接互联网,一个链接局域网。

存储我们已经搭建完成了,这里我们就不在搭建了,我们首先将两台web服务器启动,使用nginx服务来搭建web站点,注意防火墙。

1、建立虚拟服务器,提供http的负载均衡并且算法使用轮询(rr)算法

-使用-A新建虚拟服务器 -t 指定监听地址 -s 指定算法

[root@centos1 ~]# ipvsadm -A -t 172.16.16.172:80 -s rr

2、添加节点主机到虚拟服务器中

[root@centos1 ~]# ipvsadm -a -t 172.16.16.172:80 -r 192.168.1.3:80 -m -w 1

[root@centos1 ~]# ipvsadm -a -t 172.16.16.172:80 -r 192.168.1.4:80 -m -w 1

[root@centos1 ~]# service ipvsadm save

[root@centos1 ~]# service ipvsadm start

3、配置节点主机

node_1:192.168.1.3

[root@centos3 ~]# nginx

[root@centos3 ~]# mount 192.168.1.2:/opt/html /var/www/html/

[root@centos3 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT

node_1:192.168.1.4

[root@centos4 ~]# nginx

[root@centos4 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT

4、配置NAT转发规则并且配置防火墙规则

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

[root@centos1 ~]# sysctl -p

[root@centos1 ~]# iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -o eht1 -j SNAT - -to 172.16.16.172

[root@centos1 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT

[root@centos1 ~]# iptables -I INPUT -p tcp --sport 80 -j ACCEPT

[root@centos1 ~]# service iptables save

5、客户端测试

clip_image009

图4

clip_image011

图5

上面的结果证明我们已经测试成功了。

这就是NAT模式的配置,比较简单但是在实际生产环境下应用的不多,只适合一些小型企业

这里我在来介绍一下ipvsadm工具的选项

ipvsadm

-A 创建虚拟服务器

-t 指定群集IP地址

-r添加节点服务器

-s 指定算法 rr 轮询 wrr 加权轮询 lc 最少连接 wlc 加权最少连接

-m 指定为NAT模式

-g 指定为DR模式

-i 指定为TUN模式

-w 指定权重

-l 列出服务器池内各节点状态

-c 列出详细的访问信息

-v 输出ipvsadm版本信息

NAT模式的lvs总结的来所他的原理就是:调度器收到来自客户端的请求将目标地址改为节点服务器的IP地址,节点服务器在应答时直接应答给客户端目标地址为客户端的IP地址,但是由于是NAT模式所以调度器也就成为了节点服务器的唯一出口。

三、直接路由模式

1、准备环境

在DR模式群集中,LVS仅负责作为客户端访问的入口,并不作为服务器节点应答的出口。服务器池中内每台节点都各自接入Internet,发送给客户端的应答不需要经过LVS负载调度器,如下图所示

clip_image013

图6

这里我们IP地址都使用共有地址网段来体现,服务器节点采用双网卡,一块用于应答客户端请求,一块连接共享存储,在实际的生产环境下,可以连接一台交换机。在实际生产环境下一般我们会采用服务器节点都是私有地址,而通过路由器转换为公网IP这样就不会增加成本了。

这种方式入站,出站的数据包被分别处理,由于在服务器池中的节点主机应答客户端时,需要使用群集的IP地址应答,所以还需要在各个节点中的lo网卡中配置一个虚拟网卡,并且子网掩码为32位。

2、配置负载调度器。

现在的网络环境,与前面的网络环境不同,也就是另外一个实验环境,我们重新开始搭建。

1)加载ip_vs模块并安装ipvsadm工具

[root@centos1 ~]# modprobe ip_vs

[root@centos1 ~]# yum -y install ipvsadm

2)配置群集IP地址(配置在eth0的虚拟接口eth0:0

[root@centos1 ~]# cd /etc/sysconfig/network-scripts/

[root@centos1 network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0

[root@centos1 network-scripts]# vim ifcfg-eth0:0

DEVICE=eth0:0

TYPE=Ethernet

UUID=342c9eb9-6125-43a7-94be-729c5cb1d96d

ONBOOT=yes

NM_CONTROLLED=yes

BOOTPROTO=none

IPADDR=172.16.16.172

NETMASK=255.255.255.0

[root@centos1 ~]# service network restart

3)调整内核参数

对于DR群集模式来说,由于LVS负载调度器和各个节点公用一个VIP,应该关闭内核的重定向功能也就是管理ICMP重定向报文

[root@centos1 ~]# vim /etc/sysctl.conf

net.ipv4.conf.all.send_redirects = 0

net.ipv4.conf.default.send_redirects = 0

net.ipv4.conf.eth0.send_redirects = 0

[root@centos1 ~]# sysctl -p

4)配置负载平衡策略

[root@centos1 ~]# service ipvsadm stop //清除原有策略

[root@centos1 ~]# ipvsadm -A -t 172.16.16.172:80 -s wrr

[root@centos1 ~]# ipvsadm -a -t 172.16.16.172:80 -r 172.16.16.177:80 -g -w 1

[root@centos1 ~]# ipvsadm -a -t 172.16.16.172:80 -r 172.16.16.178:80 -g -w 1

[root@centos1 ~]# service ipvsadm save

5)配置防火墙

[root@centos1 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT

2、配置服务器节点

使用DR模式时,节点服务器也需要配置VIP地址,因为客户端请求的是群集IP地址,目标MAC地址是LVS的,节点服务器回应时应该以群集IP回应,否则客户端不能成功接收。还需要调整内核的ARP响应参数阻止更新VIP的MAC地址,因为客户端在发送ARP请求的时候IP地址是群集地址,这是所有的节点都配置了VIP这时客户端的ARP缓存内就会出现多条重复的IP单丝对用的MAC地址确不相同,这回导致客户端无法正确找到调度器。

1172.16.16.177 配置虚拟VIP地址 (多台几点之间配置一样)

在每个节点上,同样需要配置VIP地址172.16.16.172,但此地址只作为发送web响应的源地址,并不需要监听客户端的访问请求,因此使用lo:0来承载虚拟VIP地址,并添加一条路由记录,将访问VIP的数据包限制在本机,避免通信紊乱

[root@centos4 ~]# cd /etc/sysconfig/network-scripts/

[root@centos4 network-scripts]# cp ifcfg-lo ifcfg-lo:0

[root@centos4 network-scripts]# vim ifcfg-lo:0

DEVICE=lo:0

IPADDR=172.16.16.172

NETMASK=255.255.255.255

ONBOOT=yes

[root@centos4 network-scripts]# ifdown lo

[root@centos4 network-scripts]# ifup lo

[root@centos4 network-scripts]# cd

[root@centos4 ~]# vim /etc/rc.local

/sbin/route add -host 172.16.16.172 dev lo:0

[root@centos4 ~]# route add -host 172.16.16.172 dev eth0 //临时生效

2)调整内核参数

[root@centos4 ~]# vim /etc/sysctl.conf

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

net.ipv4.conf.default.arp_ignore = 1

net.ipv4.conf.default.arp_announce = 2

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

[root@centos4 ~]# sysctl -p

以上配置为忽略ARP更新请求解析其他网卡的MAC以及禁止lo网卡宣告自己的MAC地址

3)配置防火墙

[root@centos4 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT

4)启动HTTP服务

[root@centos4 ~]# service httpd start

3、建立共享存储

[root@centos2 ~]# mkdir /opt/wwwroot

[root@centos2 ~]# vim /etc/exports

/opt/wwwroot 192.168.1.0/24(rw,sync,no_root_squash)

[root@centos2 ~]# service rpcbind restart

[root@centos2 ~]# service nfs start

vim /etc/sysconfig/nfs

将IPTABLES关闭,或者通过修改内核的方式建立防火墙规则,这里我就直接将防火墙关闭。

[root@centos2 ~]# echo "aaaaaaa" > /opt/wwwroot/index.html

4、服务器节点挂在共享存储到/var/www/html

[root@centos4 ~]# mount 192.168.1.250:/opt/wwwroot /var/www/html/

5、测试LVS

clip_image015

图7

clip_image017

图8

可以通过ipvsadm -lnc 查看分配的情况。

今天我们通过以上实验发现了两个问题,一个是调度器的单点故障,第二个就是当摸一个服务器节点出现故障时,调度器并不知道,还会分配任务给出现故障的服务器节点,这样就会出现客户端访问失败的情况,为了避免这样的情况发生,我们在下一次会学习使用keepalived实现调度器的双击热备并且动态添加和删除服务器节点。实现服务器节点的健康检查。

你可能感兴趣的:(技术,服务器,target,blank)