文章目录
- 01-Zookeeper集群安装及配置介绍
- 不多bb,先安装(集群环境)
- zookeeper是什么
- 文件系统
- 监听通知机制
- zookeeper组成
- zoo.cfg配置文件说明
- zookeeper使用
- 查询相关指令
- 创建相关指令
- 修改相关指令
- 删除指令
- 最后
- 参考文章
01-Zookeeper集群安装及配置介绍
不多bb,先安装(集群环境)
下载链接zookeeper-3.4.14
准备四台服务器(虚拟机),来搭建集群环境。我的四台服务分别为:192.168.0.20~192.168.0.23
- 首先要确保你的几台虚拟机中都安装了Java环境,你能看到这篇文章肯定是会按的。(如果不会就去搜一下,网上有很多,安装JDK1.8的)。
- 将你下载的zookeeper-3.4.14.tar.gz上传到服务器,准备解压安装。
- 上传成功后,进入到上传的目录,进行解压。
tar xf zookeeper-3.4.14.tar.gz
- 解压成功后,会出现zookeeper-3.4.14的文件夹。
- 创建文件夹,
mkdir -p /opt/wangwren
- 将刚刚解压出来的zookeeper文件夹移动到刚刚创建的目录中。
mv zookeeper-3.4.14 /opt/wangwren/
- 修改环境变量,方便启动zookeeper
vi /etc/profile
# 输入以下内容,按照你自己的安装目录写
export ZOOKEEPER_HOME=/opt/wangwren/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER_HOME/bin
source /etc/profile
- 修改zookeeper配置文件
cd conf/
# 因为zookeeper读取的配置文件是zoo.cfg,所以需要拷贝一份,并且重命名
cp zoo_sample.cfg zoo.cfg
- 使用vim打开zoo.cfg,修改配置文件内容
- dataDir 指定生成数据的存放位置。
- server.1 ~ server.4 指定的是集群环境中的其他机器,包括自己,必须要人为的去指定。(写下的节点行数 / 2) + 1就是过半数。(选leader用)
- 创建指定的数据目录
mkdir -p /var/wangwren/zk
- 在
/var/wangwren/zk
目录下创建一个myid
的文件,文件里写的是配置文件中server.1~server.4中server点后面的这个值,用来标识是第几台zookeeper。
- 我现在使用的是第四台做的演示,就写
echo 4 > /var/wangwren/zk/myid
- 将现在配置好的zookeeper传输给其他三台机器
# 进入到/opt 目录下,将/wangwren 当前目录传输给第一台机器,其他机器都是相同操作
scp -r ./wangwren/ 192.168.0.20:`pwd`
scp -r ./wangwren/ 192.168.0.21:`pwd`
scp -r ./wangwren/ 192.168.0.22:`pwd`
# 传输后,其他三台机器的配置文件不需要改动
- 传输后,需要在其他三台机器创建
/var/wangwren/zk
文件夹和myid
文件
# 第一台机器
mkdir -p /var/wangwren/zk
echo 1 > /var/wangwren/zk/myid
# 第二台机器
mkdir -p /var/wangwren/zk
echo 2 > /var/wangwren/zk/myid
# 第三台机器
mkdir -p /var/wangwren/zk
echo 3 > /var/wangwren/zk/myid
- 为其他三台机器创建环境变量,与上面说过的修改环境变量相同,照着写。
- 启动
- start: 就是启动,在后台启动
- start-foreground: 在前台启动,所有日志会在前台打印出来
- stop: 停止
- restart: 重启
- status: 查看状态
# 使用前台启动,可以查看日志,当你搭建的是集群环境,启动其中一台时,肯定会报错,因为别的机器没启动呢,不要慌,把剩下的几台启动就好了
zkServer.sh start-foreground
当你把四台zk都启动后,通过zkServer.sh status
命令查看他们各自的状态,会发现其中三台是follower,有一台是leader。
我的启动顺序是192.168.0.20~192.168.0.23依次启动的,会发现,第三台机器192.168.0.22的状态是leader,而不是最后一台是leader。因为在启动了三台之后,zookeeper就可以通过投票方式选出leader了,之后再启动的zookeeper,都是follower。
以上,zookeeper集群环境安装就完成了,接下来会介绍zookeeper配置文件中的相关属性,还有连接zookeeper。
zookeeper是什么
zookeeper是一个分布式服务框架,是Apache Hadoop的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
zookeeper = 文件系统 + 监听通知机制
文件系统
zookeeper维护一个类似文件系统的数据结构:
每个子目录项,如NameService都被称作为znode(目录节点),和文件系统一样,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode,唯一的不同在于znode可以存储数据。而且这每个节点都可以存储1MB的数据(但是不要拿zookeeper当数据库用)。
有四种类型的znode:
PRESISTENT
-持久化目录节点(默认的)
- 客户端与zookeeper断开连接后,该节点依旧存在。
PRESISTENT_SEQUENTIAL
-持久化顺序编号目录节点(创建节点时的 -s 参数)
- 客户端与zookeeper断开连接后,该节点依旧存在,只是zookeeper给该节点名称进行顺序编号。
-
EPHEMERAL
-临时目录节点(创建节点时的-e参数) - 客户端与zookeeper断开连接后,该节点被删除。
EPHEMERAL_SEQUENTIAL
-临时顺序编号目录节点(创建节点时的 -s -e 参数)
- 客户端与zookeeper断开连接后,该节点被删除,只是zookeeper给该节点名称进行顺序编号。
监听通知机制
客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加、删除)时,zookeeper会通知客户端。
zookeeper组成
根据其身份的特征分为三种:Leader、Follower、Observer,其中Follower和Observer统称为Learner(学习者)
- Leader:负责客户端的writer请求。
- Follower:负责客户端reader类型请求,参与leader选举。
- Observer:特殊的Follower,其可以接收客户端reader请求,但不参与选举。(扩容系统支撑能力,提高读取速度)因为他不接受任何同步的写入请求,只负责leader同步数据。
- Observer就是放大查询能力,在配置文件中的配置即在设置集群的位置,选择几个服务器在最后加上observer。
server.1=192.168.0.20:2888:3888
server.2=192.168.0.21:2888:3888
server.3=192.168.0.22:2888:3888
# 添加了observer,该服务器就成了observer角色了
server.4=192.168.0.23:2888:3888:observer
zoo.cfg配置文件说明
- tickTime:这个时间是作为zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳。
- initLimit:这个配置项是用来配置zookeeper接受客户端(这里所说的客户端不是用户连接zookeeper服务器的客户端,而是zookeeper服务器集群中连接到leader的follower服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过10个心跳的时间长度后zookeeper服务器还没有收到客户端的返回信息,那么表名这个客户端连接失败。总的时间长度就是10 * 2000 = 20秒
- syncLimit:这个配置标识Leader与Follower之间发送消息,请求和应答时间长度,最长不能超多多少个tickTime的时间长度,总的时间长度就是5 * 2000 = 10秒
- dataDir:顾名思义就是zookeeper保存数据的目录,默认情况下,zookeeper将写数据的日志文件也保存在这个目录里。
- clientPort:这个端口就是客户端连接zookeeper服务器的端口,zookeeper会监听这个端口,接收客户端的访问请求。
- server.A=B:C:D : 其中 A 是一个数字,表示这个是第几号服务器;B是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的leader服务器交换信息的端口;D 表示的是万一集群中的leader服务器挂了,需要一个端口来重新选举,选出一个新的leader,而这个端口就是用来执行选举时服务器互相通信的端口。如果是伪集群的配置方式,由于B都是一样,所以不同的zookeeper实例通信端口号不能一样,所以要给他们分配不同的端口号。
zookeeper使用
zookeeper数据结构:
使用zkCli.sh
打开客户端,连接到zookeeper服务端。
- 默认连接的是自己,四个服务器你随便选哪个连都可以,连上之后使用
help
命令能够看所有的命令。
查询相关指令
-
ls path
:列出path下的文件(节点)
如上列出根目录节点下的所有文件,目前只有一个系统自带的zookeeper节点。
-
stat path
:查看节点状态
cZxid:创建节点时的事务id
pZxid:子节点列表最后一次被修改的事务id
cversion:节点版本号
dataVersion:数据版本号
aclVersion:acl权限版本号
-
get path
:获取指定节点的内容 -
ls2 path
:列出path节点的子节点及状态信息
创建相关指令
-
create [-s] [-e] path data acl
创建一个新的znode,path指定目录,data是数据(必须写)
# 与跟目录同级创建了一个node_123节点,携带数据123
create /node_1 123
使用get /node_1
验证
创建临时节点(-e)
# 创建一个临时节点(-e),并携带数据234
create -e /node_1/node_1_1 234
使用stat命令查看这个新建的临时节点:
通过上图可以发现,ephemeralOwner值不再是0,表示这个临时节点的版本号,也是当前客户端连入zookeeper服务端的session标识。现在创建的节点在其他客户端连入时也都是能够看见的,当当前客户端退出时,这个临时节点就没有了。如果是永久节点则其值为0x0
创建顺序节点(-s)
# 通过使用 -s 参数,创建一个顺序节点,虽然指定的节点名是node_1_2,但是实际上却是/node_1/node_1_20000000001
create -s /node_1/node_1_2 456
如果我们重复执行:创建出来的节点就会一直增长,就算你删除了其中一个,也是按最大的编号一直增长。利用这个特性可以生成在分布式环境下的主键生成器。
-s -e 参数还可以同时使用。
我们使用quit
退出当前登录,之后再重新登录。执行ls /node_1
会发现,创建的临时节点node_1_1
没有了,即当客户端会话结束后,临时节点会被删除。
修改相关指令
set path data [version]
set /node_1 999
多次修改会发现dataVersion
,也就是数据版本,在不停的发生变化(自增)。
如果在 set 时指定了版本号,就必须和上一次查询出来的结果一致,否则就会报错。这个可以用于在修改节点数据时保证修改前数据没有被被人改过。如果别人修改过了,这次修改是不会成功的。
删除指令
-
delete path [version]
:删除指定节点数据,其version参数的作用与set指令一致。
# 整个节点全删除
delete /node_1/node_1_20000000001
注意:delete只能删除不包含子节点的节点,如果要删除的节点包含子节点,使用rmr
命令。
rmr /node_1