根据维基百科上的定义,负载均衡(Load Balance)是一种相当常见的计算机网络技术,用来对多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源进行分配负载,以达到优化资源使用、最大化吞吐率、最小化响应时间和避免过载的目的。通常负载均衡可以分为硬件和软件负载均衡两类,本文主要讨论的是ZooKeeper在“软”负载均衡中的应用场景。

在分布式系统中,负载均衡更是一种普遍的技术,基本上每一个分布式系统都需要使用负载均衡。分布式系统具有对等性,为了保证系统的高可用性,通常采用副本的方式来对数据和服务进行部署。而对于消费者而言,则需要在这些对等的服务提供方中选择一个来执行相关的业务逻辑,其中比较典型的就是DNS服务。

一种动态的DNS服务

DNS是域名系统(Domain Name System)的缩写,是因特网中使用最广泛的核心技术之一。DNS系统可以看做是一个超大规模的分布式映射表,用于将域名和IP地址进行一一映射,进而方便人们通过域名来访问互联网站点。

通常情况下,我们可以向域名注册服务商申请域名注册,但是这种方式最大的缺陷在于只能注册有限的域名:

日常开发过程中,经常会碰到这样的情况,在一个Company1公司内部,需要给一个App1应用的服务器集群及其配置一个域名解析。相信有过一线开发经验的读者一定知道,这个时候通常会需要有类似于app1.company1.com的一个域名,其对应的就是一个服务器地址。如果系统数量不多,那么通过这种传统的DNS配置方式还可以应付,但是,一旦公司规模变大,各类应用层出不穷,那么就很难再通过这种方式来进行统一的管理了。

因此,在实际开发中,往往使用本地HOST绑定来实现域名解析的工作。使用本地HOST绑定的方法,可以很容易解决域名紧张的问题,基本上每一个系统都可以自行确定系统的域名与目标IP地址。同时,这种方法对于开发人员最大的好处就是可以随时修改域名与IP的映射,大大提高了开发调试效率。然而,这种看上去完美的方案,也有其致命的缺陷:

当应用的机器规模在一定范围内,并且域名的变更不是特别频繁时,本地HOST绑定是非常高效且简单地方式。然而一旦及其规模变大后,就常常会碰到这样的情况:我们在应用上线的时候,需要在应用的每台机器上去绑定域名,但是在机器规模相当庞大的情况下,这种做法就相当不方便。另外,如果想要临时变更新域名,还需要到每个机器上去逐个进行变更,要消耗大量时间,因此完全无法保证实时性。

现在,我们来介绍一种基于ZooKeeper实现的动态DNS方案(以下简称该方案为“DDNS”,Dynamic DNS)。

域名配置

和配置管理一样,我们首先需要在ZooKeeper上创建一个节点来进行域名配置,例如/DDNS/app1/server.app1.company1.com(以下简称“域名节点”),如下图所示。

从上图中我们看到,每个应用都可以创建一个属于自己的数据节点作为域名配置的根节点,例如/DDNS/app1,在这个节点上,每个应用都可以将自己的域名配置上去,下图是一个配置实例。

域名解析

在传统的DNS解析中,我们都不需要关心域名的解析过程,所有这些工作都交给了操作系统的域名和IP地址映射机制(本地HOST绑定)或是专门的域名解析服务器(由域名注册服务商提供)。因此,在这点上,DDNS方案和传统的域名解析有很大的区别——在DDNS中,域名的解析过程都是由每一个应用自己负责的。通常应用都会首先从域名节点中获取一份IP地址和端口的配置,进行自行解析。同时,每个应用还会在域名节点上注册一个数据变更Watcher监听,以便及时收到域名变更的通知。

域名变更

在运行过程中,难免会碰上域名对应的IP地址或是端口变更,这个时候就需要进行域名变更操作。在DDNS中,我们只需要对指定的域名节点进行更新操作,ZooKeeper就会向订阅的客户端发送这个事件通知,应用在接收到这个事件通知后,就会再次进行域名配置的获取。

