分布式基石 Zookeeper 框架全面剖析

  • Zookeeper 安装、配置、运行
  • Zookeeper 的核心工作机制
    • 特性
    • 数据结构、节点
  • 基本操作命令
    • 服务器的启动和监控
    • 客户端连接
    • 创建节点
    • 查看节点
    • 修改节点数据
    • 删除节点
    • 绑定事件

Java 从 0 到架构师目录:【Java从0到架构师】学习记录

Zookeeper 安装、配置、运行

集群安装的时候建议使用 2n+1

  • 对于集群中的节点,leader 节点和 follower 节点,当 leader 节点挂掉之后,需要在集群中选择一个节点作为 leader 节点,其中选举的策略是少数服从多数·

安装 Zookeeper:注:Zookeeper 是 Java 写的,需要 jdk 的环境

1、上传安装包到服务器

  • 下载地址:https://downloads.apache.org/zookeeper/

2、解压到指定目录

tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz  -C /usr/local/

3、修改文件所在配置目录

zookeeper/conf# 拷贝配置文件
# cp zoo_sample.cfg zoo.cfg
cat zoo_sample.cfg | grep -v "#" | grep -v "^$" > zoo.cfg# 在配置文件中添加如下内容
dataDir=/usr/local/apache-zookeeper-3.6.0-bin/data
server.1=192.168.52.128:2888:3888 # M01的ip地址
server.2=192.168.52.129:2888:3888 # M02的ip地址
server.3=192.168.52.130:2888:3888 # M03的ip地址

配置文件解析:

tickTime=2000 # 心跳时间单位(ms): 2s
initLimit=10 # 集群启动的时间限制: 10 * 2000 = 20s
syncLimit=5 # 同步数据的时间限制: 5 * 2000 = 10s
dataDir=/usr/local/apache-zookeeper-3.6.0-bin/data # 数据存放的目录
clientPort=2181 # 客户端连接端口# 集群中的服务列表 1,2,3 代表服务的 id, 需要和 myid (必须放在 dateDir 目录) 文件中的内容一直, 并且在 1~252 之间
server.1=192.168.52.128:2888:3888 # 2888 数据同步端口 | 3888 选举端口
server.2=192.168.52.129:2888:3888
server.3=192.168.52.130:2888:3888

4、创建数据存储目录,并创建标志文件 myid
在 /root/apps/zookeeper 创建 data 目录:

mkdir -p /root/apps/zookeeper/data
cd /root/apps/zookeeper/data
echo 1 > myid

5、把安装好的配置拷贝到其他的机器

注意: 一定要修改 myid 文件
M001,myid 为 1
M002,修改 myid 为 2
M003,修改 myid 为 3

6、配置 Zookeeper 的环境变量

vi /etc/profile
export ZOOKEEPER_HOME=/root/apps/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

7、启动服务

zkServer.sh start # 启动命令
zkServer.sh status # 查看状态命令
zkServer.sh stop # 停止服务命令
zkServer.sh restart# 停止服务命令
jps # 查看java进程, QuorumPeerMain是Zookeeper的进程

如果遇到无法连接的问题,很有可能是防火墙拦截了端口:
systemctl stop firewalld # 关闭防火墙
systemctl disable firewalld # 禁止防火墙自启

Zookeeper 的日志在 logs/zookeeper-root-server-localhost.localdomain.out,出现问题可以查看这个

Zookeeper 的核心工作机制

特性

1、节点的最佳实践:1 个 leader,2 个 follower 组成的集群

Leader 的选举机制:少数服从多数,选举 leader 时只需要有一半及以上人同意即可,因此 2n + 1 个节点最合适。
如果集群节点比较多,会影响写数据的性能,因为写数据只能在 Leader 节点,并且需要同步到 从节点才可以访问。

2、全局数据一致:每个 server 保存一份相同的数据副本,client 无论连接到哪个 server,数据都是一致的

3、分布式读写,更新请求转发,由 leader 实施

4、更新请求顺序进行,来自同一个 client 的更新请求按其发送顺序依次执行

5、数据更新原子性,一次数据更新要么成功(半数以上节点成功),要么失败

6、实时性,在一定时间范围内,client 能读到最新数据(毫秒级别)

数据量不要超过 1M

数据结构、节点

1、层次化的目录结构,命名符合常规文件系统规范

2、每个节点在 Zookeeper 中叫做 Znode,并且其有一个唯一的路径标识

3、节点 Znode 可以包含数据(只能存储很小量的数据,< 1M)和子节点

