Chinaunix首页 | 论坛 | 博客
  • 博客访问: 450235
  • 博文数量: 112
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1085
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-15 09:42
个人简介

上善若水,不浮不沉!

文章存档

2021年(2)

2020年(3)

2018年(2)

2017年(1)

2016年(8)

2015年(11)

2014年(57)

2013年(28)

我的朋友

分类: LINUX

2014-01-22 15:11:08

首先我们要了解LVS的工作机制:

LVS里Director本身不响应请求,只是接受转发请求到后方,Realservers才是后台真正响应请求。

LVS 工作原理基本类似DNAT,又不完全相像,它是一种四层交换,默认情况下来通过用户请求的的地址和端口,来判断用户的请求,从而转发到后台真正提供服务的主机,而判断这种请求的是通过套接字来实现,所以四层就可以实现。而且这个转发的过程对用户而言是透明的(简单的讲,就是用户访问的是DR的IP,而DR转发给RSS,而用户不知道这个过程)

LVS的工作模式:

1.DNAT

2.直接路由

3.隧道

提供的优点:

1.高并发

2.高冗余

3.适用性,扩展服务器,缩减服务器,方便服务器扩展和收缩

LVS 的IP地址类型

1.VIP:虚拟IP地址,并不提供服务,而是将用户的请求转发到后方

2 RIP:真正IP地址,客户端真正提供服务的IP地址

3.DIP:调度IP地址,通常是和RIP相连的LVS的IP地址

4.CIP:客户端IP地址,用户请求时,用户的IP

流程:如下图


LVS的工作原理和相关算法 - zhuzhu - 五事九思 (大连Linux主机维护)
 

===============================分 割 线==============================

LVS集群的类型:

1.LVS-NAT DNAT

2.LVS-DR 直接路由

3.LVS-TUN 隧道


下面我们详细说明这三种类型:


LVS-NAT模型原理


LVS的工作原理和相关算法 - zhuzhu - 五事九思 (大连Linux主机维护)
 

用户的请求和响应都需要经过Director

源地址,目标地址都需要经过转换,而目标地址转换是透明的

这种架构的扩展有限调度器,Director将处理所有的请求,压力比较大,扩展到10个结点就不行了


要求:

1.集群节点必须在同一个物理网络中,同一个子网或者VLAN

2.DIP和RIP只能在同一个网络(子网)中,不能跨越网段

3.RIP地址通常是私有地址

4.所有的RIP,必须以DIP为网关(地址转换)

5.NAT的地址可以做端口转换(比如80--à8080)

6.任何操作系统都可以做RIP

7.Director有可能成为整个系统的瓶颈


LVS的工作原理和相关算法 - zhuzhu - 五事九思 (大连Linux主机维护)
 

数据传输:

通过二层(数据链路层)转发(ARP)将DR的MAC地址转换成RIP的MAC地址(不是转变,而是转发),这样就实现了数据的传输,在RSS响应后,再将RSS的MAC地址转换成RIP的MAC地址。


===============================分 割 线==============================

LVS-DR模型原理


LVS的工作原理和相关算法 - zhuzhu - 五事九思 (大连Linux主机维护)
 

用户的请求必须经过Director,而realserver在响应的使用直接返回请求(图有问题,有可能设的网关不同,还存在一台路由器)

需要配置iptables规则,拒绝响应MAC地址转换,或者通过修改LINUX内核响应

优点:由于它比NAT少了一个地址转换,响应速度更快

特点

1.必须处于同一个物理网络中(连在同一个交换机上)

2.RIP可以使用公网地址(建议使用)

3.Director只转发请求,而realserver直接响应请求而不转发

4.集群节点的网关,不能指向DIP

5.不能做端口转换(不支持)

6.绝大多数的操作系统都可以实现realserver,而realserver需要同一个网卡配置多个Ip地址

7.DR模式的Director比NAT模式能够带动更多的节点


LVS的工作原理和相关算法 - zhuzhu - 五事九思 (大连Linux主机维护)
 

数据传输:

解决数据进入:

为了避免RS直接响应,给服务器的lo:0设置VIP地址,给本地网卡设置成CIP,这样RS就不会直接响应了,隐藏了RS

