文章目录
- 今日目标
- apache zookeeper
- zookeeper的概念
- 分布式和集群的理解
- zookeeper的集群架构和角色
- zookeeper的5大特性
- 部署zookeeper集群环境
- 计算机集群的安装
- 部署三台节点(克隆两台)
- 配置节点内存和CPU
- zookeeper安装
- zookeeper的数据模型
- zookeeper的节点类型
- 使用 shell 操作zookeeper
- watch机制特点
- zookeeper 通过 JAVA Api 操作
- zookeeper的选举机制
- 个人导图笔记
- zookeeper概念
- 重要概念
- 监听器
- ZBA协议
- 写流程
- 知识点回顾
今日目标
- 计算机集群的安装和部署(根据课件安装)
- zookeeper学习
- zookeeper的概念 (了解)
- zookeeper的架构和角色 3个角色(理解)
- zookeeper的5个特性(了解)
- zookeeper的安装(能够操作)
- zookeeper的数据模型(理解)
- zookeeper的节点类型(理解)
- zookeeper的shell操作(会增删改查,watch)
- zookeeper的 jAVA API(了解)
- zookeeper的选举机制(理解,面试题)
apache zookeeper
zookeeper的概念
-
zookeeper为分布式应用提供分布式协调服务的软件
-
zookeeper的本质就是分布式小型文件系统和监控机制
-
应用场景1-协调主机上下线

-
主备切换

-
其他应用场景
- 统一命名服务
- 统一配置管理
- 统一集群管理
- 服务器动态上下线
- 软负载均衡
分布式和集群的理解
-
集群
将一个应用或者软件进行重复部署,每个节点的数据和状态都是一致。
每个人同时具备 洗菜 配菜 做菜 端菜 两个人都具备这个功能。
-
分布式
将一个应用或者软件根据应用步骤分别部署到不同的节点上进行计算。
一个人: 洗菜 配菜
一个人: 做菜
一个人: 端菜
-
分布式集群
每个步骤都会有多个人同时操作,备份。
zookeeper的集群架构和角色

总结: zookeeper有三个角色
- leader 主节点
- follower 从节点
- observer 观察者节点(一般情况下不设置)
读频率会远远大于写。
注意:zookeeper集群不能正常运行时,节点都会进入Looking状态(角色)
zookeeper的5大特性
-
全局数据的一致性
连接不同的服务器,数据读取的都是一致的。
-
可靠性
只要数据被任意一台所接受,其他的节点也同样被接受。
-
顺序性
-
全局有序
指的是针对服务器来说,如果其中的一个节点事务型操作,另外一台也进行事务操作,他们之间的操作是有序的。
-

-
偏序
指的是针对客户端来说,如果先事务操作了 a 在操作c ,执行顺序就是 a c

- 数据更新的原子性
需要满足更新成功半数以上的服务器
-
实时性
zookeeper 小型的服务器,从节点拉取数据,保证数据的实时性。
部署zookeeper集群环境
计算机集群的安装
部署三台节点(克隆两台)
- 在node1上点击管理 => 克隆 出来两台虚拟机
配置节点内存和CPU
-
需要多少内存?
总内存 / 4 每台虚拟机需要的内存数
-
设置每台虚拟机的内存
编辑虚拟机属性 -> 内存 调整
-
设置 MAC 地址
MAC 就是网卡中唯一标识,路由优化 mac 找到你 家庭地址
IP 就是在互联网中找到你的位 个人的位置信息 会变化
如何修改MAC
- 网络编辑器 -> 高级 -> mac 自动生成唯一编码
-
设置每台节点的IP地址(静态ip)
设置的三台节点分别是
192.168.88.161 node1
192.168.88.162 node2
192.168.88.163 node3
配置网关

如何设置ip
vim /etc/sysconfig/network-scripts/ifcfg-ens32

重启服务
systemctl restart network
判断是否设置成功
ping www.baidu.com
-
设置主机名称
主机别名
如何设置主机名
vim /etc/hostname -
域名映射
vim /etc/hosts192.168.88.161 node1 node1.itcast.cn 192.168.88.162 node2 node2.itcast.cn 192.168.88.163 node3 node3.itcast.cn -
关闭防火墙和selinux
防火墙: 配置屏蔽(开放)规则,ip和port
如何关闭防火墙
systemctl stop firewalld systemctl disable firewalld systemctl status firewalld关闭selinux
vim /etc/selinux/config SELINUX=enforcing 改成 disabled -
重启服务器
reboot
-
设置三台节点之间的免密登录

