zookeeper
zookeeper简介 1、曾经是Hadoop子项目,现为顶级项目 2、是分布式应用程序协同服务
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。 3、为分布式应用提供一致性服务
它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。 4、支持Java和C的接口
ZooKeeper的目标
就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
# ntpdate -s ntp1.aliyun.com
# cat /etc/hosts
192.168.0.83 node83 作为zclient
192.168.0.84 node84
192.168.0.85 node85
192.168.0.86 node86
统一部署java环境
# rpm -ivh jdk-8u111-linux-x64.rpm
# vi /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest/
export PATH=$JAVA_HOME:$PATH
# . /etc/profile.d/java.sh
#ls /home/tools
zookeeper-3.4.10.tar.gz
# tar -xf zookeeper-3.4.10.tar.gz -C /usr/local
# vi /etc/profile.d/zookeeper.sh
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.10
export PATH=$ZOOKEEPER_HOME/bin:$PATH
# . /etc/profile.d/zookeeper.sh
# cd /usr/local/zookeeper-3.4.10/conf/
# cp zoo_sample.cfg zoo.cfg
# vi zoo.cfg
# The number of milliseconds of each tick
tickTime=2000 心跳周期2000毫秒
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/data/zookeeper 数据目录
# the port at which the clients will connect
clientPort=2181 客户端连接端口
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
server.1=node84:2888:3888
server.2=node85:2888:3888
server.3=node86:2888:3888
node84 | node85 | node86 |
# mkdir -p /data/zookeeper # echo 1 >>/data/zookeeper/myid |
# mkdir -p /data/zookeeper # echo 2 >>/data/zookeeper/myid |
# mkdir -p /data/zookeeper # echo 3 >>/data/zookeeper/myid |
# cat /etc/profile.d/zookeeper.sh export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.10 export PATH=$ZOOKEEPER_HOME/bin:$PATH # . /etc/profile.d/zookeeper.sh |
zookeeper集群模式配置(故障算法2n+1,即集群个数为奇数,集群生效条件为大于半数zkserver ok)
server.n=hostname:port1:port2
#n必须是myid中的指定值,dataDir=/data/zookeeper下创建的myid文件指定
#port1 leader端口,作为leader时,供follower连接的端口
#port2 选举端口,选举leader时供其它fllower连接的端口
server.1=s1:2888:3888
server.2=s2:2888:3888
server.3=s3:2888:3888
zookeeper伪分布集群模式
zoo1.cnf | zoo2.cnf | zoo3.cnf |
dataDir=/data/zookeeper/data1 server.1=localhost:2887:3887 server.2=localhost:2888:3888 server.3=localhost:2889:3889 |
dataDir=/data/zookeeper/data2 server.1=localhost:2887:3887 server.2=localhost:2888:3888 server.3=localhost:2889:3889 |
dataDir=/data/zookeeper/data2 server.1=localhost:2887:3887 server.2=localhost:2888:3888 server.3=localhost:2889:3889 |
node84 | node85 | node86 |
[root@node84 local]# zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@node84 local]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg Error contacting service. It is probably not running. [root@node84 local]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg Mode: follower [root@node84 local]# jps 2130 QuorumPeerMain 2211 Jps |
# zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg Starting zookeeper ... STARTED # zkServer.sh status ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg Mode: leader # jps 2177 Jps 2118 QuorumPeerMain |
[root@node86 tools]# zkServer.sh start ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@node86 tools]# jps 26834 QuorumPeerMain 26859 Jps |
[root@node84 local]# ls /data/zookeeper/ myid version-2 zookeeper_server.pid |
nc命令使用
[root@node84 ~]# nc -l 1234 启动监听
[root@node85 ~]# nc node84 1234 连接
==>可以实现字符聊天
文件传送
[root@node84 ~]# nc -l 1234 > nctest 启动监听,准备接受内容写入到nctest
[root@node85 ~]# nc node84 1234 </etc/hosts 发送host文件内容
端口扫描
[root@node84 ~]# nc 192.168.0.85 -z 15-22 -v -w 10
-z 端口扫描 + 范围
-w 超时时间
-v 详细输出
nc: connect to 192.168.0.85 port 15 (tcp) failed: Connection refused
nc: connect to 192.168.0.85 port 16 (tcp) failed: Connection refused
nc: connect to 192.168.0.85 port 17 (tcp) failed: Connection refused
nc: connect to 192.168.0.85 port 18 (tcp) failed: Connection refused
nc: connect to 192.168.0.85 port 19 (tcp) failed: Connection refused
nc: connect to 192.168.0.85 port 20 (tcp) failed: Connection refused
nc: connect to 192.168.0.85 port 21 (tcp) failed: Connection refused
Connection to 192.168.0.85 22 port [tcp/ssh] succeeded!
[root@node84 ~]# nc 192.168.0.85 -z 2000-4000
Connection to 192.168.0.85 2181 port [tcp/eforward] succeeded!
Connection to 192.168.0.85 2888 port [tcp/spcsdlobby] succeeded!
Connection to 192.168.0.85 3888 port [tcp/ciphire-serv] succeeded!
[root@node83 ~]# echo conf | nc node84 2181 获取配置信息(也可以# nc node84 2181后输入) clientPort=2181 dataDir=/data/zookeeper/version-2 dataLogDir=/data/zookeeper/version-2 tickTime=2000 maxClientCnxns=60 minSessionTimeout=4000 maxSessionTimeout=40000 serverId=1 initLimit=10 syncLimit=5 electionAlg=3 electionPort=3888 quorumPort=2888 peerType=0
[root@node83 ~]# echo ruok | nc node84 2181
imok
[root@node83 ~]# echo envi | nc node84 2181 获取环境信息
//其他
cons 连接信息
dump 未处理会话节点
reqs 未处理请求
stat 统计信息
wchs 服务watch的详细信息
wchp 列出指定路径下的服务器信息
[root@node83 ~]# zkCli.sh -server node84:2181 .......... .......... .......... WATCHER:: WatchedEvent state:SyncConnected type:None path:null [zk: node84:2181(CONNECTED) 0] 等待输入
[zk: node84:2181(CONNECTED) 0] h 输入h获取帮助
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
[zk: node84:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: node84:2181(CONNECTED) 1] ls /zookeeper
[quota]
[zk: node84:2181(CONNECTED) 2]
[zk: node84:2181(CONNECTED) 3] create /dirtest1 hello
Created /dirtest1
[zk: node84:2181(CONNECTED) 4] ls /
[zookeeper, dirtest1]
[zk: node84:2181(CONNECTED) 6] ls /dirtest1
[]
[zk: node84:2181(CONNECTED) 7] get /dirtest1
hello
cZxid = 0x100000004
ctime = Tue Jun 06 02:25:18 CST 2017
mZxid = 0x100000004
mtime = Tue Jun 06 02:25:18 CST 2017
pZxid = 0x100000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: node84:2181(CONNECTED) 8] set /dirtest1 helloworld
cZxid = 0x100000004
ctime = Tue Jun 06 02:25:18 CST 2017
mZxid = 0x100000005
mtime = Tue Jun 06 02:27:53 CST 2017
pZxid = 0x100000004
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 10
numChildren = 0
[zk: node84:2181(CONNECTED) 9] create /dirtest1/secdir shanhgai 只能一层层创建
Created /dirtest1/secdir
[zk: node84:2181(CONNECTED) 10] ls /dirtest1
[secdir]
[zk: node84:2181(CONNECTED) 11] get /dirtest1/secdir
shanhgai
cZxid = 0x100000006
ctime = Tue Jun 06 02:29:32 CST 2017
mZxid = 0x100000006
mtime = Tue Jun 06 02:29:32 CST 2017
pZxid = 0x100000006
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0
Simple API One of the design goals of ZooKeeper is provide a very simple programming interface. As a result, it supports only these operations: create creates a node at a location in the tree delete deletes a node exists tests if a node exists at a location get data reads the data from a node set data writes data to a node get children retrieves a list of children of a node sync waits for data to be propagated