关键词:
目录
zookeeper 的伪集群搭建
疯狂创客圈 Java 分布式聊天室【 亿级流量】实战系列之 -22【 博客园 总入口 】
源码IDEA工程获取链接:Java 聊天室 实战 源码
写在前面
? 大家好,我是作者尼恩。目前和几个小伙伴一起,组织了一个高并发的实战社群【疯狂创客圈】。正在开始高并发、亿级流程的 IM 聊天程序 学习和实战
? 前面,已经完成一个高性能的 Java 聊天程序的四件大事:
完成了协议选型,选择了性能更佳的 Protobuf协议。具体的文章为: Netty+Protobuf 整合一:实战案例,带源码
介绍了 通讯消息数据包的几条设计准则。具体的文章为: Netty +Protobuf 整合二:protobuf 消息通讯协议设计的几个准则
解决了一个非常基础的问题,这就是通讯的 粘包和半包问题。具体的文章为:Netty 粘包/半包 全解 | 史上最全解读
前一篇文件,已经完成了 系统三大组成模块的组成介绍。 具体的文章为: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:devtoolszookeeper-3.4.13>
1.1.1. 创建数据目录和日志目录:
提前为每一个伪节点创建日志目录、数据目录。
在安装目录下,为每一个伪节点创建一个日志目录,分别为 log/zoo-1、 log/zoo-2、 log/zoo-3:
为每一个伪节点创建一个数据目录,分别为 data/zoo-1、 data/zoo-2、 data/zoo-3。
1.1.2. 创建myid文件
myid文件的主要作用,是记录(伪)节点的编号。
myid文件是一个文本文件,文件名称为myid。
myid文件内容为一个数字,表示节点的编号。
在第一个(伪)节点数据目录 C:devtoolszookeeper-3.4.13>datazoo-1 文件夹下创建内容为 "1" 的myid文件。表示第一个节点的编号为1。
在第二个(伪)节点数据目录 C:devtoolszookeeper-3.4.13>datazoo-2 文件夹下创建内容为 "2" 的myid文件。表示第二个节点的编号为2。
在第三个(伪)节点数据目录 C:devtoolszookeeper-3.4.13>datazoo-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:devtoolszookeeper-3.4.13datazoo-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:devtoolszookeeper-3.4.13confzoo-1.cfg
set ZOO_LOG_DIR=C:devtoolszookeeper-3.4.13logzoo-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:devtoolszookeeper-3.4.13>cd bin
C:devtoolszookeeper-3.4.13in>
C:devtoolszookeeper-3.4.13in > zkServer-1.cmd
zookeeper集群需要有1/2以上的节点启动,才能完成集群的启动,对外提供服务。所以,至少需要再启动一个节点。
打开另外一个window的命令控制台,进入到bin目录,并且启动zkServer-2.cmd,这个脚本中会启动第一个节点的java服务进程:
C:devtoolszookeeper-3.4.13>cd bin
C:devtoolszookeeper-3.4.13in>
C:devtoolszookeeper-3.4.13in > zkServer-2.cmd
由于这里没有使用后台服务启动的模式,所以,这两个节点服务的窗口,在服务期间,不能关闭。
如何验证集群已经成功启动呢?
方法一:
可以通过jps命令,可以看到QuorumPeerMain的进程的数量。
C:devtoolszookeeper-3.4.13in > jps
方法二:
启动zookeeper 客户端,运行查看一下,是否能连接集群。如果能够成功连接,这个时候zookeeper已经安装成功了,
C:devtoolszookeeper-3.4.13in> ./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) 聊天程序【 亿级流量】实战 开源项目实战
- Netty 源码、原理、JAVA NIO 原理
- Java 面试题 一网打尽
疯狂创客圈 【 博客园 总入口 】
zookeepercurator使用
1,Curator包含了几个包:curator-framework:对zookeeper的底层api的一些封装curator-client:提供一些客户端的操作,例如重试策略等curator-recipes:封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式计数器、分布式Barrier等... 查看详情
zookeepercurator学习(增删改查)
主要参考的是curator,github地址:https://github.com/apache/curator/tree/master/curator-examples。zookeeper版本为zookeeper-3.4.9(需要查找合适的curator版本)源码地址:https://gitee.com/zhangjunqing/spring-boot/tree/master/zookeeper 查看详情
zookeepercurator学习(配合springboot模拟leader选举)
基础知识:http://www.cnblogs.com/LiZhiW/p/4930486.html项目路径:https://gitee.com/zhangjunqing/spring-boot 查找下面四个项目就可以了zookeeper版本为zookeeper-3.4.9(需要查找合适的curator版本)   查看详情
flink基于zookeepercurator的高可用原理1(代码片段)
本篇是基于Flink1.16对老版本(Flink1.12以下)高可用原理、以Standalone模式下的WebMonitorEndpoint为例的一篇更新本篇聚焦于Zookeeper的高可用原理。1.leader的选取分布式任务调度系统往往是一个服务集群,但是为了防止任务重复执行ÿ... 查看详情
vueui打开可视化面板一片空白(代码片段)
真离谱啊打开后一片空白点击左下角小房间或者url改为:http://localhost:8000/project/select盲猜路由异常导致 查看详情
ios绘制图形实战(代码片段)
本文结构:想看吐槽直接跳到末尾。前言正文结尾扯犊子前言最近做了iOS开发。当一天和尚撞一天钟呗。身心俱疲。贼难受,没看我都不更新博客了么。iOS的绘制,看了好多帖子,忘了都是哪些帖子了,感谢... 查看详情
在rpart情节中只形成一片叶子(代码片段)
clickherefortheoutputi尝试下面的代码用于插入训练一个rpart情节,但只有一片叶子形式可以任何人告诉为什么这发生我尝试的代码是制作一个插入火车控制集然后做了一个rpart火车设置与下面使用的功能然后我试图用prp函数绘制rpart... 查看详情
代码片--实现一个简单的模版方法设计模式(获取一段程序运行的时间)
...的时间并相减即可。*获取时间:System.currentTimeMillis()***当代码完成优化后,就可以解决这类问题*这种方式叫做模版方法设计模式。**什么是模版方法呢?*在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,而确... 查看详情
sparkstreaming实时流处理项目实战sparkstreaming整合kafka实战一(代码片段)
SparkStreaming整合Kafka实战SparkStreaming对kafka的支持SparkStreaming整合kafka的两种方式receiver方式:基于线程拉取数据direct方式:直接连接模式1.Receiver-basedApproachkafka对接streaming实战SparkStreaming对kafka的支持sparkstreaming官 查看详情
实战一:编写进度条(代码片段)
1#!/usr/bin/python32#-*-coding:utf-8-*-3#__author:Administrator4#date:2018/7/215importsys6fromPyQt5.QtWidgetsimportQApplication,QWidget,QProgressBar,QPushButton7fromPyQt5.QtCoreimportQBasi 查看详情
腾讯知名软件全线下架,网友一片唏嘘(代码片段)
👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇来源:中国证券报、中国基金报、新浪微博曾经的看片神器或要面临谢幕。最近,#腾讯下架QQ影音所有版本#的消息冲上微博热搜!记者从... 查看详情
错误记录androidstudio配置aspectj报错(allbuildscriptblocksmustappearbeforeanyplugins)(代码片(代码片段)
文章目录一、报错信息二、解决方案一、报错信息在AndroidStudio配置AspectJ报错:Buildfile'D:\\002_Project\\002_Android_Learn\\AOP_Demo\\app\\build.gradle'line:5Couldnotcompilebuildfile'D:\\002_Project\\002_Android_Learn\ 查看详情
codingdevops线下沙龙回顾一:devops代码质量实战
...自腾讯等知名企业的技术大咖们分享了研发质量与效能的实战经验,与观众们共同探讨如何采取有效手段以保证和提高软件质量。本期沙龙回顾为大家带来的,是来自腾讯云CODING布道师杨周的议题——《DevOps代码质量实战》。问... 查看详情
错误记录android应用中启动flutteractivity报错(haveyoudeclaredthisactivityinyourandroidmanifest)(代码片(代码片段)
文章目录一、报错信息二、报错信息一、报错信息在Android中启动FlutterActivity报错:Android应用调用Flutter应用界面;E/AndroidRuntime:FATALEXCEPTION:mainProcess:com.example.flutter_native,PID:12994android.content.ActivityNotFoundException:Unab 查看详情
pymongo实战(代码片段)
pymongo实战文章目录pymongo实战一.基础操作回顾1.创建数据库和集合2.插入文档插入一个文档返回_id字段插入多个文档返回_id字段3.查找数据只返回某些字段返回年龄和姓名只返回年龄只返回姓名只返回_id高级查询4.排序5.删除数据... 查看详情
python爬虫实战一|大众点评网(代码片段)
原网页1.发现网址url规律generate_urls获取点评网每一页page连接defgenerate_urls(limit=50): urls=[] template='http://www.dianping.com/shanghai/hotel/ppage' forpinrange(1,limit+1): url=template 查看详情
创建.m文件一片空白的错误解决方式
今天写代码,想继承一个类,突然发现创建的类文件一片空白,如图之后各种调试发现都解决不了问题,以为是装了xcode6beta2版本号的问题,结果发现事实上是我创建错了我创建的是watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaW9zd3lsODgyMTk=/font/5a6L... 查看详情
androidnestedscrolling解决滑动冲突问题-项目实战(代码片段)
实际需求在前面的两片文章中我们了解了NestedScroll的相关接口及一般处理逻辑。在本篇文章中就实现一个具体的联合滑动需求。Android中经常在布局中嵌入WebView来展示网页内容,而且WebView内部还有交互逻辑(滚动之类的... 查看详情