- 首先生成一个密钥对,公钥拷贝给连接的节点,node2
- ssh 连接node2,node2会随机生成一个文本串,用公钥进行加密
- 将加密的数据发送给node1,node1会通过私钥进行解密
- 解密之后的数据会发送给node2,node2会将解密的数据和生成的数据进行比对
- 如果比对成功允许免密登录,不需要输入密码。
-
如何操作免密登录
-
三台节点都生成一对秘钥对
ssh-keygen -t rsa
-
将三台节点的公钥全部先拷贝给node1
ssh-copy-id node1
-
将node1中三台的公钥在拷贝分发到另外两台 node2 node3
scp -r authorized_key root@~/.ssh/
scp /root/.ssh/authorized_keys node2:/root/.ssh scp /root/.ssh/authorized_keys node3:/root/.ssh
-
-
时钟同步
主要保证不同的服务器之间的时间一致,状态一致。
如何进行操作?
- 都连接到外部服务器
crontab -e * * * * * /usr/sbin/ntpdate ntp4.aliyun.com;- 同时连接同一台内网主机
yum install -y ntp # 设置参数 vim /etc/ntp.conf # 设置哪些节点能够同步当前node1 restrict 192.168.88.0 mask 255.255.255.0 nomodify notrap # 如果连接不上外网 就使用当前时间 server 127.127.1.0 fudge 127.127.1.0 stratum 10 # 禁用当前节点连接外网 #server 0.centos.pool.ntp.org #server 1.centos.pool.ntp.org #server 2.centos.pool.ntp.org #server 3.centos.pool.ntp.org# 设置 BIOS和系统时间保持同步 # 主板上的基本输入输出部件 vim /etc/sysconfig/ntpd SYNC_HWLOCK=yes补充内容: 定时任务(linux)

# 12点半执行脚本
30 12 * * * 脚本 参数
# 每三个小时跑一次
* */3 * * * 脚本 参数
# 1-3 跑一次
* 1-3 * * * 脚本 参数
-
node2 node3如何同步node1时间
# 将node1同步到node2 和node3 */1 * * * * /usr/sbin/ntpdate 192.168.88.161
-
安装JDK1.8_241 版本
- 解压缩
tar -zxvf /export/software/jdk1.8_241 -C /export/server- 配置环境变量
#不建议之间修改 /etc/profile 文件 vim /etc/profile.d/my_env.shexport JAVA_HOME=/export/software/jdk1.8_241 export PATH=:$PATH:$JAVA_HOME- 立即生效
source /etc/profile- 执行java命令,验证安装
java -version
javac -version
-
虚拟机镜像快照
保存一个快照,快速进行数据的恢复。
zookeeper安装
-
下载zookeeper软件包 zookeeper3.4.6.tar.gz
-
将压缩包解压缩到 /export/server
-
修改zookeeper的配置文件 cp zoo_sample.xml zoo.xml
tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/export/server/zookeeper-3.4.6/zkdatas/ # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature autopurge.purgeInterval=1# 集群中服务器地址 # server.A=B:C:D # A是一个数字,表示这个是第几号服务器 # B是这个服务器的地址 # C是这个服务器Follower与集群中的Leader服务器交换信息的端口 # D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的 server.1=node1:2888:3888 server.2=node2:2888:3888 server.3=node3:2888:3888 -
添加每台节点 myid
-
将修改好的zookeeper 软件包分发给 node2 和 node3
scp 服务器之间的文件拷贝
scp 文件 用户名@主机名:目录
scp -r 文件夹 用户名@主机名:目录
-
修改node2 和node3 的myid
-
启动zookeeper服务器
/export/server/zookeeper-3.4.6/bin/zkServer.sh start
- 启动的角色分别是:
node1:follower
node2:leader
node3:follower
zookeeper的数据模型

-
目录树,名称空间 (一本书的目录)
-
与普通文件系统不同的地方
- 每个节点既可以存储数据,又可以有子节点
- 节点存储的大小默认是 1MB ,远远小于1MB
- 通过引用路径访问,必须要从 / 目录开始读取文件或者数据 ls /
Znode的组成:
- stat 状态

- 子Znode childre

- data 数据

