天天看点

Linux LB 集群知识、如何用 LVS 方式实现 LB 集群?lvs方式实现 LB原理部分实践部分

LB负载均衡的目的是为了提高访问的并发性和服务器的性能。实现 LB 的方式主要有软件方式和硬件方式。软件方式实现的软件有LVS工作于传输层、nginx工作于应用层haproxy工作于传输层和应用层硬件方式实现的软件有 BIG-IPF5,A10A10等。这里主要介绍软件方式实现 LB。

lvsLinux Virtual Server,Linux虚拟服务是工作在第四层的一款软件。是工作在内核的netfilter模块上的类似于iptables的工作模型。它是一个前端调度器Director,由它来具体实现负载均衡。它的工作原理如下图

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312451AWYO.png" target="_blank"></a>

几个概念说明

cip请求客户端的 ip 地址。

vip是lvs调度器的 ip 地址通常也是客户端请求服务的的目标 ip 地址。

dip: 是directory和后端 real serveer 之间通信使用的 ip 地址。

rip: 是提供真正服务的real server的 IP 地址。

Director是lvs的前端调度器是ipvs的核心组件。

Real Server: 是后端真正提供服务的服务器。

lvs在内核中是由ipvs实现具体的数据包转发包括软发到后端那个real server、响应报文如何工作在netfilter的INPUT链上在此处决定是否进行数据包的转发。可以使用ipvsadm工具配置 ipvs 规则。

调度算法是在Directory转发集群数包的时候使用的具体算法目的是为了选择哪个后端Real Server服务器。ipvs代码必须提供的调度方法。

如何查看自己的内核是否支持ipvs功能以及支持的算法

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312457bwl0.jpg" target="_blank"></a>

常见的算法有如下

RR: round robin、WRR: weighted 轮询 、加权轮询实现了起点公平。新的连接请求被轮流分配至各RealServer算法的优点是其简洁性它无需记录当前所有连接的状态所以它是一种无状态调度。轮叫调度算法假设所有服务器处理性能均相同不管服务器的当前连接数和响应速度。该算法相对简单不适用于服务器组中处理性能不一的情况而且当请求服务时间变化比较大时轮叫调度算法容易导致服务器间的负载不平衡

SHSource Hash 源地址hash,目的是session保持。意义来源于同一源地址的CIP请求会被定向到同一RS。它根据请求的源IP地址作为散列键Hash Key从静态分配的散列表找出对应的服务器若该服务器是可用的且未超载将请求发送到该服务器否则返回空。它采用的散列函数与目标地址散列调度算法的相同。除了将请求的目标IP地址换成请求的源IP地址外它的算法流程与目标地址散列调度算法的基本相似。在实际应用中源地址散列调度和目标地址散列调度可以结合使用在防火墙集群中它们可以保证整个系统的唯一出入口。

DH: Destination Hash 目标地址Hash。是针对目标IP地址的负载均衡但它是一种静态映射算法通过一个散列Hash函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址作为散列键Hash Key从静态分配的散列表找出对应的服务器若该服务器是可用的且未超载将请求发送到该服务器否则返回空。

LC: Least Connection 最少连接 如何监控一般情况是根据tcp协议的计数等相关信息判断

    Overhead = Active * 256 + Inactive 表示负载情况越小说明负载越小,会优先选择

WLC: weigthed

    Overhead = (Active * 256 + Inactive)/weight 默认机制

SED: shortest expection dalay 最短期望连接

    Overhead = (Actived + 1)/weight目的是为了让权重大的优先匹配。问题权重小的可能一直空的。

NQ: Never Quene 工作机制是先每一个 Real Server 都请求一次。

LBLC: locality-based Least connection

LBLCR:  Replicated LBLC,带复制的LBLC

工作模型可以这么理解就是 LB 的Real Server接收到报文到底以哪种方式响应给客户端。lvs原生态支持的类型有NAT网络地址转换、DR直接路由、TUN隧道。

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312462fi4T.png" target="_blank"></a>

nat特点      

1、RS使用私有地址网关为DIP       

2、请求和响应都要经过direstor高负载时可能出现单点故障       