但是 EPHEMERAL 类型的节点不能有子节点,后面有讲解

4、客户端应用可以在节点上设置监视器


Znode 有 4 种形式的目录节点:

  • PERSISTENT - 持久化节点
  • PERSISTENT_SEQUENTIAL - 持久化顺序节点
  • EPHEMERAL - 临时节点
  • EPHEMERAL_SEQUENTIAL - 临时节点顺序节点

短暂 (ephemeral):断开连接自己删除
持久 (persistent):断开连接不删除

创建 Znode 时设置顺序标识,Znode 名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护

在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序

基本操作命令

服务器的启动和监控

# 服务启动 | 关闭 | 重启 | 状态
zkServer.sh  start | stop | restart | status
#  查看java进程, QuorumPeerMain是Zookeeper的进程
jps
# 监控服务器
netstat -natlnetstat -ntpl

客户端连接

终端中 ctrl + L 清屏

# 如果是连接当前本机地址, 可以使用 zkCli.sh
zkCli.sh -server localhost:2181
# 查看命令所有可以执行的命令
help

创建节点

create [-s] [-e] [-c] [-t ttl] path [data] [acl][-s]: 顺序节点 默认为否[-e]: 临时节点 默认为否[-c]: 创建一个容器节点[-t ttl] 创建一个持久化节点或者一个持久化顺序节点的时候, 指定存活时间[path]: 路径 | oloo目录[data]: 设置路径下存放的数据
# 创建持久化节点
create /pNod pNode# 创建临时节点, 临时节点在会话关闭以后, 会自动删除
# 临时节点不允许有子节点
create -e /eNode eNode# 创建顺序节点
# 顺序节点,允许进行节点重复创建, 默认会在节点后面添加一个全局唯一的顺序ID
create /lock
create -s /lock/getId
create -e -s /lock/getId2# 创建容器节点
# 容器节点下面存放多个子节点, 当子节点删除完以后容器节点自动删除
# 子节点删除完毕后, 通过定时器, 在一分钟没有子节点, 直接删除该节点znode.container.checkIntervalMs
create -c /cnode cnode
create -c /cnode/child01 child01
create -c /cnode/child02 child02
delete /cnode/child01
delete /cnode/child02
get /cnode

查看节点

ls [-s] [-w] [-R] path[-s]: 显示统计信息[-w]: 查看事件信息[-R]: 显示递归目录
get [-s] [-w] path[-s]: 显示统计信息[-w]: 获取事件信息. 只会绑定一次
get -s /pNodpNode # 获取到的节点数据
cZxid = 0x600000010 # 创建节点的事务Id
ctime = Tue Apr 21 16:23:31 CST 2020 # 创建时间
mZxid = 0x600000010 # 修改的事务ID
mtime = Tue Apr 21 16:23:31 CST 2020 # 修改时间
pZxid = 0x600000010
cversion = 0 # 当前版本信息
dataVersion = 0 # 数据版本信息
aclVersion = 0 # 权限版本信息
ephemeralOwner = 0x0 # 临时节点的会话ID
dataLength = 5 # 数据长度
numChildren = 0 # 子节点个数

修改节点数据

set [-s] [-v version] path data[-s]: 设置过程显示节点的状态信息[-v]: 给指定版本的节点设置数据
set -v 0 /node2 node3
set /node2 node3

删除节点

delete [-v version] path-v: 在并发的时候, 使用乐观锁进行删除
# 递归删除节点
deleteall /pNod

绑定事件

绑定一次事件:

# 当 eNode 被修改后, 会发出提示, 但是不会知道被修改的值
get -w /eNode

绑定永久的事件:

# 默认绑定当前节点以及子节点的所有的事件:
addWatch [-m mode] path -m PERSISTENT | PERSISTENT_RECURSIVE常见的事件有:
NodeDataChanged: 节点数据改变事件
NodeChildrenChanged: 子节点数量改变事件
NodeCreated: 节点创建时间
addWatch -m PERSISTENT /eNode  如果对于数据的获取: 一般绑定的是 NodeDataChanged
如果对于获取子节点列表: 一般绑定的是 NodeChildrenChanged

