vieyahn2017 / iBlog

44 stars 0 forks source link

9.8 lvs负载均衡 #315

Closed vieyahn2017 closed 4 months ago

vieyahn2017 commented 4 years ago

使用LVS实现负载均衡原理及安装配置详解

https://www.cnblogs.com/liwei0526vip/p/6370103.html

负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、lvs、haproxy,商业的硬件负载均衡设备F5、Netscale。这里主要是学习 LVS 并对其进行了详细的总结记录。

此文章已经过期!点击请移步新文章,更详细、更全面、更准确

一、负载均衡LVS基本介绍

LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(real server)上。为了避免不同机器上用户请求得到的数据不一样,需要用到了共享存储,这样保证所有用户请求的数据是一样的。

LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是 http://www.linuxvirtualserver.org 现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构从逻辑上可分为调度层、Server集群层和共享存储。

二、LVS的基本工作原理

  1. 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间
  2. PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链
  3. IPVS是工作在INPUT链上的,当用户请求到达INPUT时,IPVS会将用户请求和自己已定义好的集群服务进行比对,如果用户请求的就是定义的集群服务,那么此时IPVS会强行修改数据包里的目标IP地址及端口,并将新的数据包发往POSTROUTING链
  4. POSTROUTING链接收数据包后发现目标IP地址刚好是自己的后端服务器,那么此时通过选路,将数据包最终发送给后端的服务器

三、LVS的组成 LVS 由2部分程序组成,包括 ipvs 和 ipvsadm。

  1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
  2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)

四、LVS相关术语

  1. DS:Director Server。指的是前端负载均衡器节点。
  2. RS:Real Server。后端真实的工作服务器。
  3. VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
  4. DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
  5. RIP:Real Server IP,后端服务器的IP地址。
  6. CIP:Client IP,访问客户端的IP地址。

下边是三种工作模式的原理和特点总结。

五、LVS/NAT原理和特点

  1. 重点理解NAT方式的实现原理和数据包的改变。

(a). 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP (b). PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链 (c). IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP (d). POSTROUTING链通过选路,将数据包发送给Real Server (e). Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP (f). Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP

  1. LVS-NAT模型的特性

RS应该使用私有地址,RS的网关必须指向DIP DIP和RIP必须在同一个网段内 请求和响应报文都需要经过Director Server,高负载场景中,Director Server易成为性能瓶颈 支持端口映射 RS可以使用任意操作系统 缺陷:对Director Server压力会比较大,请求和响应都需经过director server

六、LVS/DR原理和特点

  1. 重将请求报文的目标MAC地址设定为挑选出的RS的MAC地址