解决数据出去:

而默认情况下,Linux设置数据包从哪块网卡出去,源地址设为该网卡地址,通过添加一条特殊路由信息,如果目标地址是lo的VIP地址,那么出去的时候源地址设置为lo的地址。

路由信息的原理:

添加一条主机路由,将VIP的地址自己设置成一个网段,既子网掩码为255.255.255.255,这样VIP出去的时候没有比VIP更优的了,就成为最佳IP


在互联网上性能最佳的就是DR应用,但是有一个缺点,必须要求主机间距离比较近(比如一个机房),如果发生天灾人祸,集群就完了,所以我们为了实现异地分布,要采用隧道比如VPN

===============================分 割 线==============================

LVS-TUN模型原理:

虚拟隧道实现:

1.专线(加密)

2.二层:在MAC之外再加一层MAC

3.三层:源IP目标IP之外再加一层IP

隧道目的: 隐藏意图,通过转换来(ip套ip)隐藏目的


LVS的工作原理和相关算法 - zhuzhu - 五事九思 (大连Linux主机维护)
 

特征:

1.集群节点和Director不必在同一个网络

2.RIP必须使用公网地址

3.Director只需要处理进来的请求,不需要处理出去的请求

4.响应的请求一定不能经过Direcor.

5.Directory不支持端口映射

6.只能使用那些支持IP 隧道协议的操作系统做realserver

优点:LVS-TUN可以实现基于网络的集群,这样就脱离了LVS-DR的realserver之间的距离限制。


LVS的工作原理和相关算法 - zhuzhu - 五事九思 (大连Linux主机维护)
 

===============================分 割 线==============================

LVS的负载均衡要依赖算法(Scheduling methods :调度方法)来实现,根据特点它们分为如下两类:

1.fiexd scheduling 静态(固定)

2.dnamic scheduling 动态


FIEXD SCHEDULING静态算法


特点:不考虑后端realserver的连接状态,而动态的要考虑后端的链接数为标准

1. Round-robin (RR) 轮询

既第一次访问A,第二次访问B,第三次再访问A…..循环下去


2. Weighted Round-Robin WRR

加强论调:提高后台服务器的响应能力

根据后方服务器的响应能力,来定义权重,根据权重来转发请求,权重大的优先访问


3.Destination hashing DH

目的:实现针对目标地址的请求做固定转发

将来自同一个用户的特定请求转发到固定的指定的主机(比如提供web服务),以提高缓存(网页文件缓存)利用率(命中率)。


LVS的工作原理和相关算法 - zhuzhu - 五事九思 (大连Linux主机维护)
 

4.Souce hashing SH

目的:将来自同一个用户的地址,始终转发到router或者firewall

应用场景:


LVS的工作原理和相关算法 - zhuzhu - 五事九思 (大连Linux主机维护)
 

将用户的请求按照平均指定到不同的防火墙,实现平均内网负载,通过特定防火墙(网关)出去(上网)

静态算法的缺陷:不考虑后台real-server的负载,连接状态


动态算法:Dynamic Scheduling Mehtod

这里有两个概念:

活动连接:后台real-server当前处于活动状态(active)和ESTABLISHED state(想关联)的连接,像ssh,或者telnet会一直处于活动状态。

非活动连接:非活动的状态(inactive)或者非FIN的数据包,比如httpd(未开启keepalive), 而httpd除非启用keepalive, 发送完成后直接断开,处于inactive的状态


相关动态算法 :

1. LC least-connection 最少连接

LC同时检查一台主机上的活动连接数和非活动连接数,连接数最少(活动状态的连接数少)的将会接受下一个连接请求。

LC同时考察活动连接和非活动连接,它用活动连接*256+非活动连接作为 overhead 通overhead谁的小,转发给谁

但是非活动链接也会影响连接,当活动连接的比数比较大的时候,会影响结果

2.WLC Weighted Least-Connection 加权最少连接数

加权按照机器的性能划分。Overhead/加权请求要转发给小得那个

加权算法,是集群应用上的最好的算法之一,比较公平


2. SED Shortest Expected Delay 最短延迟

在WLC基础上改进

