ZooKeeper集群环境安装与配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/unix21/article/details/18990123

ZooKeeper版本:3.4.5

约定:3台虚拟机

前提:需要安装JDK,关于Linux环境JDK安装配置参考我的另一帖Linux环境安装卸载JDK以及安装Tomcat和发布Java的web程序


ZooKeeper官网:http://zookeeper.apache.org/

1.下载解压

国内下载地址:http://mirrors.hust.edu.cn/apache/zookeeper/

# wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz

# tar zxvf zookeeper-3.4.9.tar.gz

# cd zookeeper-3.4.9


2.配置

1).建立数据目录

# mkdir data 

或者使用默认的

#mkdir /tmp/zookeeper都可以


2).编辑配置文件

# cd /usr/zookeeper-3.4.9/conf

conf目录下修改文件名 zoo_sample.cfg 改为 zoo.cfg 

mv zoo_sample.cfg zoo.cfg

# vim ./conf/zoo.cfg

#dataDir=/tmp/zookeeper
dataDir=/usr/zookeeper-3.4.5/data
clientPort=2181
initLimit=10
syncLimit=5
tickTime=2000
server.1=192.168.1.1:2888:3888
server.2=192.168.1.2:2888:3888
server.3=192.168.1.3:2888:3888

如果不集群就不用配置下面的server.1-3,使用默认的zoo_sample.cfg即可

注意千万不要把IP写错了,不然启动后会报奇怪的错误!



快照是需要的#mkdir   data
如果需要事务#mkdir   datalog
新建配置文件zoo.cfg,保存在conf子目录下,写入以下内容:

tickTime=# Zookeeper服务器心跳时间,单位毫秒
dataDir= # 数据持久化路径
clientPort=# 连接端口
initLimit=# 投票选举新leader的初始化时间。
syncLimit=# Leader与Follower之间的最大响应时间单位,响应超过syncLimit*tickTime,Leader认为Follwer挂掉,从服务器列表中删除Follwer
dataLogDir=# 日志保存路径  这个要自己新建,具体目录根据自己的实际情况为准!

3).新增myid文件

# cd /usr/zookeeper-3.4.9/data

在data目录下创建文件,文件名为“myid”, 编辑该“myid”文件,并在对应的IP的机器上输入对应的编号。

如在192.168.1.1上,“myid”文件内容就是1,在192.168.1.2上,内容就是2,在192.168.1.3上,内容就是3


3.修改防火墙

如果是用iptable的话,在/etc/sysconfig/iptables中加入ZooKeeper的端口:

 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2181 –j ACCEPT
 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2888 –j ACCEPT
 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3888 –j ACCEPT
 执行防火墙重启命令:
# service iptables restart


4.启动ZooKeeper

启动
# /usr/zookeeper-3.4.9/bin/zkServer.sh start
JMX enabled by default
Using config: /usr/zookeeper-3.4.9/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED


停止
# /usr/zookeeper-3.4.9/bin/zkServer.sh stop

重启
# /usr/zookeeper-3.4.9/bin/zkServer.sh restart


5.检查状态
# /usr/zookeeper-3.4.9/bin/zkServer.sh status

可能需要安装nc包
# yum install nc


ZooKeeper会自动选出Leader,一旦Leader挂了会选出新的Leader。

Leader/Follower会通过选举算法进行选择。

6.客户端登陆
# /usr/zookeeper-3.4.9/bin/zkCli.sh -server 127.0.0.1:2181


7.插入节点

create 节点名 节点值

ls 列举节点


推荐一个zookeeper信息查看工具

下载地址:https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip


新增子节点之后



8.客户端编程

<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.10</version>
</dependency>

import java.io.IOException;
import java.util.List;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;



/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Administrator
 */
public class TestNew {
public static void main(String[] args) throws IOException,InterruptedException {
        //创建会话
        ZkClient zkClient = new ZkClient("192.168.1.100:2181", 5000);
        String path = "/zk-book";

        //监测子节点变化
        zkClient.subscribeChildChanges(path, new IZkChildListener() {   
            @Override
            public void handleChildChange(String parentPath, List<String> currentChild)
                    throws Exception {
                System.out.println(parentPath + " 's child changed ,currentChilds: " + currentChild);
            }
        });

        //创建节点
        zkClient.createPersistent(path);
        Thread.sleep(1000);
        System.out.println(zkClient.getChildren(path));
        Thread.sleep(1000);
        zkClient.createPersistent(path + "/c1");
        Thread.sleep(1000);
        System.out.println(zkClient.getChildren(path));
        Thread.sleep(1000);
        zkClient.createPersistent(path + "/c2","123");
        Thread.sleep(1000);
        System.out.println(zkClient.getChildren(path));

        //删除节点
        Thread.sleep(1000);
        zkClient.delete(path + "/c1");
        Thread.sleep(1000);
        System.out.println(zkClient.getChildren(path));
        zkClient.delete(path + "/c2");
        System.out.println(zkClient.getChildren(path)); 
        Thread.sleep(1000);     
    }
}


参考:

http://blog.csdn.net/wangshuang1631/article/details/53082602

http://blog.csdn.net/zuoanyinxiang/article/details/50933862


猜你喜欢

转载自blog.csdn.net/unix21/article/details/18990123