zookeeper 默认端口_ZooKeeper知识点汇总

一、ZooKeeper简介

1. ZooKeeper是什么

​ Apache ZooKeeper是一个开源的分布式服务框架,为分布式应用提供协调服务,用来解决分布式应用中的数据管理问题,如:配置管理、域名服务、分布式同步、集群管理等

官网 https://zookeeper.apache.org/

ZooKeeper视频教程 http://edu.51cto.com/course/16190.html

2. ZooKeeper组成

​ 主要包括两部分:文件系统、通知机制

2.1 文件系统

​ ZooKeeper维护一个类似Linux文件系统的数据结构,用于存储数据

  • 数据模型结构是一种树形结构,由许多节点构成
  • 每个节点叫做ZNode(ZooKeeper Node)
  • 每个节点对应一个唯一路径,通过该路径来标识节点,如 /app1/p_2
  • 每个节点只能存储大约1M的数据
371210e8fc3014bfe9af77e8108e4c73.png

​ 节点类型有四种:

  • 持久化目录节点 persistent
  • 客户端与服务器断开连接,该节点仍然存在
  • 持久化顺序编号目录节点 persistent_sequential
  • 客户端与服务器断开连接,该节点仍然存在,此时节点会被顺序编号,如:000001、000002.....
  • 临时目录节点 ephemeral
  • 客户端与服务器断开连接,该节点会被删除
  • 临时顺序编号目录节点 ephemeral_sequential
  • 客户端与服务器断开连接,该节点会被删除,此时节点会被顺序编号,如:000001、000002.....

2.2 通知机制

​ ZooKeeper是一个基于观察者模式设计的分布式服务管理框架

  1. ZooKeeper负责管理和维护项目的公共数据,并授受观察者的注册(订阅)
  2. 一旦这些数据发生变化,ZooKeeper就会通知已注册的观察者
  3. 此时观察者就可以做出相应的反应

​ 简单来说,客户端注册监听它关心的目录节点,当目录节点发生变化时,ZooKeeper会通知客户端

​ ZooKeeper是一个订阅中心(注册中心)

3. 应用场景

3.1 配置管理

​ 场景:集群环境、服务器的许多配置都是相同的,如:数据库连接信息,当需要修改这些配置时必须同时修改每台服务器,很麻烦

​ 解决:把这些配置全部放到ZooKeeper上,保存在ZooKeeper的某个目录节点中,然后所有的应用程序(客户端)对这个目录节点进行监视Watch,一旦配置信息发生变化,ZooKeeper会通知每个客户端,然后从ZooKeeper获取新的配置信息,并应用到系统中。

8e50d71143d636e30950eb09c047c8c3.png

3.2 集群管理

​ 场景:集群环境下,如何知道有多少台机器在工作?是否有机器退出或加入?需要选举一个总管master,让总管来管理集群

​ 解决:在父目录GroupMembers下为所有机器创建临时目录节点,然后监听父目录节点的子节点变化,一旦有机器挂掉,该机器与ZooKeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都会收到通知。当有新机器加入时也是同样的道理。

​ 选举master:为所有机器创建临时顺序编号目录节点,给每台机器编号,然后每次选取编号最小的机器作为master

13cc8ef653edbe83eb05d6c860e89143.png

3.3 负载均衡

​ ZooKeeper本身是不提供负载均衡策略的,需要自己实现,所以准确的说,是在负载均衡中使用ZooKeeper来做集群的协调(也称为软负载均衡)

​ 实现思路:

  1. 将ZooKeeper作为服务的注册中心,所有服务器在启动时向注册中心登陆自己能够提供的服务
  2. 服务的调用者到注册中心获取能够提供所需要服务的服务器列表,然后自己根据负载均衡算法,从中选取一台服务器进行连接
  3. 当服务器列表发生变化时,如:某台服务器宕机下线,或新机器加入,ZooKeeper会自动通知调用者重新获取服务列表

​ 实际上利用了ZooKeeper的特性,将ZooKeeper用为服务的注册和变更通知中心

5d79448e969b1d2934426cccb3943d89.png

二、ZooKeeper安装

1. 安装

​ ZooKeeper一般都运行在Linux平台

​ 步骤:

  1. 解压zookeeper-3.4.13.tar.gz
cd ~/softwaretar -zxf zookeeper-3.4.13.tar.gz
  1. 配置