zookeeper的节点类型
-
zookeeper节点类型分为:
- 临时节点
session会话,会话结束的时候,关闭当前的节点。
客户端 => 服务器 建立连接,产生一个 session 会话,与会话 session相关
- 永久节点
不与session相关,只要创建,会永久存在。
- 序号
带上序号节点被分为了 4 类:
- 临时序号的节点
- 永久序号的节点
- 临时节点
- 永久节点
使用 shell 操作zookeeper
-
通过客户端连接 zookeeper
zkCli.sh -server 主机名:端口zkCli.sh -server node1:2181 -
通过shell操作zookeeper (需要掌握)
help 将所有的操作命令列出来
ZooKeeper -server host:port cmd argsset path data [version]ls path [watch]delquota [-n|-b] pathls2 path [watch]setquota -n|-b val pathhistory delete path [version]listquota pathrmr pathget path [watch]create [-s] [-e] path data aclconnect host:port# 创建一个持久 znode 节点 hadoop
create /hadoop hadoop
# 创建一个临时 zonode 节点 hive
create -e /hive hive
# 创建一个带序号的 znode 临时节点 spark
create -s -e /spark spark
# 修改节点的数据 将 hadoop 修改为 hive
set /hadoop hive
# 删除当前没有子节点的 Znode 的节点
delete /hadoop
# 删除带子节点的 Znode 的节点
rmr /hadoop/hive
# 查询当前的子节点
ls /hadoop
# 查询当前的子节点包括 stat 状态数据
ls2 /hadoop
# 想连接到其他的节点 node2
connect node2:2181
# 设置配额信息 ,节点数据的大小,子节点的个数
setquota -n|-b val path
-n 子节点的个数
-b 子节点的数据的大小
# 允许当前的hive节点下只能有两个子节点(不生效)
setquota -n 2 /hive
# 查询配额的信息列表
listquota /hive

扩充内容:
- 临时节点不能创建子节点
watch机制特点
-
一次性触发
-
事件触发
state 状态 type 事件的类型 path 监控的路径
-
先注册再触发
ls /hive watch

