其实和nacos差不多
Zookeeper特点
1)Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
2)集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。所 以Zookeeper适合安装奇数台服务器。
3)全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。
4)更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行。 5)数据更新原子性,一次数据更新要么成功,要么失败。
6)实时性,在一定时间范围内,Client能读到最新数据。
作用
注册中心
监控服务
统一配置管理
软负载均衡
Zookeeper的安装
前置安装
(1)安装 JDK
(2)拷贝 apache-zookeeper-3.5.7-bin.tar.gz 安装包到 Linux 系统下
(3)解压到指定目录 [atguigu@hadoop102 software]$ tar -zxvf apache-zookeeper-3.5.7- bin.tar.gz -C /opt/module/
(4)修改名称 [atguigu@hadoop102 module]$ mv apache-zookeeper-3.5.7 -bin/
zookeeper-配置修改
(1)将/opt/module/zookeeper-3.5.7/conf 这个路径下的 zoo_sample.cfg 修改为 zoo.cfg; [atguigu@hadoop102 conf]$ mv zoo_sample.cfg zoo.cfg
(2)打开 zoo.cfg 文件,修改 dataDir 路径: [atguigu@hadoop102 zookeeper-3.5.7]$ vim zoo.cfg 修改如下内容: dataDir=/opt/module/zookeeper-3.5.7/zkData
(3)在/opt/module/zookeeper-3.5.7/这个目录上创建 zkData 文件夹 [atguigu@hadoop102 zookeeper-3.5.7]$ mkdir zkData 3)
操作 Zookeeper
(1)启动 Zookeeper [atguigu@hadoop102 zookeeper-3.5.7]$ bin/zkServer.sh start
(2)查看进程是否启动 [atguigu@hadoop102 zookeeper-3.5.7]$ jps 4020 Jps 4001 QuorumPeerMain
(3)查看状态 [atguigu@hadoop102 zookeeper-3.5.7]$ bin/zkServer.sh status ZooKeeper JMX enabled by default Using config: /opt/module/zookeeper-3.5.7/bin/../conf/zoo.cfg Mode: standalone
(4)启动客户端 [atguigu@hadoop102 zookeeper-3.5.7]$ bin/zkCli.sh
(5)退出客户端: [zk: localhost:2181(CONNECTED) 0] quit
(6)停止 Zookeeper [atguigu@hadoop102 zookeeper-3.5.7]$ bin/zkServer.sh stop
配置参数解读
tickTime = 2000:通信心跳时间,Zookeeper服务器与客户端心跳时间,单位毫秒
initLimit = 10:LF初始通信时限,如果心跳在initLimit*tickTime 时间内都没有回复将会初始化失败
syncLimit = 5:LF同步通信时限,如果心跳在initLimit*tickTime 时间内都没有回复将会同步失败
dataDir:保存Zookeeper中的数据
clientPort = 2181 : 客户端通信端口号
Zookeeper-Java-API
public class TestCurator {
private CuratorFramework client;
/**
* 建立连接
*/
@Before
public void testConnect() {
/*
*
* @param connectString 连接字符串。zk server 地址和端口 "192.168.149.135:2181,192.168.149.136:2181"
* @param sessionTimeoutMs 会话超时时间 单位ms
* @param connectionTimeoutMs 连接超时时间 单位ms
* @param retryPolicy 重试策略
*/
//重试策略
RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 10);
//2.第二种方式
//CuratorFrameworkFactory.builder();
client = CuratorFrameworkFactory.builder()
.connectString("192.168.232.151:2181")
.sessionTimeoutMs(60 * 1000)
.connectionTimeoutMs(15 * 1000)
.retryPolicy(retryPolicy)
.namespace("itheima")
.build();
//开启连接
client.start();
}
@Test
public void testCreate() throws Exception {
//基本创建
//临时当前会话一旦结束,临时节点就被干掉
client.create().creatingParentContainersIfNeeded().forPath("/test","value".getBytes());
//创建节点
//设置节点类型
//创建多级节点
}
@Test
public void testFind() throws Exception {
byte[] bytes = client.getData().forPath("/test");
System.out.println(new String(bytes));
List<String> strings = client.getChildren().forPath("/");
strings.forEach(System.out::println);
CuratorFrameworkState state = client.getState();
System.out.println(state);
Stat stat = new Stat();
client.getData().storingStatIn(stat).forPath("/test");
System.out.println(stat);
}
@Test
public void testSet() throws Exception {
//保证原子性操作
Stat stat = new Stat();
client.getData().storingStatIn(stat).forPath("/test");
int version = stat.getVersion();
System.out.println(version);
client.setData().withVersion(version).forPath("/test","v1".getBytes());
}
@Test
public void testDelete() throws Exception {
//必须成功 防止网络抖动
client.delete().guaranteed().inBackground((client, event) -> {
System.out.println(client);
System.out.println(event);
}).forPath("/test");
}
@After
public void close(){
if(client!=null){
client.close();
}
}
}