# 创建存放数据文件的目录cd zookeeper-3.4.13/mkdir data# 创建配置文件cd confcp zoo_sample.cfg zoo.cfg # 默认使用的是zoo.cfg,名称固定# 修改配置文件vi zoo.cfgdataDir=../data # 指定数据存放目录
eda2700f620527a0bd9a835e0487a506.png
  1. 启动zookeeper
cd bin./zkServer.sh start | stop | status | restart # 启动|停止|查看状态|重启
3cf0b166412e0a0b87ffc3f25de88a78.png
  1. 客户端连接zookeeper
./zkCli.sh # 启动客户端,默认连接本机的2181端口或./zkCli.sh -server 服务器地址:端口 # 连接指定主机、指定端口的zookeeperquit # 退出客户端

2. 配置文件

配置项含义说明tickTime=2000心跳时间维持心跳的时间间隔,单位是毫秒
在zookeeper中所有的时间都是以这个时间为基础单元,进行整数倍配置initLimit=10初始通信时限用于zookeeper集群,此时有多台zookeeper服务器,其中一个为Leader,其他都为FollowersyncLimit=5同步通信时限在运行时Leader通过心跳检测与Follower进行通信,如果超过syncLimit*tickTime时间还未收到响应,则认为该Follower已经宕机dataDir=../data存储数据的目录数据文件也称为snapshot快照文件clientPort=2181端口号默认为2181maxClientCnxns=60单个客户端的最大连接数限制默认为60,可以设置为0,表示没有限制autopurge.snapRetainCount=3保留文件的数量默认3个autopurge.purgeInterval=1自动清理快照文件和事务日志的频率默认为0,表示不开启自动清理,单位是小时dataLogDir=存储日志的目录未指定时日志文件也存放在dataDir中,为了性能最大化,一般建议把dataDir和dataLogDir分别放到不同的磁盘上

23ddce25ffc522df24d329c9115d1b2c.png

三、客户端操作

1. 常用命令

命令作用说明help查看帮助查看所有操作命令ls 节点路径查看指定节点下的内容 ls2 节点路径查看指定节点的详细信息查看所有子节点和当前节点的状态create 节点路径 内容创建普通节点如果内容中有空格,则需要使用对双引号引起来get 节点路径获取节点中的值 create -e 节点路径 内容创建临时节点当连接断开后,节点会被自动删除create -s 节点路径 内容创建顺序编号节点即带序号的节点delete 节点路径删除节点只能删除空节点,即不能有子节点rmr 节点路径递归删除节点remove recursionstat 节点路径查看节点状态 set 节点路径 新值修改节点内容

2. 详解

​ 查看指定节点的详细信息: ls2 /

5ac6782fb006723b6db84e7d8b62936f.png
# 子节点名称数组[zookeeper] # -----------节点的状态信息,也称为stat结构体-------------------# 创建该znode的事务的zxid(ZooKeeper Transaction ID)# 事务ID是ZooKeeper为每次更新操作/事务操作分配一个全局唯一的id,表示zxid,值越小,表示越先执行cZxid = 0x0 # 0x0表示十六进制数0# 创建时间ctime = Thu Jan 01 08:00:00 CST 1970# 最后一次更新的zxidmZxid = 0x0# 最后一次更新的时间mtime = Thu Jan 01 08:00:00 CST 1970# 最后更新的子节点的zxidpZxid = 0x0# 子节点的变化号,表示子节点被修改的次数,-1表示从未被修改过cversion = -1# 当前节点的变化号,0表示从未被修改过dataVersion = 0# 访问控制列表的变化号 access control listaclVersion = 0# 如果临时节点,表示当前节点的拥有者的sessionId# 如果不是临时节点,则值为0ephemeralOwner = 0x0# 数据长度dataLength = 0# 子节点数据numChildren = 1

​ 顺序编号节点:

  • 顺序编号会紧跟在节点名称后面,节点最终名称为:节点名+序号,如/test0000000005
  • 顺序编号是一个递增的计数器
  • 顺序编号是由父节点维护,从已有的子节点个数开始(包括临时节点和被删除的节点)
  • 如果子节点为空,则从0000000000开始,依次递增1
  • 在分布式系统中,顺序编号可以被用于为所有的事件进行全局排序,这样客户端就可以根据序号推断事件的顺序

