摘要:GaussDB(DWS)的负载平衡通过LVS+keepAlived实现。对于这种形式,须要思考的问题是,CN的返回后果是否会通过LVS,而后再返回给前端利用?如果通过LVS,那么,LVS会不会成为单点瓶颈? 带着这两个问题,咱们探索一下LVS+KeepAlived的实现原理。

咱们晓得GaussDB(DWS)为了保障业务的连续性和高可靠性,各个组件都进行了高可用设计。

下图是利用拜访GaussDB(DWS)的业务流程架构图,对于业务利用或者用户来说,他们产生申请给CN,CN解析并生成执行打算,交给DN去执行,执行后再由CN汇总将数据返回给业务用户或者业务利用。这个过程是容易了解的,本次咱们重点关注的是站在CN后面的LVS+KeepAlived。

当初的问题是:

  • CN的返回后果是否会通过LVS,而后再返回给前端利用?
  • 如果通过LVS,那么,LVS会不会成为单点瓶颈?

带着这两个问题咱们探索一下LVS和KeepAlived的原理。

LVS是什么?

LVS是Linux Virtual Server的简称,也就是Linux虚构服务器, 是一个由章文嵩博士发动的自由软件我的项目,它的官方站点是www.linuxvirtualserver.org。当初LVS曾经是 Linux规范内核的一部分,在Linux2.4内核以前,应用LVS时必须要从新编译内核以反对LVS功能模块,然而从Linux2.4内核当前,曾经齐全内置了LVS的各个功能模块,无需给内核打任何补丁,能够间接应用LVS提供的各种性能。

LVS的目标是什么?

LVS次要用于服务器集群的负载平衡,领有VIP,客户端将所有申请发送至此VIP,LVS负责将申请散发到不同的RS,客户不感知RS。其目标是进步服务器的性能,将申请平衡的转移到不同的服务器上执行,从而将一组服务器形成高性能、高牢靠的虚构服务器。

LVS的体系结构

应用LVS架设的服务器集群零碎有三个局部组成:

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

  (2)两头的服务器集群层,用Server Array示意;

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

在用户看来,所有的外部利用都是通明的,用户只是在应用一个虚构服务器提供的高性能服务。如图:

  • 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的程序组成部分

LVS 由2局部程序组成,包含 ipvs 和 ipvsadm。

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

LVS的负载平衡机制

1、 LVS是四层负载平衡,也就是说建设在OSI模型的第四层——传输层之上,传输层上有咱们相熟的TCP/UDP,LVS反对TCP/UDP的负载平衡。因为LVS是四层负载平衡,因而它绝对于其它高层负载平衡的解决办法,比方DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是十分高的。

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

GaussDB(DWS)目前次要采纳的是DR(Direct Routing)模式,所以,咱们次要聊一聊DR模式。

下图是DR模式的一个示意图:

DR模式下须要LVS和RS集群绑定同一个VIP(RS通过将VIP绑定在loopback实现),申请由LVS承受,由实在提供服务的服务器(RealServer, RS)间接返回给用户,返回的时候不通过LVS。具体来看,一个申请过去时,LVS只须要将网络帧的MAC地址批改为某一台RS的MAC,该包就会被转发到相应的RS解决,留神此时的源IP和指标IP都没变,LVS只是做了一下偷梁换柱。RS收到LVS转发来的包时,链路层发现MAC是本人的,到下面的网络层,发现IP也是本人的,于是这个包被非法地承受,RS感知不到后面有LVS的存在。而当RS返回响应时,只有间接向源IP(即用户的IP)返回即可,不再通过LVS。

至此,答复了咱们第一个问题:

  • CN的返回后果是否会通过LVS,而后再返回给前端利用?

答:GaussDB(DWS)采纳的是LVS的DR模式,返回时不再通过LVS。

接下来,咱们看看keepAlived。

什么是keepAlived?

Keepalived顾名思义,放弃存活,在网络外面就是放弃在线了,也就是所谓的高可用或热备,用来避免单点故障(单点故障是指一旦某一点呈现故障就会导致整个零碎架构的不可用)的产生。

keepAlived的原理

Keepalived的实现基于VRRP(Virtual Router Redundancy Protocol,虚构路由器冗余协定),而VRRP是为了解决动态路由的高可用。虚构路由器由多个VRRP路由器组成,每个VRRP路由器都有各自的IP和独特的VRID(0-255),其中一个VRRP路由器通过竞选成为MASTER,占有VIP,对外提供路由服务,其余成为BACKUP,MASTER以IP组播(组播地址:224.0.0.18)模式发送VRRP协定包,与BACKUP放弃心跳连贯,若MASTER不可用(或BACKUP接管不到VRRP协定包),则BACKUP通过竞选产生新的MASTER并持续对外提供路由服务,从而实现高可用。

KeepAlived与LVS的关系

1、keepalived 是 lvs 的扩大我的项目,是对LVS我的项目的扩大加强,因而它们之间具备良好的兼容性。

2、对LVS应用服务层的应用服务器集群进行状态监控:若应用服务器不可用,则keepalived将其从集群中摘除,若应用服务器复原,则keepalived将其重新加入集群中。

3、查看LVS主备节点的衰弱状态,通过IP漂移,实现主备冗余的服务高可用,服务器集群共享一个虚构IP,同一时间只有一个服务器占有虚构IP并对外提供服务,若该服务器不可用,则虚构IP漂移至另一台服务器并对外提供服务,解决LVS自身单点故障问题。

至此,咱们能够答复第二个问题:

  • 如果通过LVS,那么,LVS会不会成为单点瓶颈或者呈现独自故障?

答:返回后果不会通过LVS,不会因为返回的数据量太大造成独自瓶颈的问题。对应申请, LVS只须要将用户申请转发给CN即可,负载很低,也不会呈现独自瓶颈的问题。另外,LVS通过keepAlived实现了主备冗余,防止了独自故障。

本文分享自华为云社区《由两个问题引发的对GaussDB(DWS)负载平衡的思考》,原文作者:Sprother 。

点击关注,第一工夫理解华为云陈腐技术~