马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
1.综述
1.1.Zookeeper先容
Zookeeper 是一个分布式和谐服务,由 Apache 开辟,紧张用于管理分布式应用中的设置信息、定名服务、分布式同步和组服务。它通过简单的接口提供高性能、高可用性和严格的序次访问控制,广泛应用于分布式体系的和谐与管理,资助开辟者处理处罚分布式情况中的复杂题目
ZooKeeper集群原理:Zookeeper是一种为分布式应用所计划的高可用、高性能且划一的开源和谐服务,它提供一项根本服务:分布式锁服务。
分布式应用可以基于它实现更高级的服务,实现诸犹如步服务、设置维护和集群管理大概定名的服务。Zookeeper服务自身构成一个集群,2n+1个(奇数)服务答应n个失效,集群内一半以上呆板可用,Zookeeper就可用。
1.2.架构图
下图是 Zookeeper 的架构图,ZooKeeper 集群中包罗 Leader、Follower 以及 Observer 三个脚色:
Leader:负责举行投票的发起和决定,更新体系状态,Leader 是由推举产生;
Follower: 用于担当客户端哀求并向客户端返回结果,在选主过程中加入投票;
Observer:可以担当客户端毗连,担当读写哀求,写哀求转发给 Leader,但 Observer 不加入投票过程,只同步 Leader 的状态,Observer 的目标是为了扩展体系,进步读取速率。
Client 是 Zookeeper 的客户端,哀求发起方
1.3.集群架构原理
Leader紧张有三个功能:
1.规复数据;
2.维持与follower的心跳,吸收follower哀求并判定follower的哀求消息范例;
3.follower的消息范例紧张有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据差别的消息范例,举行差别的处理处罚。
Follower紧张有四个功能:
1.向Leader发送哀求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
2.吸收Leader消息并举行处理处罚;
3.吸收Client的哀求,如果为写哀求,发送给Leader举行投票;
4.返回Client结果。
读操纵分析:
ZooKeeper集群中全部的server节点都拥有类似的数据,以是读的时间可以在恣意一台server节点上,客户端毗连到集群中某一节点,读哀求,然后直接返回。固然由于ZooKeeper协议的缘故因由(一半以上的server节点都乐成写入了数据,这次写哀求便算是乐成),读数据的时间大概会读到数据不是最新的server节点,以是比力保举利用watch机制,在数据改变时,及时感应到。
写操纵分析:
当一个客户端举行写数据哀求时,会指定ZooKeeper集群中的一个server节点,如果该节点为Follower,则该节点会把写哀求转发给Leader,Leader通过内部的协议举行原子广播,直到一半以上的server节点都乐成写入了数据,这次写哀求便算是乐成,然后Leader便会关照相应Follower节点写哀求乐成,该节点向client返回写入乐成相应
zookeeper 的三个端口作用:
2181 : 对 client 端提供服务
2888 : 集群内呆板通讯利用
3888:推举 leader 利用
2. 安装Zookeeper
2.1.实用版本
版本号:3.8.0(最新stale版本)
JDK版本:jdk1.8.0_341
Zookeeper 须要 Java 运行情况JDK 1.8 或以上
关于新版本的新特性请查阅如下官方:https://zookeeper.apache.org/
2.2.情况预备
操纵体系:Linux
Java 情况:Zookeeper 须要 Java 运行情况(JDK 1.8 或以上)。
查抄 Java 是否安装:java -version
2.3. 下载Zookeeper
zookeeper官网下载地点:Apache ZooKeeper
Jdk 官网源码包下载地点:Java Archive Downloads - Java SE 8u211 and later (oracle.com)
2.4 安装Zookeeper
2.4.1 解压安装包
下载安装包后上传至服务器。
解压安装包:tar -xf apache-zookeeper-3.9.3-bin.tar.gz
2.4.2 创建数据目次和日记目次
mkdir -p /app/zookeeper/data
mkdir -p /app/zookeeper/logs
2.4.3 设置Zookeeper
cp conf/zoo_sample.cfg conf/zoo.cfg
vi conf/zoo.cfg 文件,修改以下内容:
dataDir=/app/zookeeper/data
dataLogDir=/app/zookeeper/logs
clientPort=2181
集群设置
如果是集群模式,添加以下设置(以 3 节点为例):
server.1=192.168.1.101:2888:3888
server.2=192.168.1.102:2888:3888
server.3=192.168.1.103:2888:3888
此中
server.x:x 是节点的唯一 ID。
IP:2888:用于节点间通讯。
IP:3888:用于 Leader 推举。
| 设置节点 ID:
在每个节点的 dataDir 目次下创建 myid 文件,并写入对应的节点 ID。
echo 1 > /data/zookeeper/data/myid # 节点 1
echo 2 > /data/zookeeper/data/myid # 节点 2
echo 3 > /data/zookeeper/data/myid # 节点 3
| 2.4.4 启动Zookeeper
启动zookeeper:/app/zookeeper/bin/zkServer.sh start
# /app/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
# /app/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/bin/../conf/zoo.cfg
Client port found: 9090. Client address: localhost. Client SSL: false.
Mode: standalone(单机模式)
集群模式:
在每个节点上启动 Zookeeper:
bin/zkServer.sh start
检察集群状态:
bin/zkServer.sh status
3. Zookeeper集群摆设
过程、目次与单机摆设划一,集群数目以奇数为准如(3、5、7…)偶数会导致脑裂。
以三台zookeeper服务器为例,均需设置
3.1 设置hosts
#cat >>/etc/hosts << EOF
IP1 zookeeper01
IP2 zookeeper02
IP3 zookeeper03
EOF
3.2 设置myid
Zookeeper01
#echo 0 >>/app/zookeeper/data/myid
| Zookeeper02
#echo 1 >>/app/zookeeper/data/myid
| Zookeeper03
#echo 2 >>/app/zookeeper/data/myid
| 3.3 修改设置文件
#cat >>/app/zookeeper/conf/zoo.cfg <<EOF
tickTime=6000
initLimit=15
syncLimit=15
dataDir=/app/zk-data/data
dataLogDir=/app/zk-data/logs
clientPort=2181
clientPortAddress=0.0.0.0
maxClientCnxns=3000
maxSessionTimeout=120000
minSessionTimeout=4000
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
server.1=0.0.0.1:2888:3888
server.2=0.0.0.2:2888:3888
server.3=0.0.0.3:2888:3888
4lw.commands.whitelist=mntr.conf.ruok
EOF
| tickTime=6000
#ZK中的一个时间单位。ZK中全部时间都是以这个时间单位为底子,举行整数倍设置的。比方,session的最小超时时间是2*tickTime。
initLimit=15
#Follower在启动过程中,会从Leader同步全部最新数据,然后确定自己可以大概对外服务的起始状态。Leader答应F在 initLimit时间内完成这个工作。通常情况下,我们不消太在意这个参数的设置。如果ZK集群的数据量确实很大了,F在启动的时间,从Leader上同步数据的时间也会相应变长,因此在这种情况下,有须要得当调大这个参数了。(No Java system property)
syncLimit=15
#在运行过程中,Leader负责与ZK集群中全部呆板举行通讯,比方通过一些心跳检测机制,来检测呆板的存活状态。如果L发出心跳包在syncLimit之后,还没有从F那边收到相应,那么就以为这个F已经不在线了。注意:不要把这个参数设置得过大,否则大概会掩饰一些题目。
dataDir=/app/zk-data/data
#存储快照文件 snapshot 的目次。默认情况下,变乱日记也会存储在这里。发起同时设置参数dataLogDir, 变乱日记的写性能直接影响zk性能。
dataLogDir=/app/zk-data/logs
#变乱日记输出目次。只管给变乱日记的输出设置单独的磁盘或是挂载点,这将极大的提拔ZK性能。(No Java system property)
clientPort=2181
#客户端毗连server的端口,即对外服务端口,一样平常设置为 2181
clientPortAddress=0.0.0.0
#对于多网卡的呆板,可以为每个IP指定差别的监听端口。默认情况是全部IP都监听 clientPort指定的端口。 New in 3.3.0
maxClientCnxns=3000
#单个客户端与单台服务器之间的毗连数的限定,是ip级别的,默认是60,如果设置为0,那么表明不作任何限定。请注意这个限定的利用范围,仅仅是单台客户端呆板与单台ZK服务器之间的毗连数限定,不是针对指定客户端IP,也不是ZK集群的毗连数限定,也不是单台ZK对全部客户端的毗连数限定。
maxSessionTimeout=120000
#Session超时时间限定,如果客户端设置的超时时间不在这个范围,那么会被逼迫设置为最大或最小时间。默认的Session超时时间是在2 * tickTime ~ 20 * tickTime 这个范围 New in 3.3.0
minSessionTimeout=4000
#Session超时时间限定,如果客户端设置的超时时间不在这个范围,那么会被逼迫设置为最大或最小时间。默认的Session超时时间是在2 * tickTime ~ 20 * tickTime 这个范围 New in 3.3.0
autopurge.snapRetainCount=3
#这个参数指定了须要保存的文件数目。默认是保存3个
autopurge.purgeInterval=1
#ZK提供了自动整理变乱日记和快照文件的功能,这个参数指定了整理频率,单位是小时,须要设置一个1或更大的整数,默认是0,表现不开启自动整理功
server.1=0.0.0.1:2888:388
#zookeeper 集群监听地点
server.2=0.0.0.2:2888:3888
#zookeeper 集群监听地点
server.3=0.0.0.3:2888:3888
#zookeeper 集群监听地点
4lw.commands.whitelist=mntr.conf.ruok
#是为了对 ZooKeeper 可以实行的下令集提供细粒度的控制
|
3.4 启动Zookeeper
#/app/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
三台ZK,两台是follower,一台是leader。集群启动乐成
# /app/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
# /app/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /app/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
3.5 Zookeeper添加体系启动
#cat >>/etc/systemd/system/zookeeper.service <<EOF
[Unit]
Description=Zookeeper Service unit Configuration
After=network.target
[Service]
Type=forking
Environment=JAVA_HOME=/usr/java/jdk1.8.0_331 CLASSPATH=$JAVA_HOME/lib/tools.jar JAVA_HOME/lib/dt.jar CLASSPATH
ExecStartPost=/bin/sleep 2
ExecStart=/app/zookeeper/bin/zkServer.sh start /app/zookeeper/conf/zoo.cfg
ExecStop=/app/zookeeper/bin/zkServer.sh stop
PIDFile=/app/zk-data/data/zookeeper_server.pid
KillMode=none
User=zookeeper
Group= zookeeper
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
| 添加开启自启
#systemctl enable zookeeper.service
| 制止ZK
#systemctl stop zookeeper.service
启动zk
#systemctl start zookeeper.service
| 3.6 ZK设置
1. 设置snapshot文件整理计谋
autopurge.purgeInterval=1
autopurge.purgeInterval:开启整理变乱日记和快照文件的功能,单位是小时。默认是0,表现不开启自动整理功能。
autopurge.snapRetainCount=10
autopurge.snapRetainCount:指定了须要保存的文件数目。默认是保存3个。
2. 限定snapshot数目
snapCount=3000000
每snapCount次变乱日记输出后,触发一次快照(snapshot)。 ZooKeeper会天生一个snapshot文件和变乱日记文件。 默认是100000。
3. log和data数据分磁盘存储
dataDir:存储快照文件snapshot的目次。默认情况下,变乱日记也会存储在这里。
dataLogDir:变乱日记输出目次。只管给变乱日记的输出设置单独的磁盘或是挂载点,这将极大的提拔ZK性能。
4. 调解JVM巨细
ZooKeeper的JVM内存默认是根据操纵体系自己内存巨细的一个百分比预先分配的,以是这不是我们所须要的。
在./bin/zkEnv.sh文件中,有如下设置项:
if [ -f "$ZOOCFGDIR/java.env" ]
then
. "$ZOOCFGDIR/java.env"
fi
我们在./conf/java.env文件中设置JVM的内存,增长如下设置:
export JAVA_HOME=/app/jdk
export JVMFLAGS="-Xms10240m -Xmx20480m $JVMFLAGS"
修改完成利用jmap -heap $pid来验证内存修改情况。
5. ZNode中可以存储数据星的最大值,默认值是1M。
jute.maxbuffer
修改jvm内存参数jute.maxbuffer巨细调解到10M=10240KB=10485760Bytes
修改bin/zkServer.sh大概zkEnv.sh
JVMFLAGS="$JVMFLAGS -Djute.maxbuffer=10485760"
4. zookeeper开启ssl
4.1 利用keytool天生客户端和服务端证书
天生含有一个私钥的keystore文件
keytool -genkeypair -alias certificatekey -keyalg RSA -validity 3650 -keystore keystore.jks
检察天生的keystore文件
keytool -list -v -keystore keystore.jks
导出证书
keytool -export -alias certificatekey -keystore keystore.jks -rfc -file selfsignedcert.cer
导入证书到truststore文件中
keytool -import -alias certificatekey -file selfsignedcert.cer -keystore truststore.jks
检察天生的truststore文件
keytool -list -v -keystore truststore.jks
4.2 Zookeeper服务端添加ssl
方案一:添加到设置文件
在zoo.cfg内里添加
serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory
ssl.keyStore.location=/app/zookeeper/cert/keystore.jks
ssl.keyStore.password=123456
ssl.trustStore.location=/app/zookeeper/cert/truststore.jks
ssl.trustStore.password=123456
方案二:以变量的情势添加
在zkServer.sh开头添加
export SERVER_JVMFLAGS="
-Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory
-Dzookeeper.ssl.keyStore.location=/app/zookeeper/cert/keystore.jks
-Dzookeeper.ssl.keyStore.password=123456
-Dzookeeper.ssl.trustStore.location=/app/zookeeper/cert/truststore.jks
-Dzookeeper.ssl.trustStore.password=123456"
设置文件添加安全端口
zoo.cfg须要额外添加安全端口
secureClientPort=2183
为了防止全网监听
secureClientPortAddress=192.168.10.133 注:修改为本机ip地点
启动服务
./zkServer.sh start或systemctl start zookeeper.service
5. 设置Zookeeper ACL权限
ZooKeeper的ACL权限控制, 可以控制节点的读写操纵, 包管数据的安全性,ZookeeperACL权限设置分为3部门构成, 分别是:权限模式(Scheme ) 、授权对象I(ID) 、权限信息(Permission ) 。终极构成一条比方“scheme:id:permission"格式的ACL哀求信息
ZookeeperACL权限设置分为3部门构成, 分别是:权限模式(Scheme ) 、授权对象I(ID) 、权限信息(Permission ) 。终极构成一条比方“scheme:id:permission"格式的ACL哀求信息
(1)权限模式(scheme):授权的计谋。
(2)权限对象(id):授权的对象。
(3)权限(permission):授予的权限。
5.1 权限模式(Scheme)
权限模式(scheme):授权的计谋
模式
| 形貌
| world
| 这种模式方法的授权对象只有一个anyone,代表登录到服务器的全部客户端都能对该节点实行某种权限
| ip
| 对毗连的客户端利用IP地点认证方式举行认证
| auth
| 利用以添加认证的用户举行认证
| digest
| 利用 用户:暗码方式验证
| 5.2 权限范例(permission)
权限(permission):授予的权限:
范例
| ACL简写
| 形貌
| read
| r
| 读取节点及表现子节点列表的权限
| write
| w
| 设置节点数据的权限
| create
| c
| 创建子节点的权限
| delete
| d
| 删除子节点的权限
| admin
| a
| 设置该节点ACL权限的权限
|
5.3 授权的下令
授权的下令:
下令
| 用法
| 形貌
| getAcl
| getAcl path
| 读取节点的ACL
| setAcl
| setAcl path acl
| 设置节点的ACL
| create
| create path data acl
| 创建节点时设置acl
| addAuth
| addAuth scheme auth
| 添加认证用户,类似于登录操纵
|
天生授权ID
在xshell中天生
echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64
示例:
echo -n angel:123456 | openssl dgst -binary -sha1 | openssl base64
返回的结果是:5qPtfHTjrZrZ4DGSxBY8+G6AhiM=
5.4 设置ACL(两种方式)
方案一:
创建立置ACL
create [-s] [-e] [-c] path [data] [acl]
示例
./zkCli.sh
create /test1 'hello' digest:angel:5qPtfHTjrZrZ4DGSxBY8+G6AhiM=:cdrwa
方案二:
大概直接利用setAcl 设置(属于另一种方案)
setAcl /test1 digest:angel:5qPtfHTjrZrZ4DGSxBY8+G6AhiM=:cdrwa
访问 /test1,会出现权限不敷
[zk: localhost:2181(CONNECTED) 1] get /test1
Insufficient permission : /test1
访问前须要添加授权信息
addauth digest angel:123456
| [zk: localhost:2181(CONNECTED) 2] addauth digest angel:123456
[zk: localhost:2181(CONNECTED) 3] get /test1
hello
|
5.4.1 明文授权
另一种授权模式: auth 明文授权
利用之前须要先注册用户信息
addauth digest username:password
注册用户信息,后续可以直接用明文授权
[zk: localhost:2181(CONNECTED) 4] addauth digest wuqian:123456
| [zk: localhost:2181(CONNECTED) 5] create /test2 'hello2' auth:wuqian:123456:cdwra
Created /test2
| [zk: localhost:2181(CONNECTED) 6] get /test2
|
5.4.2 IP授权模式
方式1:setAcl /test3 ip:192.168.0.106:cdwra
方式2:create /test data ip:192.168.0.106:cdwra
5.5关闭ACL
可以通过体系参数zookeeper.skipACL=yes举行设置,默认是no,可以设置为true, 则设置过的ACL将不再举行权限检测
编辑设置启动文件 vim bin/zkServer.sh,然后添加启动参数-D:
53 ZOOMAIN="-Dzookeeper.skipACL=yes -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=$JMXLOCALONLY org.apache.zookeeper.server.quor um.QuorumPeerMain"
重启zkServer,关闭ACL访问控制
./zkServer.sh restart
|