开发者社区> 问答> 正文

如何使用zookeeper实现负载均衡器?

项目中要做个负载均衡器,想用zookeeper实现

展开
收起
蛮大人123 2016-03-05 16:40:06 8034 0
3 条回答
写回答
取消 提交回答
  • ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,提供的功能包括配置维护、名字服务、分布式同步、组服务等。 ZooKeeper会维护一个树形的数据结构,类似于Windows资源管理器目录,其中EPHEMERAL类型的节点会随着创建它的客户端断开而被删除,利用这个特性很容易实现软负载均衡。 基本原理是,每个应用的Server启动时创建一个EPHEMERAL节点,应用客户端通过读取节点列表获得可用服务器列表,并订阅节点事件,有Server宕机断开时触发事件,客户端监测到后把该Server从可用列表中删除。
    2019-07-17 18:53:46
    赞同 展开评论 打赏
  • 这里说的负载均衡是指软负载均衡。在分布式环境中,为了保证高可用性,通常同一个应用或同一个服务的提供方都会部署多份,达到对等服务。而消费者就须要在这些对等的服务器中选择一个来执行相关的业务逻辑,其中比较典型的是消息中间件中的生产者,消费者负载均衡。
    消息中间件中发布者和订阅者的负载均衡,linkedin开源的KafkaMQ和阿里开源的metaq都是通过zookeeper来做到生产者、消费者的负载均衡。这里以metaq为例如讲下:
    生产者负载均衡:metaq发送消息的时候,生产者在发送消息的时候必须选择一台broker上的一个分区来发送消息,因此metaq在运行过程中,会把所有broker和对应的分区信息全部注册到ZK指定节点上,默认的策略是一个依次轮询的过程,生产者在通过ZK获取分区列表之后,会按照brokerId和partition的顺序排列组织成一个有序的分区列表,发送的时候按照从头到尾循环往复的方式选择一个分区来发送消息。
    消费负载均衡: 在消费过程中,一个消费者会消费一个或多个分区中的消息,但是一个分区只会由一个消费者来消费。MetaQ的消费策略是:
        1. 每个分区针对同一个group只挂载一个消费者。
        2. 如果同一个group的消费者数目大于分区数目,则多出来的消费者将不参与消费。
        3. 如果同一个group的消费者数目小于分区数目,则有部分消费者需要额外承担消费任务。
          在某个消费者故障或者重启等情况下,其他消费者会感知到这一变化(通过 zookeeper watch消费者列表),然后重新进行负载均衡,保证所有的分区都有消费者进行消费。

    可以参考《ZooKeeper典型应用场景一览》 http://nileader.blog.51cto.com/1381108/1040007

    中“负载均衡”一节的内容。应该会对你有帮助。

    2019-07-17 18:53:46
    赞同 1 展开评论 打赏
  • 我说我不帅他们就打我,还说我虚伪

    可以使用curator的service discovery实现.
    参考:http://curator.apache.org/curator-x-discovery/index.html

    2019-07-17 18:53:45
    赞同 1 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
《MSE 微服务网关》 立即下载
微服务引擎 MSE 治理中心重磅发布 立即下载
阿里云微服务引擎 MSE 2.0 线上发布 立即下载