基础概念
LVS (Linux Virtual Server)是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。
可伸缩性
可伸缩 络服务是指 络服务能随着用户数目的增长而扩展其性能,如在系统中增加服务器、内存或硬盘等;整个系统很容易被扩展,无需重新设置整个系统,无需中断服务。换句话说,系统管理员扩展系统的操作对最终用户是透明的,他们不会知道系统的改变。
络服务的需求
* 可伸缩性(Scalability),当服务的负载增长时,系统能被扩展来满足需求,且不降低服务质量。
* 高可用性(Availability),尽管部分硬件和软件会发生故障,整个系统的服务必须是每天24小时每星期7天可用的。
* 可管理性(Manageability),整个系统可能在物理上很大,但应该容易管理。
* 价格有效性(Cost-effectiveness),整个系统实现是经济的、易支付的
单服务器显然不能处理不断增长的负载,服务器升级方法有下列不足:
一是升级过程繁琐,机器切换会使服务暂时中断,并造成原有计算资源的浪费;
二是越往高端的服务器,所花费的代价越大;
三是一旦该服务器或应用软件失效,会导致整个服务的中断。
针对上述需求,我们给出了基于IP层和基于内容请求分发的负载平衡调度解决方法,并在Linux内核中实现了这些方法,将一组服务器构成一个实现可伸缩的、高可用 络服务的服务器集群,我们称之为Linux虚拟服务器(Linux Virtual Server)
LVS结构
负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址上的。它可以是用IP负载均衡技术的负载调度器,也可以是基于内容请求分发的负载调度器,还可以是两者的结合。
服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
后端存储(backend storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
在IP负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。当客户请求到达时,调度器只根据负载情况从服务器池中选出一个服务器,将该请求转发到 选出的服务器,并记录这个调度;当这个请求的其他 文到达,也会被转发到前面选出的服务器。在基于内容请求分发技术中,服务器可以提供不同的服务,当客户 请求到达时,调度器可根据请求的内容和服务器的情况选择服务器执行请求。因为所有的操作都是在操作系统核心空间中将完成的,它的调度开销很小,所以它具有 很高的吞吐率。
后端存储通常用容错的分布式文件系统,如AFS、GFS、Coda和Intermezzo等。分布式文件系统为各服务器提供共享的存储区,它们访问分布式 文件系统就像访问本地文件系统一样。同时,分布式文件系统提供良好的伸缩性和可用性。然而,当不同服务器上的应用程序同时访问分布式文件系统上同一资源 时,应用程序的访问冲突需要消解才能使得资源处于一致状态。这需要一个分布式锁管理器(Distributed Lock Manager),它可能是分布式文件系统内部提供的,也可能是外部的。开发者在写应用程序时,可以使用分布式锁管理器来保证应用程序在不同结点上并发访 问的一致性。
**双机集群(HA)**HA(High Available), 高可用性群集,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。通常把正在执行业务的称为活动节点,而作为活动 节点的一个备份的则称为备用节点。当活动节点出现问题,导致正在运行的业务(任务)不能正常运行时,备用节点此时就会侦测到,并立即接续活动节点来执行业 务。从而实现业务的不中断或短暂中断
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web 服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人 工做的只是修复故障的web服务器。
LVS DR的基本原理
1.client向目标VIP(virtual IP)发送请求
IP包形式为
Src mac | Des mac | Src IP | Des IP |
---|---|---|---|
client mac | dr mac | client IP | VIP |
2.director接收到包,通过算法策略选择一台Real Server
这里是通过映射表进行轮巡选择的,选好一台Real Server后,将包发过去,此时IP包为。
Src mac | Des mac | Src IP | Des IP |
---|---|---|---|
client mac | Rs mac | client IP | VIP |
需要注意的是,无论是DR模式还是NAT模式,都需要将director 的ip_forward置一,而对于real server则该选项需要置0。这个选项控制包转发功能。
3.当real server收到包后,会比对des mac 和des ip,其中,mac地址与物理 卡eth0相同,而IP与l0上绑定的虚拟IP相同,则符合,到内核进行处理,任务结束后将处理结果发给cilent
Src mac | Des mac | Src IP | Des IP |
---|---|---|---|
Rs mac | client mac | VIP | client IP |
http://os.51cto.com/art/201105/264303.htm
http://os.51cto.com/art/201105/262536.htm
软件安装
LVS在一般linux机器上都有配备,我们只需要安装实现需要的软件ipvsadm
查看是否安装成功
查看内核模块是否运行
这里就安装成功了
由于lvs涉及 络方面的操作,这里列举一些用到的命令
linux 执行shell脚本
方法一:切换到shell脚本所在的目录
./的意思是说在当前的工作目录下执行hello.sh。如果不加上./,bash可能会响应找到不到hello.sh的错误信息。因为目前的工作目录(/data/shell)可能不在执行程序默认的搜索路径之列,也就是说,不在环境变量PASH的内容之中。查看PATH的内容可用 echo $PASH 命令。现在的/data/shell就不在环境变量PASH中的,所以必须加上./才可执行。
方法二:以绝对路径的方式去执行bash shell脚本:
方法三:直接使用bash 或sh 来执行bash shell脚本:
或
注意,若是以方法三的方式来执行,那么,可以不必事先设定shell的执行权限,甚至都不用写shell文件中的第一行(指定bash路径)。因为方法三是将hello.sh作为参数传给sh(bash)命令来执行的。这时不是hello.sh自己来执行,而是被人家调用执行,所以不要执行权限。那么不用指定bash路径自然也好理解了啊,呵呵……。
方法四:在当前的shell环境中执行bash shell脚本:
或
LVS配置
Director 配置
将VIP配到director的主 卡eth0上,这是为了client可以通过寻址VIP来寻址到director。
打开ip_forward
清除ipvsadm配置,ipvsadm -C
-A 时在内核的虚拟服务器表中添加一条新的虚拟服务器记录
-a 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。
-D 删除内核虚拟服务器表中的一条虚拟服务器记录
-C 清除内核虚拟服务器表中的所有记录
-s rr 选择调度算法rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq
-t TCP
-u UDP
-r 真实的服务器
-g 直接路由模式(DR模式)
-p 这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout的默认值为300秒。
http://blog.chinaunix.net/uid-24668835-id-2598605.html
Real Server 配置
将虚拟IP配置到l0上,如果配到出口 卡则会影响到Director的arp request。
对arp帧进行配置
arp_announce : INTEGER
默认为0
对 络接口上本地IP地址发出的ARP回应作出相应级别的限制:
确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 – (默认) 在任意 络接口上的任何本地地址
1 -尽量避免不在该 络接口子 段的本地地址. 当发起ARP请求的源IP地址是被设置应该经由路由达到此 络接口的时候很有用.此时会检查来访IP是否为所有接口上的子 段内ip之一.如果改来访IP 不属于各个 络接口上的子 段内,那么将采用级别2的方式来进行处理.
2 – 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的 络接口的子 中外出 访问子 中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送 络接口或其他的有可能接受到该ARP回应的 络接口来进行发送
all/ 和{interface}/ 下两者同时比较,取较大一个值生效.
提高约束级别有益于从指定的目标接受应答,而降低级别可以给予更多的arp查询者以反馈信息(关于arp代理这一段我普遍翻译地不好,去啃一下tcp/ip bible的卷一,然后再翻译吧)
arp_ignore : INTEGER
默认为0
定义对目标地址为本地IP的ARP询问不同的应答模式
0 – (默认值): 回应任何 络接口上对任何本地IP地址的arp查询请求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使 eth0收到来自10.1.1.2这样地址发起的对10.1.1.1 的arp查询也会回应–而原本这个请求该是出现在eth1上,也该有eth1回应的)
1 – 只回答目标IP地址是来访 络接口本地地址的ARP查询请求(比如eth0=192.168.0.1/24,eth1=10.1.1.1/24,那么即使 eth0收到来自10.1.1.2这样地址发起的对192.168.0.1的查询会回答,而对10.1.1.1 的arp查询不会回应)
2 -只回答目标IP地址是来访 络接口本地地址的ARP查询请求,且来访IP必须在该 络接口的子 段内(比如 eth0=192.168.0.1/24,eth1=10.1.1.1/24,eth1收到来自10.1.1.2这样地址发起的对192.168.0.1 的查询不会回答,而对192.168.0.2发起的对192.168.0.1的arp查询会回应)
3 – 不回应该 络界面的arp请求,而只对设置的唯一和连接地址做出回应(do not reply for local addresses configured with scope host,only resolutions for global and link addresses are replied 翻译地似乎不好,这个我的去问问人)
4-7 – 保留未使用
8 -不回应所有(本地地址)的arp查询
Keepalived
作为HA
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web 服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人 工做的只是修复故障的web服务器。可以有多个backup,当master不工作时会根据priority 来对剩下的进行选举
注意,master 和 slave 只有
router_id、state和priority 不同
http://outofmemory.cn/wiki/keepalived-configuration
vi /etc/keepalived/keepalived.conf
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!