Zookeeper精华知识库---1

1、分布式系统简介

一个tomcat已经打不了天下啦,咱们现在必须要了解分布式系统。

分布式系统的特点:分布性、对等性、并发性、缺乏全局时钟、故障随时会发生。

大型网站架构图:
在这里插入图片描述
分布式系统带来的问题:通讯异常、网络分区、三态、节点故障等。

分布式一致性算法:2p、3p、paxos、zab算法

2、CAP理论

  • C 一致性:数据在分布式环境下的多个副本之间能否保持一致性,这里的一致性更多是指强一致性;

  • A 可用性:分布式系统一直处于可用状态,对于请求总是能在有限的时间内返回结果;

  • P 分区容错性:除非整个网络故障,分布式系统在任何网络或者单点故障时,仍能对外提供满足一致性和可用性的服务;

    一个分布式系统不可能同时满足一致性、可用性和分区容错性这三个基本需求,最多只能

    同时满足其中的两项

    序号被抛弃的谁说明
    1放弃P(满足AC)将数据和服务都放在一个节点上,避免因网络引起的负面影响,充分保证系统的可用性和一致性。但放弃P意味着放弃了系统的可扩展性
    2放弃A(满足PC)当节点故障或者网络故障时,受到影响的服务需要等待一定的世界,因此在等待时间里,系统无法对外提供正常服务,因此是不可用的;
    3放弃C(满足AP)系统无法保证数据的实时一致性,但是承诺数据最终会保证一致性。因此存在数据不一致的窗口期,至于窗口期的长短取决于系统的设计

3、BASE理论

即使无法做到强一致性,但分布式系统可以根据自己的业务特点,采用 适当的方式来使系统达到最终的一致性。

  • Basically Avaliable基本可用:当分布式系统出现不可预见的故障时,允许损失部分可用性,保障系统的“基本可用”;体 现在“时间上的损失”和“功能上的损失”; e.g:部分用户双十一高峰期淘宝页面卡顿或降级处理。
  • Soft state软状态:系统的不同节点的数据副 本之间的数据同步过程存在延时,并认为这种延时不会影响系统可用性;e.g:12306 网站卖火车票,请求会进入排队队列;
  • Eventually consistent最终一致性:所有的数据在经过一段时间的数据同步后,最终能够达到一个一致的状态; e.g:理财产品首页充值总金额短时不一致;

4、Zookeeper简介

ZooKeeper 致力于提供一个高性能、高可用,且具备严格的顺序访问控制能力的分布式协调

服务,是雅虎公司创建,是 Google 的 Chubby 一个开源的实现,也是 Hadoop 和 Hbase 的重

要组件。

4.1、设计目标

  • 简单的数据结构:共享的树形结构,类似文件系统,存储于内存;

  • 可以构建集群:避免单点故障,3-5台机器就可以组成集群,超过半数正常工作就能对外提供服务。

  • 顺序访问:对于每个读请求,zk会分配一个全局唯一的递增编号,利用这个特性可以实现高级协调服务。

  • 高性能:基于内存操作,服务于非事务请求,适用于读操作为主的业务场景。3台zk集群能达到13w QPS。

4.2、ZK的应用:

数据发布订阅

负载均衡

命名服务

Master选举

集群管理

配置管理

分布式队列

分布式锁

5、Zookeeper的安装–Windows

5.1、首先要安装好jdk

略略略。。。。。。

5.2、下载安装包并解压

下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/

5.3、进入bin目录启动

在这里插入图片描述

发现启动时报错:

解决方法,在config目录下复制zoo_sample.cfg修改为zoo.cfg,再启动就成功了
在这里插入图片描述
再次启动:

服务端:
在这里插入图片描述
客户端:
在这里插入图片描述

6、Liunx下Zookeeper集群安装

6.1、安装jdk运行jdk环境(已安装略过)

上传jdk1.8安装包

安装 jdk1.8 环境变量

vi /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_181
export ZOOKEEPER_HOME=/usr/local/zookeeper
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH

刷新 profile 文件

source /etc/profile

关闭防火墙

6.2、下载zookeeper安装包

wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9.tar.gz

解压压缩包

tar -zxvf apache-zookeeper-3.5.9.tar.gz

6.3、修改Zoopkeeper文件名称

重命名:mv apache-zookeeper-3.5.9 zookeeper

在这里插入图片描述

6.4、修改zoo_sample.cfg文件

cd /zookeeper/conf
mv zoo_sample.cfg zoo.cfg
修改zoo.cfg:修改以下两处
vi zoo.cfg
(1)  dataDir=/soft/zookeeper/data  (注意同时在zookeeper里创建data目标)
(2)  最后面添加
server.0=192.168.212.154:2888:3888 
server.1=192.168.212.156:2888:3888 
server.2=192.168.212.157:2888:3888

6.5创建服务器标识

在zookeeper目录下创建文件夹
mkdir data
创建文件myid并填写内容为0

在这里插入图片描述

