zookeeper 的伪集群搭建

疯狂创客圈 Java 分布式聊天室【 亿级流量】实战系列之 -22【 博客园 总入口


源码IDEA工程获取链接Java 聊天室 实战 源码

写在前面

​ 大家好,我是作者尼恩。目前和几个小伙伴一起,组织了一个高并发的实战社群【疯狂创客圈】。正在开始高并发、亿级流程的 IM 聊天程序 学习和实战

​ 前面,已经完成一个高性能的 Java 聊天程序的四件大事:

  1. 完成了协议选型,选择了性能更佳的 Protobuf协议。具体的文章为: Netty+Protobuf 整合一:实战案例,带源码

  2. 介绍了 通讯消息数据包的几条设计准则。具体的文章为: Netty +Protobuf 整合二:protobuf 消息通讯协议设计的几个准则

  3. 解决了一个非常基础的问题,这就是通讯的 粘包和半包问题。具体的文章为:Netty 粘包/半包 全解 | 史上最全解读

  4. 前一篇文件,已经完成了 系统三大组成模块的组成介绍。 具体的文章为:Netty聊天程序(实战一):从0开始实战100w级流量应用

接下来,需要进入到分布式开发的环节了。 分布式的中间件,疯狂创客圈的小伙伴们,一致的选择了zookeeper,不仅仅是由于其在大数据领域,太有名了。更重要的是,很多的著名框架,都使用了zk。

1.1. zookeeper 安装&配置

现在,我们开始使用三台机器来搭建一个Zookeeper集群。由于没有多余的服务器,这里就将三个Zk都安装到本地机器上,故称谓伪集群模式。

伪集群模式只是便于开发、普通测试,不能用于生产环境。当然,如果了解了伪集群模式下的安装和配置,生产环境下的配置,也是大致差不多的。

首先是下载。在apache的官方网站提供了好多镜像下载地址,然后找到对应的版本,目前最新的是3.4.13。

下载地址:

http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz

Windows下安装

把下载的zookeeper的文件解压到指定目录

C:\devtools\zookeeper-3.4.13>

1.1.1. 创建数据目录和日志目录:

提前为每一个伪节点创建日志目录、数据目录。

在安装目录下,为每一个伪节点创建一个日志目录,分别为 log/zoo-1、 log/zoo-2、 log/zoo-3:

![img](file:///C:\Users\qinglin\AppData\Local\Temp\ksohtml\wps2376.tmp.jpg)

为每一个伪节点创建一个数据目录,分别为 data/zoo-1、 data/zoo-2、 data/zoo-3。

1.1.2. 创建myid文件

myid文件的主要作用,是记录(伪)节点的编号。

myid文件是一个文本文件,文件名称为myid。

myid文件内容为一个数字,表示节点的编号。

在第一个(伪)节点数据目录 C:\devtools\zookeeper-3.4.13>data\zoo-1\ 文件夹下创建内容为 "1" 的myid文件。表示第一个节点的编号为1。

在第二个(伪)节点数据目录 C:\devtools\zookeeper-3.4.13>data\zoo-2\ 文件夹下创建内容为 "2" 的myid文件。表示第二个节点的编号为2。

在第三个(伪)节点数据目录 C:\devtools\zookeeper-3.4.13>data\zoo-3\ 文件夹下创建内容为 "3" 的myid文件。表示第三个节点的编号为3。

强调一下:myid文件中只有一个数字,即一个Server ID,id的范围是1~255,表示集群最多的节点个数为255个。

1.1.3. 创建和修改配置文件

在zookeeper的配置目录conf 目录下,有一个官方的配置文件样例——zoo_sample.cfg。

将配置文件的样例zoo_sample.cfg文件复制3分,为每一个节点复制一份,分别命名为zoo-1.cfg、zoo-2.cfg、zoo-3.cfg,应用于3个节点。

然后,需要修改每一个节点的配置文件,将前面建立的编号(Server ID)、日志目录、数据目录,配置进去。

首先,配置 (Server ID)编号、IP、端口。格式为:

server.id=host:port:port

在zookeeper集群中,每个节点都需要感知到整个集群是哪些节点组。在配置文件中,可以按照这样的格式进行配置,每一行都代表一个节点。

三个节点,配置的实例如下:

server.1=127.0.0.1:2888:3888

server.2=127.0.0.1:2889:3889

server.3=127.0.0.1:2890:3890

配置ID的时候,注意四点:

(1)清确保每个节点的myid文件中的id值不同,不能有相同id的节点;

(2)server.id=houst:port:port的id值,需要与所对应的节点数据目录下的myid中的di值保持一致。

(3)每一个节点的配置文件中,不仅仅是配置自己的那份,而是需要所有节点的id、ip、端口配置。

(4)Id配置中,需要配置两个端口。前一个端口(如上的2888)用于节点之间的通讯使用,后一个端口(如上的3888)用于选举leader主节点使用。在伪集群的模式下,两个端口必须修改每一个节点都不一样。在分布式集群模式下,不同节点的ip不同,可以不同节点的端口相同。

其次,配置数据目录dataDir。

每一个节点,都有自己的数据目录。数据目录是没有默认值的,必须配置。dataDir用于存储节点快照文件的目录。

每个节点只需要配置自己的数据目录。案例中zoo-1.conf的数据目录如下:

dataDir=C:\devtools\zookeeper-3.4.13\data\zoo-1

第三,配置服务端口

clientPort:参数clientPort用于配置当前节点的服务端口,客户端会通过该端口和Zk服务器创建连接,一般设置为2181。不同的节点,clientPort不能相同,可以按照编号,进行累加。

第四,配置时间相关选项

tickTime:配置单元时间。单元时间是Zookeeper的时间计算单元,其他的时间间隔都是使用tickTime的倍数来表示的。单元时间默认值为3000,单位是毫秒(ms),所以,可以不配置。

initLimit:节点的初始化时间。该参数用于Follower(从节点)启动,并完成从Leader(主节点)同步数据的时间。Follower服务器在启动过程中,会与Leader建立连接并完成对数据的同步,从而确定自己的起始状态。leader服务器允许Follower在initLimit时间内完成这个工作。该参数默认值:10,表示是参数tickTime值的10倍,必须配置,且为正整数。

syncLimit:心跳最大延迟周期。该参数用于配置Leader服务器和Follower之间进行心跳检测的最大延时时间。在Zk集群运行的过程中,Leader服务器会通过心跳检测来确定Follower服务器是否存活。如果Leader服务器在syncLimit时间内无法获取到Follower的心跳检测响应,那么Leader就会认为该Follower已经脱离了和自己的同步。该参数默认值:5,表示是参数tickTime值的5倍,必须配置,且为正整数。

1.1.4. 配置文件实例

为了给出一个完整的直观体验,下面给出三份配置文件实际的代码。

第一个节点的配置文件zoo-1.conf

tickTime=4000

initLimit = 10

syncLimit = 5

dataDir = C:/devtools/zookeeper-3.4.13/data/zoo-1/

clientPort = 2181

server.1 = 127.0.0.1:2888:3888

server.2 = 127.0.0.1:2889:3889

server.3 = 127.0.0.1:2890:3890

第二个节点的配置文件zoo-2.conf

tickTime=4000

initLimit = 10

syncLimit = 5

dataDir = C:/devtools/zookeeper-3.4.13/data/zoo-2/

clientPort = 2182

server.1 = 127.0.0.1:2888:3888

server.2 = 127.0.0.1:2889:3889

server.3 = 127.0.0.1:2890:3890

第三个节点的配置文件zoo-3.conf

tickTime=4000

initLimit = 10

syncLimit = 5

dataDir = C:/devtools/zookeeper-3.4.13/data/zoo-3/

clientPort = 2183

server.1 = 127.0.0.1:2888:3888

server.2 = 127.0.0.1:2889:3889

server.3 = 127.0.0.1:2890:3890

通过三个配置文件,可以看出,每个节点的server id 的配置,都是全量配置。每一个节点的数据目录dataDir 和对外服务端口clientPort,则仅仅负责自己的那份。

1.1.5. 修改启动命令

在bin目录下,通过复制zkServer.cmd文件,为每一个伪节点创建一个启动文件,分别为 zkServer-1.cmd、zkServer-2.cmd、zkServer-3.cmd。

主要是为每一个节点增加配置文件(ZOOCFG)、日志目录ZOO_LOG_DIR的设置。

修改之后,第一个节点的启动命令 zkServer-1.cmd代码如下:

setlocal

call "%~dp0zkEnv.cmd"

set ZOOCFG=C:\devtools\zookeeper-3.4.13\conf\zoo-1.cfg

set ZOO_LOG_DIR=C:\devtools\zookeeper-3.4.13\log\zoo-1

set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain

echo on

call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*

endlocal

1.1.6. 启动伪集群

打开一个window的命令控制台,进入到bin目录,并且启动zkServer-1.cmd,这个脚本中会启动第一个节点的java服务进程:

C:\devtools\zookeeper-3.4.13>cd bin

C:\devtools\zookeeper-3.4.13\bin>

C:\devtools\zookeeper-3.4.13\bin > zkServer-1.cmd

zookeeper集群需要有1/2以上的节点启动,才能完成集群的启动,对外提供服务。所以,至少需要再启动一个节点。

打开另外一个window的命令控制台,进入到bin目录,并且启动zkServer-2.cmd,这个脚本中会启动第一个节点的java服务进程:

C:\devtools\zookeeper-3.4.13>cd bin

C:\devtools\zookeeper-3.4.13\bin>

C:\devtools\zookeeper-3.4.13\bin > zkServer-2.cmd

由于这里没有使用后台服务启动的模式,所以,这两个节点服务的窗口,在服务期间,不能关闭。

如何验证集群已经成功启动呢?

方法一:

可以通过jps命令,可以看到QuorumPeerMain的进程的数量。

C:\devtools\zookeeper-3.4.13\bin > jps

方法二:

启动zookeeper 客户端,运行查看一下,是否能连接集群。如果能够成功连接,这个时候zookeeper已经安装成功了,

C:\devtools\zookeeper-3.4.13\bin> ./zkCli.cmd -server 127.0.0.1:2181

windows下,Zookeeper是通过.cmd的批处理命令运行的,默认没有提供以windows服务的方式运行的方案。

避免每次关闭后,再启动还需要使用cmd,十分的不方便,可以通过工具prunsrv 来将zookeeper做成 windows 服务,将zookeeper服务化管理。

1.1.7. zk的客户端常用命令

用zkCli.sh连接上Zookeeper服务后,用help能列出所有命令:

zk的客户端常用命令 功能简介
create 创建路径结点
ls 查看路径下的所有结点
get 获得结点上的值
set 修改结点上的值
delete 删除结点

写在最后

​ 下一篇:开启zk的客户端开发。


疯狂创客圈 亿级流量 高并发IM 实战 系列

  • Java (Netty) 聊天程序【 亿级流量】实战 开源项目实战


zookeeper curator ( 实战一)的更多相关文章

  1. zookeeper curator客户端之增删改查

    zookeeper curator客户端之增删改查 zookeeper安装:https://www.cnblogs.com/zwcry/p/10272506.html curator客户端是Apach ...

  2. org/apache/curator/RetryPolicy at com.alibaba.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter.connect(CuratorZookeeperTransporter.java:26)

    使用dubbo服务,启动项目报错: org/apache/curator/RetryPolicy at com.alibaba.dubbo.remoting.zookeeper.curator.Cur ...

  3. Zookeeper Curator 事件监听 - 秒懂

    目录 写在前面 1.1. Curator 事件监听 1.1.1. Watcher 标准的事件处理器 1.1.2. NodeCache 节点缓存的监听 1.1.3. PathChildrenCache ...

  4. zookeeper snowflake 实战

    目录 写在前面 1.1.1. 集群节点的命名服务 1.1.2. snowflake 的ID算法改造 SnowFlake算法的优点: SnowFlake算法的缺点: 写在最后 疯狂创客圈 亿级流量 高并 ...

  5. zookeeper curator CRUD

    目录 Curator客户端的基本操作 写在前面 1.1.1. Curator客户端的依赖包 1.1.2. Curator 创建会话 1.1.3. CRUD 之 Create 创建节点 1.1.4. C ...

  6. zookeeper curator处理会话过期session expired

    本文介绍在使用curator框架的时候如何handle session expire. 1.什么是zookeeper的会话过期? 一般来说,我们使用zookeeper是集群形式,如下图,client和 ...

  7. zookeeper curator选主(Leader)

    在分布式系统设计中,选主是一个常见的场景.选主是一个这样的过程,通过选主,主节点被选择出来控制其他节点或者是分配任务. 选主算法要满足的几个特征: 1)各个节点均衡的获得成为主节点的权利,一旦主节点被 ...

  8. zookeeper curator使用caches实现各种监听

    1.篇首语 curator是zookeeper的一个高级api开发包.封装了zookeeper众多的recipes,并且实现了一些新的recipes原语,最重要的是基于zookeeper提供的各种机制 ...

  9. springboot使用zookeeper(curator)实现注册发现与负载均衡

    最简单的实现服务高可用的方法就是集群化,也就是分布式部署,但是分布式部署会带来一些问题.比如: 1.各个实例之间的协同(锁) 2.负载均衡 3.热删除 这里通过一个简单的实例来说明如何解决注册发现和负 ...

  10. Zookeeper+Curator 分布式锁

    本来想着基于zk临时节点,实现一下分布式锁,结果发现有curator框架.PS:原声API真的难用,连递归创建path都没有? 配置curator maven的时候,md配置了好几个小时,最后发现集中 ...