3、支持端口映射PNAT意思是director 和 real sever 的服务端口可以不在同一端口。       

4、RS可以使用任何操作系统

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312474qa5l.png" target="_blank"></a>

DR特点      

1、要保证前端路由将目标地址为VIP的报文统统发往Direstory,而不是RS       

     1) 静态地址绑定在前端路由器上配置一条静态ARP地址解析将vip地址和DIP的MAC地址绑定。       

     2arptables   在realserver主机上设置arp解析规则只要收到vip地址的arp解析就不进行解析       

     3)修改RS的内核参数修改内核参数arp_ignore arp_announce实现比解析vip的mac地址       

        此时还要在 Real Server 添加一条静态路由来实现响应报文的源地址是vip

2、RS可以使用私有地址也可以使用公网地址      

3、RS跟Directory必须在同一物理网络中。       

4、请求报文经过Directory,但响应报文必须不经过Directory.       

5、不支持端口映射       

6、RS可以使常见的OS支持arptables       

7、RS的网关不会指向DIP

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_14103124843sqR.png" target="_blank"></a>

TUN特点IP隧道 将IP首部通过IP首部隧道传送      

1、rip,vip,dip全部是公网地址       

2、rs的网关不会指向DIP       

3、不支持端口映射       

4、请求报文经过Directory,但响应报文必须不经过Directory。       

5、各个real server 必须支持隧道

补充随着互联网的出现了lvs的第四种模型。

FullNat模型是基于NAT模型的扩展可实现局域网内可以有子网的情况。实现方式同时修改请求报文的源地址和目标地址。

NAT的优点1)可以隐藏内部rip地址安全2)配置简单

ipvsadm是配置ipvs规则的工具和iptables类似。

常用的用法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

<code># 1、添加集群</code>

<code>ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] \</code>

<code>[--pe persistence_engine]</code>

<code>    </code><code>-A 添加集群  -E 修改集群</code>

<code>    </code><code>-t tcp 协议  -u udpx协议  -f 防火墙标记</code>

<code>    </code><code>service-address:指的是vip的地址</code>

<code>    </code><code>-s 指明调度算法默认是wlc</code>

<code># 2、删除一个集群服务</code>

<code>ipvsadm -D -t|u|f service-address</code>

<code># 3、清空所有的规则</code>

<code>ipvsadm -C</code>

<code># 4、导入ipvs规则相当于ipvsadm-restore</code>

<code>ipvsadm -R </code>

<code># 5、保存ipvs规则等价于 ipvsadm-save</code>

<code>ipvsadm -S [-n]</code>

<code>#6、将real server 加入到定义好的集群服务中去</code>

<code>ipvsadm -a|e -t|u|f service-address -r server-address [options]</code>

<code>    </code><code>-a -e 添加、修改real server到指定的集群中</code>

<code>    </code><code>-r 指定 real server 的IP地址</code>

<code># 7、删除集群中的指定的real sever</code>

<code>ipvsadm -d -t|u|f service-address -r server-address</code>

<code># 8、查看配置好的 ipvs 规则常与 -n 一起使用</code>

<code>ipvsadm -L|l [options]</code>

常与的option的有

<code>--gatewaying   -g DR模型也是默认的lvs类型gatewaying</code>

<code>--ipip    -i TUN模型  ipip encapsulation (tunneling)</code>

<code>--masquerading -mNAT模型 masquerading (NAT)</code>

<code>-w 指明权重</code>

借助netfilter的mangle将作为集群服务的请求报文打标记在PREROUTING链上完成。这样做的目的后者说是好处是只要是防火墙标记相同的就可以认为同一集群服务。例如在访问web服务时有用http协议的也有用https协议的此时就需要在director处定义2个集群服务这样可以实现功能。但是管理起来不方便防火墙标记就可以解决这样的困扰。

具体做法(例如将http 和 https 服务定义成统一的集群服务)

1)iptables -t mangle -A PREROUTING -d {vip} -p tcp -m mulitport --dports 80 -j MARK --set-mark 10

2)基于mark定义集群服务

   ipvsadm -A -f 10 -s rr

   ipvsadm -a -f 10 -r {rip} -g -w 1

