精华内容
下载资源
问答
  • 有一定技术基础的互联网用户都知道DNS是做什么用的,但大多数人都不清楚DNS如何查找域名。 Ven发现了一幅图片,这幅图片非常形象地描述了DNS查找下的连锁反应,对不了解DNS运行的人们可能会有些帮助。 下面这张图片...
  • 有一定技术基础的互联网用户都知道DNS是做什么用的,但大多数人都不清楚DNS如何查找域名。 Ven发现了一幅图片,这幅图片非常形象地描述了DNS查找下的连锁反应,对不了解DNS运行的人们可能会有些帮助。下面这张图片...

    有一定技术基础的互联网用户都知道DNS是做什么用的,但大多数人都不清楚DNS如何查找域名。 Ven发现了一幅图片,这幅图片非常形象地描述了DNS查找下的连锁反应,对不了解DNS运行的人们可能会有些帮助。

    下面这张图片来自Verisign,为了简化过程,图片忽略缓存的影响(正常情况下,查找结果经常在不同查找时段被缓存):

    20110305144510640.jpg

    查找www.example.com的IP地址的连锁反应:

    用户计算机首先会查询该网站所使用的域名服务器(DNS服务器)。 这个过程就是图片中的“递归式域名服务器”。

    DNS服务器不知道www.example.com的IP地址,因此DNS服务器会开始进行连锁查询,直到查找到IP地址并向计算机报告(IP地址与图片中一致)。

    1.在互联网根服务器中进行查找,获取顶级域名.com的DNS服务器。

    2.在.com的顶级域名DNS服务器进行查找,获取example.com的授权DNS服务器。

    3.在exapmle.com的授权DNS服务器中查找主机www.example.com的IP地址,最后将IP地址返回计算机

    4.大功告成! 现在计算机获得了www.example.com的IP地址,用户可以访问该网站了。

    对有些人来说,这已经不是什么新鲜事了,但不得不承认,这幅图片确实很形象, 值得分享。

    展开全文
  • 三、LVS基本工作原理   当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间。 PREROUTING链首先会接收到用户请求,判断目标IP确定是本机IP,将数据包发往INPUT链。 ...

    一、LVS简介

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

    使用LVS技术要达到的目标是:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能,高可用的服务器群集,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。

    二、LVS体系架构

    使用LVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层(Loader Balancer),中间的服务器群组层,用Server Array表示,最底层的数据共享存储层,用Shared Storage表示。在用户看来所有的应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。

    LVS的体系架构如图:

     

    LVS的各个层次的详细介绍:

    Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,LVS模块就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器(Real Server)上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时把它从LVS路由表中剔除,恢复时重新加入。

    Server Array层:由一组实际运行应用服务的机器组成,Real Server可以是WEB服务器、MAIL服务器、FTP服务器、DNS服务器、视频服务器中的一个或者多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色。

    Shared Storage层:是为所有Real Server提供共享存储空间和内容一致性的存储区域,在物理上,一般有磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数 据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可以采用集群文件系统,例如Red hat的GFS文件系统,oracle提供的OCFS2文件系统等。

    从整个LVS结构可以看出,Director Server是整个LVS的核心,目前,用于Director Server的操作系统只能是Linux和FreeBSD,linux2.6内核不用任何设置就可以支持LVS功能,而FreeBSD作为 Director Server的应用还不是很多,性能也不是很好。对于Real Server,几乎可以是所有的系统平台,Linux、windows、Solaris、AIX、BSD系列都能很好的支持。

    三、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,是真正生效实现调度的代码。IPVS的总体结构主要由IP包处理、负载均衡算法、系统配置与管理三个模块及虚拟服务器与真实服务器链表组成。
    2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,即IPVS管理器,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)。

    四、LVS技术术语

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

    五、LVS工作模式和原理

    5.1、NAT模式

    5.1.1、NAT模式工作原理

     

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

    5.1.2、NAT特性

    • RIP最好是内网IP
    • RS的网关必须指向DIP。
    • DIP和RIP必须在同一个网段内。
    • 请求和回应的报文都必须经过director,director容易成为瓶颈。
    • nat支持端口转发。

    5.2、DR模式

    5.2.1、DR模式工作原理

    1. 首先用户用CIP请求VIP。
    2. 根据上图可以看到,不管是Director Server还是Real Server上都需要配置相同的VIP,那么当用户请求到达我们的集群网络的前端路由器的时候,请求数据包的源地址为CIP目标地址为VIP,此时路由器会发广播问谁是VIP,那么我们集群中所有的节点都配置有VIP,此时谁先响应路由器那么路由器就会将用户请求发给谁,这样一来我们的集群系统是不是没有意义了,那我们可以在网关路由器上配置静态路由指定VIP就是Director Server,或者使用一种机制不让Real Server 接收来自网络中的ARP地址解析请求,这样一来用户的请求数据包都会经过Director Servrer。
    3. 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP。
    4.  PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
    5.  IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。 此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
    6.  由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
    7.  RS发现请求报文的MAC地址是自己的MAC地址,就接收此报文。处理完成之后,将响应报文通过lo接口传送给eth0网卡然后向外发出。 此时的源IP地址为VIP,目标IP为CIP
    8. 响应报文最终送达至客户端。

    5.2.2、配置DR有三种方式:

    第一种方式:

    在路由器上明显说明vip对应的地址一定是Director上的MAC,只要绑定,以后再跟vip通信也不用再请求了,这个绑定是静态的,所以它也不会失效,也不会再次发起请求,但是有个前提,我们的路由设备必须有操作权限能够绑定MAC地址,万一这个路由器是运行商操作的,我们没法操作怎么办?第一种方式固然很简便,但未必可行。

    第二种方式:

    在给别主机上(例如:红帽)它们引进的有一种程序arptables,它有点类似于iptables,它肯定是基于arp或基于MAC做访问控制的,很显然我们只需要在每一个real server上定义arptables规则,如果用户arp广播请求的目标地址是本机的vip则不予相应,或者说相应的报文不让出去,很显然网关(gateway)是接受不到的,也就是director相应的报文才能到达gateway,这个也行。第二种方式我们可以基于arptables。

    第三种方式:

    在相对较新的版本中新增了两个内核参数(kernelparameter),第一个是arp_ignore定义接受到ARP请求时的相应级别;第二个是arp_announce定义将自己地址向外通告时的通告级别。【提示:很显然我们现在的系统一般在内核中都是支持这些参数的,我们用参数的方式进行调整更具有朴实性,它还不依赖于额外的条件,像arptables,也不依赖外在路由配置的设置,反而通常我们使用的是第三种配置】

    arp_ignore:定义接受到ARP请求时的相应级别

    0:  只要本地配置的有相应地址,就给予响应。(默认)

    1:  仅回应目标IP地址是本地的入网地址的arp请求。

    2:  仅回应目标IP地址是本地的入网地址,而且源IP和目标IP在同一个子网的arp请   求。

    3:  不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应

    4-7:保留未使用

    8:  不回应所有的arp请求。

    arp_announce:定义将自己地址向外通告是的通告级别;

    0:    将本地任何接口上的任何地址向外通告

    1:  试图仅向目标网络通告与其网络匹配的地址

    2:  仅向与本地接口上地址匹配的网络进行通告

    5.2.3、DR特性

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

    补充:特点1的解决方法

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

    5.3、Tunnel模式

    5.3.1、Tunnel模式工作原理

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

    5.3.2、Tunnel模式特性

    • RIP、VIP、DIP全是公网地址。
    • RS的网关不会也不可能指向DIP
    • 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
    • 不支持端口映射
    • RS的系统必须支持隧道

    六、LVS的调度算法


     

    固定调度算法:rr,wrr,dh,sh

    动态调度算法:wlc,lc,lblc,lblcr

    固定调度算法:即调度器不会去判断后端服务器的繁忙与否,一如既往得将请求派发下去。

    动态调度算法:调度器会去判断后端服务器的繁忙程度,然后依据调度算法动态得派发请求。

    6.1、rr:轮询(round robin)

    这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。这个调度的缺点是,不管后端服务器的繁忙程度是怎样的,调度器都会讲请求依次发下去。如果A服务器上的请求很快请求完了,而B服务器的请求一直持续着,将会导致B服务器一直很忙,而A很闲,这样便没起到均衡的左右。

    6.2、wrr:加权轮询(weight round robin)

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

    6.3、dh:目标地址散列调度算法 (destination hash)

    简单的说,即将同一类型的请求分配给同一个后端服务器,例如将以 .jgp、.png等结尾的请求转发到同一个节点。这种算法其实不是为了真正意义的负载均衡,而是为了资源的分类管理。这种调度算法主要应用在使用了缓存节点的系统中,提高缓存的命中率。

    6.4、sh:源地址散列调度算法(source hash)

    即将来自同一个ip的请求发给后端的同一个服务器,如果后端服务器工作正常没有超负荷的话。这可以解决session共享的问题,但是这里有个问题,很多企业、社区、学校都是共用的一个IP,这将导致请求分配的不均衡。

    6.5、lc:最少连接数(least-connection)

    这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1。这里问题是无法做到会话保持,即session共享。

    6.6、wlc:加权最少连接数(weight least-connection)

    这个比最少连接数多了一个加权的概念,即在最少连接数的基础上加一个权重值,当连接数相近,权重值越大,越优先被分派请求。

    6.7、lblc:基于局部性的最少连接调度算法(locality-based least-connection)

    将来自同一目的地址的请求分配给同一台RS如果这台服务器尚未满负荷,否则分配给连接数最小的RS,并以它为下一次分配的首先考虑。

    6.8、lblcr:基于地址的带重复最小连接数调度 (Locality-Based Least-Connection with Replication)

    这个用得少,可以略过。

    七、LVS部署


     

    7.1、ipvsadm命令详解

    ipvsadm是ipvs的管理器,需要yum安装。

    基本用法:

    ipvsadm COMMAND [protocol] service-address [scheduling-method] [persistence options]

    ipvsadm COMMAND [protocol] service-address server-address [packet-forwarding-method] [weight options]

    第一条命令用于向LVS系统中添加一个用于负载均衡的virtual server(VS);第二条命令用来修改已经存在的VS的配置,service address用来指定涉及的虚拟服务即虚拟地址,server-address指定涉及的真实地址。

     

    命令参数:

    -A, --add-service:     为ipvs虚拟服务器添加一个虚拟服务,即添加一个需要被负载均衡的虚拟地址。虚拟地址需要是ip地址,端口号,协议的形式。

    -E, --edit-service:     修改一个虚拟服务。

    -D, --delete-service: 删除一个虚拟服务。

    -C, --clear:               清除所有虚拟服务。

    -R, --restore:            从标准输入获取ipvsadm命令。一般结合下边的-S使用。

    -S, --save:                从标准输出输出虚拟服务器的规则。可以将虚拟服务器的规则保存,在以后通过-R直接读入,以实现自动化配置。

    -a, --add-server:      为虚拟服务添加一个real server(RS)

    -e, --edit-server:      修改RS

    -d, --delete-server:  删除

    -L, -l, --list:              列出虚拟服务表中的所有虚拟服务。可以指定地址。添加-c显示连接表。

    -Z, --zero:               将所有数据相关的记录清零。这些记录一般用于调度策略。

    --set tcp tcpfin udp:修改协议的超时时间。

    --start-daemon state:设置虚拟服务器的备服务器,用来实现主备服务器冗余。(注:该功能只支持ipv4)

    --stop-daemon:      停止备服务器。

    -h, --help:               帮助。

     

    参数:以下参数可以接在上边的命令后边。

    -t, --tcp-service service-address: 

    指定虚拟服务为tcp服务。service-address要是host[:port]的形式。端口是0表示任意端口。如果需要将端口设置为0,还需要加上-p选项(持久连接)。

    -u, --udp-service service-address:

    使用udp服务,其他同上。

    -f, --fwmark-service integer:         

    用firewall mark取代虚拟地址来指定要被负载均衡的数据包,可以通过这个命令实现把不同址、端口的虚拟地址整合成一个虚拟服务,可以让虚拟服务器同时截获处理去往多个不同地址的数据包。fwmark可以通过iptables命令指定。如果用在ipv6需要加上-6。

    -s, --scheduler scheduling-method:

    指定调度算法。调度算法可以指定以下8种:rr(轮询),wrr(权重),lc(最后连接),wlc(权重),lblc(本地最后连接),lblcr(带复制的本地最后连接),dh(目的地址哈希),sh(源地址哈希),sed(最小期望延迟),nq(永不排队)

    -p, --persistent [timeout]:             

    设置持久连接,这个模式可以使来自客户的多个请求被送到同一个真实服务器,通常用于ftp或者ssl中。

    -M, --netmask netmask:               

    指定客户地址的子网掩码。用于将同属一个子网的客户的请求转发到相同服务器。

    -r, --real-server server-address:  

    为虚拟服务指定数据可以转发到的真实服务器的地址。可以添加端口号。如果没有指定端口号,则等效于使用虚拟地址的端口号。

    [packet-forwarding-method]:

    此选项指定某个真实服务器所使用的数据转发模式。需要对每个真实服务器分别指定模式。

    -g, --gatewaying:              使用网关(即直接路由),此模式是默认模式。

    -i, --ipip:                            使用ipip隧道模式。

    -m, --masquerading:         使用NAT模式。

    -w, --weight weight:                         

    设置权重。权重是0~65535的整数。如果将某个真实服务器的权重设置为0,那么它不会收到新的连接,但是已有连接还会继续维持(这点和直接把某个真实服务器删除时不同的)。

    -x, --u-threshold uthreshold:        

    设置一个服务器可以维持的连接上限。0~65535。设置为0表示没有上限。

    -y, --l-threshold lthreshold:           

    设置一个服务器的连接下限。当服务器的连接数低于此值的时候服务器才可以重新接收连接。如果此值未设置,则当服务器的连接数连续三次低于uthreshold时服务器才可以接收到新的连接。(PS:笔者以为此设定可能是为了防止服务器在能否接收连接这两个状态上频繁变换)

    --mcast-interface interface:         

    指定使用备服务器时候的广播接口。

    --syncid syncid:                           

    指定syncid,同样用于主备服务器的同步。

    以下选项用于list命令:

    -c, --connection:                           

    列出当前的IPVS连接。

    --timeout:                                     

    列出超时

    --daemon:

    --stats:                                         

    状态信息

    --rate:                                           

    传输速率

    --thresholds:                               

    列出阈值

    --persistent-conn:                       

    坚持连接

    --sor:                                           

    把列表排序。

    --nosort:                                     

    不排序

    -n, --numeric:                             

    不对ip地址进行dns查询

    --exact:                                       

    单位

    -6:                                               

    如果fwmark用的是ipv6地址需要指定此选项。     

    其他注意事项:

    1.  如果使用IPv6地址,需要在地址两端加上“[]”。例如:ipvsadm -A -t [2001:db8::80]:80 -s rr
    2.  可以通过设置以下虚拟文件的值来防御DoS攻击:/proc/sys/net/ipv4/vs/drop_entry /proc/sys/net/ipv4/vs/drop_packet /proc/sys/net/ipv4/vs/secure_tcp
    3. 对于某一目的地址,对应有一个RS子集。对此地址的请求,为它分配子集中连接数最小的RS;如果子集中所有的服务器均已满负荷,则从集群中选择一个连接数较小的服务器,将它加入到此子集并分配连接;若一定时间内,这个子集未被做任何修改,则将子集中负载最大的节点从子集删除。

    7.2、NAT模式测试

    1)测试环境:

    Director:         centos 6.8      VIP:192.168.1.111

                                                    DIP:192.168.229.133

    RealServer1: centos6.8        RIP:192.168.229.132

    RealServer2: centos6.8        RIP:192.168.229.134

    2)Director配置

    安装ipvsadm:

    [root@ShiYanLou LVS]# yum install ipvsadm –y

    编辑脚本:/LVS/install.sh

    #director设置 nat 防火墙
    iptables -t nat -F
    
    #!/bin/bash
    VIP=192.168.1.111
    DIP=192.168.229.133
    RIP1=192.168.229.132
    RIP2=192.168.229.134
    # director服务器上开启路由转发功能:
    echo 1 > /proc/sys/net/ipv4/ip_forward
    # 关闭 icmp 的重定向
    echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
    echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
    echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
    echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects
    # director设置 ipvsadm
    IPVSADM='/sbin/ipvsadm'
    $IPVSADM -C
    $IPVSADM -A -t $VIP:80 -s rr
    $IPVSADM -a -t $VIP:80 -r $RIP1:80 -m
    $IPVSADM -a -t $VIP:80 -r $RIP2:80 -m

     

    3)RealServer配置

    1. 配置RealServer1和RealServer2的网关为DIP。如:

       

      vi /etc/sysconfig/network-scripts/ifcfg-eth0
      DEVICE=eth0
      HWADDR=00:0C:29:46:3B:8C
      TYPE=Ethernet
      UUID=e2fa0e51-7240-4ef9-8572-bf82ef8bb6a8
      ONBOOT=yes
      NM_CONTROLLED=yes
      BOOTPROTO=static
      IPADDR=192.168.229.132
      NETMASK=255.255.255.0
      GATEWAY=192.168.229.133                #配置网关为DIP

       

    2. 安装httpd
      yum –y install httpd
      标记网页:
      RealServer1:echo ”I am RealServer1 192.168.229.132”>/var/www/html/index.html
      RealServer2:echo “I am RealServer2 192.168.229.134”>/var/www/html/index.html

    4)验证

    多次访问http://192.168.1.111

    会轮询得到“I am RealServer1 192.168.229.132”“I am RealServer2 192.168.229.134”

    注意:关闭Director的防火墙iptables,不然访问不成功。

    7.3、DR模式测试

    1)测试环境

    Director:        centos 6.8        VIP:eth0:0:192.168.229.111

                                                     DIP:eth0:192.168.229.133

    RealServer1: centos6.8        RIP:eth0:192.168.229.132

                                                     VIP:lo:0:192.168.229.111

    RealServer2: centos6.8        RIP:eth0:192.168.229.134

                                                     VIP:lo:0:192.168.229.111

    2)Director配置

    脚本如下:

     

    #! /bin/bash
    echo 1 > /proc/sys/net/ipv4/ip_forward
    ipv=/sbin/ipvsadm
    vip=192.168.229.111
    rs1=192.168.229.132
    rs2=192.168.229.134
    ifconfig eth0:0 down
    ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.0 up
    route add -host $vip dev eth0:0
    $ipv -C
    $ipv -A -t $vip:80 -s rr
    $ipv -a -t $vip:80 -r $rs1:80 -g
    $ipv -a -t $vip:80 -r $rs2:80 –g

     

     

    3)RealServer配置

    脚本如下:

     

     

    #!/bin/bash
    vip=192.168.229.111
    ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
    route add -host $vip 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

     

     

    4)验证

    多次访问http://192.168.1.111

    会轮询得到“I am RealServer1 192.168.229.132”  “I am RealServer2 192.168.229.134”

    注意:关闭Director的防火墙iptables,不然访问不成功。

    7.4、Tun模式测试

    1)测试环境

    Director:        centos 6.8        VIP:eth0:0:192.168.299.111

                                                     DIP:eth0:192.168.229.133

    RealServer1: centos6.8        RIP:eth0:192.168.229.132

                                                     VIP:tunl0:192.168.229.111

    RealServer2: centos6.8        RIP:eth0:192.168.229.134

                                                     VIP:tunl0:192.168.229.111

    2)Director配置

    脚本如下:

     

     

    #! /bin/bash
    echo 1 > /proc/sys/net/ipv4/ip_forward
    ipv=/sbin/ipvsadm
    vip=192.168.229.111
    rs1=192.168.229.132
    rs2=192.168.229.134
    ifconfig eth0:0 down
    ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.0 up
    route add -host $vip dev eth0:0
    iptables -t nat -F
    setenforce 0
    $ipv -C
    $ipv -A -t $vip:80 -s rr
    $ipv -a -t $vip:80 -r $rs1:80 -i
    $ipv -a -t $vip:80 -r $rs2:80 -i

     

     

    3)RealServer配置

    a、加载ipip模块

    [root@ulife3test LVS]# modprobe ipip

    b、配置VIP:

     

     

    [root@ulife3test LVS]# cd /etc/sysconfig/network-scripts/
    [root@ulife3test network-scripts]# cp ifcfg-lo ifcfg-tunl0
    [root@ulife3test network-scripts]# vi ifcfg-tunl0
    DEVICE=tunl0
    IPADDR=192.168.229.111
    NETMASK=255.255.255.0
    ONBOOT=yes
    NAME=tunl0
    [root@ulife3test network-scripts]# service network restart

     

     

    c、关闭arp转发:

     

    [root@ulife3test network-scripts]# echo '0'>/proc/sys/net/ipv4/ip_forward
    [root@ulife3test network-scripts]# vi /etc/sysctl.conf                #加入以下行
    net.ipv4.conf.tunl0.arp_ignore = 1
    net.ipv4.conf.tunl0.arp_announce = 2
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.all.arp_announce = 2
    net.ipv4.conf.tunl0.rp_filter = 0
    net.ipv4.conf.all.rp_filter = 0
    [root@ulife3test network-scripts]# sysctl -p                           #永久生效
    net.ipv4.ip_forward = 0
    net.ipv4.conf.default.rp_filter = 1
    net.ipv4.conf.default.accept_source_route = 0
    kernel.sysrq = 0
    kernel.core_uses_pid = 1
    net.ipv4.tcp_syncookies = 1
    net.ipv4.conf.tunl0.arp_ignore = 1
    net.ipv4.conf.tunl0.arp_announce = 2
    net.ipv4.conf.all.arp_ignore = 1
    net.ipv4.conf.all.arp_announce = 2
    net.ipv4.conf.tunl0.rp_filter = 0
    net.ipv4.conf.all.rp_filter = 0

     

     

    d、关闭selinux

    setenforce 0或者修改/etc/selinux/config 配置文件中SELINUX=disabled然后重启系统。

    4)验证

    多次访问http://192.168.1.111

    会轮询得到“I am RealServer1 192.168.229.132”“I am RealServer2 192.168.229.134”

    注意:关闭Director的防火墙iptables,不然访问不成功。

    展开全文
  • 图解LVS的工作原理

    万次阅读 多人点赞 2018-05-14 22:46:30
    LVS内核工作模型 LVS常见术语 LVS模式介绍 NAT模式 DR模式 其他模式 LVS调度算法介绍 LVS的部署 NAT模式的实现 DR模式的实现 调度器配置 WEB后端服务器配置 实验测试 ...

    LVS简介

    ILVS,是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目。LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

    LVS特点:

    通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。LVS的主要特点有以下几个方面:

    • 高并发连接:LVS基于内核网络层面工作,有超强的承载能力和并发处理能力。单台LVS负载均衡器,可支持上万并发连接。 稳定性强:是工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低。
    • 成本低廉:硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,性价比极高。
    • 配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。
    • 支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用
      支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。
    • 应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等等
    • 缺点:工作在4层,不支持7层规则修改,机制过于庞大,不适合小规模应用。

    LVS常见术语

    LVS中有一些常见的术语,如下表所示:

    名称 解释
    ipvsadm 用户空间的命令行工具,用于管理集群服务及集群服务上的RS等;
    IPVS 工作于内核上的netfilter INPUT HOOK之上的程序,可根据用户定义的集群实现请求转发;
    VS Virtual Server ,虚拟服务
    Director, Balancer 负载均衡器、分发器
    RS Real Server 后端请求处理服务器
    CIP Client IP,客户端IP
    VIP Director Virtual IP,负载均衡器虚拟IP
    DIP Director IP,负载均衡器IP
    RIP Real Server IP,后端请求处理服务器IP

    LVS工作原理

    这里写图片描述

    如果对于iptables5条链不了解的同学,麻烦先去看下这个知识点。这5条链是当数据包流向这台服务器的时候,数据包在服务器内核中的流向。可以参考下面这篇文章:

    iptables工作原理链接

    LVS工作原理:

    1. 当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。
    2. 当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。
    3. LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将经过INPUT链送至用户空间,交给用户空间的进程来处理。
    4. 如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。
    5. 最后经由POSTROUTING链发往后端服务器。

    NAT模式

    LVS有很多种模式来供我们选择,生产场景中一般使用的都是NAT模式和DR模式,当然,也并不是说其他模式并不会使用,还是要根据实际的生产场景来决定选择什么样的方案。

    Virtual Server via NAT(VS-NAT):用地址翻译实现虚拟服务器。地址转换器有能被外界访问到的合法IP地址,它修改来自专有网络的流出包的地址。外界看起来包是来自地址转换器本身,当外界包送到转换器时,它能判断出应该将包送到内部网的哪个节点。优点是节省IP 地址,能对内部进行伪装;缺点是效率低,因为返回给请求方的数据包经过调度器。
    这里写图片描述
    数据包流转的过程如上图所示:

    (1)当用户请求到达DirectorServer,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。

    (2) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。

    (3) IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP ,在这个过程完成了目标IP的转换。

    (4) POSTROUTING链通过选路,将数据包发送给Real Server。

    (5) Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP 。

    (6) Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。

    如下图所示,NAT模式中的一大缺点就是无论是请求的数据包,还是返回的数据包,都必须要经过负载的这个点,请求的数据包一般内容较少,问题不是很大,而返回的数据包,一般都是图片,视频等等,这会给中间的调度器带来巨大的负担。font>

    这里写图片描述

    DR模式

    Virtual Server via Direct Routing(VS-DR):用直接路由技术实现虚拟服务器。当参与集群的计算机和作为控制管理的计算机在同一个网段时可以用此方法,控制管理的计算机接收到请求包时直接送到参与集群的节点。直接路由模式比较特别,很难说和什么方面相似,前种模式基本上都是工作在网络层上(三层),而直接路由模式则应该是工作在数据链路层上(二层)。

    工作原理 :

    这里写图片描述
    如上图所示,Director和REAL SERVER都配置同一个IP(VIP),Director将该IP配置到对外的网卡上,Real server将该IP配置到lo网卡上。配置arp_ignore为1(目的是让数据包发出apr请求时,只有Director会响应该arp请求),所有REAL SERVER对本身这个IP的ARP请求保持静默。而Director收到数据包后根据调度算法,找出对应的 REAL SERVER,把目的MAC地址改为REAL SERVER的MAC并发给这台REAL SERVER。这时REAL SERVER通过网卡eth0收到这个数据包,由于Real Server上的lo网卡配置的也有VIP,所以RS接收该数据包。处理后直接返回给客户端(这里要配置arp_announce,目的是修改返回数据包的源ip地址。)。由于DR要对二层包头进行改换,所以DR和REAL SERVER之间必须在一个广播域,也可以简单的理解为在同一台交换机上。

    内核参数详解

    arp_ignore

    arp_announce

    不修改的话,回答数据包源ip地址为VIP,mac为发送网卡的mac即途中的eth0,那么交换机上更新mac表之后,就会发现VIP对应两条mac记录,一条对应Director的mac地址,一条对应Real Server的mac地址。就会使真正的VIP得不到正确的请求了
    相对于NAT模式来言,DR模式能够较好的解决上述问题,其数据在服务器集群中的流向如上图所示,请求报文经过LVS到达后端真实的WEB服务器,而响应报文,则直接发给客户端,并不需要通过调度器。

    数据包流转过程
    在这里插入图片描述

    1. 用户请求目标网站时,经过dns查询得到目的IP为VIP,目的端口为80,于是客户端和我们VIP,端口80建立连接。当数据包到达VIP所在的局域网时,在同一网段中,两个主机通信靠的是二层的物理地址而不是Ip地址,因此需要将IP地址转换为MAC地址,因此会发出apr请求,查询VIP对应的mac地址。==Linux主机有这么一个特性,假设我们的主机上有两块网卡,比如eth0,eth1 当arp请求eth1的mac地址的时候,eth1会答复,这个是理所当然的,但是eth0也会“好心”的帮eth1回答这个arp请求。==我们在Real Server的lo网卡上配置了VIP,但是我们只想让Director上的网卡来响应我们的这个arp请求。因此就需要更改下我们的一些内核参数,具体含义见后文。这时,数据包就得到了二层的Director的传输地址。
     net.ipv4.conf.lo.arp_ignore = 1
    
     net.ipv4.conf.all.arp_ignore = 1
    

    正常情况下只写第二条就是了,all 是指所有设备的interface,当all和具体的interface比如lo,按照最大的值生效;

    1. 当用户请求到达DirectorServer,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP。
    2. PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链.
    3. IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链。此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址
    4. 由于DS和RS在同一个网络中,所以是通过二层来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。
    5. client的请求被Director转发并经过链路层寻址到达Realserver后,由于Realserver的lo接口配置了VIP(请求中的目标IP正是VIP),所以接收请求并处理。处理完成之后,将响应报文通过lo接口传送给eth0网卡(这个网卡一般指和调度器在一个网段的网卡)然后向外发出。此时的源IP地址为VIP,目标IP为CIP。==如果将源地址为VIP将数据包发送出去,那么最终交换机上会产生两条VIP对应的mac地址记录,一条是Director的mac地址记录,还有一条是Real server的mac地址记录,这将会导致真正的VIP无法接收到请求。==因此,此处要配置arp_announce,目的是为了修改源ip的目的地址。
        net.ipv4.conf.lo.arp_announce = 2
    
        net.ipv4.conf.all.arp_announce = 2
    

    配置arp_announce=2,选择该主机发送网卡上最合适的本地地址作为arp请求的源IP地址。
    9. 响应报文通过二层链路传输,最终送达至客户端。

    DR模式的特性
    1、保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS

    2、RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问

    3、RS跟Director Server必须在同一个物理网络中

    4、所有的请求报文经由Director Server,但响应报文必须不能进过Director Server

    5、不支持地址转换,也不支持端口映射

    6、RS可以是大多数常见的操作系统

    7、RS的网关绝不允许指向DIP

    8、RS上的lo接口配置VIP的IP地址

    TUN工作模式

    这里写图片描述
    1.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。

    2.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。

    3.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡(这个网卡一般指和调度器在一个网段的网卡)直接发送给客户端。注意:需要设置lo接口的VIP不能在公网上出现。

    full-nat模式

    这里写图片描述

    特点:
    (1)RIP,DIP可以使用私有地址;
    (2)RIP和DIP可以不再同一个网络中,且RIP的网关未必需要指向DIP;
    (3)支持端口映射;
    (4)RS的OS可以使用任意类型;
    (5)请求报文经由Director,响应报文也经由Director

    LVS调度算法介绍

    LVS有两种类型的调度算法,其一就是静态的调度算法,这种算法一经实现,后续就不会发生变化,是既定的规则,后续数据包的流转都会按照这种规则进行按部就班的流转;其二就是动态的调度算法,这种算法是基于网络状况,或者后端服务器的状况,连接的状况等来进行实时的调整,算法的规则会根据实际情况而发生一定的变化。

    常用的静态调度算法有以下几种:

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

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

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

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

    常用的动态调度算法有下面这些

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

    2.WLC:加权最少连接(默认采用的就是这种)(Weighted Least Connections)
    在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

    3.SED:最短延迟调度(Shortest Expected Delay )
    在WLC基础上改进,Overhead = (ACTIVE+1)*256/加权,不再考虑非活动状态,把当前处于活动状态的数目+1来实现,数目最小的,接受下次请求,+1的目的是为了考虑加权的时候,非活动连接过多缺陷:当权限过大的时候,会倒置空闲服务器一直处于无连接状态。

    4.NQ永不排队/最少队列调度(Never Queue Scheduling NQ)
    无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要再进行sed运算,保证不会有一个主机很空间。在SED基础上无论+几,第二次一定给下一个,保证不会有一个主机不会很空闲着,不考虑非活动连接,才用NQ,SED要考虑活动状态连接,对于DNS的UDP不需要考虑非活动连接,而httpd的处于保持状态的服务就需要考虑非活动连接给服务器的压力。

    ipvsadm使用指南

    在ipvsadm中有几个常见术语需要解释一下:

    • virtual-service-address:是指虚拟服务器的ip 地址
    • real-service-address:是指真实服务器的ip 地址
    • scheduler:调度方法

    配置虚拟服务的语法

    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]
    #保存虚拟服务器规则
    
    命令选项解释:
    -A --add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也
    就是增加一台新的虚拟服务器。
    -E --edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录。
    -D --delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录。
    -C --clear 清除内核虚拟服务器表中的所有记录。
    -R --restore 恢复虚拟服务器规则
    -S --save 保存虚拟服务器规则,输出为-R 选项可读的格式
    -s --scheduler scheduler 使用的调度算法,有这样几个选项
    rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
    -p --persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客
    户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。
    -M --netmask netmask persistent granularity mask
    
    

    配置real server的语法

    ipvsadm 的用法和格式如下:
    
    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-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 标记过的服务类型。
    
    -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和DR模式的实现

    上述四种工作模式,DR模式和NAT模式是常用的两种模式,本文就只阐述这两种工作模式。

    NAT模式的实现

    在实现之前,要先对网段进行一定的规划,每一台服务器都去规划好它的位置,和其所承担的职责。

    机器名称 IP配置 服务角色
    lvs VIP:192.168.31.100 DIP:172.25.0.1 负载均衡器
    web1 RIP:172.25.0.31 后端服务器
    web2 RIP:172.25.0.32 后端服务器
    web3 RIP:172.25.0.33 后端服务器

    其数据流转的模型如下图所示:
    这里写图片描述

    实现步骤:
    安装相关配置工具
    [root@lvs1 ~]# yum install ipvsadm -y

    lvs-server配置:
    1、ipvsadm -A -t 192.168.31.100:80 -s wrr
    #开启一个基于80端口的虚拟服务,调度方式为wrr
    
    2、ipvsadm -a -t 192.168.31.100:80  -r 172.25.0.31 -m -w 1
    #配置web1服务后端real server  为nat工作方式  权重为1 
    
    ipvsadm -a -t 192.168.31.100:80  -r 172.25.0.32 -m -w 1
    #配置web2服务后端real server  为nat工作方式  权重为1 
    
    ipvsadm -a -t 192.168.31.100:80  -r 172.25.0.33 -m -w 1
    #配置web3服务后端real server  为nat工作方式  权重为1 
    
    3、修改内核配置,开启路由转发
    vim /etc/sysctl.conf 修改 net.ipv4.ip_forward=1 
    
    sysctl -p 使其生效
    
    5、real server配置
    配置网关指向172.25.0.11,开启web、php-fpm、mysql服务
    
    

    可分别在三个站点上面写上不同的内容,然后进行测试,看是否能够进行调度。
    注:windows中的浏览器中一般都会有缓存,其调度可能会失效,使用Linux中的curl等命令访问则是没有问题的。能够正常的实现调度。

    DR模式的实现

    机器名称 IP配置 服务角色
    lvs VIP:172.25.0.100 DIP:172.25.0.1 负载均衡器
    web1 RIP:172.25.0.31 后端服务器
    web2 RIP:172.25.0.32 后端服务器
    web3 RIP:172.25.0.33 后端服务器

    这里写图片描述
    DR模式的配置是使用命令来实现的,故其中的一些配置在系统重启之后是不存在的,如果要想下次开机启动之后,能够自动的配置,可以将配置的步骤写成脚本,并设置开机自启动。(上面NAT模式的实现也可以设置开机自启动脚本来实现。)

    调度器配置

    LVS调度器脚本

    #!/bin/bash
    # chkconfig:   2345 90 10
    #LVS script for DR
    . /etc/rc.d/init.d/functions
    VIP=172.25.0.100
    DIP=172.25.0.11
    RIP1=172.25.0.31
    RIP2=172.25.0.32
    RIP3=172.25.0.33
    PORT=80
    # 
    #description: hhahahah
    
    case "$1" in
    start)
      /sbin/ifconfig ens34:0 $VIP broadcast $VIP netmask 255.255.255.255 up
      /sbin/route add -host $VIP dev ens34:0
    
    # Since this is the Director we must be able to forward packets 
      echo 1 > /proc/sys/net/ipv4/ip_forward
    # 开启路由转发功能
    # Clear all iptables rules. 
      /sbin/iptables -F
    
    # Reset iptables counters. 
      /sbin/iptables -Z
    
    # Clear all ipvsadm rules/services. 
      /sbin/ipvsadm -C
    
    # Add an IP virtual service for VIP 192.168.0.219 port 80 
    # In this recipe, we will use the round-robin scheduling method. 
    # In production, however, you should use a weighted, dynamic scheduling method. 
      /sbin/ipvsadm -A -t $VIP:80 -s wrr
    
    # Now direct packets for this VIP to 
    # the real server IP (RIP) inside the cluster 
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -g -w 1
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -g -w 1
      /sbin/ipvsadm -a -t $VIP:80 -r $RIP3 -g -w 1
    ;;
    
    stop)
    # Stop forwarding packets 
      echo 0 > /proc/sys/net/ipv4/ip_forward
    
    # Reset ipvsadm 
      /sbin/ipvsadm -C
    
    # Bring down the VIP interface 
      /sbin/ifconfig ens34:0 down
    
    #  echo "ipvs is stopped..." 
    ;;
    
    *)
      echo "Usage: $0 {start|stop}" 
    ;;
    esac
    

    将上述内容保存在/etc/init.d/lvs-director文件中,然后添加到服务:

    
    
    [root@lvs ~]# chmod +x /etc/init.d/lvs-director
    # 添加脚本执行权限
    [root@lvs ~]# chkconfig --add lvs-director
    # 添加脚本到服务当中
    [root@lvs ~]# chkconfig lvs-director on
    # 设置为开机自启动服务
    [root@lvs ~]# /etc/init.d/lvs-director start 
    # 启动脚本    
    
    

    WEB后端服务器配置

    客户端脚本

    #!/bin/bash 
    # 
    # Script to start LVS DR real server. 
    # chkconfig: - 90 10 
    # description: LVS DR real server 
    # 
    .  /etc/rc.d/init.d/functions
    
    VIP=172.25.0.100
    
    host=`/bin/hostname`
    
    case "$1" in
    start)
           # Start LVS-DR real server on this machine. 
            /sbin/ifconfig lo down
            /sbin/ifconfig lo up
            echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
            #只响应目的IP地址为接收网卡上的本地地址的arp请求
            echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
            # 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.
            echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
            #配置所有网卡只响应自己接口上的ip的arp请求,其余的忽略。
            echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
            #必须避免将接口信息向非本网络进行通告
            
            /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
            /sbin/route add -host $VIP dev lo:0
    
    ;;
    stop)
    
            # Stop LVS-DR real server loopback device(s). 
            /sbin/ifconfig lo:0 down
            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
    
    ;;
    
    *)
                # Invalid entry. 
                echo "$0: Usage: $0 {start||stop}" 
                exit 1
    ;;
    esac
    
    

    保存至/etc/init.d/lvs-rs,并赋予执行权限,然后添加为开机启动:

    
    
        [root@web1~]# chmod +x /etc/init.d/lvs-rs
    
        [root@web1 ~]# chkconfig --add lvs-rs
    
        [root@web1 ~]# chkconfig lvs-rs on
    
        [root@web1 ~]# /etc/init.d/lvs-rs start
    
    

    web2和web3采用完全相同的配置即可。

    实验测试

    在web1、web2和web3上写入不同的站点内容,然后访问172.25.0.100。访问调度器的网址,看是否每次访问的站点内容都是不同的。(windows中的浏览器有缓存功能,如果站点内容有时候是相同的,那么不一定是自己配错了,可能是缓存的原因,避免的办法就是使用Linux的curl命令去访问站点的内容)

    参考文献

    Linux内核参数之arp_ignore和arp_announce
    LVS工作总结之原理篇–DR模式

    展开全文
  • 图解 Git 工作原理

    2021-05-14 00:20:35
    上一篇:3600万中国人在抖音“上清华”链接:http://marklodato.github.io/visual-git-guide/index-zh-cn.html 本文图解Git中的...

    上一篇:3600万中国人在抖音“上清华”

    链接:http://marklodato.github.io/visual-git-guide/index-zh-cn.html
    

    本文图解Git中的最常用命令。如果你稍微理解Git的工作原理,这篇文章能够让你理解的更透彻。

    基本用法

    上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。

    • git add files把当前文件放入暂存区域。

    • git commit给暂存区域生成快照并提交。

    • git reset – files用来撤销最后一次git add files,你也可以用git reset撤销所有暂存区域文件。

    • git checkout – files把文件从暂存区域复制到工作目录,用来丢弃本地修改。

    你可以用git reset -p,git checkout -p,or git add -p进入交互模式。

    也可以跳过暂存区域直接从仓库取出文件或者直接提交代码。

    • git commit -a相当于运行git add把所有当前目录下的文件加入暂存区域再运行。

    • git commit files进行一次包含最后一次提交加上工作目录中文件快照的提交。并且文件被添加到暂存区域。

    • git checkout HEAD – files回滚到复制最后一次提交。

    约定

    后文中以下面的形式使用图片。

    绿色的5位字符表示提交的ID,分别指向父节点。分支用橘色显示,分别指向特定的提交。当前分支由附在其上的HEAD标识。这张图片里显示最后5次提交,ed489是最新提交。master分支指向此次提交,另一个maint分支指向祖父提交节点。

    命令详解

    Diff

    有许多种方法查看两次提交之间的变动,下面是一些示例。

    Commit

    提交时,Git用暂存区域的文件创建一个新的提交,并把此时的节点设为父节点。然后把当前分支指向新的提交节点。下图中,当前分支是master。在运行命令之前,master指向ed489,提交后,master指向新的节点f0cec并以ed489作为父节点。

    即便当前分支是某次提交的祖父节点,git会同样操作。下图中,在master分支的祖父节点maint分支进行一次提交,生成了1800b。这样,maint分支就不再是master分支的祖父节点。此时,合并[1](或者衍合[2])是必须的。

    如果想更改一次提交,使用git commit –amend。Git会使用与当前提交相同的父节点进行一次新提交,旧的提交会被取消。

    另一个例子是分离HEAD提交[3],后文讲。

    Checkout

    Checkout命令用于从历史提交(或者暂存区域)中拷贝文件到工作目录,也可用于切换分支。

    当给定某个文件名(或者打开-p选项,或者文件名和-p选项同时打开)时,Git会从指定的提交中拷贝文件到暂存区域和工作目录。比如,git checkout HEAD~ foo.c会将提交节点HEAD~(即当前提交节点的父节点)中的foo.c复制到工作目录并且加到暂存区域中。(如果命令中没有指定提交节点,则会从暂存区域中拷贝内容。)注意当前分支不会发生变化。

    当不指定文件名,而是给出一个(本地)分支时,那么HEAD标识会移动到那个分支(也就是说,我们“切换”到那个分支了),然后暂存区域和工作目录中的内容会和HEAD对应的提交节点一致。新提交节点(下图中的a47c3)中的所有文件都会被复制(到暂存区域和工作目录中);只存在于老的提交节点(ed489)中的文件会被删除;不属于上述两者的文件会被忽略,不受影响。

    如果既没有指定文件名,也没有指定分支名,而是一个标签、远程分支、SHA-1值或者是像master~3类似的东西,就得到一个匿名分支,称作detached HEAD(被分离的HEAD标识)。这样可以很方便地在历史版本之间互相切换。比如说你想要编译1.6.6.1版本的Git,你可以运行git checkout v1.6.6.1(这是一个标签,而非分支名),编译,安装,然后切换回另一个分支,比如说git checkout master。然而,当提交操作涉及到“分离的HEAD”时,其行为会略有不同,详情见在下面。

    HEAD标识处于分离状态时的提交操作

    当HEAD处于分离状态(不依附于任一分支)时,提交操作可以正常进行,但是不会更新任何已命名的分支。(你可以认为这是在更新一个匿名分支。)

    一旦此后你切换到别的分支,比如说master,那么这个提交节点(可能)再也不会被引用到,然后就会被丢弃掉了。注意这个命令之后就不会有东西引用2eecb。

    但是,如果你想保存这个状态,可以用命令git checkout -b name来创建一个新的分支。

    Reset

    Reset命令把当前分支指向另一个位置,并且有选择的变动工作目录和索引。也用来在从历史仓库中复制文件到索引,而不动工作目录。

    如果不给选项,那么当前分支指向到那个提交。如果用–hard选项,那么工作目录也更新,如果用–soft选项,那么都不变。

    如果没有给出提交点的版本号,那么默认用HEAD。这样,分支指向不变,但是索引会回滚到最后一次提交,如果用–hard选项,工作目录也同样。

    如果给了文件名(或者-p选项),那么工作效果和带文件名的checkout差不多,除了索引被更新。

    Merge

    Merge命令把不同分支合并起来。合并前,索引必须和当前提交相同。如果另一个分支是当前提交的祖父节点,那么合并命令将什么也不做。另一种情况是如果当前提交是另一个分支的祖父节点,就导致fast-forward合并。指向只是简单的移动,并生成一个新的提交。

    否则就是一次真正的合并。默认把当前提交(ed489 如下所示)和另一个提交(33104)以及他们的共同祖父节点(b325c)进行一次三方合并[4]。结果是先保存当前目录和索引,然后和父节点33104一起做一次新提交。

    Cherry Pick

    cherry-pick命令“复制”一个提交节点并在当前分支做一次完全一样的新提交。

    Rebase

    衍合是合并命令的另一种选择。合并把两个父分支合并进行一次提交,提交历史不是线性的。衍合在当前分支上重演另一个分支的历史,提交历史是线性的。本质上,这是线性化的自动的 cherry-pick。

    上面的命令都在topic分支中进行,而不是master分支,在master分支上重演,并且把分支指向新的节点。注意旧提交没有被引用,将被回收。

    要限制回滚范围,使用–onto选项。下面的命令在master分支上重演当前分支从169a6以来的最近几个提交,即2c33a。

    同样有git rebase –interactive让你更方便的完成一些复杂操作,比如丢弃、重排、修改、合并提交。没有图片体现这些,细节看这里:git-rebase(1)[5]。

    技术说明

    文件内容并没有真正存储在索引(.git/index)或者提交对象中,而是以blob的形式分别存储在数据库中(.git/objects),并用SHA-1值来校验。索引文件用识别码列出相关的blob文件以及别的数据。对于提交来说,以树(tree)的形式存储,同样用对于的哈希值识别。树对应着工作目录中的文件夹,树中包含的 树或者blob对象对应着相应的子目录和文件。每次提交都存储下它的上一级树的识别码。

    如果用detached HEAD提交,那么最后一次提交会被the reflog for HEAD引用。但是过一段时间就失效,最终被回收,与git commit –amend或者git rebase很像。

    相关链接:

    1. http://marklodato.github.io/visual-git-guide/index-zh-cn.html#merge

    2. http://marklodato.github.io/visual-git-guide/index-zh-cn.html#rebase

    3. http://marklodato.github.io/visual-git-guide/index-zh-cn.html#detached

    4. http://en.wikipedia.org/wiki/Three-way_merge

    5. http://www.kernel.org/pub/software/scm/git/docs/git-rebase.html#_interactive_mode

    看完这篇文章,你有什么收获?欢迎在留言区与10w+Java开发者一起讨论~

    关注微信公众号:互联网架构师,在后台回复:2T,可以获取我整理的教程,都是干货。


    猜你喜欢

    1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

    2、如何才能成为优秀的架构师?

    3、从零开始搭建创业公司后台技术栈

    4、程序员一般可以从什么平台接私活?

    5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

    6、滴滴业务中台构建实践,首次曝光

    7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

    8、15张图看懂瞎忙和高效的区别

    9、2T架构师学习资料干货分享

    展开全文
  • 剖析互联网工作原理

    千次阅读 2017-07-10 08:50:32
    互联网如何工作 你发送完邮件,关闭你的笔记本电脑,然后继续你的意大利之旅。此时,你的邮件也将开始它的旅程,尽管旅程的时间非常短暂。 当你点击发送时,笔记本电脑的网卡使用 WiFi 将电子邮件中的数据发送到无线...
  • LVS原理图解

    2018-10-09 13:43:00
    LVS(Linux Virtual Server),是一个极好的负载均衡解决...随着互联网在人们生活中的普及,企业级应用迎来了海量数据的冲击,如微信、美团外卖、微信支付等应用每天的使用人数都在千万以上,仅靠单台机器提供服务...
  • 图解DNS的工作原理

    千次阅读 2017-03-13 23:39:05
    有一定技术基础的互联网用户都知道DNS是做什么用的,但大多数人都不清楚DNS如何查找域名。 Ven发现了一幅图片,这幅图片非常形象地描述了DNS查找下的连锁反应,对不了解DNS运行的人们可能会有些帮助。 下面这张...
  • lVS工作原理 客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此RS来处理。 RS处理完成后把数据交给经过负载均衡器,负载均衡器再把数据包的原IP地址改为自己的IP,将目的地址改为...
  • Google搜索的工作原理分析【图解

    千次阅读 2010-11-26 19:37:00
    Google搜索的工作原理分析【图解】:为你讲述一秒钟之内Google搜索服务器到底发生了什么
  • 二、ping —— 工作原理分析 1、打个 ICMP 数据包 - 网络层 2、打个 IP 数据包 - 网络层: 3、加入 Mac 头信息 - 数据链路层 4、接收端 拆解包:物理层-数据链路层-网络层 5、接收端 构建响应包,返回给发送端 ...
  • Java反射原理图解

    2020-08-20 10:32:16
    利用反射技术获取类的属性、方法、构造函数 获取类的属性和方法 感谢 博主在此给大家安利一款分享学习资料的app,此app的主要目的就是收集互联网上的各种学习资料做整合并免费分享。里面涵盖了Android、java、python...
  • 来源:深度学习进阶学习社这个帖子很好地提醒了我,为什么我愿意跟如此美丽可爱的大脑一起工作。因为真正的大脑非常不可爱,长得也难看。但是,过去一个月,我一直生活在充斥着红色...
  • 最近发现我身边和加我QQ的朋友们,总会问到我一些搜索引擎蜘蛛爬行的问题,所以今天我想为大家分享的这个seo优化知识就是百度的搜索引擎工作原理,其实应该是seo基础,呵呵。好了不废话了,还是抓紧为大家分享seo...
  • 脑分享 | 脑结构、脑工作原理最详细图解

    千次阅读 多人点赞 2018-08-24 18:10:17
    来源:深度学习进阶学习社摘要:这个帖子很好地提醒了小编我,为什么愿意跟如此美丽可爱的大脑一起工作。因为真正的大脑非常不可爱,长得也难看。但是,过去一个月,我一直生活在充斥...
  • 工作知识储备 3 ---从头说12种排序算法 原理 图解 动画视频演示 代码以及笔试面试题目中的应用
  • Modems are controlled by software on your PC using a language called the Hayes command set or AT command set. When a modem is to be dialed, the first command given it is to tell it to go off hook...
  • 开源 LVS 版本有 3 种工作模式,每种模式工作原理都不同,每种模式都有自己的优缺点和不同的应用场景,包括以下三种模式: DR 模式 NAT 模式 Tunnel 模式 这里必须要提另外一种模式是 FullNAT,这个模式在开源版本...
  • 大数据,云计算,物联网和移动互联网关系图解
  • 图解 SSH 原理

    2019-07-15 12:01:10
    2. SSH 工作原理 在讨论 SSH 的原理和使用前,我们需要分析一个问题: 为什么需要 SSH? 从 1.1 节 SSH 的定义中可以看出,SSH 和 Telnet、FTP 等协议主要的区别在于 安全性 。这就引出下一个问题: 如何实现数据的...
  • 前文拆解了2G GSM手机语音通话的工作原理开始,重点关注单个终端的通信技术:语音编码、信道编码、逻辑信道、物理信道、TDMA时分多址、GMSK调制。 本章将拆解2G GSM基站的工作原理以及多终端共享信道场景下的技术,...
  • ▌大纲 RDB和AOF两种持久化机制的介绍 RDB持久化机制的优点 RDB持久化机制的缺点 AOF持久化机制的优点 AOF持久化机制的缺点 RDB和AOF到底该如何选择   ▌RDB和AOF两种持久化机制的介绍 ...
  • 这是[码哥]Kafka 系列文章的第二篇,码哥将从原理、实践和源码角度为大家深入剖析并实践 Kafka。此系列包括[原理篇]、[实践篇]和[源码篇]。这篇是[原理篇]的第二篇,主要讲解 K...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,007
精华内容 2,402
关键字:

互联网工作原理图解