• 未完待续

什么是zookeeper

  • 开源的分布式、提供协调服务
  • zookeeper = 文件系统 + 通知机制
  1. 服务器开机后,向zookeeper注册信息
  2. 客服端向zookeeper获取服务器的信息
  3. 服务器

https://zhuanlan.zhihu.com/p/69114539?utm_source=wechat_session

组成

  • 一个leader,多个Follower
  • 集群中只要有半数以上的节点存活,就能正常运行
  • 全局数据一致,集群每个服务器保存相同的数据,所以客户端连接任何一个服务器,数据都是一致的
  • 更新请求顺序进行,来自同一个客户端的更新请求按发送
  • 数据更新原子性,要么更新成功,要么更新失败
  • 实时性,zookeeper更新非常快

  • 数据结构:树形结构,每个节点叫做Znode,默认存1MB的数据

应用场景

  • 统一命名服务:对服务统一命名,如域名

  • 统一配置管理:同步配置文件

    • 将配置信息写入Znode
    • 各个客户端、服务器监听Znode
    • 如果Znode中的数据被修改,zookeeper就通知各个客户端、服务器
  • 统一集群管理:实时掌握每个节点的状态

    • 可以将节点信息写入zookeeper上的Znode
    • 监听Znode的实时状态变化
  • 服务器动态上下线
  • 负载均衡:zookeeper记录每台服务器访问数,访问数最少的服务器处理最新的客户端请求

本地安装

  • 本地模型:主要用于测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
tar -zxvf apache-zookeeper-3.6.1-bin.tar.gz -C /opt/module/
# 名字太长了,我改短一点
mv apache-zookeeper-3.6.1-bin zookeeper-3.6.1
# 修改配置文件
cd zookeeper-3.6.1/conf
# 修改zoo.sample.cfg
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
# 修改下面,zkData可以是其他名字
dataDir=/opt/module/zookeeper-3.6.1/zkData
# 在zookeeper-3.6.1下创建文件夹
mkdir zkData
# 启动zookeeper服务器
bin/zkServer.sh start
# 启动客户端
bin/zkCli.sh
# 关闭zookeeper服务器
bin/zkServer.sh stop
  • conf/zoo.cfg解读
1
2
3
4
5
6
7
8
9
10
11
12
# tickTime为心跳,2000毫秒=2秒
tickTime=2000
# initLimit为,10X2秒=20秒,初始化通信最大延迟时间
initLimit=10
# 同步:5X2秒=10秒,集群正常工作时,通信最大延迟时间
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/opt/module/zookeeper-3.6.1/zkData
# the port at which the clients will connect
clientPort=2181

zookeeper内部原理

选举机制

  • 通常是奇数台机器
  • zookeeper没有指定Master和Slave,但是会选举出一个leader:先选自己,不行再选别人

节点类型

  • 持久:客户端与服务器断开,节点不删除
  • 短暂:客户端与服务器断开,节点删除

分布式安装

  • 分布式开发:用于开发
1
2
3
4
5
6
7
8
9
10
11
12
13
# 将刚才在本地配置好的软件发到其他机器上
xsync zookeeper-3.6.1/
# 给服务器编号,在zkData里面创建myid的文件
touch myid
vi myid
# 在myid里面添加编号,这里我设置为4、5、6
# 现在要配置zoo.cfg,还需要加上:
vim zoo.cfg
# server.A=B:C:D A为编号、B为ip地址、C为与Leader交换的端口
# D为leader挂了之后重新选举的leader的新端口
server.4=hadoop104:2888:3888
server.5=hadoop105:2888:3888
server.6=hadoop106:2888:3888

shell操作命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 客户端命令行操作
# 创建两个节点,一定要有数据才能成功
create /sanguo "jinlian"
create /sanguo/shuguo "liubei"
# 获取信息
[zk: localhost:2181(CONNECTED) 8] get /sanguo/shuguo
liubei
# 这里的-e是暂时节点
create -e /sanguo/wuguo "zhouyu"
# 创建带有序号的节点
[zk: localhost:2181(CONNECTED) 12] create -s /sanguo/weiguo "caocao"
Created /sanguo/weiguo0000000002
[zk: localhost:2181(CONNECTED) 13] create -s /sanguo/weiguo "caocao"
Created /sanguo/weiguo0000000003
[zk: localhost:2181(CONNECTED) 14] create -s /sanguo/weiguo "caocao"
Created /sanguo/weiguo0000000004
[zk: localhost:2181(CONNECTED) 15] create -s /sanguo/weiguo "caocao"
Created /sanguo/weiguo0000000005
# 修改节点数据值
set /sanguo/shuguo "diaochan"
# 注册监听/sanguo节点数据变化,只生效一次
# 在hadoop106上监听
get /sanguo watch
# 在hadoop105上改变数值
WatchedEvent state:SyncConnected type:NodeDataChanged path:/sanguo
# 删除
delete /sanguo/banzhang