Overhead = (ACTIVE+1)*256/加权

不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求

+1的目的是为了考虑加权的时候,非活动连接过多

缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态


3.NQ算法永不排队

保证不会有一个主机很空间。SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲

不考虑非活动连接,才用NQ,SED要考虑活动状态连接

对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力



4.LBLC 基于本地的最少连接算法

和DH的区别:考虑后台的负载能力和连接情况

支持权重,它在WLC基础上改进


5.LBLCR 基于本地的带复制的最少连接数

是对LBLC的一个改进,能够在LBLC的基础上实现负载均衡

判断后端,到底谁的连接少,当A的连接很多,而B的很空闲,会将A的部分连接分配到B上(打破原有规则,避免大范围的不公平)

 
LVS-DR模型实现LVS-Director的高可用集群


项目实践:配置LVS Director(WEB LVS)的HA集群,要求:

1、DR模型;

2、能监控后台RealServer的健康状态;

LVS的工作原理和相关算法 - zhuzhu - 五事九思 (大连Linux主机维护)
 

实现原理:

1)使用LVS-DR模型构建集群实现负载均衡

2)使用heartbeat构建双Director组成HA集群,提高Director的高可用性

3)利用脚本实现检测后台realserver健康状态,当一台服务器发生故障时,自动将其从集群里删除,待恢复后,再加入集群中

4)虚拟IP :172.16.14.1为两台DR想争夺的资源,通过IP的论调来实现HA


主机名规划: 两台DR :DR1,DR2

每台DR配置两块网卡,一块用来连接“提供服务”,一块用来连接“心跳信息”


实现双director组成HA步骤:

1. 配置网卡IP地址信息,都是设置为静态地址

DR1上:

ifconfig eth0 172.16.14.11   
 
vim /etc/sysconfig/network-scripts/ifcfg-eth0  
 
DEVICE=eth0  
 
BOOTPROTO=static  
 
ONBOOT=yes  
 
HWADDR=00:0c:29:43:79:d5  
 
NETMASK=255.255.0.0 
 
IPADDR=172.16.14.11 
 
GATEWAY=172.16.0.1 
 
# 配置心跳信息隧道  
 
ifconfig eth1 192.16.14.11 
 
vim /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1  
 
BOOTPROTO=static  
 
IPADDR=192.168.14.11 
 
NETMASK=255.255.255.0 
 
ONBOOT=yes  
 
HWADDR=00:0c:29:43:79:df  

DR2上同上:

ifconfig eth0 172.16.14.12 
 
vim /etc/sysconfig/network-scripts/ifcfg-eth0  
 
DEVICE=eth0  
 
BOOTPROTO=static  
 
ONBOOT=yes  
 
IPADDR=172.16.14.12 
 
GATEWAY=172.16.0.1 
 
NETMASK=255.255.255.0 
 
HWADDR=00:0c:29:13:c1:e5  
 
vim /etc/sysconfig/network-scripts/ifcfg-eth1  
 
DEVICE=eth1  
 
BOOTPROTO=static  
 
ONBOOT=yes  
 
HWADDR=00:0c:29:13:c1:ef  
 
IPADDR=192.168.14.12 
 
NETMASK=255.255.255.0 
 

2.安装ipvsadm,heartbeat v2 并配置须实现下载好所需软件包到一个文件夹里:

heartbeat-2.1.4-9.el5.i386.rpm heartbeat-pils-2.1.4-10.el5.i386.rpm

heartbeat-devel-2.1.4-9.el5.i386.rpm heartbeat-stonith-2.1.4-10.el5.i386.rpm

heartbeat-gui-2.1.4-9.el5.i386.rpm libnet-1.1.4-3.el5.i386.rpm

DR1 DR2上:

yum localinstall -y -nogpgcheck *.rpm

yum install ipvsadm -y

我们需要手动拷贝heartbeat的配置文件到/etc/ha.d下

cd /etc/ha.d

cd /usr/share/doc/heartbeat-2.1.4/

cp ha.cf haresources authkeys /etc/ha.d

修改主机名称:

hostname node1.a.org

vim /etc/hosts # 添加下面两行

172.16.14.11 node1.a.org node1