四、ZooKeeper集群

1. 配置集群

​ 步骤:

  1. 准备多台ZooKeeper服务器
  2. 配置ZooKeeper服务器
  3. 在每台服务器的conf/zoo.cfg文件中添加如下内容:
server.20=192.168.4.20:2888:3888server.21=192.168.4.21:2888:3888server.22=192.168.4.22:2888:3888
  1. 格式:server.A=B:C:D
  • A表示这台服务器的编号ID,是一个数字
  • B表示服务器的IP地址或域名
  • C表示这台服务器与集群中的Leader交换信息时使用的端口
  • D表示执行选举Leader服务器时互相通信的端口
  1. 创建myid配置文件
  2. 在集群环境下,需要在dataDir目录中创建一个名为myid的文件,文件内容是当前服务器的编号ID,即上面配置的A
cd dataecho A的值 > myid
  1. ZooKeeper启动时会读取这个文件,将里面的数字与zoo.cfg中配置的server.A进行比较,从而判断这台服务器是哪个
  2. 测试集群环境
  3. 启动所有ZooKeeper服务器,查看状态
  4. 此时在某台服务器上执行更新操作时,其他服务器也会同步

2. 集群特性

  • 一个ZooKeeper集群中,有一个领导者Leader和多个跟随者Follower
  • Leader负责进行投票的发起和决议,更新系统状态
  • Follower用于接收客户端的请求并向客户端返回结果,在选举Leader过程中参与投票
  • 半数机制:集群中只要有半数以上节点存活,集群就能够正常工作,所以一般集群中的服务器个数都为奇数
  • 全局数据一致:集群中每台服务器保存一份相同的数据副本,不论客户端连接到哪个服务器,数据都是一致的
  • 更新请求顺序执行:来自同一个客户端的更新请求,按其发送顺序依次执行
  • 数据更新的原子性:一次数据更新,要么成功,要么失败
  • 实时性:在一定的时间范围内,客户端能读取到最新数据

3. 选举机制

​ ZooKeeper在提供服务时会自动选举一个节点服务器作为Leader,其他都是Follower

4e070f7c06404ba64ce6600414a11ddb.png

​ 选举流程:

  1. Server1启动,给自己投票,然后发送投票信息,由于其它服务器都还没启动,所以它发现的消息收不到任何反馈,此时Server1为Looking状态
  2. Server2启动,给自己投票,同时与Server1通信交换选举结果,由于Server2的id值较大,所以Server2胜出,但由于投票数没有过半,此时Server1和Server2都为Looking状态
  3. Server3启动,给自己投票,同时与Server1和Server2通信交换选举结果,由于Server3的id值较大,所以Server3胜出,此时票数已经过半,所以Server3为Leader,Server1和Server2为Follower
  4. Server4启动,给自己投票,同时与Server1、Server2、Server3通信交换选举结果,尽管Server4的id较大,但由于集群中已经存在Leader,所以Server4只能为Follower
  5. Server5启动,同Server4类似,只能为Follower

​ 总结:

  • 每个服务器在启动时都会选择自己,然后将投票信息发送出去
  • 服务器编号ID越大,在选择算法中的权重越大
  • 投票数必须过半,才能选出Leader
  • 谁是Leader:启动顺序的前集群数/2+1个服务器中,id值最大的会成为Leader

4. 监听机制

4.1 监听节点值的变化

# 在集群的A服务器,监听某个节点值的变化get /yyy watch # 在集群的B服务器,修改对应节点的值set /yyy myyyy # 此时A服务器会收到事件NodeDataChangedWATCHER::WatchedEvent state:SyncConnected type:NodeDataChanged path:/yyy

监听Watch事件是一个一次性的触发器,当数据改变时只会触发一次,如果以后这个数据再发生改变,则不会再次触发

4.2 监听节点的子节点变化

# 在集群的A服务器,监听某个节点的子节点的变化 ls /yyy watch # 在集群的B服务器,创建/修改/删除对应节点的子节点create /yyy/hello hello # 此时A服务器会收到事件NodeChildrenChangedWATCHER::WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/yyy

五、Java访问ZooKeeper

Java操作Zookeeper很简单,只需要添加ZooKeeper客户端的依赖即可,可以进行节点信息的获取、管理等。

