Linux下用lvs软件实现集群

目标:

学会分别使用LVS的NAT(NAT转换),DR(直接路由),TNU(隧道技术)实现linux下服务器的集群

结构:

1. 简单介绍集群的概念

2. lvs实现集群的三种方式

3. lvs十种调度算法

4. ipvsadm的使用方法简介

5. lvs实现集群实验详细步骤

内容:

======================================================================

一.集群概念:

通俗的说集群就是为了完成一些单个计算机不可能完成的或者完成起来很吃力的工作而将多个计算机通过一点的技术连接到一块,但在外界看起来起来还只是一台计算机的技术。用专业术语来说Cluster集群技术将一组相互独立的服务器在网络中表现为单一的系统,并以单一系统的模式加以管理。此单一系统为客户工作站提供高可靠性的服务。大多数模式下,集群中所有的计算机拥有一个共同的名称,集群内任一系统上运行的服务可被所有的网络客户所使用。Cluster必须可以协调管理各分离的组件的错误和失败,并可透明地向Cluster中加入组件。一旦在服务器上安装并运行了群集服务,该服务器即可加入群集。群集化操作可以减少单点故障数量,并且实现了群集化资源的高可用性。下述各节简要介绍了群集创建和群集操作中的节点行为。

目前,越来越多的网站采用Linux操作系统,提供邮件、Web、文件存储、数据库等服务。也有非常多的公司在企业内部网中利用Linux服务器提供这些 服务。随着人们对Linux服务器依赖的加深,对其可靠性、负载能力和计算能力也倍加关注。Linux集群技术应运而生,可以以低廉的成本,很好地满足人们的这些需要。

Linux竞争力很强的原因之一,是它可以运行于极为普及的PC机上,不需要购买昂贵的专用硬件设备。 在几台运行Linux的PC机上,只要加入相应的集群软件,就可以组成具有超强可靠性、负载能力和计算能力的Linux集群。集群中的每台服务器称为一个节点。

===============================

二.集群的分类

按照侧重点的不同,可以把Linux集群分为三类

高可用性集群 HA (High Avaliability)

高可用性集群运行于两个或多个节点上,目的是在系统出现某些故障的情况下,仍能继续对外提供服务。高可用性集群的设计思想就是要最大限度地减少服务中断时间。这类集群中比较著名的有Turbolinux TurboHA、Heartbeat、Kimberlite等。

计算机系统的可用性(availability)是通过系统的可靠性(reliability)和可维护性(maintainability)来度 量的。工程上通常用平均无故障时间(MTTF)来度量系统的可靠性,用平均维修时间(MTTR)来度量系统的可维护性。于是可用性被定义为:

MTTF/(MTTF+MTTR)*100%
业界根据可用性把计算机系统分为如下几类:

可用比例
(Percent Availability)

年停机时间
(downtime/year)

可用性分类

99.5

3.7天

常规系统(Conventional)

99.9

8.8小时

可用系统(Available)

99.99

52.6分钟

高可用系统(Highly Available)

99.999

5.3分钟

Fault Resilient

99.9999

32秒

Fault Tolerant

表1. 系统可用性分类
对于关键业务,停机通常是灾难性的。因为停机带来的损失也是巨大的。下面的统计数字列举了不同类型企业应用系统停 机所带来的损失。

应用系统

每分钟损失(美元)

呼叫中心(Call Center)

27000

企业资源计划(ERP)系统

13000

供应链管理(SCM)系统

11000

电子商务(eCommerce)系统

10000

客户服务(Customer Service Center)系统

27000

表 2. 停机给企业带来的损失
随着企业越来越依赖于信息技术,由于系统停机而带来的损失也越拉越大。

负载均衡集群 LB (Load Balaceing)

负载均衡集群目的是提供和节点个数成正比的负载能力,这种集群很适合提供大访问 量的Web服务。负载均衡集群往往也具有一定的高可用性特点。Turbolinux Cluster Server、Linux Virtual Server(LVS)都属于负载均衡集群。另一类是超级计算集群,按照计算关联程度的不同,又可以分为两种。一种是任务片方式,要把计算任务分成任务片,再把任务 片分配给各节点,在各节点上分别计算后再把结果汇总,生成最终计算结果。另一种是并行计算方式,节点之间在计算过程中大量地交换数据,可以进行具有强耦合关系的计算。这两种超级计算集群分别适用于不同类型的数据处理工作。有了超级计算集群软件,企业利用若干台PC机就可以完成通常只有超级计算机才能完成的 计算任务。这类软件有Turbolinux EnFusion、SCore等。