随机推荐

  1. python调用phantomjs组件(windows和linux)

    phantomjs在windows和linux系统,可以通selenium的webdriver直接调用,所以只要将phantomjs程序加载到python程序目录下. 示例代码如下所示: #建立Pha ...

  2. Codeforces Round #324 (Div. 2) Kolya and Tanya 组合数学

    原题链接:http://codeforces.com/contest/584/problem/B 题意: 有3*n个人围成一个圈,每个人可以分配1到3个硬币,但是相邻为n的三个人的和不能是6,问你有多 ...

  3. Java编程经验汇总

    JDK和JRE 大家肯定在安装JDK的时候会有选择是否安装单独的jre,一般都会一起安装,我也建议大家这样做.因为这样更能帮助大家弄清楚它们的区别: Jre 是java runtime environ ...

  4. luogu P2043 质因子分解

    题目描述 对N!进行质因子分解. 输入输出格式 输入格式: 输入数据仅有一行包含一个正整数N,N<=10000. 输出格式: 输出数据包含若干行,每行两个正整数p,a,中间用一个空格隔开.表示N ...

  5. java 之webmagic 网络爬虫

    webmagic简介: WebMagic是一个简单灵活的Java爬虫框架.你可以快速开发出一个高效.易维护的爬虫. http://webmagic.io/ 准备工作: Maven依赖(我这里用的Mav ...

  6. XCODE 4.5 IOS多语言设置 及NSLocalizedString和NSLocalizedStringFromTable的用法。

    前 些天升级到Xcode4.5,现在正在用Xcode4.5+IOS6开发项目,当使用国际化时,遇到了一点问题,之前版本Xcode上新建 Localizable.strings后,添加语言的“+”号不见 ...

  7. mysql count(*) 和count(1)区别

    count *更快, 不要加where,否则同count(1)效率相同 sql语句对大小写不敏感,关键字一般大写,其他小写, count(*)不加where,mysql会直接返回总条数,因为mysql ...

  8. PE经典DIY案例1:全解开方案让量产PE也能

    更新说明:因未来的uefi似乎并不能识别并引导ud区,但能识别和引导量产和u+B+隐藏或高端隐藏区,故解决量产PE对u+B+隐藏区的支持,并增加对UEFI启动支持,已经成为PE制作的最主流技术. PE ...

  9. 使用Shiro

    一.架构 要学习如何使用Shiro必须先从它的架构谈起,作为一款安全框架Shiro的设计相当精妙.Shiro的应用不依赖任何容器,它也可以在JavaSE下使用.但是最常用的环境还是JavaEE.下面以 ...

  10. struts2获取ServletContext对象

      CreateTime--2017年9月7日09:24:40 Author:Marydon struts2获取ServletContext对象 需要导入: import javax.servlet. ...