摘要
咱们理解了 zk 原理后,接下来就是部署 zk、进行 zk 的运维。在部署 zk 的时候:zk 个别作为基础架构类别的零碎,也能够作为数据中间件零碎,如果在公司的部署机器比拟少,尽管部署的机器少,然而你别用太普通的配置。
思维导图
内容
1、单机模式如何启动 zk?
个别比方 zk,kafka,hbase,hdfs 这种零碎个别要求机器性能是比拟高的。应用虚拟机的话,比方 zk 部署 3 台机器,最好用 8 核 16g,16 核 32g,最好用 ssd 固态硬盘。
zk 依照集群化 3,5 单节点部署,部署结束之后,会进行恢复模式进行过半算法选举一个 leader 进去,只有 leader 能够读写,follower 只能读,客户端跟 leader/follower 通过 tcp 长连贯进行连贯,两头靠心跳会保护一个 session。往 follower 去写的话,其实会转发给 leader,往集群外面写数据的时候,会采取一个 2pc+ 过半写机制 数据写采纳: 日志文件写磁盘 +znode 内存数据结构 保障的是程序一致性(不能说是强一致性或者最终一致性)。如果肯定须要减少集群的 QPS,咱们能够往集群外面增加 observer 类型的节点进去就能够了,不采取过半写跟 leader 选举,只是同步数据,客户端查问。Mode:standalone
三台机器的小集群抗每秒十几万的并发是没有问题的,zk 集群,基本上公司都够用了。
参考:https://segmentfault.com/a/11…
2、zk 集群部署
zk 集群部署操作参考:https://segmentfault.com/a/11…
2.1 集群部署须要多少台机器?为什么?
zk 如果你用 4 核 8G 的虚拟机其实是不太靠谱的。针对于 zk 的话: 最起码也得是:8 核 16G,如果有 16 核 32G 这种高配置虚拟机最好了,而且最好是 SSD 固态硬盘。因为 3 种不同配置机器因为 zk 的并发限度了。
`4 核 8G 的机器: 一般来说,每秒并发搞到 1000 是能够的。
8 核 16G 的机器: 每秒并发搞到几千是能够的。
16 核 32G 的机器: 每秒并发搞到上万或者是几万都是有可能的。`
如果你用高配置的机器(16 核 32G 内存的机器),比方搞了 3 台机器,1 个 leader,2 个 follower,leader 次要是写,每秒抗几万并发写入是能够的;leader+follower,读,每秒抗个 5 万~10 万的读是没有问题的,综合能够每秒十多万的 QPS 都能够抗住了。
2.2 zk 的读能力如何扩大;zk 的写能力如何扩大?
如果用高配置的机器,zk 的读并发是比拟高的,只不过写 QPS 无奈线性的扩大。减少读 QPS 还能够,咱们只须要强制增加 Observer 角色节点,不能是 leader 或者 follower(因为 Observer 不参加过半写机制跟过半选举 leader)
因为 zk 在启动进入恢复模式或者宕机从新进入恢复模式的时候,zk 是采纳过半选举机制;如果有过半的机器批准某一个节点为 leader 节点,那么此节点就是 leader 节点。比方 6 台机器,过半就是 3 台,只有宕机不超过(6-3)台机器,就能够再次选举出 leader,提供服务;如果是 5 台机器,过半是 3 台,只有宕机机器不超过 2 台,也能够选举提供服务,过半 3 跟过半大于 2.5 的时候,都是 3 台。
3、正当设置 ZooKeeper 的 JVM 参数?
1、zk 能间接启动吗?
比方你当初手头搞好了几台机器,并且是那种大内存的机器,并且 zk 的配置都配置好了,当初筹备启动了,那么 zk 能间接启动吗?
不能,生产环境下,是有一些非凡的货色要改一改的。
比方最最起码的一点:zk 自身是用 java 写的,是基于 JVM 虚拟机来运行的,启动的是一个 JVM 过程,JVM 过程外面会执行 zk 的全副代码。
2、设置 JVM 参数:
必须得正当的设置一些 JVM 的参数。次要有三大块货色,必须要正当的调优和设置的。
1、内存设置
:你首先,设置调配你的各块内存区域的大小:堆内存,栈内存,Metaspace 区域的内存;依据你机器上内存的状况去设置。
举例:比方你的机器如果有 16G 的内存,堆内存能够调配个 10G,栈内存能够调配每个线程的栈是 1MB,Metaspace 区域能够调配个 512MB 都能够。
2、垃圾回收器设置
:
小内存(32G 以下):咱们设置垃圾回收器,回收新生代 + 老年代,咱们能够应用 ParNew+CMS 垃圾回收器进行垃圾回收。
如果是大内存机器,不倡议这个组合了,能够思考应用 G1 回收所有的垃圾对象,还得设置一些 G1 的参数,比方:region 的大小,最要害的是预期的每次 GC 的进展工夫是多少毫秒,比方设置为 100ms;而后决定 G1 每隔多长时间进行垃圾回收。
3、gc 日志记录设置
:
线上 JVM 运行的时候,频繁 gc 问题,oom 问题,退出一些参数,gc 日志要写入哪个目录中,如果产生 oom 的话,此时要主动 dump 内存快照进去放哪个目录去。
3、怎么简略监控?
当你的 zk 启动之后,在你的公司开始应用他了,在各种状况下,比方一些运行高峰期,你应该应用 jstat 察看一下他的状况
,去整个察看下 jvm 运行的状况,包含他的新生代的对象增长速率,young gc 的频率,老年代增长速率,full gc 的频率。如果 gc 有问题,须要得进行 gc 调优,正当优化 jvm 参数。另外,如果有 监控零碎
,须要对 zk 运行时的 jvm 的状况进行监控,比如说 gc 频繁,内存使用率。
4、zk 的 JVM 参数设置在哪里设置?
zk 的启动参数设置是在:zkServer.sh 的 start 模块去设置。
4、zk 外围参数阐明
后面曾经做了 zk 机器的配置,以及 zk 在机器上如何部署和配置,还有 zk 的 jvm 参数如何配置,如何给 zk 调配他须要的内存资源、垃圾回收器、gc 日志参数。而后解说完了下面的其实还不够,还须要在正式的启动 zk 之前,还须要理解下其余的一些货色;就是对 zk 的一些参数进行配置。zk 有很多参数,所以咱们须要思考下 zk 的个别参数如何配置。
tickTime
:zk 里的最小工夫单位, 是 zk 的根本工夫单元。默认是 2000 毫秒,也就是 2s,zk 其余的一些参数就会以这个 tickTime 为基准来进行设置,比方有的参数就是 tickTime * 2。dataDir
: 次要是放 zk 里的 内存数据快照
,因为 zk 里会存储很多的数据,然而这些数据在内存里有一份快照,而后在磁盘里其实也会有一份数据的快照,这样的话,比方:zk 停机了,而后 zk 重启能力复原之前的数据。所以 dataDir 次要是寄存 zk 外面的数据快照的。dataLogDir
: 在 zk 原理时候,咱们解说了 zk 的写数据操作,它是基于 2PC 机制,
第一个阶段:将申请包装成写 proposal,这个时候每台机器都会写入一个本地磁盘的 事务日志
,次要是放一些日志数据。
一般来说倡议 dataDir 跟 dataLogDir 挂载到不同的磁盘,并且最好挂载 SSD 固态硬盘;因为这样的话,能够保障读写速度十分快,因为 dataLogDir 这种事务日志磁盘写,是对 zk 的写性能和写并发的影响是很大的。
5、影响 Leader 与 Follower 组成集群运行的两个外围参数
这外面给大家解说下两个比拟外围的参数:initLimit 跟 syncLimit。
initLimit(初始化同步容许超时工夫)
:zk 集群启动的时候,默认值 10 就是:10 * tickTime=20s,leader 在启动之后会期待 follower 跟本人建设连贯以及同步数据,最长等待时间是 20s,在 20s 内,follower 个别必须要跟 leader 建设连贯。过了这个工夫之后,leader 就不等 follower,间接进入音讯播送模式,对外提供服务了。
个别下面默认的参数是不必动的,然而如果:你的 zk 里存储的数据量比拟大了,导致 follower 同步数据须要的工夫比拟长,此时能够调大这个参数。
syncLimit(心跳超时距离)
:默认值 5,也就是 5 * tickTime,10s,这个就是指代:leader 跟 follower 之间会进行心跳,如果超过 10s 没有心跳,leader 就把这个 follower 给踢出去了,认为他曾经死掉了。
6、ZK 数据快照
zk 里的数据分成两份:一份是在磁盘上的事务日志,一份是在内存里的数据结构,实践上两份数据是统一的,即便是有 follower 宕机,也是内存里的数据失落了,然而磁盘上的事务日志都是存在的。即便有的 follower 没收到事务日志就宕机了,也能够在启动之后找 leader 去同步数据
1、什么是数据快照
数据快照是某一时刻全量内存数据的镜像,存储在磁盘文件。
2、为什么引入数据快照?
zk 宕机时候, 重建内存数据: 比方 zk 宕机了,此时 zk 比如说在磁盘里有一份事务日志了,此时他启动之后要重建内存里的数据,如何重建呢?难道说把事务日志进行回放?一条一条从新执行每条事务日志到内存里去吗?这样必定是不靠谱的,而是会导致 zk 启动很慢的。所以 zk 是有一个数据快照的机制。
3、zk 是什么时候进行数据快照的?
事务日志的次数超过设定值后,会触发 ZK dump 全量内存数据到磁盘文件,生成数据快照,如下图所示.
4、数据快照创立流程以及相干的参数是什么?
数据快照创立流程流程:
1. 首先,查看事务日志数量是否达到设定次数;2. 其次,如果超过指定次数,则切换事务日志文件(为了和数据快照放弃同步);3. 其次创立异步线程,专门用于 dump 内存数据到磁盘文件;4. 用 ZXID 作为文件名,而后将会话信息和 DatatTree 分贝序列化写入文件;
快照创立参数:
每次执行肯定的事务之后,就会把内存里的数据快照存储到 dataDir 这个目录中去,作为 zk 以后的一个数据快照。当初在磁盘事务日志里有 1000 个事务,而后把 1000 个事务对应的内存数据写入到 dataDir 里作为一个数据快照,接下来持续写事务日志,比方此时事务日志里有 1032 个事务,此时 zk 重启,他能够间接把蕴含 1000 个事务的快照间接加载到内存里来。而后 1000 之后的 32 个事务,1001~1032 的事务,在内存里回放一遍,就能够在内存里复原进去重启之前的数据了。到底是写多少个事务日志存储一个快照呢?实际上它有一个参数叫做 snapCount;snapCount:100000,默认是 10 万个事务存储一次快照。即便没到 10 万事务,就重启了,此时是没有快照文件的,然而此时是没有关系的,他认为 10 万个事务以内,不须要快照,因为 10 万个事务日志以内,能够间接读取事务日志,回放到内存就重建内存数据了。
7、一台机器上最多能启动多少个 ZooKeeper 客户端?
连接数:
在 zk 客户端上可能会运行一个 Java 开发的零碎去应用 zk,比如说 Kafka(尽管是 Scala 写的,也是 JVM 类的语言),HBase,Canal,HDFS,比如说 Canal 比方部署在一台机器上,此时他会去应用 zk,他就是一个 zk 的客户端。当他们应用 zk 的 Java API,去建设一个 zk 客户端,zk 客户端负责跟 zk servers 进行连贯和通信。
然而一台机器上,咱们能够创立多少个 zk 客户端?也就是说能够跟 zk servers 建设多少个连贯呢?
这个是有限度的,默认来说 60;
3.4.0 以前是 10 个
1、参数:maxClientCnxns
咱们通过参数:maxClientCnxns 能够设置某一个客户端机器最大连贯 zk server 的连贯个数。所以如果咱们本人开发一个零碎去应用 zk 的话,一台机器上,你个别是就用一个 zk 客户端去跟 zk servers 进行交互就能够了,不要无限度的搞很多的 zk 客户端,会连贯不下来的,他 zk servers 最多只能容许你的一台机器跟他建设 60 个连贯。
8、一个 znode 最大存储数据量大小
一个 znode 中最多能够存储多大数据量,这个其实也是一个关键点。你必定会不停地往 zk 外面写数据;往 zk 外面写数据其实就是一个一个的 znode,一个 znode 最多能够存储多少数据呢?
默认是:1mb,1048575bytes(字节)。
一般来说倡议,不要在 znode 中存储的数据量过大,一般来说几百个字节,几百 kb,就能够了。
9、Leader 与 Follower 是通过哪两个端口进行通信?
之前咱们配置 zk 集群时候, 每台机器上都须要配置如下:
server.1=zk01:2888:3888
第二个端口
:3888,一般来说每台机器的 3888 端口,是用来在集群恢复模式的时候进行 leader 选举投票的,也就是说所有的机器之间进行选举投票的时候就是基于 3888 端口来的。
第一个端口
:2888,2888 的端口,是用来进行 leader 和 follower 之间进行数据同步和运行时通信的。
10、事务日志和数据快照是如何进行定时清理?
你不停的让 zk 运行,那么事务日志会越来越多,然而不可能是有限多的,所以他会切割进去多个事务日志文件,也就是事务日志文件它是有多个的。另外的话每次你执行一次数据快照,每次都有一个独立的数据快照文件,最初的话你 zk 磁盘文件上会有多个事务日志文件,多个数据快照文件。
默认来说没有开启定时清理数据文件的性能
。
11、2PC 阶段中写入磁盘的事务日志有没有失落的危险?
1、为什么有危险?(写日志原理)
是这样的?如果你的写申请 proposal 过来到 follower 了,leader 会告诉过半的 follower 去写事务日志。而后返回 ack 之后,才会让 leader 去发送 commit 的申请,那么实际上来说的话,在 事务进行 commit 提交的时候,有没有日志失落的危险?其实是有的,默认状况下,在 2PC 阶段的第一个阶段里,各个机器把事务日志写入磁盘,此时个别是只能进入 os cache 的,没有间接进入物理磁盘下来。所以的话在 commit 提交的时候个别默认会强制把写的事务从 os cache 通过 fsync 到磁盘下来。它有一个参数叫做:forceSync:yes // 默认值是 yes, 也就是说他默认状况下就会强制把事务同步到磁盘下来。你也能够将其改为 no, 这样能够进步机器的性能。倡议设置为 yes, 升高事务日志失落危险。
2、写事务日志到磁盘的效率如何?
1、写日志是程序写磁盘,程序写磁盘跟随机写内存的性能是差不多的,性能是很高的。之前给大家解说 Kafka 的时候就也是说过,程序写磁盘性能很高,2、而且,刚开始的话,它是写到操作系统的缓存外面去的:os cache,所以也保障了他的性能就更高了,只是在 commit 的时候,须要 fsync 到磁盘下来,然而 fsync 之前机器坏了,有可能会失落局部 os cache 里没刷入磁盘的数据,如果是 follower 宕机还好,因为 follower 会从 leader 同步数据,然而如果是 leader 宕机的话,这个就有可能导致数据失落。
总结 :
大家要分明一点,就是默认会将数据通过参数 forceSync:yes 设置将数据刷到磁盘外面去的
12、跟 leader 本人相干的两个参数的阐明
leaderServers
:默认值是 yes, 就是说 leader 是否承受客户端的连贯,默认是能够的,默认客户端是能够跟 leader 建设连贯的。然而你也能够设置成 no, 然而此时客户端只能跟 follower 进行连贯,因而客户端跟 follower 进行了连贯,所有写申请由 follower 转发给 leader,而后 leader 次要承受 follower 的转发写申请进行解决。其实也能够,一般来说不这么设置。
cnxTimeout
:默认 5000,在进行 leader 选举的时候,各个 follower 机器会基于 3888 那个端口建设 TCP 连贯,在这个过程中建设 TCP 连贯的超时工夫。
在启动 zk 集群之前,有哪些参数是必须要设置的,必须要设置的参数,即便有,也全都在 zoo_sample.cfg,次要是以下 3 个参数须要设置
:
1、次要是把 zk 集群的信息配置进去:server.1,server.2。
2、每台机器配置 dataDir,dataLogDir。
3、开启主动清理数据文件的参数。
配置实现之后,就能够写数据了。而后就能够基于 zkServer.sh 命令,
别离启动 leader 和 follower 等多个节点。
13、zookeeper 提供给运维人员命令阐明
假如你硬件配置、JVM 配置(zkServer.sh)、日志参数配置 (zoo.cfg) 都弄好了之后,整个 zk 集群启动,你作为 zk 运维; 你须要去关注 zk 集群的运行状态。这个时候 zk 提供了一些命令供咱们应用。其实怎么用了?如下:
1、命令模版
conf(查看配置)、cons(查看连贯)、crst(重置客户端统计)、dump(输入会话)、envi(查看环境)、ruok(查看是否在运行)、stat(查看运行时状态)、srst(重置服务器统计)、wchs(查看 watcher 信息)、wchc(输入 watche 详细信息)、wchp(输入 watcher,以 znode 为单位分组)、mntr(输入比 stat 更具体的)
echo xxx | nc ip 客户端连贯端口
2、xxx 具体阐明
查看 zk 配置
:conf 查看环境:
envi查看连贯数量
:cons 查看详细信息
:mntr
14、zk 监控
1、jstat 监控
你手上有一个 zk 集群的话,你得常常去看看他的 JVM 运行状况。他的内存应用状况,以及 gc 状况;
Jstat -gc pid 最多显示多好行 每多少毫秒显示一次
jstat -gc 82826 1000 1000
2、jconsole 监控
JDK 自带了一个可视化的 JVM 过程内存剖析的工具,JConsole
个别在你本人的笔记本电脑上就能够关上应用,百度一下,看看就晓得了
此时须要设置 ZOOMAIN 参数:对于 zk 而言,咱们在他的启动脚本下,能够批改其脚本参数。咱们查找 ZOOMAIN 参数:
参数如下:
-Dcom.sun.management.jmxremote.port=21811
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
15、退出 Observer 节点晋升读 QPS
之前给大家讲过,如果你当初有一个 zk 集群,想要线性减少其读的 QPS;你该如何做呢?
1、你能够配置一台机器上的 zk,你讲上面参数设置如下:peerType=observer
2、另外所有机器的配置文件,都要退出一个server.4=zk04:2888:3888:observer;// 除了本身晓得本人是一个 observer, 还得让所有机器晓得 observer.
这样的话 leader 仅仅会同步数据给他,然而他不参加 leader 选举,也不参加过半写机制。只是缓缓去同步数据。
其余就没什么了?其余 zk 的运维就是:看看磁盘空间是否足够,zk 集群建设的连贯是否过多,或者就是最多降级一下版本,3.4.5 够用了。
总结:
到此,zk 集群的部署、参数的设置、监控运维治理根本就这样了。