172.16.14.12 node2.a.org node2

vim /etc/sysconfig/network #修改network值于主机名对应

HOSTNAME=node1.a.org

配置三个配置文件

cd /etc/ha.d #添加下面的内容

vim ha.cf

node node1.a.org #节点名称,注意要在/etc/hosts里面定义主机名和这个一致

node node2.a.org

bcast eth1 #心跳信息传播网卡

logfile /var/log/ha-log #打开日志文件

vim haresources #配置虚拟IP资源

# HA开启时分配给DR1 自动配置为eth0:0 172.16.14.1/172.16.14.1 并且开启ipvsadm

node1.a.org 172.16.14.1/16/eth0/172.16.14.1 ipvsadm

编辑 authkeys

vim authkeys # 定义心跳传送加密方式和密钥

auth 2

2 sha1 13db1dff9f50c88841f4199457b11091

# 编辑完后要将该文件改为400 或600否则无法启动

chmod 400 authkeys

生成ssh密钥,复制到DR2主机

# 创建key文件

ssh-keygen -t rsa

# 复制到node2上

ssh-copy-id -i .ssh/id_rsa.pub root@node2

以上步骤在DR2上也执行一次,注意IP的变化

3.配置ipvsadm

[root@node1 ha.d]# ipvsadm -A -t 172.16.14.1:80

[root@node1 ha.d]# ipvsadm -a -t 172.16.14.1:80 -r 172.16.14.21

[root@node1 ha.d]# ipvsadm -a -t 172.16.14.1:80 -r 172.16.14.22

[root@node1 ha.d]# ipvsadm -a -t 172.16.14.1:80 -r 172.16.14.23

# 将配置好的表保存在/etc/sysconfig/ipvsadm 这样可以使用ipvsadm脚本来实现DR的控制

ipvsadm -S > /etc/sysconfig/ipvsadm

同样的操作,在DR2上进行一次

4.编写监控脚本,用于监控后台RSS的状态

vim /root/.testrss.sh  
 
#!/bin/bash  
 
# This script is used to test the RSS's status and take some action when it down  
 
# 定义一个数组来存放DIP信息  
 
declare -a DIP=(  
 
172.16.14.21 
 
172.16.14.22 
 
172.16.14.23)  
 
SERVICE='-t 172.16.14.1:80' # 定义ipvsadm添加的主条目  
 
MAILBOX=root@a.org # 定义管理员邮件地址  
 
# 函数RSMON的作用是监控整个后台的RSS,某一台当机后,将其从集群表中删除,恢复后,将其加入集群  
 
RSMON() {  
 
local TEST=`elinks -dump $1/.test.html 2> /dev/null |tr 'a-z' 'A-Z' |grep OK`  
 
if [ "$TEST" = 'OK' ];then  
 
ipvsadm -Ln |grep $1 || ipvsadm -a $SERVICE -r $1 -g -w $W  
 
else 
 
sleep 1 
 
local TEST=`elinks -dump $1/.test.html 2> /dev/null |tr 'a-z' 'A-Z' |grep OK`  
 
if [ "$TEST" != 'OK' ]; then  
 
ipvsadm -Ln |grep $1 && ipvsadm -d $SERVICE -r $1  &&  
 
echo "The Host $1 is failure." |mail -s "$1 failure." $MAILBOX  
 
fi  
 
fi  
 
}  
 
# 定义死循环,每5秒执行一次上面的函数  
 
while true;do  
 
for myIP in ${DIP[*]};do  
 
W=`ipvsadm -Ln |grep $myIP |awk '{print $4}'`  
 
RSMON $myIP  
 
done  
 
sleep 5 
 
done  

# 将该脚本的路径添加到ipvsadm的启动脚本里

vim /etc/init.d/ipvsadm

# 在start的最后一行添加

/root/.testrss.sh &

# 在stop的最后一行添加

killall testrss.sh

拷贝两个脚本到DR2上

[root@node1 ha.d]# cd /etc/init.d/

[root@node1 init.d]# scp /root/.testrss.sh ipvsadm node2:/etc/init.d/

