Windows安装和选用zookeeper

 

EPHEMERAL
创立须臾时节点,Zookeeper在感知连接机器宕机后会清除它创设的须臾间节点

成都百货上千时候,业务有定时职责依旧定时超时的需求,当职责量相当大时,或然必要爱慕大批量的timer,可能拓展低效的围观。

其中CreateMode分为4类Persistent、PersistentSequential、Ephemeral、EphemeralSequential

 

watcher

特意在同时在线量相当大时,很不难CPU百分之百,怎么着赶快维护和接触大量的定时/超时职责,是本文要斟酌的题材

锁相关部分API方法:

 

  • 图片 1

1)30s超时,就创办四个index从0到30的环形队列(本质是个数组)

2.装置超时时间

Current
Index每秒种运动二个slot,那个slot对应的Set<uid>中全体uid都应该被集体超时!借使近年来30s有请求包来到,一定被平放Current
Index的前1个slot了,Current
Index所在的slot对应Set中拥有因素,都以近年30s从未有过请求包来到的。

1.获得服务主机列表

例如:58到家APP实时音信通道类别,对种种用户会爱戴1个APP到服务器的TCP连接,用来实时收发新闻,对这一个TCP连接,有如此3个需求:“如若老是30s没有请求包(例如登录,音讯,keepalive包),服务端就要将那个用户的场馆置为离线”。

率先需求安装JdK,从Oracle的Java网站下载,安装很简短,就不再详述。

一、缘起

开创节点:create

“轮询扫描法”

znodes类似文件和目录。但它不是两个博学多才的文件系统,zookeeper数据保存在内部存储器中,那意味着zookeeper能够兑现高吞吐量和低顺延。

2)当某些用户uid有请求包来到,实时更新那些Map,并同时对这么些uid请求包运维八个timer,30s之后触发

demo :zk.GetData(Dir, new MyWatch2(), stat);

(4)更新Map,这个uid对应slot的index值

demo :zk.Delete(Dir, -1);

HashedWheelTimer也是相近的法则,有趣味的同班能够百度时而以此数据结构,Netty中的一个工具类,希望大家有获得,帮忙转载一下哈。

Zookeeper
作为二个分布式的劳动框架,首要用来消除分布式集群中利用系统的一致性难题,它能提供基于类似于文件系统的目录节点树格局的数额存储,但是Zookeeper
并不是用来尤其储存数据的,它的功力至关心爱护纵然用来爱戴和监理你存款和储蓄的数量的景况变化。通过监督那么些数量状态的更动,从而得以高达基于数据的集群众管理理.

 

 

3)将uid重新参加到新的slot中,具体是哪三个slot呢 => Current
Index指针所针对的上一个slot,因为那么些slot,会被timer在30s过后扫描到

4.以线程安全的章程创设请求连接(运转客户端请求队列,循环队列基于socket通信、依据请求类型执行不一的伸手动作)

 

Zookeeper有三种watches,一种是data watches,另一种是child
watches。当中,getData()和exists()以及create()等会添加data
watches,getChildren()会添加child
watches。而delete()涉及到删除数据和子节点,会同时触发data watches和child
watches。

3)运维贰个timer,当Map中不为空时,轮询扫描那么些Map,看各样uid的last_packet_time是不是超过30s,即使超越则展开过期处理

设置数据 setData

2)有叁个Current Index指针来标识刚检查和测试过的slot

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ZooKeeperNet;

