分布式管中窥豹之zookeeper小白学习(五)启动zookeeper仲裁模式

欢迎来到分布式管中窥豹之zookeeper小白学习系列,本系列会记录zookeeper以及分布式系统学习过程中的一些操作和细节,大饼果子非科班出身,如有错误,欢迎指出



本篇将启动zookeeper服务的仲裁模式,三个节点将以不同的端口号在本地被启动

1. 首先我们需要修改一下配置文件

节点1的配置文件z1.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/Users/dabingguozi/Documents/zookeeper/data/z1/data
clientPort=2181
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445

节点2的配置文件z2.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/Users/dabingguozi/Documents/zookeeper/data/z2/data
clientPort=2182
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445

节点3的配置文件z3.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/Users/dabingguozi/Documents/zookeeper/data/z3/data
clientPort=2183
server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334
server.3=127.0.0.1:4444:4445

因为是本机的三个节点,所以需要不同的端口号

最后的三行是对节点的配置,server.n的n是服务的编号,我们会发现每个server配有两个端口号,前一个用于仲裁通信,后一个用于群首选举(涉及到分布式一致性算法,稍后会降到讲到)

2. 现在我们需要在dataDir的路径下指定节点的编号

echo 1 > /Users/dabingguozi/Documents/zookeeper/data/z1/data/myid
echo 2 > /Users/dabingguozi/Documents/zookeeper/data/z2/data/myid
echo 3 > /Users/dabingguozi/Documents/zookeeper/data/z3/data/myid

3. 启动服务

到z1的路径下启动

$ ./../../zookeeper-3.4.12/bin/zkServer.sh start ./z1.cfg

我们会发现他在尝试和其他节点通信,但是并没有成功(log在zookeeper.out文件中)

2019-01-29 10:40:14,968 [myid:1] - WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:[email protected]] - Cannot open channel to 2
at election address /127.0.0.1:3334
java.net.ConnectException: Connection refused (Connection refused)
        at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:400)
        at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:243)
        at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:225)
        at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:402)
        at java.base/java.net.Socket.connect(Socket.java:591)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:558)
        at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:610)
        at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:838)
        at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:957)
2019-01-29 10:40:14,968 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:[email protected]] - Resolved hostname: 127.0.0.1 to address: /127.0.0.1
2019-01-29 10:40:14,969 [myid:1] - WARN  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:[email protected]] - Cannot open channel to 3 at election address /127.0.0.1:4445
java.net.ConnectException: Connection refused (Connection refused)
        at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:400)
        at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:243)
        at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:225)
        at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:402)
        at java.base/java.net.Socket.connect(Socket.java:591)

再去到z2和z3的路径下分别启动服务

$ ./../../zookeeper-3.4.12/bin/zkServer.sh start ./z2.cfg
$ ./../../zookeeper-3.4.12/bin/zkServer.sh start ./z3.cfg

那么我们再次观察log

2019-01-29 10:41:55,925 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:[email protected]] - FOLLOWING - LEADER ELECTION TOOK - 152007
2019-01-29 10:41:55,927 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumPeer$Qu[email protected]] - Resolved hostname: 127.0.0.1 to address: /127.0.0.1
2019-01-29 10:41:55,973 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:[email protected]] - Getting a diff from the leader 0x40000000a

z1已经成功的和z2还有z3完成通信了

4. 尝试连接

这次我们用z3的端口连接

$ ./zkCli.sh -server localhost:2183
Connecting to localhost:2183
2019-01-29 10:45:09,499 [myid:] - INFO  [main:[email protected]] - Client environment:zookeeper.version=3.4.12-e5259e437540f349646870ea94dc2658c4e44b3b, built on 03/27/2018 03:55 GMT
......Welcome to ZooKeeper!
2019-01-29 10:45:09,536 [myid:] - INFO  [main-SendThread(localhost:2183):[email protected]] - Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2183. Will not attempt to authenticate using SASL (unknown error)
2019-01-29 10:45:09,550 [myid:] - INFO  [main-SendThread(localhost:2183):[email protected]] - Socket connection established to localhost/0:0:0:0:0:0:0:1:2183, initiating session
JLine support is enabled
2019-01-29 10:45:09,604 [myid:] - INFO  [main-SendThread(localhost:2183):[email protected]] - Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2183, sessionid = 0x300322ca7c90000, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2183(CONNECTED) 0] 

我们成功连接上了

那么让我们去看一下这三个节点的状态信息

$ ./../../zookeeper-3.4.12/bin/zkServer.sh status ./z1.cfg
ZooKeeper JMX enabled by default
Using config: ./z1.cfg
Mode: follower

$ ./../../zookeeper-3.4.12/bin/zkServer.sh status ./z2.cfg
ZooKeeper JMX enabled by default
Using config: ./z2.cfg
Mode: leader

$ ./../../zookeeper-3.4.12/bin/zkServer.sh status ./z3.cfg
ZooKeeper JMX enabled by default
Using config: ./z3.cfg
Mode: follower

因为随机性,mode是leader的不一定是z2,但一定有一个节点是leader

这里就出现了这个概念,leader,follower,这是zookeeper仲裁模式下各个节点的角色(还有一个角色叫做observer)