这样就实现了HA的两个DR节点在抢夺资源的时候,开启ipvsadm服务的同时,启动监控脚本,项目目标达成。


heartbeat+ldirector 构建高可用LVS-DR集群

heartbeat+ldirector 构建高可用LVS-DR集群

上篇文章实现了,脚本自动化管理LVS-DR集群,现在我们通过heartbeat的一个插件ldriector来实现项目功能。(上篇文章链接:)

项目实践:配置LVS Director(WEB LVS)的HA集群,要求:

1、DR模型;

2、能监控后台RealServer的健康状态;


LVS的工作原理和相关算法 - zhuzhu - 五事九思 (大连Linux主机维护)
 

相关网卡配置见上篇文章,这里只说明ldrictor的使用。


1安装

需要准备的软件包(已经安装过heartbeat v2):

perl-MaliTools heartbeat-ldirectored

将其放在一个文件夹

yum --nogpgcheck localinstall *.rpm

2.复制ld的配置文件到/etc/ha.d

[root@node1 /]# cd /usr/share/doc/heartbeat-ldirectord-2.1.4/

[root@node1 heartbeat-ldirectord-2.1.4]# ls

COPYING ldirectord.cf README

[root@node1 heartbeat-ldirectord-2.1.4]# cp ldirectord.cf /etc/ha.d/

[root@node1 heartbeat-ldirectord-2.1.4]# cd /etc/ha.d/

[root@node1 ha.d]# ls

authkeys harc ldirectord.cf README.config shellfuncs

ha.cf haresources rc.d resource.d

只需要把LVS需要定义的集群定义到/etc/ha.d/ldirector.cf,不需要ipvsadm来实现


3.修改 ldirector

vim ldirector.cf


# 修改配置文件,只启用如下内容  

 

checktimeout=10 

 

# ldirectord等待Realserver健康检查完成的时间,单位为秒;  

 

# 任何原因的检查错误或超过此时间限制,ldirector将会将此Realserver从IPVS表中移除;  

 

checkinterval=2 

 

autoreload=yes  

 

# 此项用来定义ldirectord是否定期每隔一段时间检查此配置文件是否发生改变并自动重新加载此文件;  

 

logfile="/var/log/ldirectord.log" 

 

# 定义日志文件存放位置;  

 

quiescent=yes  

 

# 当某台Realserver出现异常,此项可将其设置为静默状态(即其权重为“0”)从而不再响应客户端的访问请求;  

 

virtual=172.16.14.1:80 

 

# 此项用来定义LVS服务及其使用的VIP和PORT  

 

real=172.16.14.21:80 gate 1 

 

real=172.16.14.22:80 gate 2 

 

real=172.16.14.23:80 gate 3 

 

fallback=127.0.0.1:80 gate  

 

# 当IPVS表没有任何可用的Realserver时,此“地址:端口”作为最后响应的服务;  

 

# 一般指向127.0.0.1,并可以通过一个包含错误信息的页面通知用户服务发生了异常;  

 

service=http  

 

# 定义基于什么服务来测试Realserver;  

 

request="index.html" 

 

receive="Test Page" 

 

scheduler=wlc  

 

protocol=tcp  

 

# 定义此虚拟服务用到的协议;  

 

checktype=negotiate  

 

# ldirectord进程用于监控Realserver的方法;{negotiate|connect|A number|off}  

 

checkport=80 

 在haresource里添加如下行,以启用ldriector

vim haresorce

node1.a.org 172.16.14.1/32/eth0/172.16.14.1 ldirectord::ldirectord.cf

拷贝这两个文件到node2上

scp haresources ldirectord.cf node2:/etc/ha.d

启用服务

/etc/init.d/heartbeat start

ssh node2 -- '/etc/init.d/heartbeat start'



至此,ldirector配置完成,我只做相关测试而没有配置后台的三个RSS,来看一下效果


LVS的工作原理和相关算法 - zhuzhu - 五事九思 (大连Linux主机维护)
 

由于后台三个RSS就没有开启(相当于当机),ldirictor默认将他们的权重都设为0既不生效,而把本地的80开启,这个外界访问时,将看到一个提示界面(可以自己定义一些内容,比如网站维护中等)f

阅读(1316) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~