zookeeper docker单机安装使用和连接
拉取镜像
docker pull zookeeper
启动容器并添加映射
docker run --privileged=true -d --name zookeeper --publish 2181:2181 -d zookeeper:latest
客户端命令连接zookeeper服务端
docker run -it --rm --link zookeeper:zookeeper zookeeper zkCli.sh -server zookeeper
客户端操作zookeeper
# 指定路径创建节点
create path
# 创建临时节点:临时节点在客户端断开连接后节点会消失
create -e path
# 创建顺序节点,序号自动累加
create -s path+seq
# 指定枯井删除节点
delete path
# 修改节点内容
set path data
# 查看path下的节点
ls path
# 获取指定节点下的数据和更新信息
get path
# 获取节点的更新信息
stat path
# watch通知事件,当path发生变化时就会触发watch通知机制
stat path watch
- cZxid :创建节点的id
- ctime : 节点的创建时间
- mZxid :修改节点的id
- mtime :修改节点的时间
- pZxid :子节点的id
- cversion : 子节点的版本
- dataVersion : 当前节点数据的版本
- aclVersion :权限的版本
- ephemeralOwner :判断是否是临时节点
- dataLength : 数据的长度
- numChildren :子节点的数量
java连接zookeeper
依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
java简单连接
@Slf4j
public class TestZoo implements Watcher{
private ZooKeeper zookeeper;
public void connect() {
try {
zookeeper = new ZooKeeper("47.103.95.233", 2000, this);
log.info("连接成功");
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void process(WatchedEvent watchedEvent) {
if(watchedEvent.getState() == Event.KeeperState.SyncConnected){
log.info("Watch received event");
}
}
public static void main(String[] args){
TestZoo testZoo = new TestZoo();
testZoo.connect();
}
}
zookeeper数据结构
zookeeper是以节点作为单位,整体是一种类似文件系统的目录树结构的数据模型,最顶层的是zookeeper节点(默认)
但是zookeeper中的数据并不是存放在操作系统的文件中的,而是存放在内存中,所以zookeeper可以实现高吞吐量和低延迟
zookeeper集群模式
经典集群模式:
- 主从复制(master/slave)
- 主服务器提供写服务
- 从服务器通过异步复制的方式同步主服务器的数据,提供读服务
zookeeper集群模式没有选择传统的主从复制模式,而是引入了leader。follower和observer三种角色。
zookeeper集群中的所有机器通过一个leader选举过程来选定一台称为leader的机器,leader既可以为客户端提供写服务又能为客户端提供读服务,除了leader外,follower和observer都只能提供读服务,他们唯一区别在于observer机器不参与leader选举的过程,也不参与写操作的过半写成功策略,所以observer机器可以在不影响写性能的情况下提升集群的读性能
springcloud整合zookeeper作为注册中心
引入依赖
<!--SpringBoot整合Zookeeper客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
修改配置文件
server:
port: 8104
spring:
application:
name: zookeeper8104
cloud:
zookeeper:
connect-string: 47.103.95.233:2181 # zookeeper地址
主类:
@SpringBootApplication
@EnableDiscoveryClient //zookeeper和后期的consul都是这个注解
public class Zookeeper8104 {
public static void main(String[] args) {
SpringApplication.run(Zookeeper8104.class,args);
}
}
测试:
注意,这个节点的名称就是服务名,节点是临时节点,服务一停掉,过一会zookeeper就会将该节点剔除