namespace ZookeeperDemo
{
    class Watcher : IWatcher
    {
        public void Process(WatchedEvent @event)
        {
            if (@event.Type == EventType.NodeDataChanged)
            {
                Console.WriteLine(@event.Path);
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ZooKeeperNet;

namespace ZookeeperDemo
{
    class Program
    {
        static void Main(string[] args)
        {

            //创建一个Zookeeper实例,第一个参数为目标服务器地址和端口,第二个参数为Session超时时间,第三个为节点变化时的回调方法 
            using (ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", new TimeSpan(0, 0, 0, 50000), new Watcher()))
            {
                var stat = zk.Exists("/root",true);

                ////创建一个节点root,数据是mydata,不进行ACL权限控制,节点为永久性的(即客户端shutdown了也不会消失) 
                //zk.Create("/root", "mydata".GetBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.Persistent);

                //在root下面创建一个childone znode,数据为childone,不进行ACL权限控制,节点为永久性的 
                zk.Create("/root/childone", "childone".GetBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.Persistent);
                //取得/root节点下的子节点名称,返回List<String> 
                zk.GetChildren("/root", true);
                //取得/root/childone节点下的数据,返回byte[] 
                zk.GetData("/root/childone", true, null);

                //修改节点/root/childone下的数据,第三个参数为版本,如果是-1,那会无视被修改的数据版本,直接改掉
                zk.SetData("/root/childone", "childonemodify".GetBytes(), -1);
                //删除/root/childone这个节点,第二个参数为版本,-1的话直接删除,无视版本 
                zk.Delete("/root/childone", -1);
            }

        }
    }
}

3)同时还有2个Map<uid, index>,记录uid落在环上的哪位slot里

Storm-源码分析-
Storm中Zookeeper的选取

方案二:不须求轮询,但每一种请求包要开动2个timer,相比功耗源

创造连接:

 

李欣:ZooKeeper在携程的行使及前景
http://v.csdn.hudong.com/open/view/detail/83-SDCC2012-ctrip-ZooKeeper

诚如的话怎么落到实处这类须求吗?

怎样行使

三、总结

单机格局

2)从那几个slot的Set结构中,删除这一个uid

demo : zk.Exists(Dir, new MyWatch2());

为此,当没有过期时,Current Index扫到的每三个slot的Set中应该都没有成分。

一呼百应流程:

1)从Map结构中,查找出那些uid存款和储蓄在哪1个slot里

获取叁个节点的数目,可注入watcher 

优势

  • tickTime:这几个时辰是用作 Zookeeper
    服务器之间或客户端与服务器之间维持心跳的小时间隔,也便是各种tickTime 时间就会发送1个心跳。
  • dataDir:顾名思义正是 Zookeeper
    保存数据的目录,暗中认可情形下,Zookeeper
    将写多少的日记文件也保留在这些目录里。
  • dataLogDir:顾名思义便是 Zookeeper 保存日志文件的目录
  • clientPort:那个端口便是客户端连接 Zookeeper 服务器的端口,Zookeeper
    会监听那几个端口,接受客户端的访问请求。

2)环上每三个slot是一个Set<uid>,任务集合

ZooKeeper完毕分布式队列Queue http://blog.fens.me/zookeeper-queue/ 

 

demo : zk.SetData(Dir, new byte[1], 1);

(1)只需要1个timer

PERSISTENT_SEQUENTIAL
尽管PATH是以’/’结尾则以那些PATH作为父节点,创设八个子节点,其子节点名字是贰个按先后顺序排列的数值;不然创设一个名字是‘/’前面字符加上先后顺序排列的数值字符串的节点,同样创立持久节点

 

 

 