高可用性和负载均衡集群的区别:

高可用性集群与负载均衡集群的工作原理不同,适用于不同类型的服务。通常,负载均衡集群适用于提供静态数据的服务,如HTTP服务;而高可用性集群既适用于提供静态数据的服务,如HTTP服务,又适用于提供 动态数据的服务,如数据库等。高可用性集群之所以能适用于提供动态数据的服务,是由于节点共享同一存储介质,如RAIDBox。也就是说,在高可用性集群 内,每种服务的用户数据只有一份,存储在共用存储设备上,在任一时刻只有一个节点能读写这份数据。

以Turbolinux TurboHA为例,集群中有两个节点A和B,设这个集群只提供Oracle服务,用户数据存放于共用存储设备的分区/dev/sdb3上。在正常状态 下,节点A提供Oracle数据库服务,分区/dev/sdb3被节点A加载在/mnt/oracle上。当系统出现某种故障并被TurboHA软件检测 到时,TurboHA会将Oracle服务停止,并把分区/dev/sdb3卸载。之后,节点B上的TurboHA软件将在节点B上加载该分区,并启动 Oracle服务。对于Oracle服务有一个虚拟的IP地址,当Oracle服务从节点A切换到节点B上时,虚拟的IP地址也会随之绑定到节点B上,因此用户仍可访问此服务。

由以上分析可以看出, 负载均衡集群适用于提供相对静态的数据的服务,比如HTTP服务。因 为通常负载均衡集群的各节点间通常没有共用的存储介质,用户数据被复制成多份,存放于每一个提供该项服务的节点上。

高性能计算集群 HP (High perfomancing)

高可用性集群对一种服务而言不具有负载均衡功能,它可以提高整个系统的可靠性,但不能增加负载的能力。当然,高可用性集群可以运行多种服务,并适当分配在不同节点上,比如节点A提供Oracle服务,同时节点B提供Sybase服务,这也可以看成是某种意义上的负载均衡,不过这是对多种服务的分配而言。 简单的说,高性能计算(High-Performance Computing)是计算机科的一个分支,它致力于开发超级计算机,研究并行算法和开发相关软件。高性能计算主要研究如下两类问题:

大规模科学问题,象天气预报、地形分析和生物制药等;
存储和处理海量数据,象数据挖掘、图象处理和基因测序;
顾名思义,高性能集 群就是采用集群技术来研究高性能计算。

=======================================

三. linux下LVS软件实现集群

Linux 下实现服务器集群的方法有很多种,下面我们主要探讨通过LVS软件来实现linux下服务器的集群.我们有必要简单提下下我们LVS的开源始祖章文嵩。他是内地唯一对开源linux作出卓绝贡献,将LVS嵌入到linux内核中的中国人,有兴趣的可以自己去Google下了。

下面这幅图就是我们lvs 的架构图,我们需要了解以下几个概念:

clip_image002

