zookeeper学习总结

一、介绍

轻量级集群框架,协同服务,保证高可靠、高可用,集中式服务,用于配置信息,名称服务,分布式同步处理树形层次结构,znode,动物管理员

二、zk组件

client 向server周期性的发送消息,表明自己还活着,server向client回应确认消息,client没有收到回应,自动重定向消息到其他server

server 一个zk节点,向client提供所有服务,通知client ,server是活着的

ensemble 一组zk节点,需要最小值3

leader 特殊的zk节点,zk集群启动时,推选leader,leader在follower故障时进行处理,有一半坏掉了,集群就挂了

follower(随从) 听命于leader

zk的namespace的等级结构

驻留在内存中

树上的每一个节点都是znode。

每个znode都有name,而且用/分隔

每个znode存放的数据不能超过1m

每个节点都有stat对象 version 与之关联的数据发生改变时,版本增加 acl:权限 timestamp:时间戳 datalength:长度

zk的znode节点类型

持久节点

临时节点

序列节点

三、zk安装

下载 zookeeper-3.4.10.tar.gz

安装jdk

配置环境变量 profile

配置zk

考察文件/conf/zoo_sample.conf tickTime=2000 每次心跳的毫秒数 initLimit=10 开始同步阶段的心跳数 synclimit=5 发送请求和得到确定之间可以传递的心跳数 dataDir=/tmp/zookeeper 存放zk的快照目录 clientport=2181 客户端连接的端口 maxclientcnxns=60 客户端最大连接数 autopurge.snapretainCoun=3在dataDir保留的快照数 autopurge.purgeInterval=1 丢弃任务的间隔时间

部署zk

单机版

创建配置/conf/zoo.cfg tickTime=2000 dataDir=/home/root/zk/data clientPort=2181 initLimit=5 synclimit=2

启动zkserver zkServer.sh start

启动zkClient zkCli.sh start

zk完全分布式

确定主机 a101,s102,s103

配置myid dataDir目录。/home/root/zk/myid,每台myid不一样,101机器的是101,102机器的是102

配置zoo.cfg tickTime=2000 dataDir=/home/root/zk/data clientPort=2181 initLimit=5 synclimit=2 server.101=s101:2888:3888 server.102=s102:2888:3888 server.103=s103:2888:3888

每台机器上单独启动 zkServer.sh start zkServer.sh stop

zkServer.sh status 查看节点状态

四、使用

客户端连接服务器 zkCli.sh -server s101:2181 ls / 查看结构 get /文件 查看数据 create /文件名 “内容” 创建节点 set /文件名 “文件内容” 修改内容 dataversion 数据版本 set /文件名 “内容” 版本号 delete /目录 删除节点,该节点下不能有内容 rmr /目录 递归删除

通过zk的api访问zk集群

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;

import java.util.ArrayList;
import java.util.List;

public class ConnZookeeper {
public static void main(String[] args) throws Exception {
String conn = “s101:2181,s102:2181,s103:2181”;
ZooKeeper zk = new ZooKeeper(conn, 5000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
}
});
//创建权限列表
ACL acl = new ACL(ZooDefs.Perms.ALL, ZooDefs.Ids.ANYONE_ID_UNSAFE);
List acls = new ArrayList<>();
acls.add(acl);
zk.create("/root", “helloworld”.getBytes(), acls, CreateMode.PERSISTENT);
}
}

修改znode

    zk.setData("/root","hi".getBytes(),1);

读取数据

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Stat;

import java.util.ArrayList;
import java.util.List;

public class GetZKData {
public static void main(String[] args) throws Exception {
String conn = “s101:2181,s102:2181,s103:2181”;
ZooKeeper zk = new ZooKeeper(conn, 5000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
}
});
//创建权限列表
ACL acl = new ACL(ZooDefs.Perms.ALL, ZooDefs.Ids.ANYONE_ID_UNSAFE);
List acls = new ArrayList<>();
acls.add(acl);
//创建状态对象,在getDate时候,接收节点的状态信息
Stat s = new Stat();
byte[] bytes = zk.getData("/root", null, s);
System.out.println(bytes);
}
}
创建临时节点,程序运行结束就消失

zk.create("/root", “helloworld”.getBytes(), acls, CreateMode.EPHEMERAL);
创建序列节点

zk.create("/root", “helloworld”.getBytes(), acls, CreateMode.PERSISTENT_SEQUENTIAL);
得到孩子节点

List list=zk.getChildren("/",null);
for(String s:list){
System.out.println(s);
}
删除节点

zk.delete("/root",1);
创建节点

