多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 一、Zookeeper基础知识、体系结构、数据模型Zookeepr 1. zookeeper是一个类似hdfs的树形文件结构,zookeeper可以用来保证数据在(zk)集 群之间的数据的事务性一致、 2. zookeeper有watch事件,是一次性触发的,当watch监视的数据发生变化时,通 知设置了该watch的client,即watcher 3. zookeeper有三个角色:Learner,Follower,Observer 4. zookeeper应用场景: 统一命名服务(Name Service) 配置管理(Configuration Management) 集群管理(Group Membership) 共享锁(Locks) 队列管理 ## 二、Zookeeper配置(搭建zookeeper服务器集群) 1. 结构:一共三个节点 (zk服务器集群规模不小于3个节点),要求服务器之间系统时间保持一致。 2.上传zk 进行解压: tar zookeeper-3.4.5.tar.gz 重命名: mv zookeeper-3.4.5 zookeeper 修改环境变量: vi /etc/profile 3.ZOOKEEPER_HOME=/usr/local/zookeeper export PATH=.:$HADOOP_HOME/bin:$ZOOKEEPER_HOME/bin:$JAVA_HOME/... 刷新: source /etc/profile 到zookeeper下修改配置文件 cd /usr/local/zookeeper/conf mv zoo_sample.cfg zoo.cfg 修改conf: vi zoo.cfg 修改两处 (1)dataDir=/usr/local/zookeeper/data (2)最后面添加 server.0=wuliang:2888:3888 server.1=hadoop1:2888:3888 server.2=hadoop2:2888:3888 服务器标识配置: 创建文件夹:mkdir data 创建文件myid并填写内容为0:vi myid (内容为服务器标识 : 0) 进行复制zookeeper目录到hadoop01和hadoop02 还有/etc/profile文件 把hadoop01、hadoop02中的myid文件里的值修改为1和2 路径(vi /usr/local/zookeeper/data/myid) 启动zookeeper: 路径:/usr/local/zookeeper/bin 执行:zkServer.sh start (注意这里3台机器都要进行启动) 状态:zkServer.sh status(在三个节点上检验zk的mode,一个leader和俩个follower) 1.3 操作zookeeper (shell) zkCli.sh 进入zookeeper客户端 根据提示命令进行操作: 查找:ls / ls /zookeeper 创建并赋值:create /wuliang hadoop 获取:get /wuliang 设值:set /wuliang master 可以看到zookeeper集群的数据一致性 创建节点有俩种类型:短暂(ephemeral) 持久(persistent) ## 三、zoo.cfg详解: tickTime: 基本事件单元,以毫秒为单位。这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔, 也就是每隔 tickTime时间就会发送一个心跳。 dataDir:存储内存中数据库快照的位置,顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。 clientPort: 这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。 initLimit: 这个配置项是用来配置 Zookeeper接受客户端初始化连接时最长能忍受多少个心跳时间间隔数, 当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是10*2000=20 秒。 syncLimit: 这个配置项标识 Leader 与 Follower之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 5*2000=10 秒 server.A = B:C:D : A表示这个是第几号服务器, B 是这个服务器的 ip 地址; C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口; D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader ## 四、JAVA 怎么操作zookeeper zk的构造器的参数详解 String connectString 连接服务器列表,已,分割 int sessionTimeout 心跳检测时间周期 (毫秒) Watcher watcher 事件处理通知 canBeReadOnly 标识当前会话是否支持只读 long sessionId sessionPasswd 提供连接zookeeper的sessionId 和密码,通过这两个确定唯一一台客户端, 目前可以提供重复会话 /** zookeeper地址 */ static final String CONNECT_ADDR = "192.168.80.88:2181,192.168.80.87:2181,192.168.80.86:2181"; /** session超时时间 */ static final int SESSION_OUTTIME = 2000;//ms /** 信号量,阻塞程序执行,用于等待zookeeper连接成功,发送成功信号 */ static final CountDownLatch connectedSemaphore = new CountDownLatch(1); public static void main(String[] args) throws Exception{ ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME, new Watcher(){ @Override public void process(WatchedEvent event) { //获取事件的状态 KeeperState keeperState = event.getState(); EventType eventType = event.getType(); //如果是建立连 if(KeeperState.SyncConnected == keeperState){ if(EventType.None == eventType){ //如果建立连接成功,则发送信号量,让后续阻塞程序向下执行 connectedSemaphore.countDown(); System.out.println("zk 建立连接"); } } } }); //进行阻塞 connectedSemaphore.await(); System.out.println(".."); ## 五、创建节点 ### 第一个create的介绍 zk.create("/testRoot", "testRoot".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); 第一个参数: 路径的问题 第二个参数: 数据 第三个参数: 认证的方式 第四个参数: 创建节点的持久化 关闭连接 zk.close(); 总结 1.不能创建相同的的节点 2.如果在某个父节点下面创建某个子节点 要写全路径 3.临时节点 一次会话 ## 怎么获取、更新、判断上面的节点zk上面节点的数据 //获取节点洗信息 byte[] data = zk.getData("/testRoot", false, null); System.out.println(new String(data)); //获取该路径下面的所有子节点(直接子节点) System.out.println(zk.getChildren("/testRoot", false)); byte[] data = zk.getData("/testRoot", false, null); zk.getChildren("/testRoot", false) //修改节点的值 zk.setData("/testRoot", "modify data root".getBytes(), -1); byte[] data = zk.getData("/testRoot", false, null); //判断节点是否存在 System.out.println(zk.exists("/testRoot/children", false)); ### 第二个delete的方法 //删除节点 -1 表示全部删除 zk.delete("/testRoot/children", -1); ## 总结: ### ## zookpeer分布式锁的呢 第一可以采用zk的临时节点,先读取该临时节点上有没有数据, 如果有没有则创建,如果有则更新。 注意: 原生的zk不允许递归创建节点,也支持节点递归的删除 ## 六、同步和异步 异步方式:(在同步参数的基础上添加两个参数) 参数五:注册一个异步回调函数,要实现AsyncCallBackStringCallBack接口,重写 processResult(int rc,String path,Object ctx,String name)方法,当节点创建完毕 后执行此方法。 rc:为服务端响应吗 0 表示调用成功,-4 表示端口连接,-110表示指定节点存在,-112 表示会话已经过期。 path:接口调用时传入API的数据节点的路径参数 ctx:为调用接口传入API的ctx值 name:实际在服务器端创建节点的名称 参数六,传递给回调的从参数,一般为上下文(context)信息