zookeeper 节点讲解以及实际项目运用
转自:https://www.jianshu.com/p/86acf1df6cdd
前言:最近工作不是很忙,本应该乘着闲暇的时间看书的,之前每天晚上都要翻翻的,可是自己竟然迷恋上了王晓磊 写的 卑鄙的小人-曹操传 刚开始的时候还没啥 后面迷的无法自控,以前中午吃完饭的时候,都是趴着玩手机,现在是一吃完饭都是拿着kindle看上一会儿,弄的技术书好久都没翻过 连博客也不写了,实在不该,罪过罪过 ,一个技术狗 不搞技术,那不是坐着等死吗。话不多说,回归正题。
前段时间 我给大家介绍了ZK的一些基础知识,让大家对ZK有了一个初步了解,但在实际的过程中 怎么将zk运用到实际的项目中去了 zk的节点有几种特点,以及如何调整好我们的zk配置 才能达到最优了 今天我给大家简单的介绍一下。
我们以我们的实际项目为例 给大家介绍一下。 场景:我们有两个直播房间服务yunva-room,用户登入房间,根据yunva-room-lvs服务将房间里的用户分部在不同的服务机器上,即不同的服务器有相同的房间,房间里有不同的用户。那么这时候问题就来了
1 分布在不同服务器上的相同房间怎么保证用户数负载均衡 ?
2 一台机器的房间服务挂掉后,另一台服务器怎么感知?
此时ZK的出现 可以很好的解决这两个问题。
解决方式: 1 将不同服务器上房间用户的数据都挂在ZK上,根据zk的数据的变化 动态的将用户分配在合适的机器上。
2 ZK的临时节点的变化,ZK是可以感知的,可以通知到其他的临时节点,这样就很好的解决一台服务挂掉后,很好的通知到另几台房间服务所在的服务器。将缓存在本地的可用房间服务列表清掉即可。
不同服务器上的房间服务启动后,向ZK注册自己的房间服务信息并建立节点 配置的信息写在配置文件上

服务启动后向zk注册 并订阅监听子节点时间,接受其他房间服务挂掉的通知:
RoomServerInfo 和 ServiceInfo 是我们房间服务 节点 的基本配置信息

yunva-room 服务启动后都会向zk注册,zk里的节点信息如下:

roomServer节点下面都是我们的不同的房间服务 房间里面的数据大家大家也是可以看得到的。
yunva-room-lvs 服务启动后 会向zk订阅所有的房间服务 进行用户的分配 达到负载均衡。订阅房间服务的时候,全部load到本地缓存中,如果子节点发生变化了,则从本地缓存中移除挂掉的服务数据。也就不进行用户的分配。

当我们的房间服务挂掉后 我们的节点也就发生了变化,在此之前,我们简单的介绍一下ZK的节点相关知识,
ZK的节点是有生命周期的,可以分为以下几种节点:
持久节点(PERSISTENT)
所谓持久节点,是指在节点创建后,就一直存在,直到有删除操作来主动清除这个节点——不会因为创建该节点的客户端会话失效而消失。
临时节点(EPHEMERAL)
和持久节点不同的是,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点。
我们创建的节点肯定是临时的,服务挂掉后,子节点也就消失了 ZK感知后 通知到订阅节点变化的服务yunva-room-lvs 从本地移除到没有用的服务。
回归到如何监听节点 我们用的zk 是用开源的curator框架来进行对zk操作,这个比较成熟,还有一些类似其他的vertx spring-clound 都有对zk的封装 ,大家如果有时间的话 可以看一下 挺有意思的。
那么curator 监听的节点三种方式:
1 PathChildrenCache PathChildrenCacheListener 监听子节点变化
实现类似如下:

2 NodeCache NodeCacheListener 监听父节点变化 如下:

3 TreeCache TreeCacheListener 监听父节点和子节点的变化 如下:

在我们的项目中肯定用的是监听子节点变化 能感知服务是否可用
我们监听子节点的方式 订阅子节点变化的时候 我们用了java 的观察者模式 有变化 通知到实际的服务

上面我们讲到了 我们要实现不同服务器的房间用户负载均衡,房间人数是要挂到ZK服务上去的,并且要实现负载均衡算法。 由于yunva-room-lvs 监听节点了变化 每次用户登入房间 zk节点发生变化 并同步到yunva-room-lvs 即不同服务器上的房间人数也同步到了本地缓存 负载均衡 根据yunva-room-lvs 本地缓存的房间数据来进行分配房间的服务器分配即可。
用户登入房间 yunva-room感知后 向zk伪实时(2分钟同步一次)同步数据:

yunva-room-lvs 进行用户服务器的分配

