cap :一致性 可用性 分区容错性 BASE原理 :基本可用 + 软状态(同步允许延迟)+最终一致性 一致性协议:2PC(2阶段提交)+3PC(3阶段提交) 3PC = canCommit + preCommit + doCommit PAXOS引入过半的原则 只要过半通过则通过 zookeeper为分布式应用提供了高效可靠的分布式协调服务 zookeeper采用 zab协议 zookeeper atomic broadcast zookeeper是分布式数据一致性的解决方案 单一视图:客户端不管连接哪个服务器看到的视图都一致 zookeeper保证最终一致性 zookeeper将全量数据存储到内存中 实现高吞吐和低延迟 只要集群中有一半机器对外服务 则可以对外服务 zk 有三个角色 :leader + foller + observer foller和observer都可以对外提供读服务 当只有foller才能选举 znode分临时节点和持久节点 持久节点需要主动删除才能删除 临时节点与客户端连接服务器会话的时间有关 一旦客户端断开则节点删除 每个znode都会维护一个stat的数据结构 里面维护这三个版本 : version(znode版本)+cversion(znode子节点版本)+aversion(znode acl版本) watcher 允许在节点注册客户端感兴趣的事件 acl=access control list 权限控制集合 = CREATE READ WRITE DELETE ADMIN zookeeper主要依赖zab进行数据的一致性 zab只允许一个主进程来接受所有客户端的所有请求 并采用zab协议将事务发布到副本进程中去。 所有的事务请求都只能由leader服务器进行转换成事务 并将事务分发给所有foller进行提议 过半则通过 zab协议分为崩溃恢复(选举新leader)和消息广播 leader服务器会为每一个事务proposal分配一个事务id(zxid) zxid 由64位组成 低32位是简单的单调递增的计数器 用于记录客户端每次的请求id 高32位用于储存每次选举出来的epoch值+1 zab协议是zk的核心所在 其规定了任何时候只有一个主进程进行消息广播,主进程失效后必须选举一个新leader zab协议分三个阶段:发现(looking 选举) + 同步(最后的事务) + 广播 (接受客户端的响应) leader进程与follower进程通过心跳检测机制进行交流 leader在超时时间内无法获得过半follower的心跳 则进入looking状态(重新选举) zab协议中每个事务proposal都有一个epoch值表示当前的leader周期 使用zk --------------------------------------- zoo.cfg配置文件 # The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. dataDir=/tmp/zookeeper # the port at which the clients will connect clientPort=2181 # 镜像数据位置 dataDir=D:\\zookeeper\\data\\zookeeper #日志位置 dataLogDir=D:\\zookeeper\\logs\\zookeeper #客户端连接的端口 clientPort=2181 #集群中 格式:server.id=ip:port:port server.1=ip1:2888:3888 server.2=ip2:2888:3888 server.3=ip3:2888:3888 集群中所有的zoo.cfg文件都是一致 在dataDir下面生成一个myid文件 内容就是zoo.cfg中id的值如1 只有一个数字 create -s 顺序节点 -e 临时节点 默认不加则是持久化节点 ls / 进行查看 get path 用于获取节点内容 set path value 用于更新节点内容 delete path 用于删除节点 权限控制:通过在节点中设置acl权限控制访问 zookeeper.addAuthInfo("digest","username:password");// 类似 用户名:密码格式 zookeeper.create(path,value,Ids.CREATOR_ALL_ACL,NodeType); try { // 建立一个连接 ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 5000, null); System.out.println(zk.getState()); zk.addAuthInfo("digest", "lanwx:123".getBytes()); //zk.create("/zk-lanwx/childss", "lan".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT); // 无权限 ZooKeeper zk1 = new ZooKeeper("127.0.0.1:2181", 5000, null); System.out.println(new String(zk1.getData("/zk-lanwx/childss", null, null))); } catch (Exception e) { e.printStackTrace(); } Curator可以很好的作为zookeeper的客户端API可用于分布式锁 zookeeper使用场景 ------------------------- zk是高可用的分布式数据一致性框架 集群中各机器共享 数据一致 YARN全新一代分布式调度框架 技术内幕 ------------------------- 数据模型:树形结构 每个zxid代表一个更新操作 znode节点类型:持久 + 临时 + 顺序 zookeeper采用jute进行数据的序列化和反序列化 zookeeper采用tcp/ip的通信协议 客户端与服务器建立连接后就存在一个会话
zookeeper 学习总结
猜你喜欢
转载自forlan.iteye.com/blog/2407119
今日推荐
周排行