前言
最近在项目中使用了Kafka,但出现了一些预料之外的情况,所以想深入钻研一下,本来使用的公司的Kafka云产品,但一查看消息就搁那卡半天,极其拉跨,所以就自己在本地搭建一套
参考链接:
1.zookeeper安装概要流程
准备四个虚拟机 主机名改为node01~node04:
- 安装jdk,并设置javahome
*, node01: - 下载zookeeper zookeeper.apache.org
- tar xf zookeeper.*.tar.gz
- mkdir /opt/mashibing
- mv zookeeper /opt/mashibing
- vi /etc/profile export ZOOKEEPER_HOME=/opt/mashibing/zookeeper-3.4.6 export PATH= P A T H : PATH: PATH:ZOOKEEPER_HOME/bin
- cd zookeeper/conf
- cp zoo.sem*.cfg zoo.cfg
- vi zoo.cfg dataDir= server.1=node01:2888:3888
- mkdir -p /var/mashibing/zk
- echo 1 > /var/mashibing/zk/myid
- cd /opt && scp -r ./mashibing/ node02:
pwd
- node02~node04 创建 myid
- 启动顺序 1,2,3,4
- zkServer.sh start-foreground
2.zookeeper常用命令
zkCli.sh
help
ls /
create /ooxx “”
create -s /abc/aaa
create -e /ooxx/xxoo
create -s -e /ooxx/xoxo
get /ooxx
3.zookeeper安装详细流程
概念
ZooKeeper集群是复制集群/主从集群(各个服务上数据相同),而非分片集群/无主集群,写是主leader节点写,查是都可以查(leader、follower)
主从集群肯定要考虑的问题:主是单点,挂掉不可用,不可靠,所以需要解决单点故障问题、
但zookeeper集群其实是高可用,因为它可以快速恢复leader
有两种运行状态,可用和不可用,区别在于leader是否挂掉
不可用恢复到可用应该越快越好
leader选举新leader的时间不到200ms
读写分离时读写比例为10:1时性能最高
客户端可以连接任意节点,但写一定是转发到leader节点去操作
不要把zookeeper当数据库使用:保证对外协调服务的块
节点:持久节点,临时节点,(都支持序列节点)
客户端连接到zookeeper会创建session,session和临时节点生命周期相同
zookeeper使用的弱一致性,最终一致性,过半则写成功通过,sync
安装流程
提前准备工作:
vim /etc/hosts
zoo.cfg文件
# The number of milliseconds of each tick
# 心跳ms,节点之间确认是否存活
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
# 当有follower追随leader,leader允许等待 2000*10=20s
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
# leader下发操作时,2000*5=10s,10s不回馈则有问题
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
# 快照持久化目录,/var目录存储数据
# /srv :主要用来存储本机或本服务器提供的服务或数据。(用户主动生产的数据、对外提供服务)
# /var :系统产生的不可自动销毁的缓存文件、日志记录。(系统和程序运行后产生的数据、不对外提供服务、只能用户手动清理)(包括mail、数据库文件、日志文件)
# /tmp :保存在使用完毕后可随时销毁的缓存文件。(有可能是由系统或程序产生、也有可能是用户主动放入的临时数据、系统会自动清理)
dataDir=/usr/local/apache-zookeeper-3.6.3-bin/data
# the port at which the clients will connect
# 客户端连接zookeeper的端口号
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
# zookeeper允许连接的最大客户端数,默认没有设置
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
# 配置zookeeper节点
# (行数/2)+1就是过半数
# 3888是如果leader挂掉或者刚启动没有leader,通过该端口投票选出leader
# 2888 选出leader后会启一个2888端口,其他接口连接该端口建立连接,之后都通过该端口号传递操作
# 如何选出leader,谦让,选一个ID最大的,但仍旧遵循过半
# 1234顺序就是3
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
server.4=node04:2888:3888
-
在conf目录下 cp zoo.sample.cfg zoo.cfg
创建data目录用于zokeeper的持久化
修改zoo.cfg文件内容
- 在第一个虚拟机执行如下命令:
-
s c p − r a p a c h e − z o o k e e p e r − 3.6.3 − b i n / 192.168.204.132 : ‘ p w d ‘ scp -r apache-zookeeper-3.6.3-bin/ 192.168.204.132:`pwd` scp−rapache−zookeeper−3.6.3−bin/192.168.204.132:‘pwd‘
-
s c p − r a p a c h e − z o o k e e p e r − 3.6.3 − b i n / 192.168.204.133 : ‘ p w d ‘ scp -r apache-zookeeper-3.6.3-bin/ 192.168.204.133:`pwd` scp−rapache−zookeeper−3.6.3−bin/192.168.204.133:‘pwd‘
-
s c p − r a p a c h e − z o o k e e p e r − 3.6.3 − b i n / 192.168.204.134 : ‘ p w d ‘ scp -r apache-zookeeper-3.6.3-bin/ 192.168.204.134:`pwd` scp−rapache−zookeeper−3.6.3−bin/192.168.204.134:‘pwd‘
- 在data目录下,创建myid文件,echo 1 > ./data/myid
然后各个节点在zookeeper目录内执行
echo 2 > ./data/myid
echo 3 > ./data/myid
echo 4 > ./data/myid
-
修改环境变量
vim /etc/profile
. /etc/profile (或者source /etc/profile)
scp /etc/profile node02:/etc
scp /etc/profile node03:/etc
scp /etc/profile node04:/etc
- 查时间是否一致
date
-
启动
zkServer.sh help(帮助命令)
zkServer.sh start(默认后台)
zkServer.sh start-foreground(前台启动)
基本操作
zkCli.sh连接zookeeper
节点可以放入1MB数据且是二进制安全的
zookeeper的顺序体现在czxid上
cZxid Zookeeper为节点分配的Id
64位,如果前32位是0,一般默认不显示,前32位表示是哪个纪元,第几个leader,后32位是事务递增序列
cTime 节点创建时间mZxid 修改后的id
mtime 修改时间
pZxid 最后一个子节点id
cversion 子节点的version
dataVersion 当前节点数据的版本号
aclVersion 权限Version
ephemeralOwner:临时节点的所有者(create使用-e参数,和会话生命周期相同),和执行zkCli.sh返回的会话id相同
dataLength 数据长度
numChildren 子节点个数
zookeeper四字命令 | 功能描述 |
---|---|
conf | 输出相关服务配置的详细信息。 |
cons | 列出所有连接到服务器的客户端的完全的连接 /会话的详细信息。包括“接受 / 发送”的包数量、会话 id 、操作延迟、最后的操作执行等等信息。 |
dump | 列出未经处理的会话和临时节点。 |
envi | 输出关于服务环境的详细信息(区别于 conf命令)。 |
reqs | 列出未经处理的请求 |
ruok | 测试服务是否处于正确状态。如果确实如此,那么服务返回“imok ”,否则不做任何相应。 |
stat | 输出关于性能和连接的客户端的列表。 |
wchs | 列出服务器 watch的详细信息。 |
wchc | 通过 session列出服务器 watch的详细信息,它的输出是一个与watch相关的会话的列表。 |
wchp | 通过路径列出服务器 watch的详细信息。它输出一个与 session相关的路径。 |
zookeeper3.5版本后提供了jetty默认后台管理8080端口,访问地址为:http://localhost:8080/commands/stat(http://192.168.204.134:8080/commands/stat)
http://192.168.204.134:8080/commands
临时节点测试
1.开一个客户端连接会创建session,显示sessionId:
Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2181, session id = 0x300000d81430000, negotiated timeout = 30000
临时节点伴随会话的断开而消失
创建sessionId的时候会将消息发给所有节点,所以会占用一个序列id,断开连接也需要同步,所以也消耗一个事务id