中小型企业 公司网站建设,odoo网站建设,长春 网络设计,电商平台开网店简介
设计模式角度 Zookeeper#xff1a;是一个基于观察者模式设计的分布式服务管理框架#xff0c;它负责存储和管理大家都关心的数据#xff0c;然后接受观察者的注册#xff0c;一旦这些数据的状态发生变化#xff0c;Zookeeper就将负责通知已经在Zookeeper上注册的那…简介
设计模式角度 Zookeeper是一个基于观察者模式设计的分布式服务管理框架它负责存储和管理大家都关心的数据然后接受观察者的注册一旦这些数据的状态发生变化Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。 1Zookeeper一个领导者Leader多个跟随者Follower组成的集群。 2集群中只要有半数以上节点存活Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台服务器。 3全局数据一致每个Server保存一份相同的数据副本Client无论连接到哪个Server数据都是一致的。 4更新请求顺序执行来自同一个Client的更新请求按其发送顺序依次执行。 5数据更新原子性一次数据更新要么成功要么失败。 6实时性在一定时间范围内Client能读到最新数据。
数据结构 整体上可以看作是一棵树每个节点称做一个 ZNode。每一个 ZNode 默认能够存储 1MB 的数据每个 ZNode 都可以通过其路径唯一标识。
应用场景
提供的服务包括统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。
安装
mv zoo_sample.cfg zoo.cfg
#打开 zoo.cfg 文件修改 dataDir 路径
dataDir/opt/module/zookeeper-3.5.7/zkDatamkdir zkData操作 Zookeeper
#启动 Zookeeper
bin/zkServer.sh start
#查看进程是否启动
jps
#查看状态
bin/zkServer.sh status
#启动客户端
bin/zkCli.sh
#退出客户端
quit
#停止 Zookeeper
bin/zkServer.sh stop配置参数 1tickTime 2000通信心跳时间Zookeeper服务器与客户端心跳时间单位毫秒 2initLimit 10LF初始通信时限 3syncLimit 5LF同步通信时限 Leader和Follower之间通信时间如果超过syncLimit * tickTimeLeader认为Follwer死 掉从服务器列表中删除Follwer。 4dataDir保存Zookeeper中的数据 注意默认的tmp目录容易被Linux系统定期删除所以一般不用默认的tmp目录。 5clientPort 2181客户端连接端口通常不做修改。
Zookeeper 集群
集群安装
tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/1配置服务器编号 在/opt/module/zookeeper-3.5.7/zkData 目录下创建一个 myid 的文件
vi myid
#2拷贝配置好的 zookeeper 到其他机器上
xsync zookeeper-3.5.7配置zoo.cfg文件 打开 zoo.cfg 文件 打开 zoo.cfg 文件
[atguiguhadoop102 conf]$ vim zoo.cfg修改数据存储路径配置
dataDir/opt/module/zookeeper-3.5.7/zkData增加如下配置
#######################cluster##########################
server.2hadoop102:2888:3888
server.3hadoop103:2888:3888
server.4hadoop104:2888:3888配置参数解读 server.AB:C:D A 是一个数字表示这个是第几号服务器 集群模式下配置一个文件 myid这个文件在 dataDir 目录下这个文件里面有一个数据 就是 A 的值Zookeeper 启动时读取此文件拿到里面的数据与 zoo.cfg 里面的配置信息比 较从而判断到底是哪个 server。 B 是这个服务器的地址 C 是这个服务器 Follower 与集群中的 Leader 服务器交换信息的端口 D 是万一集群中的 Leader 服务器挂了需要一个端口来重新进行选举选出一个新的 Leader而这个端口就是用来执行选举时服务器相互通信的端口。 同步 zoo.cfg 配置文件
xsync zoo.cfgZK 集群启动停止脚本
#!/bin/bash
case $1 in
start){
for i in hadoop102 hadoop103 hadoop104
do
echo ---------- zookeeper $i 启动 ------------
ssh
$i
/opt/module/zookeeper-3.5.7/bin/zkServer.sh
start
done
};;
stop){
for i in hadoop102 hadoop103 hadoop104
do
echo ---------- zookeeper $i 停止 ------------
ssh
$i
/opt/module/zookeeper-3.5.7/bin/zkServer.sh
stop
done
};;
status){
for i in hadoop102 hadoop103 hadoop104
do
echo ---------- zookeeper $i 状态 ------------
ssh
$i
/opt/module/zookeeper-3.5.7/bin/zkServer.sh
status
done
};;
esac启动
zk.sh start停止
zk.sh stop节点数据
1czxid创建节点的事务 zxid 每次修改 ZooKeeper 状态都会产生一个 ZooKeeper 事务 ID。事务 ID 是 ZooKeeper 中所有修改总的次序。每次修改都有唯一的 zxid如果 zxid1 小于 zxid2那么 zxid1 在 xid2 之前发生。 2ctimeznode 被创建的毫秒数从 1970 年开始 3mzxidznode 最后更新的事务 zxid 4mtimeznode 最后修改的毫秒数从 1970 年开始 5pZxidznode 最后更新的子节点 zxid 6cversionznode 子节点变化号znode 子节点修改次数 7dataversionznode 数据变化号 8aclVersionznode 访问控制列表的变化号 9ephemeralOwner如果是临时节点这个是 znode 拥有者的 session id。如果不是临时节点则是 0。 10dataLengthznode 的数据长度 11numChildrenznode 子节点数量
节点类型 监听器原理
客户端注册监听它关心的目录节点当目录节点发生变化数据改变、节点删除、子目 录节点增加删除时ZooKeeper 会通知客户端。监听机制保证 ZooKeeper 保存的任何的数据的任何改变都能快速的响应到监听了该节点的应用程序。
IDEA操作
创建 ZooKeeper 客户端
package com.atguigu.zk;import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.util.List;public class zkClient {// 注意逗号左右不能有空格// private String connectString hadoop102:2181,hadoop103:2181,hadoop104:2181;private String connectString localhost:2181;private int sessionTimeout 2000;private ZooKeeper zkClient;Beforepublic void init() throws IOException {zkClient new ZooKeeper(connectString, sessionTimeout, new Watcher() {Overridepublic void process(WatchedEvent watchedEvent) {// System.out.println(-------------------------------);
// ListString children null;
// try {
// children zkClient.getChildren(/, true);
//
// for (String child : children) {
// System.out.println(child);
// }
//
// System.out.println(-------------------------------);
// } catch (KeeperException e) {
// e.printStackTrace();
// } catch (InterruptedException e) {
// e.printStackTrace();
// }}});}Testpublic void create() throws KeeperException, InterruptedException {String nodeCreated zkClient.create(/atguigu, ss.avi.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}Testpublic void getChildren() throws KeeperException, InterruptedException {ListString children zkClient.getChildren(/, true);for (String child : children) {System.out.println(child);}// 延时Thread.sleep(Long.MAX_VALUE);}Testpublic void exist() throws KeeperException, InterruptedException {Stat stat zkClient.exists(/atguigu, false);System.out.println(statnull? not exist : exist);}
}
客户端向服务端写数据流程
写流程写入请求发送给Leader节点 写流程写入请求发送给Follower节点
服务器动态上下线 Client
public class DistributeClient {// private String connectString hadoop102:2181,hadoop103:2181,hadoop104:2181;private String connectString localhost:2181;private int sessionTimeout 2000;private ZooKeeper zk;public static void main(String[] args) throws IOException, KeeperException, InterruptedException {DistributeClient client new DistributeClient();// 1 获取zk连接client.getConnect();// 2 监听/servers下面子节点的增加和删除client.getServerList();// 3 业务逻辑睡觉client.business();}private void business() throws InterruptedException {Thread.sleep(Long.MAX_VALUE);}private void getServerList() throws KeeperException, InterruptedException {ListString children zk.getChildren(/servers, true);ArrayListString servers new ArrayList();for (String child : children) {byte[] data zk.getData(/servers/ child, false, null);servers.add(new String(data));}// 打印System.out.println(servers);}private void getConnect() throws IOException {zk new ZooKeeper(connectString, sessionTimeout, new Watcher() {Overridepublic void process(WatchedEvent watchedEvent) {try {getServerList();} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}});}
}Server
public class DistributeServer {// private String connectString hadoop102:2181,hadoop103:2181,hadoop104:2181;private String connectString localhost:2181;private int sessionTimeout 2000;private ZooKeeper zk;public static void main(String[] args) throws IOException, KeeperException, InterruptedException {DistributeServer server new DistributeServer();// 1 获取zk连接server.getConnect();// 2 注册服务器到zk集群server.regist(args[0]);// 3 启动业务逻辑睡觉server.business();}private void business() throws InterruptedException {Thread.sleep(Long.MAX_VALUE);}private void regist(String hostname) throws KeeperException, InterruptedException {String create zk.create(/servers/hostname, hostname.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(hostname is online) ;}private void getConnect() throws IOException {zk new ZooKeeper(connectString, sessionTimeout, new Watcher() {Overridepublic void process(WatchedEvent watchedEvent) {}});}
}重点
6.1 选举机制
半数机制超过半数的投票通过即通过。
1第一次启动选举规则
投票过半数时服务器 id 大的胜出
2第二次启动选举规则
①EPOCH 大的直接胜出
②EPOCH 相同事务 id 大的胜出
③事务 id 相同服务器 id 大的胜出
6.2 生产集群安装多少 zk 合适
安装奇数台。
生产经验
10 台服务器3 台 zk
20 台服务器5 台 zk
100 台服务器11 台 zk
200 台服务器11 台 zk
服务器台数多好处提高可靠性坏处提高通信延时
6.3 常用命令
ls、get、create、delete