52

Zookeeper简介-Memos-51CTO博客

 6 years ago
source link: http://blog.51cto.com/darrenmemos/2067088
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Zookeeper简介

zookeeper 是一个分布式协调系统

下载链接:http://mirror.cogentco.com/pub/apache/zookeeper/

1.zookeeper集群结构

(1) leader

是zk集群的主节点,客户端向zk注册数据时,都要通过leader来对整个集群中的所有从节点做数据同步

(2)follower

是zk集群的从节点,保留数据,接收leader的请求,参与leader的选举

(3)observer

是zk集群的从节点,保留数据,接收leader的请求,不参与leader的选举

2.zookeeper的选举机制

(1)集群启动的时候

server1启动,先查看集群中有没有leader,如果没有,则选举自己为leader;

server2启动,先查看集群中有没有leader,如果没有,则选举自己为leader,

第二轮投票,server1j和server2投id较大为leader, server2当选为leader;

(2)集群运行的时候

运行中,如果leader宕机,剩余的机器会进入选举状态,重新选举的依据:

优先考虑节点所持有的数据的版本号,最新的作为leader;

如果每个节点的数据都一样新,那就选举id大的为leader;

3.安装配置

[root@Darren2 zookeeper-3.4.10]# tar -zxvf zookeeper-3.4.10.tar.gz

[root@Darren2 zookeeper-3.4.10]# mkdir -p   /usr/local/zookeeper-3.4.10/data

[root@Darren2 zookeeper-3.4.10]# echo 1 > data/myid

修改配置文件

其中server.1中的1对应文件myid内容,每个zookeeper都要有myid文件

[root@Darren2 zookeeper-3.4.10]# cd /usr/local/zookeeper-3.4.10/conf/

[root@Darren2 conf]# cp zoo_sample.cfg zoo.cfg

[root@Darren2 conf]# vim zoo.cfg

tickTime=2000

initLimit=10

syncLimit=5

dataDir=/usr/local/zookeeper-3.4.10/data

clientPort=2181

server.1=Darren2:2888:3888  

server.2=Darren3:2888:3888

server.3=Darren4:2888:3888

#启动zookeeper

[root@Darren2 bin]# ./zkServer.sh start

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

[root@Darren2 bin]# ./zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg

Mode: Leader

[root@Darren3 bin]# ./zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /usr/local/zookeeper-3.4.10/bin/../conf/zoo.cfg

Mode: Follower

4.zookeeper命令

zookeeper中数据本质是key-value,zookeeper中一个数据被称为一个znode,一个znode不能太大,通常在10K以内,官方要求最大不要超过1M,如果太大,会导致zookeeper集群个节点的数据无法实时同步 ,数据保持一致性。

key使用路径表示,如:/dir1   value

znode类型

(1) persistent:默认的节点类型,一旦创建就会一直存在,除非手动删除数据;

(2)ephemeral:短暂节点,创建该数据节点的客户端如果和zk服务失去联系,该数据节点会被zk服务自动删除;

(3)sequential:带自增序号的节点,在同一个节点下创建sequential子节点,zk会给子节点名字自动拼接一个自增的序列号;

#登录zk client

[root@Darren2 bin]# ./zkCli.sh

[zk: localhost:2181(CONNECTED) 0] help

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

    getAcl path

    close

    connect host:port

[zk: localhost:2181(CONNECTED) 13] create /dir1 a1 

[zk: localhost:2181(CONNECTED) 16] ls /

[dir1, zookeeper]

[zk: localhost:2181(CONNECTED) 15] get /dir1

cZxid = 0x7

ctime = Sun Nov 26 13:05:34 CST 2017

mZxid = 0x7

mtime = Sun Nov 26 13:05:34 CST 2017

pZxid = 0x7

cversion = 0

dataVersion = 0

aclVersion = 0

ephemeralOwner = 0x0

dataLength = 2

numChildren = 0

#创建短暂的znode,一旦quit客户端,则自动删除

[zk: localhost:2181(CONNECTED) 17] create -e /dir2 b1

#创建序列znode

[zk: localhost:2181(CONNECTED) 1] create -s /dir3 c1

Created /dir30000000003

[zk: localhost:2181(CONNECTED) 2] ls /

[dir1, zookeeper, dir30000000003]

[zk: localhost:2181(CONNECTED) 3] create -s /dir3 c1

Created /dir30000000004

[zk: localhost:2181(CONNECTED) 4] ls /

[dir1, zookeeper, dir30000000003, dir30000000004]

#创建短暂序列znode

[zk: localhost:2181(CONNECTED) 5] create -s -e /dir3 c1

#事件监听

[zk: localhost:2181(CONNECTED) 4] ls /dir1 watch

WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/dir1

5.zookeeper的客户端api的基本使用

package zkdemo1;

import org.apache.zookeeper.ZooKeeper;

public class TestConnection {

       public static void main(String[] args) throws Exception{

             ZooKeeper zk = new ZooKeeper("192.168.163.102", 2000, null);

             byte[] data = zk.getData("/dir1", false, null);

             System.out.println(new String(data));

             zk.close();


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK