Flink】zookeeper在flink中的作用是什么

2020-07-21 08:50发布

4条回答
水默
2楼 · 2020-08-26 20:06

1.Zookeeper加强集群稳定性

Zookeeper通过一种和文件系统很像的层级命名空间来让分布式进程互相协同工作。这些命名空间由一系列数据寄存器组成,我们也叫这些数据寄存器为znodes。这些znodes就有点像是文件系统中的文件和文件夹。和文件系统不一样的是,文件系统的文件是存储在存储区上的,而zookeeper的数据是存储在内存上的。同时,这就意味着zookeeper有着高吞吐和低延迟。

Zookeeper实现了高性能,高可靠性,和有序的访问。高性能保证了zookeeper能应用在大型的分布式系统上。高可靠性保证它不会由于单一节点的故障而造成任何问题。有序的访问能保证客户端可以实现较为复杂的同步操作。

2.Zookeeper加强集群持续性

组成Zookeeper的各个服务器必须要能相互通信。他们在内存中保存了服务器状态,也保存了操作的日志,并且持久化快照。只要大多数的服务器是可用的,那么Zookeeper就是可用的。

客户端连接到一个Zookeeper服务器,并且维持TCP连接。并且发送请求,获取回复,获取事件,并且发送连接信号。如果这个TCP连接断掉了,那么客户端可以连接另外一个服务器。

3.Zookeeper保证集群有序性

Zookeeper使用数字来对每一个更新进行标记。这样能保证Zookeeper交互的有序。后续的操作可以根据这个顺序实现诸如同步操作这样更高更抽象的服务。

4.Zookeeper保证集群高效

Zookeeper的高效更表现在以读为主的系统上。Zookeeper可以在千台服务器组成的读写比例大约为10:1的分布系统上表现优异。

数据结构和分等级的命名空间

Zookeeper的命名空间的结构和文件系统很像。一个名字和文件一样使用/的路径表现,zookeeper的每个节点都是被路径唯一标识


爱梦 - 拿来吧你
3楼 · 2021-11-24 09:59

Zookeeper的主要有四个作用:

配置管理

名字服务

提供分布式同步

集群管理

配置管理

在我们的应用中,会有一些配置项是写在

application.properties

文件里的,代码中通过@Value读取对应的值,如果配置非常多,而且还可能是动态的话使用配置文件就需要重启服务。这个时候往往需要寻找一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣的都可以获得变更。

这个时候就需要使用一种实现了一致性协议的服务了。Zookeeper就是这种服务,它使用Zab(原子广播协议)来提供一致性。现在有很多开源项目使用Zookeeper来维护配置,比如在消息队列Kafka中,使用Zookeeper来维护broker的信息。在Alibaba开源的SOA框架Dubbo中也广泛的使用Zookeeper管理一些配置来实现服务治理。

名字服务

我们大家应该都知道DNS这个东西。我们只需要访问一个大家熟知的站点,它就会告诉你这个域名对应的IP是什么。我们的应用中也会存在很多这类问题,特别是在我们的服务特别多的时候,如果我们在本地保存服务的地址将非常不方便,但如果我们只需要访问一个大家都熟知的endpoint,这里提供统一的入口,那么维护起来将方便得多。


分布式锁

可以利用Zookeeper来协调多个分布式进程之间的活动。比如在一个分布式环境中,为了提高可靠性,集群的每台服务器上都部署着同样的服务。但是,一件事情如果集群中的每个服务器都进行的话,那相互之间就要协调,编程起来非常复杂。如果我们只让一个服务进行操作,那又存在单点。

通常的做法就是使用分布式锁,在某个时刻只让一个服务去工作,当这个服务出问题时释放锁,立即fail over到另外的服务,即Leader Election(leader选举)机制。比如HBase的Master就是采用这种机制。需要注意的是分布式锁跟同一个进程的锁还是有区别的,所以使用的时候要比同一个进程里的锁更谨慎的使用。


集群管理

在分布式集群中,经常有各种原因,比如硬件故障,软件故障,网络问题,有新的节点加入进来,也有老的节点退出集群。这时,集群中其他机器需要感知到这种变化,然后根据这种变化做出对应的决策。

比如一个分布式存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来时我们要根据现在集群当前的状态分配存储节点。这时我们就需要动态感知到集群目前的状态。

还有,比如一个分布式的SOA架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要采用某种机制发现现在有哪些节点可以提供该服务(这也称之为服务发现,比如Alibaba开源的SOA框架Dubbo就采用了Zookeeper作为服务发现的底层机制)。还有开源的Kafka队列就采用了Zookeeper作为Cosnumer的上下线管理。


汽水味的小盆友
4楼 · 2021-11-24 14:25

1、数据发布和订阅  他就相当于房产中介 主要起到注册和发现服务的作用  在系统中不参与服务的调用和传输,就是发布者将数据发布到zookeeper节点上,供订阅者动态的获取数据

实现配置信息集中式管理和动态更新,类似场景就是 应用在启动时会主动来获取一次配置,同时在节点上注册一个wacther,这样一来每次配置有更新的时候 那么就会通知到订阅的客户端

2.分布式 搜索服务中 索引的元信息 和 服务器集群机器的节点状态 放在zookeeper的一些指定节点 供各个客户端调用


超甜的布丁
5楼 · 2021-11-24 16:26

一、配置维护