常见的持久连接类型

PCC:持久客户端连接

在基于tcp或udp定义集群服务时其端口为0。表示将来自客户端的所有请求都转发到后端的RS。基于客户端持久连接时来自同一个client的所有请求都被转发到同一RS.

示例ipvsadm -A -t vip:0 -p 60 -p指定持久连接的时间

PPC:持久端口连接

仅针对某一特定的服务启用的持久服务。单服务调度各个集群分开调度。

示例ipvsadm -A -t vip:80 -s rr -p 60

PFM:持久防火墙标记

持久防火墙标记单服务调度。可以通过防火墙标记来定义一个集群的多个端口。

示例ipvsadm -A -f 10 -p 60

实验原理如下实验实现的目标是实现通过访问Director实现Discuz的访问。真正实现的discuz服务地后端的Real Sever从而实现负载均衡的效果。此时就必须要有单独的文件服务器和数据库服务器分别来存储像图片等的非结构数据和像账号、密码等的结构化数据。

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312487gzaW.jpg" target="_blank"></a>

环境

操作系统CentOS 6.5 安装在VMware虚拟机上

配置步骤

在172.16.10.16

<code>一、配置NFS服务器</code>

<code># 1、安装客户端软件</code>

<code>yum </code><code>install</code> <code>-y nfs-utils</code>

<code># 2、提供共享目录</code>

<code>mkdir</code> <code>/data</code>

<code>setfacl -m u:48:rwx </code><code>/data</code> <code>-R (</code><code>id</code><code>为48的用户是rpm方式安装httpd时的apache用户)</code>

<code># vim /etc/exports</code>

<code>/data/</code> <code>172.16.0.0</code><code>/24</code><code>(rw)</code>

<code># 3、启动服务</code>

<code>/etc/init</code><code>.d</code><code>/nfs</code> <code>start</code>

<code># 以后使用 exports -ar</code>

<code>二、安装mysql</code>

<code>#1、安装mysql软件这里使用rpm安装</code>

<code>yum </code><code>install</code> <code>mysql mysql-sever -y</code>

<code># 2、初始化数据库这里不再详细说明</code>

<code># 3、授权用户</code>

<code>mysql&gt; CREATE DATABASE discuz;</code>

<code>mysql&gt; GRANT ALL ON discuz.* TO discuz@</code><code>'172.16.%.%'</code> <code>IDENTIFIED BY </code><code>'123456'</code><code>;</code>

在172.16.10.22

<code>一、配置ip地址和网关信息</code>

<code># 临时配置</code>

<code>ifconfig eth0 172.16.10.22/16 up</code>

<code>route add </code><code>default</code> <code>gw 172.16.10.9</code>

<code># 也可使用永久配置如下</code>

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_14103124897XGh.jpg" target="_blank"></a>

<code>二、部署discuz服务</code>

<code># 1、安装软件</code>

<code>yum </code><code>install</code> <code>httpd php php-mysql </code>

<code># 2、挂载NFS服务</code>

<code>mount</code> <code>-t nfs 172.16.10.16:</code><code>/data</code> <code>/var/www/html</code>

<code># 解压 discuz 源代码将解压后的upload目录复制到此目录</code>

<code>cp</code> <code>upload </code><code>/var/www/html</code> <code>-r</code>

<code># 修改属主属组</code>

<code>chown</code> <code>apache.apache </code><code>/var/www/html/upload</code> <code>-R</code>

<code># 3、安装discuz</code>

<code># 不在详述安装时需要注意编码问题和数据库连接时的问题。其他可根据提示解决。</code>

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312492GboG.jpg" target="_blank"></a>

在172.16.10.33 

在172.16.10.33可参照172.16.10.22步骤可完成。

在Director 上172.16.10.9 192.168.1.66

<code># 配置ipvs规则</code>

<code>ipvsadm -A -t 192.168.1.66:80 -s rr</code>

<code>ipvsadm -a -t 192.168.1.66:80 -r 172.16.10.22:80 -m -w 1</code>

<code>ipvsadm -a -t 192.168.1.66:80  -r 172.16.10.33:80 -m -w 1</code>

