zookeeper
zookeeper的介绍
简介
1,中间件,提供协调服务
2,作用于分布式系统,发挥其优势,可以为大数据服务
3,支持java,提供java和c语言的客户端api
分布式系统
1,很多台计算机组成一个整体,一个整体一直对外挺且处理同一请求
2,内部的每台计算机都可以互相通信(REST/RPC)
3,客户端到服务端的一次请求到响应结束会经历多台计算机
特性
一致性:数据一致性,数据按照顺序分批入库
原子性:事务要么成功要么失败,不会局部化
单一视图:客户端连接集群中的任一zk节点,数据都是一致的
可靠性:每次对zk的操作状态都会保存在服务端
实时性:客户端可以读取到zk服务端的最新数据
zookeeper安装(在Linux上)
1,首先安装jdk(jdk安装见前面写的博客)
2,解压缩zookeeper
[root@Ting installpackage]# tar -zxvf zookeeper-3.4.13.tar.gz
[root@Ting installpackage]# mv zookeeper-3.4.13 ../worktool/
[root@Ting installpackage]# cd
[root@Ting /]# cd usr/java/worktool/
重命名
[root@Ting worktool]# rename zookeeper-3.4.13 zookeeper zookeeper-3.4.13/
配置环境变量
[root@Ting worktool]# vi /etc/profile
export ZOOKEEPER_HOME=/usr/java/worktool/zookeeper
export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin
图片中包含了jdk、mysql、 zookeeper的配置
[root@Ting worktool]# cd zookeeper/conf/
1.复制zoo_sample.cfg
[root@Ting conf]# cp zoo_sample.cfg zoo.cfg
2,配置文件参数介绍
tickTime:用于计算的时间单元。比如session超时:N*tickTime
initLimit:用于集群,允许从节点连接并同步到主节点的初始化连接时间,以 tickTime的倍数表示
syncLimit:用于集群,master主节点与从节点之间发送消息,请求和应答时间长度(心跳机制),以tickTime的倍数表示
dataDir:存放数据目录
dataLogDir:日志目录,如果不配置,将于dataDir共用一个目录
比如:dataDir=/usr/java/worktool/zookeeper/dataDir
dataLogDir=/usr/java/worktool/zookeeper/dataLogDir
clientPort:连接服务器的端口,默认为2181
[root@Ting conf]# vi zoo.cfg
在zoo.cfg中添加
dataDir=/usr/java/worktool/zookeeper/dataDir
dataLogDir=/usr/java/worktool/zookeeper/dataLogDir
zookeeper的主要目录结构
bin:运行命令
conf:配置文件,运行之前需要修改zoo_sample.cfg
contrib:附加的功能
dist-maven:mvn编译后的目录
docs:文档目录
lib:jar包目录
recipes:案例demo目录
src:源码
数据模型基本操作
1,客户端连接
[root@Ting conf]# cd ..
[root@Ting zookeeper]# cd bin/
[root@Ting bin]# ./zkServer.sh start
[root@Ting bin]# ./zkCli.sh -server 192.168.56.130:2181
2,查看znode结构
[zk: 192.168.56.130:2181(CONNECTED) 0]
[zk: 192.168.56.130:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: 192.168.56.130:2181(CONNECTED) 1] ls /zookeeper
[quota]
[zk: 192.168.56.130:2181(CONNECTED) 2] ls /zookeeper/quota
[]
3,关闭客户端连接
Ctrl+C Quit
4.停止服务
./zkServer.sh stop
5.重启服务
./zkServer.sh restart
6.查看状态
./zkServer.sh status
zookeeper作用体现
1,master节点选举,主节点挂了之后,从节点就会接手工作。并且保证这个节点是唯一的,即首脑模式。从而保证集群的高可用
2,统一配置文件管理。即只需要部署一台服务器,则可以把相同的配置文件同步更新到其他所有服务器。(云计算)
3,发布与订阅。类似于消息队列RabitMQ 、ActiveMq。dubbo发布者把数据存到znode上,订阅者会读取该数据
4,提供分布式锁, 分布式环境中不同进程之间争夺资源,类似于多线程中的锁
5,集群管理,保证数据的强一致性。
zookeeper常用命令操作
1,通过./zkCli.sh打开zk客户端进入命令行后台
2,ls与ls2命令 ls2为ls与stat命令的组合
cZxid = 0x0 创建ID
ctime = Wed Dec 31 16:00:00 PST 1969 创建时间
pZxid = 0x0 子节点ID
dataVersion = 0 当前数据版本号
aclVersion = 0 acl权限版本
ephemeralOwner = 0x0 持久节点与临时节点的区分标示 此处为持久节点
3,get与stat命令
4,create命令
create -e 创建临时节点
create -s 创建顺序节点
5,set指令
dataVersion = 1 版本号发送了变化
根据版本号来修改数据-即乐观锁
6,delete指令
删除也有版本号的限制
watcher机制
针对每个节点的操作,zk都会有一个监督者->watcher
当监控的某个对象(znode)发送了变化,则会处罚watcher事件
zk中的watcher是一次性的,触发后立即销毁
父节点、子节点 增删改都能够触发其watcher
针对不同类型的操作,触发的watcher事件也不同
1,(子)节点创建事件
2,(子)节点删除事件
3,(子)节点数据变化事件
watcher命令行操作
1,通过get/stat path 【watch】设置watcher
2,父节点增删改操作都会触发watcher
3,子节点增删改操作触发watcher
watcher事件类型之父节点
创建父节点触发:NodeCreated 通过help指令查看设置watch事件的命令
修改父节点数据触发:NodeDataChanged
删除父节点:NodeDeleted
watcher事件类型之子节点
ls为父节点设置watch,创建子节点触发:NodeChildrenChanged
ls为父节点设置watcher,删除子节点触发:NodeChildrenChanged
ls为父节点设置watch,修改子节点不触发事件;通过get/stat设置事件
watch使用场景
统一资源配置
zk特性-session的基本原理
1,客户端与服务端之间的连接会话
2,每个会话都可以设置一个超时时间
3,心跳结束,session则过期
4,session过期,则临时节点znode会被抛弃
5,心跳机制:客户端向服务端的ping包请求。可通过创建临时节点来查看(退出客户端临时节点还会继续发送心跳包,此时还可以查看。时效段过了后,则查看不了该节点)
ALC(access control lists)权限控制列表
1,针对节点可以设置相关读写等权限
2,权限可以指定不同的权限范围以及角色
ACL命令行
1,getAcl:获取某个节点的acl权限信息
2,setAcl:设置某个节点的acl权限信息
3,addauth:输入认证授权信息,注册时输入明文密码(登录),但是在zk系统里,密码是以加密的形式存在的
ACL的构成
1,zk的acl通过[scheme:id:permissions]来构成权限列表
scheme:代表采用的某种权限机制
1),world:world下只有一个id,即只有一个用户,也就是anyone,那么组合的写法就是world:anyone:[permissions]
2),auth:代表认证登录,需要注册用户有权限就可以,形式为auth:user:password:[permissions]
3),digest:需要密码加密才能访问,组合形式为digest:username:BASE64(SHA1(password)):[permissions]
auth与digest的区别就是,前者明文,后者密文
setAcl /path auth:lee:lee:cdrwa与
setAcl /path digest:leeBASE64(SHA1(password))cdrwa是等价的,在通过addauth digest lee:lee后都能操作指定节点的权限
4),ip:当设置ip指定的ip地址,此时限制ip进行访问,比如ip:192.168.1.1:[permissions]
5)super:代表超级管理员,拥有所有的权限
id:代表允许访问的用户
permissions:权限组合字符串
--权限字符串缩写 crdwa
1,create:创建子节点
2,read:获取节点/子节点
3,delete:删除子节点
4,write:设置节点数据
5,admin:设置权限
ACL命令行学习
1,world:anyone:cdrwa
此时删除节点报错
重新赋值权限再删除
2,acl auth的使用
[zk: localhost:2181(CONNECTED) 0] addauth digest aa:aa 添加用户密码到zk库
"digest,"aa:yr3WY3jl0t9TOJWOvenTBfrUTe8= 密码以密文形式存储
3,acl digest的使用
todo
4,acl ip的使用
5,acl super超级管理员
1)修改zkServer.sh增加super管理员
2)重启zkServer.sh
zk四字命令
1,与服务器进行交互
zk集群 主从节点,心跳机制(选举模式)
搭建集群注意点
1,配置数据文件 myid 1/2/3 对于 server.1/2/3
2,通过./zkCli.sh -server [ip]:[port]检测集群是否配置成功
伪分步是集群搭建
克隆虚拟机的话,修改vi /etc/sysconfig/network-scripts/ifcfg-eth0 ,将HWADDR="00:0C:29:8C:32:25"
修该为虚拟机对于的MAC地址(虚拟机设置 网络适配器 高级 MAC),然后重启网卡service network restart
1,copy zookeeper
cp zookeeper/ zookeeper02 -rf
cp zookeeper/ zookeeper03 -rf
2,修改zoo.cfg ip:同步端口号:选举端口
server.1=192.168.25.128:2888:3888
server.2=192.168.25.128:2889:3889
server.3=192.168.25.128:2890:3890
3,在zookeeper中的dataDir目录中创建myid 内容为1
4,在zookeeper02中修改zoo.cfg 将clientPort修改为2182,添加server配置见步骤2
并修改日志目录 数据目录
5,进入zookeeper02的dataDir目录 创建myid 内容为2
6,在zookeeper03中修改zoo.cfg 将clientPort修改为2183,添加server配置见步骤2,并 修改日志目录 数据目录
7,进入zookeeper03的dataDir目录 创建myid 内容为3
8,分别进入zookeeper zookeeper02 zookeeper03 bin目录下启动./zkServer.sh start
启动日志如果报错,查看 bin/zookeeper.out
测试伪分步的集群
连接一台服务 ./zkCli.sh -server localhost:2181
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper, java12, ipdemo]
创建节点
[zk: localhost:2181(CONNECTED) 1] create /culster 111111
Created /culster
[zk: localhost:2181(CONNECTED) 2] ls /
[zookeeper, java12, ipdemo, culster]
退出并连接另外一台服务器
[zk: localhost:2181(CONNECTED) 3] [root@localhost bin]# ./zkCli.sh -server localhost:2182
查看是否存在culster节点
[zk: localhost:2182(CONNECTED) 0] ls /
[zookeeper, java12, ipdemo, culster]
[zk: localhost:2182(CONNECTED) 1]
测试选举
关闭集群中主节点的机子或伪分步的主节点服务
伪分步下:
zookeeper Apache Curator客户端的使用
1,会话连接与恢复
2,节点的增删改查
3,watch与acl的相关操作