在我们的应用中除了代码外,还有一些就是各种配置。比如数据库连接等。一般我们都是使用配置文件的方式,在代码中引入这些配置文件。当我们只有一种配置,只有一台服务器,并且不经常修改的时候,使用配置文件是一个很好的做法,但是如果我们配置非常多,有很多服务器都需要这个配置,这时使用配置文件就不是个好主意了。这个时候往往需要寻找一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣的都可以获得变更。Zookeeper就是这种服务,它使用Zab这种一致性协议来提供一致性。现在有很多开源项目使用Zookeeper来维护配置,比如在HBase中,客户端就是连接一个Zookeeper,获得必要的HBase集群的配置信息,然后才可以进一步操作。还有在开源的消息队列Kafka中,也使用Zookeeper来维护broker的信息。在Alibaba开源的SOA框架Dubbo中也广泛的使用Zookeeper管理一些配置来实现服务治理。

二、域名服务

名字服务这个就很好理解了。比如为了通过网络访问一个系统,我们得知道对方的IP地址,但是IP地址对人非常不友好,这个时候我们就需要使用域名来访问。但是计算机是不能是域名的。怎么办呢?如果我们每台机器里都备有一份域名到IP地址的映射,这个倒是能解决一部分问题,但是如果域名对应的IP发生变化了又该怎么办呢?于是我们有了DNS这个东西。我们只需要访问一个大家熟知的(known)的点,它就会告诉你这个域名对应的IP是什么。在我们的应用中也会存在很多这类问题,特别是在我们的服务特别多的时候,如果我们在本地保存服务的地址的时候将非常不方便,但是如果我们只需要访问一个大家都熟知的访问点,这里提供统一的入口,那么维护起来将方便得多了。

三、分布式同步

其实在第一篇文章中已经介绍了Zookeeper是一个分布式协调服务。这样我们就可以利用Zookeeper来协调多个分布式进程之间的活动。比如在一个分布式环境中,为了提高可靠性,我们的集群的每台服务器上都部署着同样的服务。但是,一件事情如果集群中的每个服务器都进行的话,那相互之间就要协调,编程起来将非常复杂。而如果我们只让一个服务进行操作,那又存在单点。通常还有一种做法就是使用分布式锁,在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即fail over到另外的服务。这在很多分布式系统中都是这么做,这种设计有一个更好听的名字叫Leader Election(leader选举)。比如HBase的Master就是采用这种机制。但要注意的是分布式锁跟同一个进程的锁还是有区别的,所以使用的时候要比同一个进程里的锁更谨慎的使用。

四、组服务

在分布式的集群中,经常会由于各种原因,比如硬件故障,软件故障,网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。这个时候,集群中其他机器需要感知到这种变化,然后根据这种变化做出对应的决策。比如我们是一个分布式存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候我们要根据现在集群目前的状态来分配存储节点。这个时候我们就需要动态感知到集群目前的状态。还有,比如一个分布式的SOA架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要采用某种机制发现现在有哪些节点可以提供该服务(这也称之为服务发现,比如Alibaba开源的SOA框架Dubbo就采用了Zookeeper作为服务发现的底层机制)。还有开源的Kafka队列就采用了Zookeeper作为Cosnumer的上下线管理。


相关问题推荐

  • 回答 2

    1、Window Assinger是干啥的当你决定stream是否keyby之后,window是没有构建的,你还需要指定一个window Assinger用于定义元素如何分配到窗口中。2、window Assinger如何指定?Keyedstream:window(WindowAssigner)non-keyed streams :windowAll(WindowAssig...

  • 回答 2

    Event Time:是事件创建的时间。它通常由事件中的时间戳描述,例如采集的日志数据中,每一条日志都会记录自己的生成时间,Flink 通过时间戳分配器访问事件时间戳。Ingestion Time:是数据进入Flink 的时间。Processing Time:是每一个执行基于时间操作的算子...

  • 回答 2

    Event Time:是事件创建的时间。它通常由事件中的时间戳描述,例如采集的日志数据中,每一条日志都会记录自己的生成时间,Flink 通过时间戳分配器访问事件时间戳。Ingestion Time:是数据进入Flink 的时间。Processing Time:是每一个执行基于时间操作的算子...

  • 回答 1

    批处理是流处理的一种非常特殊的情况。在流处理中,我们为数据定义滑动窗口或滚动窗口,并且在每次窗口滑动或滚动时生成结果。批处理则不同,我们定义一个全局窗口,所有的记录都属于同一个窗口。...

  • 回答 5

    jobmanager:主节点,类似于spark中的mastertaskManager:从节点,类似于spark中的workerslot:插槽,类似于spark中executor中的线程,只不过flink中的slot是物理存在的,可以手动配置,每个slot执行一个任务,是静态概念,用来隔绝内存。...

  • 回答 1

    配置文件(flink-conf.yaml)要启动HA集群,请将以下配置键添加到 conf/flink-conf.yaml:高可用性模式(必需):在 conf/flink-conf.yaml 中,必须将高可用性模式设置为zookeeper,以打开高可用模式。或者将此选项设置为工厂类的 FQN,Flink 通过创建 HighAva...

  • 回答 1

    根据现实的数据产生方式和数据产生是否含有边界(具有起始点和终止点)角度,将数据分为两种类型的数据集----一种是有界数据集,另外一种是无界数据集

  • 回答 1

    目前,还是选择saprkflink还有成长的空间

  • 回答 3
    已采纳

     Flink为流处理和批处理应用公用一个通用的引擎。1、数据量&吞吐量&延迟性Flink 的流处理引擎只需要很少配置就能实现高吞吐率和低延迟。2、支持 Event Time 和乱序事件Flink 支持了流处理和 Event Time 语义的窗口机制。Event time 使得计算乱序到达的事件或...

没有解决我的问题,去提问