上面我们介绍了如何使用ZooKeeper来实现一种动态的DNS系统。通过ZooKeeper来实现动态DNS服务,一方面,可以避免域名数量无限增长带来的集中式维护的成本;另一方面,在域名变更的情况下,也能够避免因逐台机器更新本地HOST而带来的繁琐工作。

自动化的DNS服务

根据上面的讲解,相信读者基本上已经能够使用ZooKeeper来实现一个动态的DNS服务了。但是我们仔细看一下上面的实现就会发现,在域名变更环节中,当域名对应的IP地址发生变更的时候,我们还是需要人为的介入去修改域名节点上的IP地址和端口。接下来我们看看下面这种使用ZooKeeper实现的更为自动化的DNS服务。自动化的DNS服务系统主要是为了实现服务的自动化定位,整个系统架构如下图所示。

首先来介绍整个动态DNS系统的架构体系中几个比较重要的组件及其职责。

  • Register 集群负责域名的动态注册。
  • Dispatcher 集群负责域名解析。
  • Scanner 集群负责检测以及维护服务状态(探测服务的可用性、屏蔽异常服务节点等)。
  • SDK 提供各种语言的系统接入协议,提供服务注册以及查询接口。
  • Monitor 负责收集服务信息以及对DDNS自身状态的监控。
  • Controller 是一个后台管理的Console,负责授权管理、流量控制、静态配置服务和手动屏蔽服务等功能,另外,系统的运维人员也可以在上面管理Register、Dispatcher和Scanner等集群。
整个系统的核心当然是ZooKeeper集群,负责数据的存储以及一系列分布式协调。下面我们再来详细的看下整个系统时如何运行的。在这个架构模型中,我们将那些目标IP地址和端口抽象为服务的提供者,而那些需要使用域名解析的客户端则被抽象成服务的消费者。

域名注册

域名注册主要是针对服务提供者来说的。域名注册过程可以简单地概括为:每个服务提供者在启动的过程中,都会把自己的域名信息注册到Register集群中去。
  1. 服务提供者通过SDK提供的API接口,将域名、IP地址和端口发送给Register集群。例如,A及其用于提供serviceA.xxx.com,于是他就向Register发送一个“域名→IP:PORT”的映射:“serviceA.xxx.com→192.168.0.1:8080”。
  2. Register获取到域名、IP地址和端口配置后,根据域名将信息写入相对应的ZooKeeper域名节点中。

域名解析

域名解析是针对服务消费者来说的,正好和域名注册过程相反:服务消费者在使用域名的时候,会向Dispatcher发出域名解析请求。Dispatcher收到请求后,会从ZooKeeper上的指定域名节点读取相应的IP:PORT列表,通过一定的策略选取其中一个返回给前端应用。

域名探测

域名探测是指DDNS系统需要对域名下所有注册的IP地址和端口的可用性检测,俗称“健康度检测”。健康度检测一般有两种方式,第一种是服务端主动发起健康度心跳检测,这种方式一般需要在服务端和客户端之间建立起一个TCP长链接;第二种则是客户端主动向服务端发起健康度心跳检测。在DDNS架构中的域名探测,使用的是服务提供者主动向Scanner进行状态汇报(即第二种健康度检测方式)的模式,即每个服务提供者都会定时向Scanner汇报自己的状态。
Scanner会负责记录每个服务提供者最近一次的状态汇报时间,一旦超过5秒没有收到状态汇报,那么就认为该IP地址和端口已经不可用,于是开始进行域名清理过程。在域名清理过程中,Scanner会在ZooKeeper中找到该域名对应的域名节点,然后将该IP地址和端口配置从节点内容中移除。