Dip(Director's IP address)

vip(Virtual IP address)

cip(Client computer's IP address)

rip(Real IP address)

LVS工作原理:

如图所示的就是我们LVS的一个构架图。LVS的工作原理很类似于iptables和netfilter之间的工作方式。我们通过向ipvs中写规则来过滤数据流,从而达到分发控制数据流向,均衡服务器负载的目的:当client来访问服务器时,其目标IP是director分发器的对外网声明的一个viretual ip地址,当director接收到请求后通过自己的真实director ip将请求传递给内网的real server,client实际访问的是real server上的服务,director只是起到一个分发任务给内网各服务器的作用。这里我们需要声明的是linux 2.4.26版本往后的版本都将lvs技术直接嵌入的内核中,我们直接可以使用。

LVS中ipvs的实现:

clip_image004

和iptables一样,它也是通过这五个钩子函数来实现数据的过滤。因此它和iptables是相互冲突的,两者不能同时共存于系统。过程:

① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。

② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。

③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图10-4所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出

============================================

基于ipvs来实现虚拟服务主要有以下三种技术:

1. 通过NAT实现虚拟服务器(L VS/NAT

clip_image005

特点:

1.IP DIP必须在同一网段,而且必须为私有地址

2.IP为RIP的default gateway

3.irector很容易会成为整个网络的瓶颈点

4.IP可支持端口映射

2通过直接路由实现虚拟服务器(LVS/DR

clip_image006

特点:

1.RIP DIP必须在同一网段,都不必是私有地址,

2.IP直接给CIP回复,directory只需要处理请求数据,这样的工作效率将成倍的提高,解决了LVM-NAT的瓶颈问题。不能进行端口映射

3.IP不支持端口映射。服务必须使用默认的端口

4.理员可以直接通过Internet连接到RIP对服务器进行配置。但这里同时也存在着来自Internet的网络安全隐患

3.通过IP隧道实现虚拟服务器(LVS/TUN

clip_image008

特点:

1.IP DIP 都必须为公网地址,DIP RIP之间数据通过网络Internet传送。因此directory和server可以不再同一个网段,可以跨越地区,其他的都和LVM-DR形式的一样,

LVM scheduling Methods

2.因为其耗资源,投资较大,在实际应用中并不常用。这里不做详细介绍。

======================================================================

LVS的调度方法:

-s 指定服务采用的算法,常用的算法参数如下:

Fixed echeduling(rr wrr dh sh)===========静态调度方法

1. 轮叫 Round-robin (RR)

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

2. 加权轮叫 Weithted round-robin (WRR)

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

3. 目标地址散列 Destination hashing (DH)

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

4. 源地址散列 Source hash (SH)

"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
Dynamic Scheduling (lc wlc sed nq lblc lblcr)=====动态调度方法

其算法是:活动链接数x256+非活动链接数 将client请求分给数值小的服务器。

1. 最少链接 Least-connect (LC)

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

2. 加权最少链接 Weighted least-connection (WLC) (Default)

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

3. 最短期望连接Shortest Expected delay(SED)

对wlc的改进,在wlc算法的基础上给权重值加一,主要用来针对某个服务器活动链接数值为0情况

4. 从不排队Never Quene(NQ)

基于SED算法的改进,不排队

5. 基于局部性的最少链接locality-based least-connection (LBLC)

基于局部的最少连接

6. 带复制的基于局部性最少链接 Locality-Based Least Connectionswith Replication (LBLCR)

四. IPVS命令的用法:

===================================================================

IPVS命令用法:

ipvsadm 的用法和格式如下:ipvsadm -A|E -t|u|f virutal-service-address:port [-s scheduler] [-p [timeout]] [-M netmask] ipvsadm -D -t|u|f virtual-service-address ipvsadm -C ipvsadm -R ipvsadm -S [-n] ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight] ipvsadm -d -t|u|f service-address -r server-address ipvsadm -L|l [options] ipvsadm -Z [-t|u|f service-address] ipvsadm ——set tcp tcpfin udp ipvsadm ——start-daemon state [——mcast-interface interface] ipvsadm ——stop-daemon ipvsadm -h命令选项解释:有两种命令选项格式,长的和短的,具有相同的意思。在实际使用时,两种都可以。
-A ——add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。
-E ——edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D ——delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C ——clear 清除内核虚拟服务器表中的所有记录。
-R ——restore 恢复虚拟服务器规则

-S ——save 保存虚拟服务器规则,输出为-R 选项可读的格式

-a ——add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器

-e ——edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录

-d ——delete-server 删除一条虚拟服务器记录中的某条真实服务器记录

-L|-l ——list 显示内核虚拟服务器表

-Z ——zero 虚拟服务表计数器清零(清空当前的连接数量等)
——set tcp tcpfin udp 设置连接超时值

——start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup.在这个功能上也可以采用keepalived 的VRRP 功能。
——stop-daemon 停止同步守护进程

-h ——help 显示帮助信息其他的选项:-t ——tcp-service service-address 说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port] -u ——udp-service service-address 说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port] -f ——fwmark-service fwmark 说明是经过iptables 标记过的服务类型。
-s ——scheduler scheduler 使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc. -p ——persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。
-M ——netmask netmask persistent granularity mask

-r ——real-server server-address 真实的服务器[Real-Server:port]

-g ——gatewaying 指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)
-i ——ipip 指定LVS 的工作模式为隧道模式-m ——masquerading 指定LVS 的工作模式为NAT 模式-w ——weight weight 真实服务器的权值——mcast-interface interface 指定组播的同步接口-c ——connection 显示LVS 目前的连接 如:ipvsadm -L -c——timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L ——timeout——daemon 显示同步守护进程状态——stats 显示统计信息——rate 显示速率信息——sort 对虚拟服务器和真实服务器排序输出——numeric -n 输出IP 地址和端口的数字形式

============================================================================================================================================

五.实验

++++++++++++++++++++++++++++++++++++++++++++++++++++

一.通过NAT实现虚拟服务器(L VS/NAT实验环境:

实验环境:

Client: CIP:10.0.0.5/24

Director:VIP:10.0.0.1/24

DIP:192.168.0.1/24

Realserver1: RIP:192.168.0.222/24

Realserver2: RIP:192.168.0.223/24

实验拓扑图:

clip_image009

IPVS配置

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

[root@node2 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

[root@node2 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

[root@node2 ~]# cat /proc/sys/net/ipv4/ip_forward

1

[root@node2 ~]# service iptables stop

[root@node2 ~]# ipvsadm -A -t 10.0.0.1:80 -s rr

[root@node2 ~]# ipvsadm -a -t 10.0.0.1:80 -r 192.168.0.222:80 -m

[root@node2 ~]# ipvsadm -a -t 10.0.0.1:80 -r 192.168.0.223:80 -m

[root@node2 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 10.0.0.1:80 rr

-> 192.168.0.223:80 Masq 1 0 0

-> 192.168.0.222:80 Masq 1 0 0

realserver1和realserver2配置

[root@station7 html]# yum install httpd –y

[root@station7 html]#service httpd restart

注意:

需配置网关,分别指向director内网地址

在client测试(轮显如下realserver上的服务):

clip_image011

clip_image013

小结:

1. RIP和DIP必须在同一网段,并且都是私有地址。

2. RIP网关需指向DIP,否则无法成功的。

3.Director的防火墙需要关闭

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

二.通过直接路由实现虚拟服务器(LVS/DR

实验环境:

Client: CIP:192.168.0.100/24

Director:VIP:192.168.0.210/32(条件限制我们这里用同一网段地址)

DIP:192.168.0.1/24

Realserver1: RIP:192.168.0.222/24 VIP:192.168.0.210/32

Realserver2: RIP:192.168.0.223/24 VIP:192.168.0.210/32

这里需要接触到VIP隐藏,参加《LVS中VIP隐藏的实现》篇

实验拓扑图:

clip_image014

IPVS配置:

[root@node2 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

[root@node2 ~]# cat /proc/sys/net/ipv4/ip_forward

1

[root@node2 ~]# route add -host 192.168.0.210 dev eth0

[root@node2 ~]# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

192.168.0.210 * 255.255.255.255 UH 0 0 0 eth0

192.168.0.0 * 255.255.255.0 U 0 0 0 eth1

169.254.0.0 * 255.255.0.0 U 0 0 0 eth1

[root@node2 ~]# ipvsadm -C

[root@node2 ~]# ipvsadm -A -t 192.168.0.210:80 -s wlc

[root@node2 ~]# ipvsadm -a -t 192.168.0.210:80 -r 192.168.0.222 -w 1 -g

[root@node2 ~]# ipvsadm -a -t 192.168.0.210:80 -r 192.168.0.223 -w 3 -g

[root@node2 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.0.210:80 wlc

-> 192.168.0.223:80 Route 3 0 0

-> 192.168.0.222:80 Route 1 0 0

realserver1realserver2配置两者一样:

[root@station7 html]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

[root@station7 html]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

[root@station7 html]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

[root@station7 html]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

[root@station7 html]# ifconfig lo: 192.168.0.210 broadcast 192.168.0.210 netmask 255.255.255.255 up

[root@station7 html]# route add -host 192.168.0.210 dev lo:0

[root@station7 html]# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

192.168.0.210 0.0.0.0 255.255.255.255 UH 0 0 0 lo

192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0

在客户端我们地址栏我们输入http://192.168.0.210会轮显realserver

clip_image013[1]

clip_image011[1]

以上知识仅为集群的一些基础知识。在下篇我们一起来学习实际应用中集群的应用

1.LVS中隐藏IP的实现

2.iptables标记

3.HA高可用性集群 heartbeat

4.ldirectord解决主备节点“脑裂”问题

5.drbd和 mon应用