【Java从0到架构师】Zookeeper - 安装、核心工作机制、基本命令相关推荐

  1. 【Java从0到架构师】git 核心原理和分支管理

    git 核心原理和分支管理 核心原理 Git 数据存储结构 git add 流程 - 把数据添加到暂存区 git commit 流程 - 把数据提交到版本库 HEAD 关联关系处理 分支管理 常用命令 ...

  2. 【Java从0到架构师】RocketMQ 基础 - 应用、核心组件、安装

    RocketMQ 消息中间件 基础知识 消息中间件的应用 异步解耦 削峰填谷 消息分发 RocketMQ 核心组件 RocketMQ 安装 源码安装 修改配置参数 启动 管理控制台安装 测试项目 Ja ...

  3. 【Java从0到架构师】Zookeeper 应用 - Java 客户端操作、服务器动态感知、分布式锁业务处理

    分布式基石 Zookeeper 框架全面剖析 Java 客户端操作 Java 客户端 API 服务器的动态感知 服务注册 服务发现 分布式锁业务处理 单机环境(一个虚拟机中) 分布式环境_同名节点 分 ...

  4. 【Java从0到架构师】Linux 应用 - 软件包管理、软件安装

    Linux 应用 - 软件包管理.软件安装 软件包管理器 rpm yum 软件的安装 jdk 1.8 mysql 5.7 tomcat8 Java 从 0 到架构师目录:[Java从0到架构师]学习记 ...

  5. 【Java从0到架构师】Zookeeper - 系统高可用、分布式的基本概念、Zookeeper 应用场景

    分布式基石 Zookeeper 框架全面剖析 系统高可用 集群 - 主备集群.主从集群.普通集群 分布式(系统部署方式) 微服务(架构设计方式) 分布式的基本概念 分布式存储.分布式计算 分布式协调服 ...

  6. 【Java从0到架构师(1),Java中高级面试题总结(全面)

    JSP 九大内置对象 MySQL 基础 + 多表查询 [Java从0到架构师]MySQL 基础 MySQL MySQL 的使用步骤 数据库的内部存储细节 GUI 工具 SQL 语句 DDL 语句 DD ...

  7. 【Java从0到架构师】SpringCloud - Eureka、Ribbon、Feign

    SpringCloud 分布式.微服务相关概念 微服务框架构选型 SpringCloud 概述 服务注册与发现 - Eureka 案例项目 Eureka 自我保护机制 微服务调用方式 - Ribbon ...

  8. 【Java从0到架构师】Dubbo 基础 - 设置启动时检查、直接提供者、线程模型、负载均衡、集群容错、服务降级

    Dubbo 分布式 RPC 分布式核心基础 分布式概述 RPC Dubbo Dubbo 入门程序 - XML.注解 部署管理控制台 Dubbo Admin 修改绑定的注册 IP 地址 设置启动时检查 ...

  9. 【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI

    分布式框架通信核心基础 序列化 JDK 的序列化 JDK 序列化的一些细节 Protobuf 序列化 Protobuf 环境搭建与操作 Protobuf 原理分析 实际数据传输 序列化技术选型 远程过 ...

最新文章

  1. 爬虫 - requests模块
  2. find = in a string
  3. tez什么意思_传统数仓和大数据数仓的区别是什么?
  4. Manjaro Linux 0.8.5 发布
  5. PeekMessage抓取消息,如何把每个消息都获取到呢?
  6. Ubuntu16.04LTS+CUDA8.0+cuDNN5.1+Anaconda3(python3.6)+tensorflow_gpu-1.2.1安装过程全记录
  7. oracle spool
  8. 强连通分量[trajan]
  9. 【精通内核】CPU控制并发原理CPU中断控制内核解析
  10. word文档通配符换行_PDF如何转化成Word文档?
  11. Oracle特殊符号
  12. 下载到的电子书格式是Mobi,这种格式能否在WINDOWS电脑上打开?
  13. 使用H5中的表单标签制作一个简单的网页登陆页面
  14. SATA硬盘性能测试软件,趣味测试:实测SATA线对硬盘性能的影响
  15. [网络验证破解]某外挂验证转本地化
  16. 星形接法和三角形接法电压和电流关系
  17. Dev C++ 运行出现:源文件未编译
  18. Internal Server Error“,“message“:“nested exception is org.apache.ibatis.exce【已解决】
  19. 有哪些原创的微信公众号推荐?(it技术编程类)
  20. 高质量的代码 - 价值观

热门文章

  1. 朴宥拉短片突破了几百万的观看量
  2. 如何看待使用盗版windows系统的人?
  3. 那些很重要,但是不常用的技术,websocket
  4. From the data point of view
  5. Qt4_读取和写入文本
  6. JvavScript中的函数与对象
  7. linux内核的队列实现移植
  8. ssis导入xml_使用SSIS包将XML文档导入SQL Server表
  9. Zabbix-1.8.14 安装
  10. python015 Python3 函数