6.6、复制zookeeper到node1和node2服务器

还有/etc/profile 文件

把 node1、 node2 中的 myid 文件里的值修改为 1 和 2

scp -r /soft root@zk2:/
scp -r /soft root@zk3:/
修改myid文件路径(vi /soft/zookeeper/data/myid)

6.7、启动zookeeper

路径:cd /soft/zookeeper/bin
执行:zkServer.sh start
(注意这里 3 台机器都要进行启动) 
状态: zkServer.sh status
(在三个节点上检验 zk 的 mode,一个 leader 和俩个 follower) 

6.8、目录结构

bin 存放系统脚本
conf 存放配置文件
contrib zk附加功能支持
dist-maven maven仓库文件
docs zk文档
lib 依赖的第三方库
recipes 经典场景样例代码
src zk源码

其中bin和conf目录是最常用的,bin目录下的zkCli是客户端,zkServer是服务端,启动默认端口为2181

7、Zookeeper的简单命令

7.1、服务端常用命令:

启动ZK服务:      sh bin/zkServer.sh start 
查看ZK服务状态:   sh bin/zkServer.sh status 
停止ZK服务:      sh bin/zkServer.sh stop 
重启ZK服务:      sh bin/zkServer.sh restart 

7.2、客户端常用命令:

显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容 
显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据 

在这里插入图片描述

创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串 
获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串 
修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置 

在这里插入图片描述

删除文件: delete /zk 将刚才创建的 znode 删除,如果存在子节点删除失败 
递归删除:rmr  /zk将刚才创建的 znode 删除,子节点同时删除

在这里插入图片描述

退出客户端: quit 
帮助命令: help

7.3、ACL常用命令:

ACL 机制,表示为 scheme🆔permissions,第一个字段表示采用哪一种机制,第二个 id 表示 用户,permissions 表示相关权限(如只读,读写,管理等)。
zookeeper 提供了如下几种机制:
(1)scheme

  • world: 默认方式,相当于全世界都能访问。它下面只有一个 id, 叫 anyone, world:anyone 代表任何人,zookeeper 中对所有人有权限的结点就是属于 world:anyone 的
  • auth: 代表已经认证通过的用户。(可以通过addauth digest user:pwd 来添加授权用户)它不需要 id, 只要是通过 authentication 的 user 都有权限(zookeeper 支持通过 kerberos来进行 authencation, 也支持 username/password 形式的 authentication)
  • digest: 密码这种方式认证。这也是业务系统中最常用的。它对应的 id 为 username:BASE64(SHA1(password)),它需要先通过 username:password 形式的 authentication
  • ip: 使用ip地址的认证。它对应的 id 为客户机的 IP 地址,设置的时候可以设置一个 ip 段,比如 ip:192.168.1.0/16, 表示匹配前 16 个 bit 的 IP 段

(2)id 是验证模式,不同的scheme,id的值也不一样
scheme 为 auth 时:
username:password
scheme 为 digest 时:
username:BASE64(SHA1(password))
scheme 为 ip 时:
客户端的 ip 地址。
scheme 为 world 时
anyone。
(3)permission
CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这 5 种权限
简写为 crwda(即:每个单词的首字符缩写)

  • CREATE©:创建子表节的权限
  • DELETE(d):删除节点的权限
  • READ®:读取节点数据的权限
  • WRITE(w):修改节点数据的权限
  • ADMIN(a):设置子节点权限的权限
getAcl
    获取指定节点的ACL信息
create /testDir/testAcl test # 创建一个子节点
getAcl /testDir/testAcl # 获取该节点的 acl 权限信息

setAcl
     设置指定节点的ACL信息
 
setAcl /testDir/testAcl world:anyone:crwa # 设置该节点的 acl 权限
getAcl /testDir/testAcl # 获取该节点的 acl 权限信息,成功后,该节点就少了 d 权限
create /testDir/testAcl/xyz xyz-data # 创建子节点
delete /testDir/testAcl/xyz # 由于没有 d 权限,所以提示无法删除


addauth
    注册会话授权信息
    addauth digest user1:123456 # 需要先添加一个用户
    setAcl /testDir/testAcl auth:user1:123456:crwa # 然后才可以拿着这个用户去设置权限
    getAcl /testDir/testAcl # 密码是以密文的形式存储的
    create /testDir/testAcl/testa aaa
    delete /testDir/testAcl/testa # 由于没有 d 权限,所以提示无法删除
    退出客户端后:
    ls /testDir/testAcl #没有权限无法访问
    create /testDir/testAcl/testb bbb #没有权限无法访问
    addauth digest user1:123456 # 重新新增权限后可以访问了

在这里插入图片描述
在这里插入图片描述
退出后再进行创建不成功
在这里插入图片描述
auth与digest的区别
前者使用明文密码进行登录,后者使用密文密码进行登录

create /testDir/testDigest data
addauth digest user1:123456
setAcl /testDir/testDigest digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:crwa # 使用 digest
来设置权限