(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP (b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链 (c) IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址 (d) 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。 (e) RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP (f) 响应报文最终送达至客户端

  1. LVS-DR模型的特性

特点1:保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问 RS跟Director Server必须在同一个物理网络中 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server 不支持地址转换,也不支持端口映射 RS可以是大多数常见的操作系统 RS的网关绝不允许指向DIP(因为我们不允许他经过director) RS上的lo接口配置VIP的IP地址 缺陷:RS和DS必须在同一机房中

  1. 特点1的解决方案:

在前端路由器做静态地址路由绑定,将对于VIP的地址仅路由到Director Server 存在问题:用户未必有路由操作权限,因为有可能是运营商提供的,所以这个方法未必实用 arptables:在arp的层次上实现在ARP解析时做防火墙规则,过滤RS响应ARP请求。这是由iptables提供的 修改RS上内核参数(arp_ignore和arp_announce)将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求。

七、LVS/Tun原理和特点 在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标IIP为VIP),外层IP首部(源地址为DIP,目标IP为RIP)

(a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。 (b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链 (c) IPVS比对数据包请求的服务是否为集群服务,若是,在请求报文的首部再次封装一层IP报文,封装源IP为为DIP,目标IP为RIP。然后发至POSTROUTING链。 此时源IP为DIP,目标IP为RIP (d) POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为在外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。 此时源IP为DIP,目标IP为RIP (e) RS接收到报文后发现是自己的IP地址,就将报文接收下来,拆除掉最外层的IP后,会发现里面还有一层IP首部,而且目标是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成之后,通过lo接口送给eth0网卡,然后向外传递。 此时的源IP地址为VIP,目标IP为CIP (f) 响应报文最终送达至客户端

LVS-Tun模型特性

RIP、VIP、DIP全是公网地址 RS的网关不会也不可能指向DIP 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server 不支持端口映射 RS的系统必须支持隧道 其实企业中最常用的是 DR 实现方式,而 NAT 配置上比较简单和方便,后边实践中会总结 DR 和 NAT 具体使用配置过程。

八、LVS的八种调度算法

  1. 轮叫调度 rr 这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。

  2. 加权轮叫 wrr 这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。

  3. 最少链接 lc 这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1

  4. 加权最少链接 wlc 这个算法比 lc 多了一个权重的概念。

  5. 基于局部性的最少连接调度算法 lblc 这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器

  6. 复杂的基于局部性最少的连接算法 lblcr 记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。

  7. 目标地址散列调度算法 dh 该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。

  8. 源地址散列调度算法 sh 与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。

九、实践LVS的NAT模式

十、实践LVS的DR模式

十一、LVS结合keepalive LVS可以实现负载均衡,但是不能够进行健康检查,比如一个rs出现故障,LVS 仍然会把请求转发给故障的rs服务器,这样就会导致请求的无效性。keepalive 软件可以进行健康检查,而且能同时实现 LVS 的高可用性,解决 LVS 单点故障的问题,其实 keepalive 就是为 LVS 而生的。

vieyahn2017 commented 4 years ago

关于LVS+Nginx为什么会被同时使用的思考

https://www.cnblogs.com/crazylqy/p/7742073.html

最初的理解 (也可以每个nginx都挂在上所有的应用服务器) nginx大家都在用,估计也很熟悉了,在做负载均衡时很好用,安装简单、配置简单、相关材料也特别多。

lvs是国内的章文嵩博士的大作,比nginx被广泛接受还要早7年,并且已经被红帽作为了系统内置软件,可谓很牛了。lvs相对于nginx来说配置上就要相对复杂一些。

但是,有时候我们会看到大牛们分享的经验里面是lvs+nginx作为负载均衡了,一直想不明白这是个什么道理。

为什么会出现两者被同时使用呢?其实,这要从两者的各自优势来说了。

nginx用来做http的反向代理,能够upsteam实现http请求的多种方式的均衡转发。由于采用的是异步转发可以做到如果一个服务器请求失败,立即切换到其他服务器,直到请求成功或者最后一台服务器失败为止。这可以最大程度的提高系统的请求成功率。

lvs采用的是同步请求转发的策略。这里说一下同步转发和异步转发的区别。同步转发是在lvs服务器接收到请求之后,立即redirect到一个后端服务器,由客户端直接和后端服务器建立连接。异步转发是nginx在保持客户端连接的同时,发起一个相同内容的新请求到后端,等后端返回结果后,由nginx返回给客户端。

进一步来说:当做为负载均衡服务器的nginx和lvs处理相同的请求时,所有的请求和响应流量都会经过nginx;但是使用lvs时,仅请求流量经过lvs的网络,响应流量由后端服务器的网络返回。

也就是,当作为后端的服务器规模庞大时,nginx的网络带宽就成了一个巨大的瓶颈。

但是仅仅使用lvs作为负载均衡的话,一旦后端接受到请求的服务器出了问题,那么这次请求就失败了。但是如果在lvs的后端在添加一层nginx(多个),每个nginx后端再有几台应用服务器,那么结合两者的优势,既能避免单nginx的流量集中瓶颈,又能避免单lvs时一锤子买卖的问题。

参考文章: 章文嵩:LVS项目介绍 moon:强大的nginx反向代理异步传输模式(原理)

yaoweibin:nginx健康检查 追马博客:LVS+keepalived+nginx+tomcat部署实现

补充(20160731 下午2:07): 在后续继续了解这部分内容时,发现了这两个帖子:

  1. 有了LVS,还要apache,nginx有什么用? 2.从一个开发的角度看负载均衡和LVS—–注意看最后一个lvs集群化的图,nginx和rs是一对一连接的。

从以上文章来看,lvs+nginx组合使用的原因主要是用lvs来做负载均衡(因为工作在4层,效率高),nginx来做静态文件的处理。

这里第二篇文章,和lvs的后续维护者之一的吴佳明_普空的ppt中比章博士的文章中多出了一种转发模式,也就是full_nat模式,这种模式下,所有的响应也要经过lvs服务器作为出口返回给客户端。

lvs在full_nat的模式下,是否还是同步的模式呢?我猜想应该是的,因为lvs工作在4层,所以可能当前出错的响应要映射到之前的那一次请求(因为没有解析http包),所以也就做不到把错误转发到其他的应用服务器上重新处理。

另外,这个补充是不是就完全的否定了昨天(也就是补充之前的那一大段)的内容呢?我觉得并没有。昨天的理解可能不是正规大型互联网在使用的模式(当然,这里我不能确定,因为我没有大型互联网的经验),但是理论应该是对的。

具体一点,lvs+nginx的组合nginx用来做静态文件的处理的场景下,如果一次请求失败了,那么久不能被重新处理了,当然你的nginx也可以后挂1个以上的应用服务器(这样的话nginx实质上也是起到了lvs均衡补充的效果)。另外就是,nginx不是单单的作为静态文件的处理,而是作为lvs的一个补充,互相弥补均衡上的不足。

那么你可能会说lvs在4层上处理的高效就不复存在了,确实是的,这点要承认,但是,我们提高了系统请求的成功率,两者需要各自去选择和权衡。

另外,需要说的一点是,静态内容其实我们还可以借助cdn去处理,而不是单单的依靠nginx或者apache去处理。

补充(2016年12月17日 上午11:24) 现在到了比较大一些的互联网公司,也看了京东的用法(可以看开涛的nginx+lua系列http://www.iteye.com/blogs/subjects/nginx-lua)。

lvs+nginx的使用中,nginx还可以作为一个中间环节来减小后端tomcat的服务压力,以及做一些业务切换、分流、前置缓存的功能。

vieyahn2017 commented 4 years ago

LVS+Nginx(LVS + Keepalived + Nginx安装及配置)

https://www.cnblogs.com/Henry-pan/p/7308763.html

nginx大家都在用,估计也很熟悉了,在做负载均衡时很好用,安装简单、配置简单、相关材料也特别多。

lvs是国内的章文嵩博士的大作,比nginx被广泛接受还要早7年,并且已经被红帽作为了系统内置软件,可谓很牛了。lvs相对于nginx来说配置上就要相对复杂一些。

但是,有时候我们会看到大牛们分享的经验里面是lvs+nginx作为负载均衡了,一直想不明白这是个什么道理。

为什么会出现两者被同时使用呢?其实,这要从两者的各自优势来说了。

nginx用来做http的反向代理,能够upsteam实现http请求的多种方式的均衡转发。由于采用的是异步转发可以做到如果一个服务器请求失败,立即切换到其他服务器,直到请求成功或者最后一台服务器失败为止。这可以最大程度的提高系统的请求成功率。

lvs采用的是同步请求转发的策略。这里说一下同步转发和异步转发的区别。同步转发是在lvs服务器接收到请求之后,立即redirect到一个后端服务器,由客户端直接和后端服务器建立连接。异步转发是nginx在保持客户端连接的同时,发起一个相同内容的新请求到后端,等后端返回结果后,由nginx返回给客户端。

进一步来说:当做为负载均衡服务器的nginx和lvs处理相同的请求时,所有的请求和响应流量都会经过nginx;但是使用lvs时,仅请求流量经过lvs的网络,响应流量由后端服务器的网络返回。

也就是,当作为后端的服务器规模庞大时,nginx的网络带宽就成了一个巨大的瓶颈。

但是仅仅使用lvs作为负载均衡的话,一旦后端接受到请求的服务器出了问题,那么这次请求就失败了。但是如果在lvs的后端在添加一层nginx(多个),每个nginx后端再有几台应用服务器,那么结合两者的优势,既能避免单nginx的流量集中瓶颈,又能避免单lvs时一锤子买卖的问题。

参考文章: 章文嵩:LVS项目介绍 moon:强大的nginx反向代理异步传输模式(原理)

LVS + Keepalived + Nginx安装及配置

1、概述 上篇文章《架构设计:负载均衡层设计方案(6)——Nginx + Keepalived构建高可用的负载层》(http://blog.csdn.net/yinwenjie/article/details/47130609) 我们讲解了Nginx的故障切换,并且承诺各位读者会尽快讲解 LVS + Keepalived + Nginx的安装和配置。在中间由于工作的原因,我又插写了三篇关于zookeeper的原理使用的文章。今天这边文章我们回归主题,为各位读者讲解 LVS + Keepalived + Nginx的安装及配置。

2、安装计划和准备工作 下图,我们表示了本篇文章要搭建的整个集成架构的抽象结构:

这里写图片描述

我们采用两个LVS节点(141和142),但是一个时间工作的只有一个LVS节点,另一个始终处于热备standby状态,由keepalived监控这两个节点的工作状态并完成切换。

在LVS节点下,我们采用LVS-DR工作模式挂载了两个Nginx节点(131、132)。并最终将外网请求交由这两个节点进行处理。注意:在实际工作中,Nginx下面一般就是访问静态资源、动态资源的配置了。

2-1、准备两个keepalived节点 首先我们在将要安装LVS的两个节点上,先安装keepalived,并保证这两个keepalived节点能够正常工作(监控批次的状态)。当然,您也可以先准备LVS,在准备keepalived。

我想准备keepalived节点,大家应该轻车熟路了吧,在《架构设计:负载均衡层设计方案(6)——Nginx + Keepalived构建高可用的负载层》这篇文章中详细介绍了keepalived的最简配置方式。为了大家阅读方便,我们在这里再进行依次简要说明。准备keepalived的整个过程包括:

安装必要的支撑组件,源码安装keepalived 将keepalived注册成节点的服务,以便保证keepalived在节点启动时就开始工作 更改keepalived的配置文件,让其可以正常工作 验证准备工作

=============安装keepalived

[root@lvs1 ~]# yum install -y zlib zlib-devel gcc gcc-c++ openssl openssl-devel openssh
[root@lvs1 ~]# tar -zxvf keepalived-1.2.17.tar.gz
[root@lvs1 ~]# cd keepalived-1.2.17
[root@lvs1 ~]# ./configure --perfix=/usr/keepalived-1.2.17
[root@lvs1 ~]# make & make install 

=============将keepalived注册成服务(如果您使用的默认路径安装,就不需要cp命令了)

[root@lvs1 ~]# cp /usr/keepalived-1.2.17/etc/sysconfig/keepalived  /etc/sysconfig/keepalived 
[root@lvs1 ~]# cp /usr/keepalived-1.2.17/sbin/keepalived /usr/sbin/keepalived
[root@lvs1 ~]# cp /usr/keepalived-1.2.17/etc/rc.d/init.d/keepalived  /etc/rc.d/init.d/keepalived
[root@lvs1 ~]# mkdir /etc/keepalived
[root@lvs1 ~]# cp /usr/keepalived-1.2.17/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
[root@lvs1 ~]# 可以做成服务了(不要拷贝,没用的)
[root@lvs1 ~]# chkconfig keepalived on

这里我们先设置浮动ip

设置VIP的信息

ifconfig eth0:0 192.168.220.140 broadcast 192.168.220.140 netmask 255.255.255.255 up
route add -host 192.168.220.140 dev eth0:0      

做成服务后,先不要急着启动,因为配置文件还没有改好。

========配置keepalived(配置文件在:/etc/keepalived/keepalived.conf)

! Configuration File for keepalived

global_defs {
   #notification_email {
   #  acassen@firewall.loc
   #  failover@firewall.loc
   #  sysadmin@firewall.loc
   #}
   #notification_email_from Alexandre.Cassen@firewall.loc
   #smtp_server 192.168.200.1
   #smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    #141节点设置为MASTER,142或者还有其他的节点设置为BACKUP
    #还记得我们前面文章讲到的无抢占设置吗?这里也可以用哦。
    state MASTER
    #网络适配器名称
    interface eth0
    virtual_router_id 51
    #所有的SLAVE节点的优先级都要比这个设置值低
    priority 120
    advert_int 1
    #真实ip,142要改成相应的lvs节点真实ip
    mcast_src_ip=192.168.220.141
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虚拟/浮动IP
    virtual_ipaddress {
        192.168.220.140
    }
}

以上配置还是最简单的keepalived配置,因为我们还没有加上配合LVS使用的虚拟ip监测设置和下层真实ip监测的设置。最简配置主要是为了保证keepalived节点是工作正常的。

将以上的配置分别对应到LVS的两个节点(注意要改动的地方哦)

==========进行keepalived工作状态的检查:

[root@lvs1 ~]# /etc/init.d/keepalived start

现在设置为MASTER的keepalived节点(或者在非抢占模式下,优先级最高的那个节点),已经绑定了140这个虚拟ip了:

[root@lvs2 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:39:75:9f brd ff:ff:ff:ff:ff:ff
    inet 192.168.220.141/24 brd 192.168.220.255 scope global eth0
    inet 192.168.220.140/32 scope global eth0
    inet6 fe80::20c:29ff:fe39:759f/64 scope link 
       valid_lft forever preferred_lft forever

当然您也可以通过 /var/log/message的日志进行keepalived是否正常工作的验证。

2-2、继续两个keepalived节点上准备LVS 准备lvs的工作就太简单了,因为centos6.4、6.5、6.6都已经集成了LVS的核心,我们只需要安装LVS的管理工具就行了:

(1)如果要源码安装的话:

这里源码安装ipvsadm(http://www.linuxidc.com/Linux/2016-03/129232.htm)
yum install kernel-devel -y
yum -y install popt popt-devel libnl libnl-devel popt-static(我尝试过要是不安装的话就会报错)
ln -s /usr/src/kernels/2.6.32-642.4.2.el6.x86_64/ /usr/src/linux
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
tar xf ipvsadm-1.25.tar.gz
cd ipvsadm-1.25
make && make install

然后我们检测一下 ipvsadm 是否有内容输出 (2)如果yum安装的话

两个LVS节点都执行:

yum -y install ipvsadm

还记得lvs管理工具怎么使用吗?请参见我介绍LVS单节点安装的博文:《架构设计:负载均衡层设计方案(5)——LVS单节点安装》。这里为了方便阅读,给出主要参数的含义列表:

-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 –list 显示内核虚拟服务器表
-Z –zero 虚拟服务表计数器清零(清空当前的连接数量等)
–set tcp tcpfin udp 设置连接超时值
–start-daemon 启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。
–stop-daemon 停止同步守护进程
-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 的工作模式为直接路由模式DR模式(也是LVS默认的模式)
-i –ipip 指定LVS 的工作模式为隧道模式
-m –masquerading 指定LVS 的工作模式为NAT 模式
-w –weight weight 真实服务器的权值
–mcast-interface interface 指定组播的同步接口
–connection 显示LVS 目前的连接 如:ipvsadm -L -c
–timeout 显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L –timeout
–daemon 显示同步守护进程状态
–stats 显示统计信息
–rate 显示速率信息
–sort 对虚拟服务器和真实服务器排序输出
–numeric -n 输出IP 地址和端口的数字形式

到后面正式启动LVS的时候,就不要问我参数含义咯。^_^

2-3、准备两个Nginx节点并保证可用 在《架构设计:负载均衡层设计方案(5)——LVS单节点安装》(http://blog.csdn.net/yinwenjie/article/details/47010569) 这篇文章中,我们详细讲解了Nginx节点的准备工作,但是为了方便各位读者阅读,这里我们大致再讲一下。

Nginx节点的准备工作主要由以下步骤构成(这个不是本文的重点,点到即可):

安装Nginx(当然,正式系统中,还涉及到Nginx的参数调优,可以参见《架构设计:负载均衡层设计方案(2)——Nginx安装》这篇文章) 打开Nginx所在服务器的“路由”功能、关闭“ARP查询”功能 将VIP:192.168.220.140 设置成Nginx所在节点的回环IP

安装Nginx

[root@vm1 ~]# yum -y install make zlib zlib-devel gcc gcc-c++ ssh libtool pcre*
[root@vm1 ~]# 下载nginx(别拷贝,不能执行的)
[root@vm1 ~]# 解压nginx(别拷贝,不能执行的)
[root@vm1 ~]# ./configure –prefix=/usr/nginx-1.8.0 
[root@vm1 ~]# make && make install 
[root@vm1 ~]# 设置环境变量(别拷贝,不能执行的)
[root@vm1 ~]# 启动nginx

打开Nginx所在服务器的“路由”功能、关闭“ARP查询”功能

[root@vm1 ~]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@vm1 ~]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@vm1 ~]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@vm1 ~]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

设置回环IP

[root@vm1 ~]# ifconfig lo:0 192.168.220.140 broadcast 192.168.220.140 netmask 255.255.255.255 up
[root@vm1 ~]# route add -host 192.168.220.140 dev lo:0

两台Nginx的节点都按照这样的方法去设置。然后使用浏览器,看看这两个节点的Nginx是否工作正常:

我这里在做实验的时候忘了把防火墙和selinux关了,所以浏览器访问不了。不要忘了关哦

我们可以把nginx的首页改一下以便分辨区别

vm1:131上的nginx工作正常

vm2:132上的nginx工作正常

2-4、其他说明 keepalived和LVS是天生配合完美的一对,LVS负责进行请求转发不负责任何节点的健康监测;keepalived负责监控整个环境中,包括虚拟ip,真实ip对应的下层节点的健康状态监测。

3、开始配置:LVS-DR工作模式 3-1、keepalived的更改——健康监测

5、后文介绍 好了,到这里负载均衡层所使用的几个标准工具就介绍完了。下一篇文章我们将进行总结,然后进入架构设计:业务层设计方案 的系列文章。在下一个系列文章中,我们将介绍至少两套SOA的实现、至少两套系统间通信使用的消息队列。哦,应我朋友的要求,我会专门写几篇文章,介绍Java中线程的基础知识和进阶知识。

文章转自:http://blog.csdn.net/yinwenjie/article/details/47211551

vieyahn2017 commented 4 years ago

Keepalived + LVS(DR) 高可用负载均衡集群 https://blog.csdn.net/zp820705/article/details/84410375

5、常见问题及注意事项 1、LVS+DR模式中,只支持IP的转发,不支持端口转发,也就是说在keepalived.conf的virtual_server和real_server的配置节点中端口必须一样。

vieyahn2017 commented 4 years ago

LVS+Keepalived+Nginx实现HA https://www.jianshu.com/p/88589646aae8

vieyahn2017 commented 4 years ago

借助LVS+Keepalived实现负载均衡

https://www.cnblogs.com/edisonchou/p/4281978.html

一、负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器集群等等。

古人有云:当一头牛拉不动车的时候,不要去寻找一头更强壮的牛,而是用两头牛来拉车。

load balance

在实际应用中,在Web服务器集群之前总会有一台负载均衡服务器,负载均衡设备的任务就是作为Web服务器流量的入口,挑选最合适的一台Web服务器,将客户端的请求转发给它处理,实现客户端到真实服务端的透明转发。最近几年很火的「云计算」以及分布式架构,本质上也是将后端服务器作为计算资源、存储资源,由某台管理服务器封装成一个服务对外提供,客户端不需要关心真正提供服务的是哪台机器,在它看来,就好像它面对的是一台拥有近乎无限能力的服务器,而本质上,真正提供服务的,是后端的集群。

1.2 负载均衡的类型 负载均衡可以采用硬件设备(例如常常听见的F5),也可以采用软件负载。

商用硬件负载设备成本通常较高(一台几十万上百万很正常),所以在条件允许的情况下我们会采用软件负载;

软件负载解决的两个核心问题是:选谁、转发,其中最著名的是LVS(Linux Virtual Server)。

传送门->关于负载均衡的实现方式类型等介绍请浏览我的另一篇博文:《大型网站技术架构》读书笔记之六:永无止境之网站的伸缩性架构

二、初识LVS:Linux Virtual Server 2.1 LVS是神马东西 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

2.2 LVS有神马作用 LVS主要用于服务器集群的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。

LVS自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。可以利用LVS技术实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等等,有许多比较著名网站和组织都在使用LVS架设的集群系统,例如:Linux的门户网站(www.linux.com)、向RealPlayer提供音频视频服务而闻名的Real公司(www.real.com)、全球最大的开源网站(sourceforge.net)等。

2.3 LVS的体系结构 使用LVS架设的服务器集群系统有三个部分组成:

(1)最前端的负载均衡层,用Load Balancer表示;

(2)中间的服务器集群层,用Server Array表示;

(3)最底端的数据共享存储层,用Shared Storage表示;

在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。

传送门->关于体系结构的详细介绍,请浏览南飞蚂蚁的blog:http://ixdba.blog.51cto.com/2895551/552947

2.4 LVS负载均衡机制 (1)LVS是四层负载均衡,也就是说建立在OSI模型的第四层——传输层之上,传输层上有我们熟悉的TCP/UDP,LVS支持TCP/UDP的负载均衡。因为LVS是四层负载均衡,因此它相对于其它高层负载均衡的解决办法,比如DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。

(2)LVS的转发主要通过修改IP地址(NAT模式,分为源地址修改SNAT和目标地址修改DNAT)、修改目标MAC(DR模式)来实现。

①NAT模式:网络地址转换

NAT

NAT(Network Address Translation)是一种外网和内网地址映射的技术。NAT模式下,网络数据报的进出都要经过LVS的处理。LVS需要作为RS(真实服务器)的网关。当包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,仿佛是客户端直接发给它的一样。RS处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP。这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,这样,这个包对客户端看起来就仿佛是LVS直接返回给它的。客户端无法感知到后端RS的存在。

②DR模式:直接路由

DR

DR模式下需要LVS和RS集群绑定同一个VIP(RS通过将VIP绑定在loopback实现),但与NAT的不同点在于:请求由LVS接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过LVS。详细来看,一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变,LVS只是做了一下移花接木。RS收到LVS转发来的包时,链路层发现MAC是自己的,到上面的网络层,发现IP也是自己的,于是这个包被合法地接受,RS感知不到前面有LVS的存在。而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS。

(3)DR负载均衡模式数据分发过程中不修改IP地址,只修改mac地址,由于实际处理请求的真实物理IP地址和数据请求目的IP地址一致,所以不需要通过负载均衡服务器进行地址转换,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。因此,DR模式具有较好的性能,也是目前大型网站使用最广泛的一种负载均衡手段。

三、构建实战:LVS+Keepalived实现负载均衡 3.1 实验结构总览

(1)本次基于VMware Workstation搭建一个四台Linux(CentOS 6.4)系统所构成的一个服务器集群,其中两台负载均衡服务器(一台为主机,另一台为备机),另外两台作为真实的Web服务器(向外部提供http服务,这里仅仅使用了CentOS默认自带的http服务,没有安装其他的类似Tomcat、Jexus服务)。

(2)本次实验基于DR负载均衡模式,设置了一个VIP(Virtual IP)为192.168.80.200,用户只需要访问这个IP地址即可获得网页服务。其中,负载均衡主机为192.168.80.100,备机为192.168.80.101。Web服务器A为192.168.80.102,Web服务器B为192.168.80.103。

3.2 基础准备工作 以下工作针对所有服务器,也就是说要在四台服务器中都要进行配置:

(1)绑定静态IP地址

命令模式下可以执行setup命令进入设置界面配置静态IP地址;x-window界面下可以右击网络图标配置;配置完成后执行service network restart重新启动网络服务;

验证:执行命令ifconfig

(2)设定主机名

①修改当前会话中的主机名,执行命令hostname xxxx (这里xxxx为你想要改为的名字)

②修改配置文件中的主机名,执行命令vi /etc/sysconfig/network (√一般需要进行此步凑才能永久更改主机名)

验证:重启系统reboot

(3)IP地址与主机名的绑定

执行命令vi /etc/hosts,增加一行内容,如下(下面的从节点以你自己的为主,本实验搭建了两个从节点):

192.168.80.100 lvs-master

192.168.80.101 lvs-slave

#下面是本次试验的两个真实服务器节点

192.168.80.102 lvs-webserver1

192.168.80.103 lvs-webserver2

保存后退出

验证:ping lvs-master

(4)关闭防火墙

①执行关闭防火墙命令:service iptables stop

验证:service iptables stauts

②执行关闭防火墙自动运行命令:chkconfig iptables off

验证:chkconfig --list | grep iptables

3.3 配置两台Web服务器 以下操作需要在角色为Web服务器的两台中进行,不需要在负载均衡服务器中进行操作:

(1)开启http服务

命令:service httpd start

补充:chkconfig httpd on -->将httpd设为自启动服务

(2)在宿主机访问Web网页,并通过FTP工具上传自定义网页:这里上传一个静态网页,并通过更改其中的html来区别两台Web服务器,以下图所示为例,其中一台显示from 192.168.80.102,而另一台显示from 192.168.80.103;

(3)编辑realserver脚本文件

①进入指定文件夹:cd /etc/init.d/

②编辑脚本文件:vim realserver

SNS_VIP=192.168.80.200
/etc/rc.d/init.d/functions
case "$1" in
start)
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       /sbin/route add -host $SNS_VIP dev lo:0
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       ifconfig lo:0 down
       route del $SNS_VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
exit 0

这里我们设置虚拟IP为:192.168.80.200

③保存脚本文件后更改该文件权限:chmod 755 realserver

④开启realserver服务:service realserver start

3.4 配置主负载服务器 (1)安装Keepalived相关包

yum install -y keepalived 在CentOS下,通过yum install命令可以很方便地安装软件包,但是前提是你的虚拟机要联网;

(2)编辑keepalived.conf配置文件

①进入keepalived.conf所在目录:cd /etc/keepalived

②首先清除掉keepalived原有配置:> keepalived.conf

③重新编辑keepalived配置文件:vi keepalived.conf

global_defs {  
   notification_email {  
         edisonchou@hotmail.com  
   }  
   notification_email_from sns-lvs@gmail.com  
   smtp_server 192.168.80.1  
   smtp_connection_timeout 30
   router_id LVS_DEVEL  # 设置lvs的id,在一个网络内应该是唯一的
}  
vrrp_instance VI_1 {  
    state MASTER   #指定Keepalived的角色,MASTER为主,BACKUP为备          
    interface eth1  #指定Keepalived的角色,MASTER为主,BACKUP为备
    virtual_router_id 51  #虚拟路由编号,主备要一致
    priority 100  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR    
    advert_int 1  #检查间隔,默认为1s
    authentication {  
        auth_type PASS  
        auth_pass 1111  
    }  
    virtual_ipaddress {  
        192.168.80.200  #定义虚拟IP(VIP)为192.168.2.33,可多设,每行一个
    }  
}  
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.80.200 80 {  
    delay_loop 6 # 设置健康检查时间,单位是秒                    
    lb_algo wrr # 设置负载调度的算法为wlc                   
    lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式   
    nat_mask 255.255.255.0                
    persistence_timeout 0          
    protocol TCP                  
    real_server 192.168.80.102 80 {  # 指定real server1的IP地址
        weight 3   # 配置节点权值,数字越大权重越高              
        TCP_CHECK {  
        connect_timeout 10         
        nb_get_retry 3  
        delay_before_retry 3  
        connect_port 80  
        }  
    }  
    real_server 192.168.80.103 80 {  # 指定real server2的IP地址
        weight 3  # 配置节点权值,数字越大权重越高  
        TCP_CHECK {  
        connect_timeout 10  
        nb_get_retry 3  
        delay_before_retry 3  
        connect_port 80  
        }  
     }  
} 

(3)开启keepalived服务

service keepalived start 3.5 配置从负载服务器 从负载服务器与主负载服务器大致相同,只是在keepalived的配置文件中需要改以下两处:

(1)将state由MASTER改为BACKUP

(2)将priority由100改为99

vrrp_instance VI_1 {  
    state BACKUP # 这里改为BACKUP
    interface eth1  
    virtual_router_id 51  
    priority 99 # 这里改为99,master优先级是100
    advert_int 1  
    authentication {  
        auth_type PASS  
        auth_pass 1111  
    }  
    virtual_ipaddress {  
        192.168.80.200  
    }  
}  

3.6 验证性测试 (1)指定请求的均衡转发:因为两个Web服务器的权重都一样,所以会依次转发给两个Web服务器;

(2)Web服务器发生故障时:

①A发生故障后,只从B获取服务;

这里模拟192.168.80.102发生故障,暂停其http服务:service httpd stop

再来看看这时从外部访问VIP时,便会只从192.168.80.103获取网页:

②A故障修复后,又从A获取服务;

这里模拟192.168.80.102修复完成,重启其http服务:service httpd start

再来看看这时从外部访问VIP,又可以从192.168.80.102获取网页:

(3)主负载均衡服务器发生故障时,备机立即充当主机角色提供请求转发服务:

这里模拟192.168.80.100发生故障,暂停其keepalived服务:service keepalived stop

再来看看这时从外部访问VIP,还是可以正常获取网页:

学习小结 LVS是目前广为采用的软件负载均衡解决方案,在一些大型企业级系统及互联网系统中应用。本次,简单地了解了一下LVS,并在Linux下搭建了一个小小的测试环境,借助Keepalived实现了一个最小化的负载均衡测试环境。LVS是一个可以工作在网络第四层的负载均衡软件,因此它相对于Nginx一类工作在第七层的负载均衡软件有着无可比拟的性能优势,而且它还是我国的章文嵩博士(现在阿里的副总裁,淘宝的技术专家)作为创始人发起的,现已经成为Linux内核的组成部分。

当然,目前流行的LVS解决方案中,在Web服务器端也有采用了Nginx+Tomcat这样的搭配类型,静态文件和动态文件分开进行处理,也不失为一种有效的尝试。在以后的日子里,我还会尝试下在Linux下借助Jexus跑ASP.NET MVC项目,试试.NET项目在Linux下的运行效果,希望到时也可以做一些分享。好了,今天就到此停笔。

参考资料 (1)王晨纯,《Web基础架构:负载均衡和LVS》:http://www.importnew.com/11229.html

(2)win_xp,《LVS简介及使用》:http://www.cnblogs.com/codebean/archive/2011/07/25/2116043.html

(3)jiwang1980,《LVS+Keepalived》:http://7567567.blog.51cto.com/706378/578289

(4)南飞蚂蚁的BLOG,《Linux负载均衡软件LVS之概念篇》:http://ixdba.blog.51cto.com/2895551/552947

(5)AKing王国,《四层和七层负载均衡的区别》:http://kb.cnblogs.com/page/188170/