之前的篇幅提到过zookeeper可以用来管理协同数据,那么这个管理的服务如果是单点的(像我们之前启动的独立模式),他的可用性就不高,也就是说,如果这个zookeeper节点宕机或者发生网络异常就没有办法再管理数据了。仲裁模式其实就是为解决这样的问题而提供的多节点协同服务,它也是一种分布式的服务。那么作为分布式的服务,为保证接入每一个节点拿到的数据都是一致的,就需要分布式的一致性协议去保证。

分布式的终极一致性协议paxos,本果子目前还没有甚解,但是zookeeper的ZAB(zookeeper atomic broadcast)协议,我们可以先一起学习一下

管中窥豹,可见一斑

那么下一篇就来研究一下这个ZAB协议吧

https://www.cnblogs.com/dabingguozi/p/10333110.html

原文地址:https://www.cnblogs.com/dabingguozi/p/10329411.html

时间: 2024-10-08 18:57:40

分布式管中窥豹之zookeeper小白学习(五)启动zookeeper仲裁模式的相关文章

小白学习设计模式之装饰者模式

装饰者模式:1.动态的将新功能附加到对象上,在对象功能扩展方面,他比继承更具有弹性2.一个基类,多个分支 自我理解:用人来举例,人有各个国家的人,这是一个分支,另一个分支就是穿着分支,冬季冷了添衣服就要添加衣服(这个黎姿不是特别合适) 视频中的例子:使用饮品来举例,coffer有各个品种的咖啡,选定主coffer还可以选定辅料,继续添加辅料,最后计算总价0下面是我的代码例子,视频中的例子放在下一章 package com.wz.decorate; import java.math.BigDeci

Centos7以普通用户启动zookeeper并加入开机自启动服务

我的环境的zookeeper目录为/opt/app/zk,假设我想以zookeeper用户启动 以下示例,在/etc/systemd/system/文件夹下创建一个启动脚本zookeeper.service [Unit] Description=zookeeper After=syslog.target network.target [Service] Type=forking Environment=ZOO_LOG_DIR=/opt/app/zk/log ExecStart=/opt/app/

zookeeper的安装和启动教程

zookeeper的安装和启动 zookeeper安装包所在目录: 上传文件到虚拟机.现在本地新建一个目录setup,将zookeeper压缩包复制进去. ALT+P打开一个标签,操作如下put命令. 解压: 进入zookeeper目录 创建一个目录: 进入conf目录,并改名文件,改名才能生效. vim编辑 按i进入编辑模式 将目录改为: esc键 :wq 保存退出. 进入bin目录,启动zookeeper start stop cd..    返回上一目录 原文地址:https://www.

陈松松:五步万能成功模式

每个视频,都是你的金牌业务员 这是我写的第54篇视频营销原创文章 与其搜索十年,不如花一年的时间学习,去赚9年的高薪! 今天分析五步万能成功模式,这五步万能成功模式非常简单,只有10个字 第一步:学习 第二步:模仿 第三步:分析 第四步:整合 第五步:创新 一定记下来,熟记于心: 每一步都是一个阶段,每个人都要经历,虽然只有10个字,你可以应用在任何领域,任何场合,不管是在互联网做生意,还是说我在线下做的实体买卖,包括开发,销售自己的产品......都是通用的. 接下来我们开始正式学习五步万能成

ZooKeeper学习第五期--ZooKeeper管理分布式环境中的数据

转:http://www.cnblogs.com/sunddenly/p/4092654.html 引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知识,理解起来比较抽象所以还需要借助一些应用场景,来帮我们理解.由于内容比较多,一口气吃不成胖子,得慢慢来一步一个脚印,因此我对后期ZooKeeper的学习规划如下: 第一阶段: |---理解ZooKeeper的应用 |---ZooKeeper是什么 |--

EOS小白学习(五)EOS的HTTP API

欢迎来到EOS小白学习系列,本系列会记录EOS学习过程中的一些操作和细节,大饼果子非C++出身,如有错误,欢迎指出 接上一篇: 本篇将会列出EOS支持的HTTP API(chain和history),没有过多的讲解,只是方便大家调用 1. chain/get_info(请求链的信息) POST: http://127.0.0.1:8888/v1/chain/get_info BODY: 什么都不需要填 {} RESPONSE: { "server_version": "756

ZooKeeper学习第二期--ZooKeeper安装配置

一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式. ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境:■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例:■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个"集合体"(ensemble) Zookeeper通过复制来实现高可用性,只要集合体中半数以上的机器处于可用状态,它就能够保证服务继续.为什么一定要超过半数呢?这

ZooKeeper学习第一期---Zookeeper简单介绍

该系列来源 http://www.cnblogs.com/wuxl360/p/5817471.html 一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术--分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止造成"脏数据"的后果.这时,有人可能会说这个简单,写一个调 度算法就轻松解决了.说这句话的人,可能对分布式系统不是很了解,所以才会出现这种误

[转]ZooKeeper的学习与应用

http://blog.csdn.net/rengq126/article/details/7393227 1. ZooKeeper的学习与应用 1.1. 概述 ZooKeeper是Apache在很多云计算项目中的一个,与Hadoop密切相关,这种情况导致我一开始认为ZooKeeper的搭建需要Hadoop项目作为支持,但是最后发现完全不需要,它是可以单独运行的一个项目. 在网上看到了一个很不错的关于ZooKeeper的介绍: 顾名思义动物园管理员,他是拿来管大象(Hadoop) . 蜜蜂(Hi