服务治理让人掉头发?用zookeeper啦!(一)
前序
原理看这个
ZooKeeper 这么牛逼,基本原理你懂吗?
转载链接:https://mp.weixin.qq.com/s/DtLdmLhGO4wJxIaOWgrXQg
正文
一、客户端API常规应用
zookeeper 提供了java与C两种语言的客户端。我们要学习的就是java客户端。引入最新的maven依赖:
1 <dependency> 2 3 4 <groupId>org.apache.zookeeper</groupId> 5 6 7 <artifactId>zookeeper</artifactId> 8 9 10 <version>3.5.5</version> 11 12 13 </dependency>
1.初始连接:
常规的客户端类是 org.apache.zookeeper.ZooKeeper,实例化该类之后将会自动与集群建立连接。构造参数说明如下:
|
参数名称 |
类型 |
说明 |
|
connectString |
String |
连接串,包括ip+端口 ,集群模式下用逗号隔开 192.168.0.149:2181,192.168.0.150:2181 |
|
sessionTimeout |
int |
会话超时时间,该值不能超过服务端所设置的 minSessionTimeout 和maxSessionTimeout |
|
watcher |
Watcher |
会话监听器,服务端事件将会触该监听 |
|
sessionId |
long |
自定义会话ID |
|
sessionPasswd |
byte[] |
会话密码 |
|
canBeReadOnly |
boolean |
该连接是否为只读的 |
|
hostProvider |
HostProvider |
服务端地址提供者,指示客户端如何选择某个服务来调用,默认采用StaticHostProvider实现 |
2.创建、查看节点
创建节点
通过org.apache.zookeeper.ZooKeeper#create()即可创建节点,其参数说明如下:
|
参数名称 |
类型 |
说明 |
|
path |
String |
给定的目录节点 path |
|
data |
byte[] |
数据 |
|
acl |
List<ACL> |
权限 |
|
createMode |
CreateMode |
标识有四种形式的目录节点 |
|
cb
|
StringCallback |
回调方法 |
|
ctx |
Object |
上下文 |
查看节点:
通过org.apache.zookeeper.ZooKeeper#getData()即可创建节点,其参数说明如下:
|
参数名称 |
类型 |
说明 |
|
path |
String |
路径 |
|
watch |
boolean |
是否需要注册一个watcher |
|
watcher |
Watcher |
注入的watcher |
|
cb |
DataCallback |
回调函数 |
|
ctx |
Object |
上下文 |
查看子节点:
通过org.apache.zookeeper.ZooKeeper#getChildren()即可获取子节点,其参数说明如下:
|
参数名称 |
类型 |
说明 |
|
path |
String |
指定数据节点的路径 |
|
watch |
boolean |
表明是否需要注册一个Watcher,如果为true,则使用默认的watcher(在客户端创建会话的时候传入的Watcher),false则不使用watcher |
|
watcher |
Watcher |
注册的Watcher。一旦在此次获取子节点以后,如果子节点列表发生变更,该Watcher将会收到通知 |
|
cb |
Children2Callback |
注册一个异步回调函数 |
|
ctx |
Object |
用于传递的上下文对象 |
3.监听节点
在getData() 与getChildren()两个方法中可分别设置监听数据变化和子节点变化。通过设置watch为true,当前事件触发时会调用zookeeper()构建函数中Watcher.process()方法。也可以添加watcher参数来实现自定义监听。一般采用后者。
注:所有的监听都是一次性的,如果要持续监听需要触发后在添加一次监听。
4.设置节点ACL权限
ACL包括结构为scheme:id:permission
客户端中由org.apache.zookeeper.data.ACL 类表示,类结构如下:
- ACL
- Id
- scheme // 对应权限模式scheme
- id // 对应模式中的id值
- perms // 对应权限位permission
- Id
关于权限位的表示方式:
每个权限位都是一个唯一数字,将其合时通过或运行生成一个全新的数字即可
1 @InterfaceAudience.Public 2 3 public interface Perms { 4 5 int READ = 1 << 0; 6 7 int WRITE = 1 << 1; 8 9 int CREATE = 1 << 2; 10 11 int DELETE = 1 << 3; 12 13 int ADMIN = 1 << 4; 14 15 16 17 int ALL = READ | WRITE | CREATE | DELETE | ADMIN; 18 19 }
5.第三方客户端ZkClient
zkClient 是在zookeeper客户端基础之上封装的,使用上更加友好。主要变化如下:
可以设置持久监听,或删除某个监听
可以插入JAVA对象,自动进行序列化和反序列化
简化了基本的增删改查操作。
二、Zookeeper集群
zookeeper集群的目的是为了保证系统的性能承载更多的客户端连接设专门提供的机制。通过集群可以实现以下功能:
读写分离:提高承载,为更多的客户端提供连接,并保障性能。
主从自动切换:提高服务容错性,部分节点故障不会影响整个服务集群。
半数以上运行机制说明:
集群至少需要三台服务器,并且强烈建议使用奇数个服务器。因为zookeeper 通过判断大多数节点的存活来判断整个服务是否可用。比如3个节点,挂掉了2个表示整个集群挂掉,而用偶数4个,挂掉了2个也表示其并不是大部分存活,因此也会挂掉。
-
集群部署
配置语法:
server.<节点ID>=<ip>:<数据同步端口>:<选举端口>
节点ID:服务id手动指定1至125之间的数字,并写到对应服务节点的 {dataDir}/myid 文件中。
IP地址:节点的远程IP地址,可以相同。但生产环境就不能这么做了,因为在同一台机器就无法达到容错的目的。所以这种称作为伪集群。
数据同步端口:主从同时数据复制端口,(做伪集群时端口号不能重复)。
远举端口:主从节点选举端口,(做伪集群时端口号不能重复)。
配置文件示例:
tickTime=2000
dataDir=/var/lib/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
#以下为集群配置,必须配置在所有节点的zoo.cfg文件中
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
集群配置流程:
- 分别创建3个data目录用于存储各节点数据
mkdir data
mkdir data/1
mkdir data/3
mkdir data/3
编写myid文件
echo 1 > data/1/myid
echo 3 > data/3/myid
echo 2 > data/2/myid
3、编写配置文件
conf/zoo1.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=data/1
clientPort=2181
#集群配置
server.1=127.0.0.1:2887:3887
server.2=127.0.0.1:2888:3888
server.3=127.0.0.1:2889:3889
conf/zoo2.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=data/2
clientPort=2182
#集群配置
server.1=127.0.0.1:2887:3887
server.2=127.0.0.1:2888:3888
server.3=127.0.0.1:2889:3889
conf/zoo3.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=data/3
clientPort=2183
#集群配置
server.1=127.0.0.1:2887:3887
server.2=127.0.0.1:2888:3888
server.3=127.0.0.1:2889:3889
4.分别启动
./bin/zkServer.sh start conf/zoo1.cfg
./bin/zkServer.sh start conf/zoo2.cfg
./bin/zkServer.sh start conf/zoo3.cfg

浙公网安备 33010602011771号