目录
- ZooKepper简介
- ZooKepper数据保存
- Paxos算法
- ZooKeeper安装和配置
- 节点操作
- C++操作zookeeper
- 分布式锁实现概述
相关链接:
ZooKepper简介
ZooKepper
可以实现在服务器集群中节点出现问题后及时处理操作,是一个协调一致性组件工具。
ZooKeeper是一一个分布式的, 开放源码的分布式应用程序协调服务,是Google的Chubby-个 开源的实现,是Hadoop和Hbase的重要组件。它是一一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
主要采用若干个进程和数据存储功能组成,并且组成的结构采用的是树状结构。
ZooKepper数据保存
-
Zookeeper
表现为一个分层的文件系统目录树结构(不同于文件系统的是,节点可以有自己的数据,而文件系统中的目
录节点只有子节点) - 保存在
ZooKeeper
节点中的数据一般只有1M左右。
可以看做是一个前缀树
ZooKepper
特点
- 顺序一致性:按照客户端发送请求的顺序更新数据;
- 原子性:更新要么成功,要么失败,不会出现部分更新;
- 单一性:无论客户端连接哪个
server
,都会看到同一个视图; - 可靠性:一旦数据更新成功,将一-直保持,直到新的更新;
- 及时性:客户端会在一个确定的时间内得 到最新的数据。
Paxos算法
Paxos是莱斯利兰伯特( Leslie Lamport ,就是LaTeX中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递的一致性算法:
- Paxos 算法解决的问题是-一个分布式系统如何就某个值(决议)达成一-致。
- Google的Chubby与Apache的Zookeeper都是基于此理论实现的;
- Paxos有一一个前提:没有拜占庭将军问题。就是说Paxos只有在一个可信的计算环境中才能成立,这个环境是不会被入侵所破坏的。
拜占庭将军问题( Byzantine failures )
- 拜占庭将军问题 ( Byzantine failures )
又称两军问题,是由莱斯利兰伯特提出的点对点通信中的基本问题。含义是在存在消
息丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。因此对一-致
性的研究一般假设信道是可靠的,或不存在本问题。 - 将军问题:
拜占庭将军问题是一一个协议问题,拜占庭帝国军队的将军们必须全体一 致的决定是否攻击某一支敌军。问题是这些将军在地理上是分隔开来的,并且将军中存在叛徒。叛徒可以任意行动以达到以正百标:欺骗某些将军采取进攻行动;促成一个不是所有将军都同意的决定,如当将军们不希望进攻时促成进攻行动;或者迷惑某些将军,使他们无法做出决定。如果叛徒达到了这些目的之-一,则任何攻击行动的结果都是注定要失败的,只有完全达成一致的努力才能获得胜利。
拜占庭假设是对现实世界的模型化,由于硬件错误、网络拥塞或断开以及遭到恶意攻击,计算机和网络可能出现不可预料的行为。拜占庭吞错协议必须处理这些失效,并且这些协议还要满定所要解决的问题要求的规范。这些算法通常以其弹性t作为特征, 表示算法可以应付的错误进程数。
很多经典算法问题只有在t < n/3时才有解,如拜占庭将军问题,其中n是系统中进程的总数。
ZooKeeper安装和配置
zoo.cfg
配置信息
tickTime=2000 # 心跳发送间隔时间
dataDir=/tmp/zookepper # zookepper 工作目录
clientPort=2181 # 客户端连接端口
# 定义所有存货的zookepper进程的主机列表
# ip:监听端口:选举端口
server.1=xxx:2888:3888
server.2=xxx:xxx:xxx
server.3=xxx:xxx:xxx
每一台主机都有一个编号,而这个编号的文件一定要保存在工作目录中
echo 1 >> /tmp/zookepper/myid
echo 2 >> /tmp/zookepper/myid
echo 3 >> /tmp/zookepper/myid
启动zookepper集群
zookepper/bin/zkServer.sh start
查看服务器的状态status
zookepper/bin/zkServer.sh status
停止服务
zookepper/bin/zkServer.sh stop
可以通过jps
查看zookepper
相关信息
jps
节点操作
进入到zookeeper
工作目录
ls / # 查看节点
创建节点(必须一级一级创建)
create /mldn-data java
删除节点
rmr /mldn-data
更新节点数据
set /mldn-data hello
设置节点为可监听控制,但是只能监听处理一次
get /mldn-data watch
获取数据
get /mldn-data
# info
java # 节点中保存的数据
cZxid # 节点最后发生更新的id
ctime # 节点创建的时间戳
mtime # 节点最后一次更新的时间戳
cversion # 子节点更新的次数
dataversion # 子节点数据更新的次数
aclcversion # 子节点ACL更新的次数
numChildren # 子节点的个数
C++操作zookeeper
创建节点
zoo_rc create_persistent_node(const char* path, const std::string& value, const std::vector<zoo_acl_t>& acl);
zoo_rc create_sequence_node(const char* path, const std::string& value, const std::vector<zoo_acl_t>& acl, std::string& returned_path_name);
zoo_rc create_ephemeral_node(const char* path, const std::string& value, const std::vector<zoo_acl_t>& acl);
zoo_rc create_sequance_ephemeral_node(const char* path, const std::string& value, const std::vector<zoo_acl_t>& acl, std::string& returned_path_name);
设置节点的值
zoo_rc set_node(const char* path, const std::string& value, int32_t version);
获取节点的值
zoo_rc get_node(const char* path, std::string& out_value, zoo_state_t* info, bool watch);
删除节点
zoo_rc delete_node(const char* path, int32_t version);
节点是否存在
zoo_rc exists_node(const char* path, zoo_state_t* info, bool watch);
设置节点的acl
zoo_rc set_acl(const char* path, const std::vector<zoo_acl_t>& acl, int32_t version);
获取节点的acl
zoo_rc get_acl(const char* path, std::vector<zoo_acl_t>& acl);
添加权限认证
zoo_rc add_auth(const std::string& user_name, const std::string& user_passwd);
一些用编程语言操作zookeeper
我就不在此做介绍了,虽然C++
好,但是有一说一这种东西还是用Java
操作比较好,还是别C++
了。
分布式锁实现概述
三种实现分布式锁的方式