  • initLimit:这些布局项是用来安顿 Zookeeper
    接受客户端(那里所说的客户端不是用户连接 Zookeeper
    服务器的客户端,而是 Zookeeper 服务器集群中总是到 Leader 的 Follower
    服务器)开端化连接时最长能经受多少个心跳时间间隔数。当已经超先生过 十二个心跳的年华(也正是 tick提姆e)长度后 Zookeeper
    服务器还尚未收到客户端的回来新闻,那么注明这些客户端连接失利。总的时间长度正是5*2000=10 秒
  • syncLimit:那些布局项标识 Leader 与 Follower
    之间发送音讯,请求和回答时间长短,最长无法超越几个 tickTime
    的时光长度,总的时长正是 2*2000=4 秒
  • server.A=B:C:D:当中 A 是3个数字,表示那一个是第几号服务器;B
    是其一服务器的 ip 地址;C 表示的是以此服务器与集群中的 Leader
    服务器调换新闻的端口;D 表示的是假诺集群中的 Leader
    服务器挂了,须求三个端口来再度开始展览公投,选出贰个新的
    Leader,而以此端口正是用来进行大选时服务器彼此通信的端口。若是是伪集群的布局格局,由于
    B 都以同一,所以分裂的 Zookeeper
    实例通讯端口号不可能同一,所以要给它们分配分化的端口号。
  • 除去修改 zoo.cfg 配置文件,集群形式下还要配置多个文本
    myid,那些文件在 dataDir 目录下,那么些文件之中就有1个数量便是 A
    的值,Zookeeper 运行时会读取这么些文件,得到中间的数据与 zoo.cfg
    里面包车型地铁布署音讯相比从而判断毕竟是足够 server。

(2)timer每1s只须求1遍接触,消耗CPU很低

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=C:\\zookeeper-3.4.5\\data
dataLogDir=C:\\zookeeper-3.4.5\\log
# the port at which the clients will connect
clientPort=2181
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

 

有关小说:

其间,单机TCP同时在线量约在10w级别,keepalive请求包大约30s三遍,吞吐量约在3000qps。

事先整理过一篇小说《zookeeper
分布式锁服务
》,本文介绍的
Zookeeper 是以 3.4.5 那么些稳定版本为底蕴,最新的本子能够经过官网
http://hadoop.apache.org/zookeeper/来取得,Zookeeper
的安装很是简单,下边将从单机方式和集群方式四个地点介绍 Zookeeper
的Windows安装和配置.

当有某用户uid有请求包到达时

浅析

3)每种uid请求包对应的timer触发后,看Map中,查看那一个uid的last_packet_time是或不是超过30s,假诺抢先则展开过期处理

数据模型

1)用一个Map<uid,
last_packet_time>来记录每三个uid近年来一次呼吁时间last_packet_time

演示代码下载:ZookeeperDemo.zip

 

据悉ZooKeeper构建大规模布署连串II
http://xahxy.blog.hexun.com/83250722_d.html

其一环形队列法是1个通用的方法,Set和Map中能够是任何task,本文的uid是八个最简易的比方。

在您执行运行脚本此前,还有多少个着力的配备项必要配备一下,Zookeeper
的安插文件在 conf 目录下,这一个目录下有 zoo_sample.cfg 和
log4j.properties,你须求做的正是将 zoo_sample.cfg 改名为 zoo.cfg,因为
Zookeeper
在运行时会找这些文件作为暗中认可配置文件。上面详细介绍一下,这几个布局文件中种种配置项的含义。

 

Zookeeper 那种数据结构有如下那几个特色:

“多timer触发法”

initLimit=5 
syncLimit=2 
server.1=192.168.211.1:2888:3888 
server.2=192.168.211.2:2888:3888

方案一:只运转三个timer,但须要轮询,作用较低

针对心跳的ping请求的resp,针对auth请求的resp,一般接口请求的resp,假若接口请求需求了watcher,当watcher关心的内容有转变时的notification

同时

图片 2

废话不多说,多个至关心重视要的数据结构:

删去节点 delete

2)当某些用户uid有请求包来到,实时更新那一个Map

EPHEMERAL_SEQUENTIAL
穿件瞬时逐条节点,和PE奥迪Q5SISTENT_SEQUENTIAL一样,差距在于它是一弹指顷的

1)运转2个timer,每隔1s,在上述环形队列中移动一格,0->1->2->3…->29->30->0…

查阅节点 exists

 

https://github.com/devhong/Zookeeper.Net

(3)批量超时,Current Index扫到的slot,Set中全数因素都应该被超时掉

呼吁流程:

图片 3

Zookeeper的运用重假诺经过创造其Nuget
ZooKeeperNet包下的Zookeeper实例,并且调用其接口方法进行的,首要的操作就是对znode的增加和删除改操作,监听znode的生成以及处理。

二 、环形队列法

