您的位置:首页 > 运维架构 > Linux

在CentOS7部署zookeeper集群以及简单API使用

2016-04-12 16:18 941 查看
一.部署zookeeper集群

zookeeper是一个针对大型分布式系统的协调系统,提供的功能有统一名称服务、分布式同步等。

1.上传zk安装包

2.解压     tar -xzvf zookeeper-3.4.6.tar.gz -C app/

3.配置(先在一台节点上配置)

    3.1添加一个zoo.cfg配置文件

   进入配置文件目录: cd /home/koushengrui/app/zookeeper-3.4.6/conf/

   复制现有的配置文件模板,并命名为zoo.cfg:cp  zoo_sample.cfg zoo.cfg

    3.2修改配置文件(zoo.cfg)

        dataDir=/home/koushengrui/app/zookeeper-3.4.6/data

        server.1=server1:2888:3888

        server.2=server2:2888:3888

        server.3=server3:2888:3888

    其中2888是leader与follower通信的端口,3888是选举通信的端口。

    3.3在dataDir目录中创建一个myid文件,里面内容是server.N中的N(server.2里面内容为2)

        echo "1" > myid

    3.4将配置好的zk拷贝到其他节点

        scp -r /home/koushengrui/app/zookeeper-3.4.6 server2:/home/koushengrui/app/    ,这里不要加sudo

        scp -r /home/koushengrui/app/zookeeper-3.4.6 server3:/home/koushengrui/app/

    3.5注意:在其他节点上一定要修改myid的内容

        在server2应该将myid的内容改为2 (echo "2" > myid)

        在server3应该讲myid的内容改为3 (echo "3" > myid)

4.启动集群

    分别启动zk

        ./zkServer.sh start

这个时候若严格按照上面步骤部署,且已经关闭防火墙的话(很重要,在防火墙这里吃过大亏,如何关闭centos7的防火墙在之前博客有细讲),则zookeeper应该已经正常启动起来了,用下面命令看各节点的身份(是leader还是follower):

        ./zkServer.sh status

二.ZooKeeper简单API的使用

zookeeper的每个节点称为znode,znode除了本身能够包含一部分数据外,还能拥有子节点。znode的数据主要是协调的数据,如状态、配置等信息,当znode的数据发生变化或者子节点发生变化时,基于Watcher机制,会发出相应的通知给订阅其状态变化的客户端。

ZooKeeper有4个构造器:

ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)

ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly)

ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd)

ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long sessionId, byte[] sessionPasswd, boolean canBeReadOnly)

可见,最简单的是第一种,要传3个参数。

如:

ZooKeeper zk = new ZooKeeper("192.168.2.128:2181,192.168.2.129:2181,192.168.2.130:2181", 2000, null);第一个参数是zookeeper服务器的地址,ip:port形式,port是在zoo.cfg中配置的,默认是2181,比较推荐的做法是传入zookeeper集群中所有节点的地址以逗号拼成的字符串,如192.168.2.128:2181,192.168.2.129:2181,192.168.2.130:2181。因为如果只写单个节点的地址,如192.168.2.128:2181,万一该节点刚好掉线了的话,之后调用zookeeper实例的方法时就会报错。第二个参数是会话超时时间,以毫秒为单位,超过了这个时间还没有连上zookeeper集群的话就会报错,注意不能传0。第三个参数是Watcher实例(Watcher是个接口,只有一个process(WatchedEvent
event)方法,需要我们写一个Watcher接口的实现类,匿名类也可以),如果不为null的话,则之后调用byte[] getData(String path, boolean watch, Stat stat)或者getChildren(String path, boolean watch)方法时,如果第二个传入的是true,则就会将此Watcher实例注册为监听。
注意ZooKeeper的Watcher是一次性的,主要触发了,watcer就不再监听了,要想继续监听,需要重新做注册,可以在process()方法中注册监听,这样在触发了watcher之后又立刻注册监听,就可以达到一直监听的目的。

示例:

public class TestCyclicWatcher {
static ZooKeeper zk = null;
static String path = "/test";
static {
try {
zk = new ZooKeeper("192.168.153.128:2181", 5000, new Watcher() {
public void process(WatchedEvent event) {
try {
zk.getData(path, true, null);
if (event.getType() != EventType.None) {
System.out.println(event.getPath());
System.out.println(event.getType());
System.out.println(event.getState());
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws Exception {
System.out.println(new String(zk.getData(path, true, null)));
Thread.sleep(Integer.MAX_VALUE);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: