第三天课程:Zookeeper
Zookeeper概述&主从、主备集群
-
是一个分布式协调服务的开源框架,是一个分布式的小文件存储系统。有目录式结构。
-
主从集群 (一主多从)
主和从各司其职,从角色要受到主的管理
主角色 主节点 master leader 老大
从角色 从节点 slave follower 小弟 -
主备集群(常见一主多备)
解决单点故障:一系列步骤中的某一个节点故障,导致整个流程错误。
同一时刻,有且只有一个主可以工作,当主挂了,备顶上。
主角色 active
备角色 standby -
Zookeeper是一个主从集群。
全局数据一致性
- 全局数据一致性:无论客户端连接到集群上哪个服务器,看到的数据目录结构都是一样的。
- 两个从角色都要操作数据目录结构,主角色按照fifo指定集群的顺序。
集群主从角色职责
- 针对事务性操作,如何保持数据全局一致性
- 任何角色都可以接收事务性请求和非事务性请求,如果是非事务性请求,自己直接处理。
- 如果是事务性请求,如果是主角色接收,自己处理;如果是从角色接收,内部转发给主角色处理。
- 所有的事务性请求,主角色按照请求时间顺序编号,依次处理
数据模型–文件系统特性
- 不再有文件夹之分,都叫节点 znode
- znode既像文件又像文件夹
- 存储数据大小有限制
- zk目录中每个znode叫做节点
- zk集群中每个服务器也叫做节点
数据结构–节点类型
- 临时节点和永久节点
- znode节点由客户端创建–客户端首先通过某方式连接到zk集群,建立会话session–连接成功进行增删改查–操作完毕断开连接,结束对话。
- 临时节点根创建她的客户端跟集群的session有关系,会话结束,节点消失。
- 临时节点下面不能创建子节点。
- 序列化特性:记录每个子节点创建的先后顺序。
Zookeeper集群搭建
通过虚拟网桥将主机的网卡和虚拟交换机Vmnet0连接在一起
安装过程学到的命令
- 复制:cp,剪切:mv,删除:rm
活学活用: 重新命名 mv zookeeper/ zoo - ssh连接之后:scp -r /etc/hosts root@node-2:/etc/ 拷贝文件从一个虚拟机至另一个
- echo 2 > zkdata/myid 在zkdata下面新建myid,myid里面是 2
ZooKeeper-安装详解
- 检测集群时间是否一致:
查看时间:date
设置时间与北京时间一致:
yum install ntpdate
ntpdate cn.pool.ntp.org - 检测防火墙是否关闭
service iptables stop
chkconfig iptables off
chkconfig iptables --list - 检测主机IP是否映射
- server.1=node-1:2888:3888
2888心跳端口,3888选举端口
ZooKeeper–Shell客户端操作&节点属性
- 客户端连接: /zookeeper/bin/zkCli.sh -server node-1
- shell基本操作:
a. 创建节点: create [-s]/[-e] path data acl
acl:进行权限控制
-s: 顺序节点,-e:临时节点,都不加就是永久节点 - 临时节点下面不能有child
- 读取节点属性
get path:获得节点的数据和属性
ls2 path:获得节点的子节点和属性 - 属性:dataVersion: 数据版本号,对节点进行set操作,值加1
cversion:子节点版本号,有变化时,加1
cZxid:事务id
ephemeralOwner = 0x0 如果znode这个值有数据,这个节点是短暂节点,这个值代表创建该临时节点的session编号。 - 更新节点:set path data
- 删除节点:delete path
若节点存在子节点,先删除子节点再删除父节点
或者递归删除节点:rmr path - quota:对节点约束
在计算子节点的个数中,将自己也算成子节点。
quota限制是个软性限制,没有强制限制。(超出只会在日志中警告)
zookeeper.out可以查看日志
setquota -n|-b val path:对节点增加限制,n表示子节点最大个数,b表示数据值最大长度
listquota path:列出限制
delquota [-n|-b] path
ZooKeeper–watcher监听机制
- watcher机制实现分布式的通知功能。
- a. 设置监听(监听的事件),b. 监听该事件是否发生,c. 如果事件发生(监听触发,通知,回调)
- zookeeper允许客户端向服务端注册一个watcher监听,当服务端的一些事件触发这个watcher,就会向指定客户端发送一个事件来实现分布式的通知。
- 机制特点:
a. 一次性触发
b. 事件封装:WatchedEvent: 通知状态,事件类型,节点路径
c. event异步发送。watcher的通知事件从服务端到客户端是异步的。
d. 先注册再发送。 - help可查看哪些命令可以watch
比如:
get /666 没有设置监听
get /666 watch 设施监听,只要数据发生改变,监听触发。
set /666 456 修改数据,监听触发
设置监听的客户端收到:
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/666
第四天课程:ZooKeeper–Java API&网络编程
ZooKeeper–Java环境和创建节点
public class ZkClient{
public static void main(String[] args) throws Exception{
//参数列表:第一个zk地址,写几个访问几个
ZooKeeper zk = new ZooKeeper("node-1:2181,node-2:2181", 30000, new Watcher() {
//监听触发通知客户端,客户端就在这进行事件处理
public void process(WatchedEvent watchedEvent) {
}
});
//创建znode
zk.create("/hello","EM".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//删除znode
zk.delete("/enheng", 0);
zk.close();
}
}
ZooKeeper–java api–监听和实现永久监听
- java操作zk集群,事件中有连接事件(type=none path=null), 这类事件不需要我们注册,客户端可以直接收到。
- 如果想满足永久触发,就需要在上次触发通知后,再次设置监听。
public class ZkClient
{
static ZooKeeper zk = null;
public static void main(String[] args) throws Exception
{
//参数列表:第一个zk地址,写几个访问几个
zk = new ZooKeeper("node-1:2181,node-2:2181", 30000, new Watcher()
{
//监听触发通知客户端,客户端就在这进行事件处理
public void process(WatchedEvent watchedEvent)
{
System.out.println("状态"+watchedEvent.getState());
System.out.println("事件类型"+watchedEvent.getType());
System.out.println("路径"+watchedEvent.getPath());
//如果想多次触发监听,在这里收到监听事件的时候再次设置同节点 同事件的监听 即可满足
try {
zk.getData("/hello", true, null); //继续设置监听
} catch (KeeperException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
//创建znode
//zk.create("/hello","EM".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
//删除znode
//zk.delete("/enheng", 0);
//获取data,同时设置监听
zk.getData("/hello", true, null);
zk.setData("/hello", "333333333".getBytes(), -1);
zk.setData("/hello", "444444444".getBytes(), -1);
zk.close();
}
}
ZooKeeper–选举机制–概念&全新和非全新
- 服务器id:myid的值,编号越大在算法中的权重越大。
- 数据id:值越大数据越新,在选举算法中数据越新,权重越大。
- 选举状态:
looking:竞选状态
following:随从状态,同步leader状态,参与投票
observing:观察状态:同步leader状态,不参与投票
leading:领导者状态 - 逻辑时钟:投票的次数。
- 全新集群选举:集群刚搭建好,第一次启动,没有任何客户端操作过
a. 每个人都给自己投票
b. 谁的票数过半,选举结束
c. myid大的权重大 - 非全新集群选举:集群已经运行工作过一段时间,重新选举leader的过程
针对非全新集群选举,优中择优,选择数据最新的,状态最好的
a. 逻辑时钟小的被淘汰
b. 数据id大的胜出
c. myid大的胜出
ZooKeeper–典型应用–全局配置中心
- 把需要全局管理的信息放在zk指定的某个znode
- 每个模块启动的时候都去zk集群指定路径获取数据库的相关信息,同时设置监听,监听节点数据是否发送改变
- 当业务需要,更改db的信息时,管理员只需要修改zk集群上对应的znode的信息即可
- 一旦修改,监听触发,通知给设置监听的客户端,重新获取新的数据再次设置同样的监听。
- 只适用于小数据场景。这样数据更新可能会比较快。
ZooKeeper–典型应用–命名中心
- 将服务地址命名
- znode节点是短暂的
- 时刻动态维护服务的提供列表和消费列表
ZooKeeper–典型应用–如何给其他软件选举
- 需求:开发了一款分布式软件,软件有leader,有follower,如何决定哪个角色是leader,哪个是follower。要求借用zookeeper完成这款软件的选举
- zookeeper如何给其他软件选举leader。
- 思路:leader只有一个(唯一性),leader挂了再次选举新的leader(选举重复性)
- znode如果非序列性,节点不能重名,重复选举–>重复监听。
- 过程:
a. 每个软件角色启动后第一步去zk指定路径下创建znode
b. 最终一定只有一个角色能够创建该节点,谁创建成功谁就是leader
c. 其他的作为follower,同时要监听leader创建的节点
d. 当leader挂掉,leader跟zk的会话断开,节点消失,触发监听,各个follower收到通知,并且再去指定目录创建同样类型同样名字的节点。 - 分布式锁:a)保持独占,znode的唯一性,先到先得,b)控制时序,需要大的靠前,依次排序。
网络编程–概述&通信三要素
- 网络通信三要素:IP;端口:数字逻辑标识,不同端口代表不同进程;通信协议
- UDP:用户数据报协议
a. 不需要建立连接
b. 每个数据包限制在64k
c. 不需要连接,不可靠协议
d. 速度快 - TCP:传输控制协议
a. 建立连接,形成传输通道
b. 大数据量传输
c. 通过三次握手建立连接,是可靠协议
d. 必须建立连接,效率低
网络编程–了解网络模型
- 物理层:主要定义物理设备标准,主要作用:将数据最终编码为0、1标识的比特流,通过物理介质传播
数据链路层:将接收到的数据进行网卡地址的封装与解封装
网络层:将接收到的数据进行IP地址的封装和解封装
传输层:定义数据传输的协议和端口号,主要将接收到的数据进行分段和传输,到达目的地址后进行重组
会话层:通过传输层建立数据传输的通道,主要在系统间发起会话和接收会话请求。
表示层:对接收数据的解释,加密与解密,压缩与解压,主要确保一个系统的应用层发送的数据被另一个系统的应用层识别。
应用层:为一些终端应用程序提供服务。
网络编程–了解socket机制–TCP、UDP
- socket也叫做套接字,用于描述ip和端口,应用程序通过socket向网络发出请求或者应答网络请求。
- 通信两端都有socket。
- 数据在两个socket之前通过IO传输
网络编程–IO通信模型–BIO、NIO
- 本地IO需要系统内核支持,网络IO也需要系统内核支持
- BIO是阻塞IO:阻塞产生:操作系统没有发现socket从指定的端口x来,操作系统一直等待。
- NIO是非阻塞IO
三大核心部分:
Channel 通道:对数据的写入和读取要通过通道。双向的,可读可写可同时读写。channel不会直接处理数据,通过buffer处理数据。
Buffer 缓冲区:容器对象,包含读取或写入的数据。
Selector 选择器:选择已经就绪的任务。channel先去selector注册。selector轮询客户端找已经就绪的任务。
网络编程–了解阻塞、非阻塞
- 阻塞和非阻塞是程序级别的,阻塞:程序一直等待数据来,非阻塞:程序执行,线程轮询直到IO准备好数据。
- 同步和非同步是操作系统级别的。同步:IO资源没有准备好,操作系统不响应程序。非同步:操作系统告诉程序会把IO资源放在哪,准备好了之后用事件机制发给程序。
网络编程–RPC实质
- RPC–远程过程调用协议。
- 满足:调用远程方法或者函数就像调用本地的一样,对于使用者来说忽略底层网络细节,那就符合RPC的协议规范。
- 通过RPC可以网络通信。
总结
- ZooKeeper是一个分布式协调服务的开源框架。