demo:zk.Create(Dir, severname.GetBytes(), Ids.OPEN_ACL_UNSAFE,
CreateMode.Persistent);

 

ZooKeeper配置
(二)

1)用一个Map<uid,
last_packet_time>来记录每三个uid近期贰回呼吁时间last_packet_time

  1. 每一个子目录项如 NameService 都被称作为 znode,那么些 znode
    是被它所在的路径唯一标识,如 Server1 这么些 znode 的标识为
    /NameService/Server1
  2. znode 能够有子节点目录,并且每种 znode 能够储存数据,注意 EPHEMERAL
    类型的目录节点不能够有子节点目录
  3. znode 是有版本的,每一种 znode
    中存款和储蓄的数量能够有七个本子,相当于3个访问路径中得以储存多份数据
  4. znode 能够是一时节点,一旦创造那几个 znode
    的客户端与服务器失去联系,这几个 znode 也将机关删除,Zookeeper
    的客户端和服务器通讯采纳长连接格局,每一个客户端和服务器通过心跳来保持再而三,那么些三番五次情形称为
    session,如若 znode 是一时半刻节点,那些 session 失效,znode 也就删除了
  5. znode 的目录名能够自动编号,如 App1
    已经存在,再成立的话,将会自行命名为 App2
  6. znode
    能够被监督,包蕴那几个目录节点中贮存的数码的修改,子节点目录的变化等,一旦变化能够通报设置监察和控制的客户端,那一个是
    Zookeeper 的主导本性,Zookeeper
    的居多效率都以依据那么些天性完结的,后边在典型的行使场景中会有实例介绍

怎么要素会被超时掉吧?

Zookeeper 不仅可以单机提供劳务,同时也帮忙多机组成集群来提供劳动。实际上
Zookeeper 还帮助别的一种伪集群的主意,也便是能够在一台物理机上运转多个Zookeeper 实例,下边将介绍集群方式的安装和陈设。

 

 

Zookeeper
的上学与利用

获取数据 getData

demo :zk.GetChildren(Dir, true);

zookeeper
安装配置(三)

Zookeeper
会维护一个有所层次关系的数据结构,它那多少个相近于二个正规的文件系统,如图 1
所示:

取得下级节点集合 GetChildren

PELX570SISTENT 创制持久化节点,对应机器关闭连接后节点/数据不会化为乌有

集群格局

ZooKeeper介绍、分析、理解  http://mazd1002.blog.163.com/blog/static/6657496520111120101753463/

Zookeeper .Net
Client

分布式服务框架 Zookeeper —
管理分布式环境中的数据
http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/

结构请求头、构造request,reponse、构造响应头、构造Packet对象,packet对象准备好后,把一切对象放入一个outgoingQueue
packet被放入outgoingQueue中,等待SendThread把packet对应的剧情发送给server。server处理分3步在doio方法中ReadLength
ReadConnectResult
ReadResponse,直到ReadResponse方法中规定packet请求停止。

依据ZooKeeper的分布式Session达成
http://blog.csdn.net/jacktan/article/details/6112806

当这几个陈设项配置好后,你未来就足以运行 Zookeeper 了,运转后要检查
Zookeeper 是还是不是早已在劳务,能够因此 netstat – ano 命令查看是还是不是有你布署的
clientPort 端口号在监听服务。

3.报了名客户端事件

通过C#代码应用zookeeper

前3个参数代表节点名称(一般作为路径),后一个是本子号 -1意味着全匹配

Zookeeper
的集群方式的安装和铺排也不是很复杂,所要做的正是扩展多少个布局项。集群方式除了下边的多少个布局项还要加进上边多少个布局项:

存储

单机安装分外简单,只要获得到 Zookeeper
的压缩包并解压到某些目录如:C:\zookeeper-3.4.5\下,Zookeeper
的启航脚本在 bin 目录下,Windows 下的启航脚本是 zkServer.cmd。

发表评论

电子邮件地址不会被公开。 必填项已用*标注