​ 步骤:

  1. 添加jar包
org.apache.zookeeper zookeeper 3.4.13
  1. 操作
public static void main(String[] args) throws IOException, KeeperException, InterruptedException { //获取ZooKeeper的连接,即创建ZooKeeper的客户端 String connectString = "127.0.0.1:2181"; //服务器地址 int sessionTimeout = 3000; //超时时间,单位为毫秒 Watcher watcher = new MyWatcher(); ZooKeeper zkClient = new ZooKeeper(connectString, sessionTimeout, watcher);  Thread.sleep(2000); System.out.println(zkClient.getState());  /** * 操作ZooKeeper */ //查看指定节点下的内容 List children = zkClient.getChildren("/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

侍魂服务器维修,侍魂胧月传说合服活动开启 4月15日更新内容预告

侍魂胧月传说合服活动开启。侍魂胧月传说将会在4月15日执行停机更新,此次更新将会开启合服活动,即对多组服务器进行合服互通,随之而来还有服务器内开展一些合服活动,此外还有对家族矿战玩法的优化及商城的调整更新,那么…

电脑pro,大师屏幕,小米归来!小米笔记本Pro 15 OLED首发评测

2016 年 7 月,小米正式杀入笔记本市场,推出了两款轻薄本。在当时主流的轻薄本市场都用着低色域 TN 屏和塑料机身的情况下,小米用高素质的屏幕和金属 CNC 一体化机身搅动了整个市场。遗憾的是,小米笔记本的模具在这之后更新的并不频…

无线路由器的DNS服务器怎么设置,无线路由器DNS的设置方法

路由器DNS怎么设置?其实一般情况下路由器上的DNS是无需进行设置;如果你电脑、手机等设备连接到路由器后,只能够登录QQ,网页打不开。这是因为路由器上的DNS配置被接触/串改了原标题:"无线路由器DNS的设置方法"…

仪表盘刻度调整_惊艳了我的仪表盘 那些年我遇到最美的“面孔”

文| G哥汽仪表盘上的信息可以让车主们了解自己座驾的状况,出彩的仪表盘设计甚至能让消费者购车时对这款车一见倾心,回顾过往曾经惊艳到我们的那些酷炫仪表盘,那些面孔你是否还依稀还记得……汽车的什么地方最凸显其科技感?营造高科…

负数比较大小_人教版六下【第一单元】负数比较负数的大小

点击蓝色文字关注我们吧!主讲人邬卫老师,长沙市喻沛名师“错例研究”工作室成员。今天讲的微课是人教版小学数学六年级下册第一单元《负数》中有关“比较负数的大小”的典型错题分析。 摘要仿例组练 掌握了这些解题策略及方法之后,我们…

创建数组_如何创建数组

js数组js的数组不是典型的数组典型的数组元素的数据类型相同使用连续的内存储存通过数字下标获取元素但是js的数组不这样元素的数据类型可以不同内存不一定连续的(对象是随机储存的)不可以通过数字下标,而是通过字符串下标这意味着数组可以有…

node.js 实现udp传输_Node.js实战15:通过udp传输文件。

本文将要写一个udp服务器,和一个udp客户端,并实现客户端发送文件给服务器。服务器端代码如下:var dgram require("dgram");server();function server(){var socket dgram.createSocket("udp4");socket.on("messag…

mysql镜像压缩包使用_如何连接docker的mysql镜像

展开全部推荐使用Dockerfile方式。服务的管理使用的是supervisord, 因为dockerfile里只会有一个cmd生效,如果我想62616964757a686964616fe58685e5aeb931333361326332通过ssh去管理容器还要有mysql服务的启动起来 cmd的方式就无法实现,当然容器不需要以sshd的方式去管…

alibaba 实体转json_com.alibaba.fastjson 转换List Map等对象

原文:http://www.cnblogs.com/goody9807/p/4244862.html本文讲解2点:1. fastjson生成和解析json数据(举例:4种常用类型:JavaBean,List,List,List)2.通过一个android程序测试fastjson的用法。fastjson简介:Fastjson是一个Java语言编…

高性能mysql看不懂_高性能mysql笔记1

转载请注明&#xff1a;TheViper http://www.cnblogs.com/TheViper<>这本书写的真的很好&#xff0c;只可惜本屌不才&#xff0c;大部分都看不懂&#xff0c;暂且记下与mysql优化有关&#xff0c;对自己有用的东西。测试指标吞吐量吞吐量指的是单位时间内的事务处理数&am…

python 热词分析_Python笔记:热词分析2020-01-01

热词分析在公众趋势分析、舆情分析有很宽广的应用&#xff0c;我们来看看怎么从一个TXT文件中分析出文章的热词出来&#xff0c;我们采用流行的第三方“结巴”包来实现。首先安装第三方包(matplotlib&#xff0c;jieba&#xff0c;wordcloud&#xff0c;numpy)mmatplotlib主要来…

子进程会继承父进程的哪些内容_【学习教程】Node.js创建子进程方法

来源 | https://github.com/CommanderXL/biu-blog/issues/25exec其中exec可用于在指定的shell当中执行命令。不同参数间使用空格隔开&#xff0c;可用于复杂的命令。const { exec } require(child_process)exec(cat *.js bad_file | wc -l)exec方法用于异步创建一个新的子进程…

mysql筛选两个表有相同项的数据库_用SQL查询两个表中相同的数据

展开全部 1、创建测试表; create table test_col_1(id number, var varchar2(200)); create table test_col_2(id number, var varchar2(200)); 2、插入测试数据, insert into test_col_1 select level*8, var||32313133353236313431303231363533e59b9ee7ad9431333431373839l…

MySQL建表添加乐观锁字段_Java秒杀系统优化-Redis缓存-分布式session-RabbitMQ异步下单-页面静态化...

Java秒杀系统优化-Redis缓存-分布式session-RabbitMQ异步下单-页面静态化项目介绍基于SpringBootMybatis搭建的秒杀系统&#xff0c;并且针对高并发场景进行了优化&#xff0c;保证线程安全的同时极大地提高了服务器的吞吐量&#xff0c;主要优化手段有页面静态化、Redis缓存(页…

叶金荣mysql教程_mysql优化--叶金荣老师讲座笔记

copy to tmp table执行ALTER TABLE修改表结构时建议&#xff1a;凌晨执行Copying to tmp table拷贝数据到内存中的临时表&#xff0c;常见于GROUP BY操作时建议&#xff1a;创建索引Copying to tmp table on disk临时结果集太大&#xff0c;内存中放不下&#xff0c;需要将内存…

python qqbot实现qq聊天机器人_Python QQBot库的QQ聊天机器人

本文实例为大家分享了Python QQBot库的QQ聊天机器人的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下1.安装pip install qqbot2.主动发出消息from qqbot import _bot as bot# 登录QQbot.Login([-q, 2816626661])buddy 获取指定名称/备注的好友group 获取群buddy bot…

tp5 mysql实现消息队列_TP5系列 | Queue消息队列

消费信息如下ThinkPHP5 Queue消息队列优点1、Queue内置了 Redis&#xff0c;Database&#xff0c;Topthink &#xff0c;Sync这四种驱动&#xff0c;本文使用Redis驱动2、Queue消息队列适用于大并发或者返回结果 时间有点长并需要批量操作的第三方接口&#xff0c;可用于短信发…

java创建临时文件夹_java创建临时文件

[java]代码库/*** 创建临时文件** param prefix* 临时文件名的前缀* param suffix* 临时文件名的后缀* param dirName* 临时文件所在的目录&#xff0c;如果输入null&#xff0c;则在用户的文档目录下创建临时文件* return 临时文件创建成功返回true&#xff0c;否则返回false*…

linux cmake编译安装mysql_Linux源码安装MySQL 5.6.12 (Cmake编译)

Linux源码安装MySQL 5.6.12 (Cmake编译)1.安装make编译器(默认系统自带)下载地址&#xff1a;tar zxvf make-3.82.tar.gzcd make-3.82./configuremakemake install2.安装bison下载地址&#xff1a;tar zxvf bison-2.5.tar.gzcd bison-2.5./configuremakemake install3.安装gcc-…

JAVA怎么实现网页退出系统_java后台实现js关闭本页面,父页面指定跳转或刷新操作...

关闭本页面&#xff0c;跳转到百度response.setCharacterEncoding("gbk");PrintWriter outresponse.getWriter();out.print("");out.print("");关闭本页面&#xff0c;刷新父页面response.setCharacterEncoding("gbk");PrintWriter ou…