注意:这里如果使用明文,会导致该 znode 不可访问

通过明文获得密文
shell>
java -Djava.ext.dirs=/soft/zookeeper-3.4.12/lib -cp /soft/zookeeper-3.4.12/zookeeper-3.4.12.jar
org.apache.zookeeper.server.auth.DigestAuthenticationProvider king:123456
deer:123456->deer:ACFm5rWnnKn9K9RN/Oc8qEYGYDs=

acl 命令行 ip

create /testDir/testIp data
setAcl /testDir/testIp ip:192.168.30.10:cdrwa
getAcl /testDir/testIp

7.4、ZooKeeper 常用四字命令

需要装nc指令,linux安装命令:

yum install nc

可通过 telnet 或 nc 向 ZooKeeper 提交相应的命令 :(注意一下下面命令的中文空格)

echo stat|nc 127.0.0.1 2181 来查看哪个节点被选择作为follower或者leader 
使用echo ruok|nc 127.0.0.1 2181 测试是否启动了该Server,若回复imok表示已经启动。 
echo dump| nc 127.0.0.1 2181 ,列出未经处理的会话和临时节点。 
echo kill | nc 127.0.0.1 2181 ,关掉server 
echo conf | nc 127.0.0.1 2181 ,输出相关服务配置的详细信息。 
echo cons | nc 127.0.0.1 2181 ,列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息 
echo envi |nc 127.0.0.1 2181 ,输出关于服务环境的详细信息(区别于 conf 命令)。 
echo reqs | nc 127.0.0.1 2181 ,列出未经处理的请求。 
echo wchs | nc 127.0.0.1 2181 ,列出服务器 watch 的详细信息。 
echo wchc | nc 127.0.0.1 2181 ,通过 session 列出服务器 watch 的详细信息,它的输出是一个与 watch 相关的会话的列表。 
echo wchp | nc 127.0.0.1 2181 ,通过路径列出服务器 watch 的详细信息。它输出一个与 session 相关的路径。

7.5、ZooKeeper 日志可视化

事务日志可视化  (LogFormatter)
java -cp ../../zookeeper-3.5.9.jar;../../lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter log.xxxx

数据快照可视化  (SnapshotFormatter)
java -cp ../../zookeeper-3.5.9.jar;../../lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.SnapshotFormatter  snapshot.xxxx  

8、ZK的特性

zk的特性从会话、数据节点、版本、Watcher、ACL权限控制、集群角色这些方面来了解,其中最重要的是数据节点和Watcher

8.1、会话

客户端与服务端的一次会话连接,本质是 TCP 长连接,通过会话可以进行心跳检测和数据传输。

会话状态

Zk 客户端和服务端成功连接后,就创建了一次会话,ZK 会话在整个运行期间的

生命周期中,会在不同的会话状态之间切换,这些状态包括:

CONNECTING、CONNECTED、RECONNECTING、RECONNECTED、CLOSE

一旦客户端开始创建 Zookeeper 对象,那么客户端状态就会变成 CONNECTING 状态,同时客户端开始尝试连接服务端,连接成功后,客户端状态变为 CONNECTED,通常情况下,由于断网或其他原因,客户端与服务端之间会出现断开情况,一旦碰到这种情况,Zookeeper 客户端会自动进行重连服务,同时客户端状态再次变成 CONNCTING,直到重新连上服务端后,状态又变为 CONNECTED,在通常情况下,客户端的状态总是介于 CONNECTING和 CONNECTED 之间。但是,如果出现诸如会话超时、权限检查或是客户端主动退出程序等情况,客户端的状态就会直接变更为 CLOSE 状态

8.2、ZK数据模型

ZooKeeper 的视图结构和标准的 Unix 文件系统类似,其中每个节点称为“数据节点”或 ZNode,

每个 znode 可以存储数据,还可以挂载子节点,因此可以称之为“树”。

第二点需要注意的是,每一个 znode 都必须有值,如果没有值,节点是不能创建成功的。
在这里插入图片描述

  • 在 Zookeeper 中,znode 是一个跟 Unix 文件系统路径相似的节点,可以往这个节点存储或获取数据。

  • 通过客户端可对 znode 进行增删改查的操作,还可以注册 watcher 监控 znode 的变化。

8.3、Zookeeper节点类型

持久节点(PERSISTENT):

跟客户端断开联接后,数据还在,后面可以有子节点

不能创建相同的节点

create /test01 value

持久顺序节点(PERSISTENT_SEQUENTIAL):

可以创建相同的节点

create -s /test03 value

临时节点(EPHEMERAL):

跟客户端断开联接后,数据就不在了,后面不能拥有子节点

不能创建相同的节点

create -e /test02 value

临时顺序节点(EPHEMERAL_SEQUENTIAL):

可以创建相同的节点

create -e -s test04 value

在这里插入图片描述
在这里插入图片描述

8.4、Zookeeper节点状属性

在这里插入图片描述

设置超级管理员
在这里插入图片描述
登录
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值