注意real sever和director的172.16.10.9属于同一局域网中在VMware中可以使用如下方式配置

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312496sZDG.jpg" target="_blank"></a>

配置完成验证结果

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_14103124994VlL.jpg" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312503JXm3.jpg" target="_blank"></a>

实验原理图如下实现的目标是web服务。

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312507oSrx.png" target="_blank"></a>

解释

arp_announce:如何通告本地地址

    0表示有arp请求时会通告本机所有网卡的mac地址。 默认

    2 表示仅通过网络直连的接口的地址

arp_ignore:表示如何响应接收到的arp请求

    0 表示请求的地址可以通过其他网卡响应  默认。

    1 表示仅在请求的地址必须在请求报文接口进行响应

在172.16.10.33中

<code>ifconfig</code> <code>eth0 172.16.10.22</code><code>/16</code> <code>up </code><code># 这个也可以写到配置文件</code>

<code>echo</code> <code>1 &gt; </code><code>/proc/sys/net/ipv4/conf/lo/arp_ignore</code>

<code>echo</code> <code>1 &gt; </code><code>/proc/sys/net/ipv4/conf/all/arp_ignore</code>

<code>echo</code> <code>2 &gt; </code><code>/proc/sys/net/ipv4/conf/lo/arp_announce</code>

<code>echo</code> <code>2 &gt; </code><code>/proc/sys/net/ipv4/conf/all/arp_announce</code>

<code>ifconfig</code> <code>lo:0 172.16.10.20 netmask 255.255.255.255 broadcast 172.16.10.20</code>

<code>route add -host 172.16.10.20  dev lo:0</code>

在172.16.10.22中

此配置可参照172.16.10.33配置配置基本相同

在Director172.16.10.9 172.16.10.20中

<code>ipvsadm -A -t 172.16.10.20:80 -s rr</code>

<code>ipvsadm -a -t 172.16.10.20:80 -r 172.16.10.22:80 -g -w 1</code>

<code>ipvsadm -a -t 172.16.10.20:80 -r 172.16.10.33:80 -g -w 1</code>

实验结果

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312509niR7.jpg" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312512mRnS.jpg" target="_blank"></a>

实验拓扑图如下,实验实现的目的是:使用防火墙标记实现将80和443端口实现持久连接。

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312518c21H.png" target="_blank"></a>

在192.168.1.201上

1、提供IP地址和网关

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312520LyVE.png" target="_blank"></a>

2、安装软件

httpd软件和mod_ssl软件

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312521KcE6.png" target="_blank"></a>

3、提供测试页面和ssl证书

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312521CNYi.png" target="_blank"></a>

编辑/etc/httpd/conf.d/ssl.conf

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312522Vpm7.png" target="_blank"></a>

4、启动服务即可

在192.168.1.202上

在192.168.1.202上的配置于192.168.1.201类似ip地址和测试页面不同。

在192.168.1.50172.16.0.50上

<code>iptables -t mangle -A PREROUTING -d 172.16.0.50 -p tcp -m multiport \</code>

<code>--dports 80,443 -j MARK --</code><code>set</code><code>-mark 10</code>

<code>ipvsadm -A -j 10 -s rr</code>

<code>ipvsadm -a -f 10 -r 192.168.1.201 -m</code>

<code>ipvsadm -a -f 10 -r 192.168.1.202 -m</code>

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312523UrtR.png" target="_blank"></a>

补充说明

结果说明

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312524yPYA.png" target="_blank"></a>

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312530iWNu.png" target="_blank"></a>

此时只需要修改ipvs的规则如下

<code>ipvsadm -A -f 10 -s rr -p 60</code>

<code>ipvsadm -a -f 10 -r 192.168.1.201 -m -w 1 </code>

<code>ipvsadm -a -f 10 -r 192.168.1.202 -m -w 1</code>

此时在访问到一个RealServer时会话会保持一段时间结果如下

<a href="http://guoting.blog.51cto.com/attachment/201409/10/8886857_1410312533zUb5.png" target="_blank"></a>

至此所有配置完成。

本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1550809,如需转载请自行联系原作者

继续阅读