本想给大家继续介绍在ZK服务实际在生产环境的优化配置 使ZK达到最好的状态 今天就到这里吧 我都没吃饭 在公司默默的码字。 今天简单的介绍了zk在实际项目中的运用以及zk节点以及如何监听的基本知识,后面我给大家介绍ZK的生产环境优化我们的配置 以及其他的一些知识 比如分布式锁 分布式队列 我们这个项目已经在线上稳定运行。是一个很好的例子 而且我们的并发还很高。
不多说了 该回去吃狗粮了 不然猝死在办公桌上都没人收尸,我是小志码字,一个简单码代码的小人物。如果想了解这个项目和代码 加我微信 微信号:2B青年 欢迎交流 相互学习。
作者:小志码字
链接:https://www.jianshu.com/p/86acf1df6cdd
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
zookeeper 节点讲解以及实际项目运用的更多相关文章
- zookeeper基本讲解及基本命令和配置 (转)
一.ZooKeeper概述 ZooKeeper是一种为分布式应用所设计的高可用.高性能且一致的开源协调服务,是Google的Chubby一个开源实现,是Hadoop和Hbase的重要组件,它提供了一项 ...
- kafka之zookeeper 节点
1.zookeeper 节点 kafka 在 zookeeper 中的存储结构如下图所示:
- Ambari 管理hadoop、hbase、zookeeper节点
简介: Apache Ambari是一种基于Web的工具,支持Apache Hadoop集群的供应.管理和监控.Ambari已支持大多数Hadoop组件,包括HDFS.MapReduce.Hive.P ...
- ZooKeeper基本讲解及使用
本文摘录于:http://blog.51cto.com/tchuairen/1859494:https://blog.csdn.net/peace1213/article/details/525714 ...
- zookeeper入门讲解事例
zookeeper使用和原理探究(一) zookeeper介绍zookeeper是一个为分布式应用提供一致性服务的软件,它是开源的Hadoop项目中的一个子项目,并且根据google发表的<Th ...
- zookeeper 入门讲解实例 转
转 http://www.blogjava.net/BucketLi/archive/2010/12/21/341268.html zookeeper使用和原理探究(一) zookeeper介绍zo ...
- Dubbo+zookeeper 基础讲解
一.dubbo是什么? 1)本质:一个Jar包,一个分布式框架,,一个远程服务调用的分布式框架. 既然是新手教学,肯定很多同学不明白什么是分布式和远程服务调用,为什么要分布式,为什么要远程调用.我简单 ...
- .Net客户端监听ZooKeeper节点数据变化
一个很简单的例子,用途是监听zookeeper中某个节点数据的变化,具体请参见代码中的注释 using System; using System.Collections.Generic; using ...
- zookeeper 节点的移动与删除
package com.zhengmo.test; import java.util.List; import org.apache.zookeeper.CreateMode; import org. ...
随机推荐
- 011PHP文件处理——文件处理 文件内容分页操作类
<?php /** * 文件内容分页操作类: */ //访问地址:http://basicphp.com/006file/011.php?&page=1 class StrPage { ...
- 09_Git patch(补丁)操作
Git打补丁,补丁操作一般在多人开发时才会用到,单人本地开发一般用不到,没必要. 应用场景举例: 我把我的更改打成一个补丁发给你,你来合并到你的代码中 或者,在家里电脑开发提交后,打一个补丁,拿到 ...
- MissingNumber缺失的数字,FirstMissingPositive第一个缺失的正数
MissingNumber问题描述:给定一个数组,数组数字范围是0-n,找到缺失的数字.例如nums={0,1,3},return2. 算法分析:第一种方法,对数组进行排序,然后找到和下标不一致的数字 ...
- HDU 1241 Oil Deposits bfs 难度:0
http://acm.hdu.edu.cn/showproblem.php?pid=1241 对每个还未访问的点bfs,到达的点都标为一块,最后统计有多少块即可 #include <cstdio ...
- c# winform 操作oracle数据库的Blob字段,把图片存储到数据库,保存图片到数据库
///c# winform 操作oracle数据库的Blob字段,把图片存储到数据库,保存图片到数据库 闲话不多说,直接上代码 using System; using System.Collectio ...
- java应用简单递归
毕业后就怎么学过算法,还在上学的时候学过数据结构,现在基本上都还给老师了,可惜老师学费没有还给我... 情景: 类似于给定一个数字,算他由多少个数字组成,比如:36 现在有10.5.1 ,那么最佳帅3 ...
- Nginx 防盗链设置
何谓'盗链' 此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容. 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址( ...
- 20155318 2016-2017-2 《Java程序设计》第八学习总结
20155318 2016-2017-2 <Java程序设计>第八学习总结 教材学习内容总结 学习目标 了解NIO 会使用Channel.Buffer与NIO2 会使用日志API.国际化 ...
- WPF 的 ElementName 在 ContextMenu 中无法绑定成功?试试使用 x:Reference!
在 Binding 中使用 ElementName 司空见惯,没见它出过什么事儿.不过当你预见 ContextMenu,或者类似 Grid.Row / Grid.Column 这样的属性中设置的时候, ...
- 2018-2019-2 《网络对抗技术》Exp5 msf 20165222
本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 总计:主动:ms17_010永恒之蓝(成功): 浏览器:office_word_hta(成功): 客户 ...