目录
1.CAP理论
2.BASE理论
3.zookeeper介绍
3.1 zookeeper安装
3.1.1 常见cli命令
3.1.2 演示节点创建和监听机制
3.1.2 zookeeper的ACL权限控制
3.1.3 事物日志,快照日志
CAP理论是分布式系统实现的理论基础,主要包括一致性,可用性和分区容易性。
一致性(consistency):保证多个系统之间的数据一致。
可用性(availbilaty):每次请求都能获得响应,但不保证数据是最新数据。
分区容错性(partition tolerance):分布式系统在遇到网络故障时,能够对外提供一致性和可用性服务,除非整个网络瘫痪。
一个系统中最多保证其中的两项,分区容错性是必须的,所以一般只有CP和AP,zookeeper是CP,springCloud中eureka是保证AP。
BASE理论是对一致性和可用性的妥协,即包括基本可用,软状态和最终一致性。
基本可用:在分布式系统出现故障时,允许损失一定可用性和一致性。
软状态:允许在达到最终一致性时有中间状态,即在延迟后达到最终一致性。
最终一致性:经过一段时间后达到最终一致性。
强一致性:在分布式系统中多个数据备份一旦有更新就要通知其他数据备份更新,保证任意时刻读到的数据是相同的,强一致性一定会损害可用性。
弱一致性:不保证响应的数据是最新的。
最终一致性:在经过一段时间的延迟后最终数据达到一致性的要求。
顺序一致性:任意一次读都能看到最近一次写的数据。写入时是建立在已经同步且确定的基础上。
zookeeper写入时强一致性,读取时顺序一致性。
zookeeper是一个开源的分布式协调框架,旨在解决分布式系统中一致性的问题。
zookeeper本质上是一个小型存储系统,主要包括文件服务+监听服务。从设计角度看是从观察者模式设计的分布式服务管理框架。
zookeeper包括节点:持久化目录节点,持久化顺序编号目录节点,临时目录节点,临时目录顺序编号目录节点。container节点,TTL节点zookeeper官网传送门!!!https://zookeeper.apache.org/
下载文件:Apache ZooKeeper
上传文件到目录:/usr/local/zookeeper(没有zookeeper目录就创建一个,mkdir zookeeper)
赋权限:chmod -R 777 apache-zookeeper-3.8.0-bin.tar.gz
解压文件:tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz
切换目录:cd apache-zookeeper-3.8.0-bin
创建data目录:mkdir data复制样例文件zoo.cfg并指定zoo.cfg为启动配置文件:
cd apache-zookeeper-3.8.0-bin/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg dataDir=/tmp/zookeeper 修改为指定的data目录
/usr/local/zookeeper/apache-zookeeper-3.8.0-bin/data
cd ../
bin/zkServer.sh start conf/zoo.cfg
查看server状态:bin/zkServer.sh status
启动客户端bin/zkCli.sh下面步骤非必须步骤:
# 连接远程的zookeeper server
# bin/zkCli.sh -server ip:port关闭server服务: bin/zkServer.sh stop conf/zoo.cfg
第二次进入服务器:
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin
bin/zkServer.sh start conf/zoo.cfg
bin/zkCli.sh
ZooKeeper: Because Coordinating Distributed Systems is a Zoo
命令基本语法 |
功能描述 |
help |
显示所有操作命令 |
ls [-s] [-w] [-R] path |
使用 ls 命令来查看当前 znode 的子节点 [可监听] -w: 监听子节点变化 -s: 节点状态信息(时间戳、版本号、数据大小等) -R: 表示递归的获取 |
create [-s] [-e] [-c] [-t ttl] path [data] [acl] |
创建节点 -s : 创建有序节点。 -e : 创建临时节点。 -c : 创建一个容器节点。 t ttl] : 创建一个TTL节点, -t 时间(单位毫秒)。 data:节点的数据,可选,如果不使用时,节点数据就为null。 acl:访问控制 |
get [-s] [-w] path |
获取节点数据信息 -s: 节点状态信息(时间戳、版本号、数据大小等) -w: 监听节点变化 |
set [-s] [-v version] path data |
设置节点数据 -s:表示节点为顺序节点 -v: 指定版本号 |
getAcl [-s] path |
获取节点的访问控制信息 -s: 节点状态信息(时间戳、版本号、数据大小等) |
setAcl [-s] [-v version] [-R] path acl |
设置节点的访问控制列表 -s:节点状态信息(时间戳、版本号、数据大小等) -v:指定版本号 -R:递归的设置 |
stat [-w] path |
查看节点状态信息 |
delete [-v version] path |
删除某一节点,只能删除无子节点的节点。 -v: 表示节点版本号 |
deleteall path |
递归的删除某一节点及其子节点 |
setquota -n|-b val path |
对节点增加限制 n:表示子节点的最大个数 b:数据值的最大长度,-1表示无限制 |
演示持久化节点,临时节点,临时节点顺序节点,容器节点
TTL节点默认关闭,需要配置参数开启。
监听机制:每个目录都只能有一次监听,但可以对一个目录下的所有子节点设置一次性监听。
ls -R /
创建持久化节点
create /test
ls -R /
创建持久化节点赋予数据
create /test2 cainiao
ls -R /
查看数据
get /test
get /test2
修改数据
set /test testData
get /test
删除节点
delete /test
ls -R /
创建子节点
create /test2/sub0
ls -R /test2
创建顺序节点
create /seq
create -s /seq/seq-
create -s /seq/seq-
create -s /seq/seq-
ls -R /seq
创建顺序节点赋予数据
create -s /seq/seq- datatest
get /seq/seq-0000000005
创建临时节点
create -e /ephemeral ephemeralData
查看临时节点与持久化节点ephemeralOwner不同
get -s /ephemeral
get -s /test2
CTRL+C
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin/logs
tail -f zookeeper-root-server-localhost.localdomain2.out
bin/zkCli.sh
create -e /ephemeral ephemeralData
ls /
CTRL+C
bin/zkCli.sh
ls /
(30秒以后就看不到这个ephemeral临时节点了)
ls /
创建临时节点子节点,无法创建,临时节点下不能有子节点
create -e /ephemeral
ls /
create -e /ephemeral/sss
创建临时节点顺序节点(断开客户端30秒以后就看不到这个临时顺序节点了)
create /seq-ephemeral
create -e -s /seq
create -e -s /seq-ephemeral/ data
create -e -s /seq-ephemeral/ data
create -e -s /seq-ephemeral/ data
ls -R /seq
ls -R /seq-ephemeral
创建容器节点
create -c /container data
get -s /container
create /container/sub0
create /container/sub1
create /container/sub2
删除容器节点子节点:
delete /container/sub0
delete /container/sub1
delete /container/sub0
60秒以后会定时检查容器节点下有没有子节点没有则删除容器节点,可以通过日志查看
手动删除容器节点:delete /container
开启TTL节点
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin/bin
vim zkServer.sh
查找ZOOMAIN参数:/ZOOMAIN,在后面添加-Dzookeeper.extendedTypesEnabled=true参数
重启服务器:
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin
bin/zkServer.sh stop conf/zoo.cfg
bin/zkServer.sh start conf/zoo.cfg
bin/zkCli.sh
创建TTL节点:
create -t 5000 /ttl-node data
5秒以后自动删除TTL节点
ls /
删除节点以及子节点
deleteall /seq
deleteall /seq-ephemeral
创建持久化节点
create /test data
注册监听,一次性:get -w /test
修改数据会看到一个监听事件的消息,服务端主动通知客户端:set /test data2
查看参数变化
set -s /test data3
set -s /test data4
对目录进行监听,永久性监听:ls -R -w /test
可以触发监听,一次性:create /test/sub3
不可以触发监听:create /test/sub3/sub0
可以触发监听,一次性:create /test/sub2/sub0
移出所有监听:removewatches /test
权限控制是为了安全需求,分为三部分:权限模式,授权对象,权限信息。
生成密钥:echo -n user:psss | openssl dgst -binary -sha1 | openssl base64
GgxJVZB8sBKb444t1KJ9wkY1EbQ=
bin/zkCli.sh
加密并且赋予用户user读写权限:create /zknode data digest:user:GgxJVZB8sBKb444t1KJ9wkY1EbQ=:rw
报错没有登录权限:get /zknode
登录用户user:addauth digest user:psss
查看数据:get /zknode
明文授权
addauth digest user:psss
create /zknode2 data auth:user:psss:rw
getAcl /zknode2
都可以查看,session存在:get /zknode
get /zknode2
ip授权
create /zknode3 data ip:192.168.1.8:rw
只有ip为192.168.1.8的能访问:get /zknode3
如果想其他服务器也能访问:第一种方式关闭ACL
CTRL+C
cd bin
vim zkServer.sh
搜索关键字:/ZOOMAIN在后面追加-Dzookeeper.skipACL=yes
重启服务器:
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin
bin/zkServer.sh stop conf/zoo.cfg
bin/zkServer.sh start conf/zoo.cfg
bin/zkCli.sh
可以查看数据:get /zknode3
第二种方式超级管理员方式
CTRL+C
生成密钥:echo -n user2:psss | openssl dgst -binary -sha1 | openssl base64
cd bin
vim zkServer.sh
搜索关键字:/ZOOMAIN在后面追加-Dzookeeper.DigestAuthenticationProvider.superDigest=user2:mUE7OR8718aa2a8L/nmyJGj6keY=
重启服务器:
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin
bin/zkServer.sh stop conf/zoo.cfg
bin/zkServer.sh start conf/zoo.cfg
bin/zkCli.sh
仍然不能访问:get /zknode3
使用超级管理员:addauth digest user2:psss
可以访问:get /zknode3
查看权限信息getAcl /zknode3
设置任何人都能访问zknode3节点:setAcl /zknode3 world:anynoe:cdwra
事物日志是内存持久化日志,比如创建节点就会生成日志。这个日志路径记录在启动文件zoo.cfg中datadir路径下。也可以修改路径
快照日志跟上面的datadir路径是相同的,主要记录某一时刻的日志。
同时也可以使用java -cp slf4j-api-1.7.30.jar:zookeeper-3.8.0.jar:zookeeper-jute-3.8.0.jar org.apache.zookeeper.server.LogFormatter /usr/local/zookeeper/apache-zookeeper-3.8.0-bin/data2/version-2/log.1命令来查看日志文件命令主要用来格式化使用。但是本地实验报错
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin/conf
vim zoo.cfg
搜索/dataDir,这个目录下就是事物日志的路径,默认事物日志路径会放在dataDir参数下,也可以设置dataLogDir参数设置事物日志路径。
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin/data
cd version-2/
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin/lib
修改事物日志路径
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin
bin/zkServer.sh stop conf/zoo.cfg
mkdir data2
vim conf/zoo.cfg
搜索/dataDir修改dataDir=/usr/local/zookeeper/apache-zookeeper-3.8.0-bin/data2
bin/zkServer.sh start conf/zoo.cfg
bin/zkCli.sh
cd /usr/local/zookeeper/apache-zookeeper-3.8.0-bin/lib
java -cp slf4j-api-1.7.30.jar:zookeeper-3.8.0.jar:zookeeper-jute-3.8.0.jar org.apache.zookeeper.server.LogFormatter /usr/local/zookeeper/apache-zookeeper-3.8.0-bin/data2/version-2/
java -cp slf4j-api-1.7.30.jar:zookeeper-3.8.0.jar:zookeeper-jute-3.8.0.jar /usr/local/zookeeper/apache-zookeeper-3.8.0-bin/data2/version-2/
java -classpath .:slf4j-api-1.7.30.jar:zookeeper-3.8.0.jar org.apache.zookeeper.server.LogFormatter /usr/local/zookeeper/apache-zookeeper-3.8.0-bin/data2/version-2/
java -classpath .:slf4j-api-1.7.30.jar:zookeeper-3.8.0.jar org.apache.zookeeper.server.LogFormatter /usr/local/zookeeper/apache-zookeeper-3.8.0-bin/data2/version-2/log.1