zk.create("/root",“hello”.getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
五、leader推选过程

所有节点在相同的路径下创建各自的临时序列化节点,每个节点都有自己对应的znode。

拥有最小编号的zk是leader其他的zk为follower。

每个follower观察紧比自己小的那个node

如果leader下线,则它对应的节点就会删除

观察者会发现leader被删除

观察者查找是否还有最下的节点,如果有,最小值节点成为leader,否则观察者为leader

自动容灾一般要用zk

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dubbo启动服务启动报错.UnsatisfiedDependencyException: Error creating bean with name '***': Un

报错信息&#xff1a; 今天部署开发环境的时候这个问题弄了一下午&#xff0c;由于我本地启动是好的&#xff0c;然后部署到服务器老是启动不了&#xff0c;报如上错&#xff0c;后来经过排查发现是provider.xml和consumer.xml中的如下代码version属性版本信息不一致。 <du…

【转载保存】dubbo学习笔记

Dubbo Dubbo简介 首先&#xff0c;我理解的Dubbo&#xff0c;从大的方向来看是单体应用到分布式应用过度期的一个产物&#xff0c;具体来说应该是分布式应用从早期的SOA到微服务过度的一个产物。 在编写分布式场景下高并发、高扩展的系统对技能的要求很高&#xff0c;因为这…

即时通讯常用功能

功能列表 单人对单人实时聊天 用户在线状态判断 离线消息推送 用户好友关系保持以及验证 群组资料管理&#xff0c;人员管理 群组实时聊天 用户上线下线状态推送提醒 违禁词屏蔽

正则查看接口消耗时间超过4位数的

tail -40000 logs.log| grep -C 4 -E “[1-9]{4}ms”

shell读取文件并且遍历输出

#!/bin/bash addwords_path"/home/weijie/files" addwords_sizewc -l ${addwords_path} | awk {print $1} for ((i1; i< $addwords_size; i)); do wordsed -n ${i}p $addwords_patheval rm -rf ${word}echo "${word}" done

【转载保存】Mysql主从同步报错集锦

https://www.cnblogs.com/wangxin37/p/6398755.html

mysql搭建手册

mysql搭建手册 主从搭建 搭建mysql 关闭防火墙&#xff1a;systemctl stop firewalld 如果失败先安装 yum install iptables-services 配置数据库 /etc/my.cnf&#xff0c;配置同步数据库等 主库配置信息 [mysqld] datadir/usr/local/mysql/data log-error/usr/local/mysql/…

mysql中count(*),count(字段),count(1)的区别

count(主键id) InnoDB 会遍历全表&#xff0c;取每行的主键 id&#xff0c;返回给 server 层&#xff0c;server 层拿到数据后&#xff0c;进行判断累加。count(1) InnoDB 仍遍历全表&#xff0c;但是不取值&#xff0c;server 层对返回的每一行数据新增一个 1&#xff0c;然…

MongoDb安装配置

Mongodb学习 Mongodb安装 1.下载社区版 MongoDB 4.1.3 去官网下载对应的MongoDB 然后上传到Linux虚拟机 2.将压缩包解压即可 tar -zxvf MongoDB-linux-x86_64-4.1.3.tgz3.启动 mkdir -p /data/db./bin/mongod4.指定配置文件方式的启动 配置文件样例: dbpath/data/mongo…

【预留】Apache Doris 0.12 官方中文文档学习

https://www.bookstack.cn/read/ApacheDoris-0.12-zh/8376e91fcde1d3d6.md 预留&#xff1a;后续实际操作并记录

awk输出指定行,awk如何取反

指定行输出 awk {print $1}取反输出 awk {$1"";print }更多使用&#xff0c;日后记录

FastDFS学习笔记

FastDFS课程内容 第一部分&#xff1a;FastDFS基础回顾 为什么要有分布式文件系统、分布式文件系统对比、FastDFS特性、linux安装、java访问FastDFS 第二部分&#xff1a;FastDFS系统架构和功能原理 架构详解、架构设计的概念、设计理念、功能原理(上传、下载、文件同步、删…

java stream filter map collector使用

Testpublic void demo1(){ArrayList<Integer> list new ArrayList<>();for (int i 0; i < 10; i){list.add(i);}/*** map* collector* filter* stream*///stream顺序处理&#xff0c;底层用来fork/Join框架System.out.println("stream顺序处理");St…

判断对象所有属性是否全部为空

private boolean checkObjFieldIsNotNull(Object obj){try {for (Field f : obj.getClass().getDeclaredFields()) {f.setAccessible(true);if (f.get(obj) ! null) {return true;}}}catch (IllegalAccessException e){}return false; }

redis主从搭建和分片集群搭建

文章目录redis主从搭建搭建一主一从&#xff1a;下载安装redis&#xff1a;两台机器都需要操作权限认证理解主从复制原理、同步数据集全量同步三个阶段&#xff1a;增量同步&#xff1a;心跳检测redis哨兵模式部署方案搭建配置哨兵模式原理建立连接获取主服务器信息获取从服务器…

为什么是先更新数据库再删除缓存,而不是更新缓存?

一开始看很多人说更新数据库后删除缓存&#xff0c;然后有人说是更新缓存时需要遍历list或者hash查找导致慢&#xff0c;我!#&((&(&^%&%&m&*&&#xff08;&#xff09;&&#xff0c;然后百度一堆。。。。。。。&#xff0c;然后用Bing搜索找到…

如何利用redis实现秒杀系统

文章目录题记利用Watch实现Redis乐观锁题记 在线思维导图总结&#xff1a;redis大纲 利用Watch实现Redis乐观锁 乐观锁基于CAS&#xff08;Compare And Swap&#xff09;思想&#xff08;比较并替换&#xff09;&#xff0c;是不具有互斥性&#xff0c;不会产生锁等待而消 耗…

教你如何使用redis分布式锁

文章目录一、redis客户端实现应用1.利用set nx命令实现分布式锁2.利用分布式锁命令 setnx问题1.为什么不直接调用jedis.del(key)方法而采用redislua实现&#xff1f;2.上述两种方式存在的问题&#xff1f;3.根本原因分析二、分布式场景Redission分布式锁的使用1.分布式锁的特性…

【记录保存】批量删除进程

kill -9 ps -ef|grep redis-server | awk {print $2} print $2 选择进程id