首页 > 大数据 > 数据分析 > day03 zookeeper笔记
高并发基础
Day03
复习:
1. Concurrent
包
-
原子性操作。本质上就是对数据进行了加锁。
2. NIO
:同步式阻塞式
IO
。在操作的时候基于选择器,面向通道进行传输,利用缓冲区作为载体来存储数据。
1. Buffer
:缓冲区。存储数据,并且存储的都是基本类型的数据,底层是以数组来作为存储结构
---
标记位
mark <=
操作位
position<=
限制位
limit<=
容量位
capacity ---
翻转、重置、重绕、清空
2. Channel
:通道。用于传输数据,面向缓冲区进行操作。双向传输。
3. Selector
:多路复用选择器。针对事件进行选择。保证使用少量的线程去处理大量的请求。
Zookeeper
是
Apache
开发的开源组件。是
Hadoop
的子间件之一,但是不只是支持
Hadoop
,支持常见的大部分的分布式框架。
分布式存在的问题
1.
需要设置管理节点
2.
如果管理节点只有一个,那么就存在单点问题:即这台服务器一旦宕机,那么入口被封闭。
3.
为了解决单点问题,引入管理集群,就会产生多个管理者的情况
4.
需要在管理集群中选出一个
leader
5.
确定一套选举机制
6.
管理节点之间实现信息的共享
7.
需要一套机制来确定一个唯一的
leader
8.
分布式锁:死锁,活锁
(
没有把持资源,占用
CPU)
。
搭建单机的
Zookeeper
1.
运行环境中必须安装了
JDK1.6
及以上
2.
解压
Zookeeper
的压缩包
3.
打开
conf
(配置)
4. cp zoo_sample.cfg zoo.cfg --- zookeeper
在启动的时候需要自动寻找
zoo.cfg
5. cd ../bin
6.
启动
Zookeeper
的服务器:
sh zkServer.sh start
1. jps:
查看
java
进程,如果是单机的,可以用这种方式查看,如果是集群版本,则不意味着集群就搭建成功
2. sh zkServer.sh status Standalone
7. Zookeeper
进行启动的时候,会在启动的目录下生成一个
zookeeper.out,
存储的就是启动的信息日志。
Zookeeper
的默认端口号是
2181
Zookeeper
的结构
1. Zookeeper
本身一个树状结构
2.
根节点是
/
3.
每一个节点都要存储数据
4.
没有相对路径,只有绝对路径
5.
每一个节点的路径是唯一的
6.
任意一个持久节点都可以挂载子节点
7.
所有的临时节点都不能挂载子节点
8.
所有节点存储的数据是字节形式
9. Zookeeper
构成的这棵树是维系在内存中
10.
每一个节点是一个
znode
节点
Zookeeper
的基本命令
1. ls
路径 查看指定路径下的所有的子节点
2. create
路径 数据 创建节点
3. create -e
路径 数据 创建临时节点
4. get
路径 查看指定节点的信息
5. set
路径 数据 修改指定节点的数据
6. delete
路径 删除指定节点,但是要求节点下没有子节点
7. rmr
路径 删除这个节点及其子节点
节点信息
Zookeeper
会对每一次发生的事务(创建、更新、删除)进行一个编号,编号是依次递增
1
个
cZxid
创建事务
id
ctime
创建时间
mZxid
修改事务
id
mtime
修改时间
pZxid
最大事务
id
cversion
创建版本
dataVersion
数据版本 节点的数据每修改依次,那么数据版本就
+1
Zookeeper
节点的类型
持久节点
- 0
:可以挂载子节点
临时节点
- 1
:不能挂载子节点,关机即没
持久顺序节点
- 2
:会对节点顺次编号
临时顺序节点
- 3
:
-e -s
Zookeeper
本身是基于
Netty
的
Zookeeper
的
API
操作
pom
文件需要加入的依赖:
Zookeeper
的集群配置
1.
解压压缩包
2.
进入
conf
目录
3. cp zoo_sample.cfg zoo.cfg
4.
编辑
zoo.cfg
,改变属性
dataDir=/home/software/zookeeper-3.4.8/tmp
5. server.
编号
=ip
地址
:2888:3888 --- 2888
是原子广播端口,
3888
是选举端口,只要端口不冲突就可以使用
6.
需要在
dataDir
指定的目录下来创建一个文件
:myid,
文件内容就是当前服务器的编号
7.
其他服务器依次做类似操作
scp -r
文件
ip
地址
:
存放路径
scp -r zookeeper-3.4.8 10.9.130.83:/home/software
注意:
如果在集群中只启动了一个节点,那么这个节点默认是失败的,至少出现一半以上的节点才能查
看状态。
ZooKeeper
的选举机制
1.
数据恢复阶段:保证每一个节点都能找到当前节点的最大事务
id
2.
选举阶段:每一个节点都会提交自己的选举信息,并且推荐自己当
leader
。在选举的时候比较每一个节点所提
交的选举信息(最大事务
id---pZxid
,选举
id---myid,
逻辑时钟
---
保证是同一轮选举)
,
在选举的时候是先比较
两个节点的最大事务
id
,谁大谁就胜出。如果事务
id
一致,那么就根据
myid
进行比较,谁大谁胜出。选举的
时候不是一次胜出就能够当
leader
,而是要满足过半性原则。一旦选出
leader
,后续添加的节点无论事务
id
和
myid
是多少,都只能作为
follower
。每一个节点将会对应不同的状态:
Looking
(选举)
,Follower(
追随
)
,
Leader
(管理)
,Observer(
观察
)
3.
集群要想对外提供服务,也需要满足过半性:即至少有一半以上有选举权的服务器还存活。
4.
集群在选举过程中不对外提供服务。
Observer -
观察者
和
follower
一样具有对外提供事务的能力,但是不参加选举。适用于网络不稳定条件下的事务处理。
过半性的意义
1.
选举要满足过半性
2.
处理事务的时候需要有过半的节点同意才能处理
3.
防止脑裂
---
通常都会将节点个数设置为奇数个
Zookeeper
根据
Paxos
来进行选举的。
------------------------------------------------------------------------
其它:
zookeeper 3.4.7
1.setData()不会检查节点是否存在,即使节点不存在也不会报错
2.Watcher对当前操作注册监听,当发生当前事件的时候回调用Watcher的方法
3.通过CountDownLatch的方法避免主线程先退出,无法看到测试结果
4.Observer角色,只参加事务的处理,不参加选举,如果所有的observer都挂掉,
集群依旧正常运行,只有属于leader+follower的一半挂掉,集群才会瘫痪
5.过半性,为了防止闹裂(选举的时候如果有两个一半选出两个leader)
6.有follower宕机重启后会将缺少的事务恢复
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31506529/viewspace-2216949/ ,如需转载,请注明出处,否则将追究法律责任。