zookeeper 通过 JAVA Api 操作
-
需求
对zookeeper节点进行创建、修改节点数据、获取节点数据、watch 节点
-
分析步骤
//1.创建 Znode 节点,添加 createZnode 方法//1.1 定制一个重试策略//1.2 工厂类获取一个客户端对象//1.3 开启一个客户端对象//1.4 创建Znode 节点对象,在节点/hello2下写入一个 world 内容//1.5 关闭客户端对象 //2.修改 Znode 节点数据,创建 nodeData 方法//2.1 定制一个重试策略//2.2 工厂类获取一个客户端对象//2.3 开启一个客户端对象//2.4 客户端设置指定路径下的数据//2.5 关闭客户端对象 //3.Znode 节点的数据查询 getData方法//3.1 定制一个重试策略 //3.2 工厂类获取一个客户端对象//3.3 开启一个客户端对象//3.4 判断路径并获取 /hello2 的数据//3.4.1 实例化 ZkClient//3.4.2 通过zkClient判断路径是否存在,如果存在了获取此节点下的值//3.4.3 如果不存在路径提示,路径不存在//3.5 打印输出此路径下的数据//3.6 关闭客户端对象 //4.创建监听节点事件 watchNode方法//4.1 定制一个重试策略//4.2 工厂创建客户端对象//4.3 开启客户端对象//4.4 将监听的节点树指定给缓存TreeCache中//4.5 自定义监听事件,实现匿名内部类,判断事件类型//4.6 开启缓存树进程//4.7 阻塞进程
-
代码实现
ctrl + h : 用于显示当前的抽象类或者接口的所有子类
ctrl + p : 快速显示当前参数的类型列表 快捷键
/*** Author itcast* Date 2020/12/20 16:46* 需求:* 1.创建一个节点 hive 内容 hive* 2.修改这个节点的内容 /hive hive -> hadoop* 3.判断如果当前的节点/hive存在,读取/hive下的数据* 4.创建一个带监听/hive的事件,捕捉当前这个节点做了什么操作*/ public class ZookeeperDemo {public CuratorFramework client;@Beforepublic void init() {//连接字符串String connectString = "node1:2181,node2:2181";ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(2000, 3);//创建一个客户端 CuratorFrameworkFactoryclient = CuratorFrameworkFactory.newClient(connectString, retryPolicy);//开启这个客户端client.start();}//1.创建 Znode 节点,添加 createZnode 方法//1.1 定制一个重试策略//1.2 工厂类获取一个客户端对象//1.3 开启一个客户端对象//1.4 创建Znode 节点对象,在节点/hello2下写入一个 world 内容//1.5 关闭客户端对象public void createZnode() throws Exception {//写入数据 /hello2 worldclient.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/hello2", "world".getBytes());}//2.修改 Znode 节点数据,创建 nodeData 方法//2.1 定制一个重试策略//2.2 工厂类获取一个客户端对象//2.3 开启一个客户端对象//2.4 客户端设置指定路径下的数据//2.5 关闭客户端对象public void nodeData() throws Exception {Stat stat = client.setData().forPath("/hello2", "hive".getBytes());long ctime = stat.getCtime();long mtime = stat.getMtime();SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String ctimeStr = dateFormat.format(ctime);String mtimeStr = dateFormat.format(mtime);System.out.println(ctimeStr);System.out.println(mtimeStr);}//3.Znode 节点的数据查询 getData方法//3.1 定制一个重试策略//3.2 工厂类获取一个客户端对象//3.3 开启一个客户端对象//3.4 判断路径并获取 /hello2 的数据//3.4.1 实例化 ZkClient//3.4.2 通过zkClient判断路径是否存在,如果存在了获取此节点下的值//3.4.3 如果不存在路径提示,路径不存在//3.5 打印输出此路径下的数据//3.6 关闭客户端对象public void getData() throws Exception {//判断节点是否存在 如果存在在获取数据ZkClient zkClient = new ZkClient("node1:2181");if (zkClient.exists("/hello2")) {byte[] value = client.getData().forPath("/hello2");String values = new String(value);System.out.println(values);}}//4.创建监听节点事件 watchNode方法//4.1 定制一个重试策略//4.2 工厂创建客户端对象//4.3 开启客户端对象//4.4 将监听的节点树指定给缓存TreeCache中//4.5 自定义监听事件,实现匿名内部类,判断事件类型//4.6 开启缓存树进程//4.7 阻塞进程@Testpublic void watchNode() throws Exception {TreeCache treeCache = new TreeCache(client, "/hello2");treeCache.getListenable().addListener(new TreeCacheListener() {@Overridepublic void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {//如果是创建节点 打印当前节点被创建//如果当前节点被修改 被修改//如果当前节点被删除 被删除switch (event.getType()) {case NODE_ADDED:System.out.println("当前节点被创建");break;case NODE_UPDATED:System.out.println("当前节点被更新");break;case NODE_REMOVED:System.out.println("当前节点被删除");//client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("")}}});treeCache.start();Thread.sleep(100000);}@Afterpublic void close() {//客户端关闭client.close();} }

- 监控节点的事件信息

zookeeper的选举机制

-
新集群的选举机制
首先第一台进行选举,发现没有其他的节点,没有选出leader,当前还是looking
当第二台开机,进行选举,各投自己一票,信息的交换,发现第二台的级别 myid比第一台大
node2会获取两票,node1 0 票,node2 两票没有超过半数,两个节点都是looking状态,
当第三台开机,各投自己一票,信息的交换,发现第三台的级别最高,第三台获取3票,超过半数
状态变成leader
第四台,发现没有选举looking ,直接变成 follower
第五台同第四台。
-
老集群选举机制
只需要考虑 zxid 事务id,事务id的级别是最高的,如果事务id一样的情况,看myid谁大选谁做leader。
问题集锦
-
ssh srt 不能连接 vmware 虚拟机
解决办法:
-
修改 vmware 网络编辑器中 网关 192.168.88.1
-
修改本地适配器 IPV4

-
个人导图笔记
zookeeper概念
zookeeper安装要点
重要概念
监听器
ZBA协议
写流程

知识点回顾
下面我们通过一些简单问题来回顾一下知识点
zookeeper概念:是____________________应用(框架)zookeeper的本质是_____________系统和______________机制zookeeper的应用场景:统一的配_______、集________我们使用zookeeper主要是因为它__________________的特性5大 特性:1,全__________,2,___靠____,3,顺____,4,数据更______,5,实_____(快)zookeeper集群(至少___台):配置_______文件并分发,各节点配置自己的_____文件,注意时___zookeeper使用____数据结构,兼顾_____和_____ 的特点4种节点类型:持______,临______,______顺序,______顺序节点大小限制_____M;顺序号由_________维护监听器原理:使用______,一个______,另一个________ZBA协议:是___________协议,两种工作模式:______播,______复ZBA协议的选举机制:_________,_______的权重最高,其次是__________写流程:收到请求后由______广播写请求;各节点_____,若同意则______;leader统计,超半数则______在写流程时,若flower不同意,则会______,原因:___________在shell中,查看节点的命令是_____,数据的增删查改命令是__________如何使用Java API操作zookeeper?

