ZooKeeper的典型应用场景之负载均衡。相关推荐

  1. Nginx应用场景之负载均衡

    本文来说下Nginx应用场景之负载均衡的几个问题 文章目录 概述 概述

  2. ZooKeeper 的典型应用场景

    2019独角兽企业重金招聘Python工程师标准>>> ZooKeeper 是一个高可用的分布式数据管理与系统协调框架. 基于对 Paxos算法的实现,使该框架保证了分布式环境中数据 ...

  3. Zookeeper的典型应用场景(1)

    此文知识来自于:<从Paxos到Zookeeper分布式一致性原理与实践>第六章 数据发布/订阅(配置中心) 负载均衡(DNS解析) 命名服务(顺序节点特性) 分布式协调/通知(Watch ...

  4. Zookeeper 的典型应用场景场景

    Zookeeper作为一种协调分布式应用高性能的调度服务,实际的应用场景也非常的广泛,这里主要通过几个例子来具体的说明Zookeeper在特定场景下的使用方式(下面的这些功能估计consul和etcd ...

  5. Zookeeper的典型应用场景(2)

    此文知识来自于:<从Paxos到Zookeeper分布式一致性原理与实践>第六章 集群管理(子节点) Master选举(同时创建节点) 分布式锁(同时创建节点) 分布式队列(创建顺序节点) ...

  6. ZooKeeper典型应用场景一览

    原文地址:http://jm-blog.aliapp.com/?p=1232 ZooKeeper典型应用场景一览 数据发布与订阅(配置中心) 发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据 ...

  7. 【ZooKeeper Notes 28】ZooKeeper典型应用场景一览

    ZooKeeper是一个高可用的分布式数据管理与系统协调框架.基于对Paxos算法的实现,使该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得ZooKeeper解决很多分布式问题.网上 ...

  8. 负载均衡续:万亿流量场景下的负载均衡实践

    高并发优化系列文章(持续更新补充) 垂直性能提升 1.1. 架构优化:集群部署,负载均衡 1.2. 本篇内容:万亿流量下负载均衡的实现 上篇基本把负载均衡涉及到的基础都罗列了,那么到了实际场景下,特别 ...

  9. 架构设计:负载均衡层设计方案(1)——负载场景和解决方式

    架构设计:负载均衡层设计方案(1)--负载场景和解决方式 1.不同的负载场景 我们知道负载均衡层的作用是"将来源于外部的处理压力通过某种规律/手段分摊到内部各个处理节点上",那么不 ...

最新文章

  1. localStorage值的最大大小是多少?
  2. [综合面试] 大牛的面试神级总结之总结篇
  3. matlab您的安装可能需要执行其他配置步骤_手把手超详细介绍MATLAB+RoadRunner+Unreal Engine自动驾驶联合仿真...
  4. pico8 掌机_使用Pico-8构建自己的复古游戏
  5. css 滤镜之AlphaImageLoader
  6. ipvsadm命令及lvs-nat类型web服务器集群
  7. java final date_Java中的时间和日期(上)
  8. 【操作系统】—进程的状态与转换
  9. Codeforces 486D Valid Sets (树型DP)
  10. 一个很好用的桌面取色器和一个在线取色器
  11. 论文准备:基于区块链的一些设计IIoT的最新动向调查【已公开发表】
  12. 全面讲解在BIOS设置IDE设备的多种组合方式
  13. nvidia驱动和CUDA的安装
  14. 100行Python代码,做一个打地鼠小游戏!
  15. Python_基础笔记
  16. 二维正态分布参数rho的作用
  17. 火车票是一门什么生意 「上篇」
  18. 英语美文阅读:当爱向你们挥手
  19. 如何tradeoff
  20. 【距离高考还有多少天】

热门文章

  1. 365赚钱宝养猫小程序程序源码下载
  2. 【爬虫】第一部分 urllib
  3. 基于ymir2.0版本搭建本地化调试的环境
  4. Ymir平台部署安装
  5. HTML+CSS+JavaScript网页制作案例教程-黑马程序员-第五章课后习题(课程介绍专栏效果)
  6. Host memory buffer HMB的大小
  7. 一文搞定JVM的内存结构
  8. 我的一周所学(黑马的课)
  9. OpenGL教程翻译 第二十二课 使用Assimp加载模型
  10. 基于python的短视频智能推荐/django的影视网站/视频推荐系统