一、安装部署

  1. 下载Zookeeper安装包

a)         下载地址http://zookeeper.apache.org/releases.html(这个是apache zookeeper的官网下载地址)

  1. tar文件解压

使用命令解压文件,当我们需要部署伪集群的时候需要进行多次解压,解压到不同目录下如:server002,server003下面

a)         cd /usr/local/server001                //进入该目录下进行解压

b)         tar -zvxf zookeeper-3.4.9.tar.gz          //解压文件

  1. 修改zookeeper-3.4.9/zoo_sample.cfd文件名改为zoo.cfg,内容缺省如下:

Server001目录下的zoo.cfg配置文件内容修改:

 

# The number of milliseconds of each tick
tickTime=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 port at which the clients will connect
clientPort=2181 #注意主要就是修改这个端口,端口不能一样
# the directory where the snapshot is stored.
#dataDir=/export/crawlspace/mahadev/zookeeper/server1/data
dataDir=/usr/local/zookeeper-3.3.3/data# 

dataLogDir=/usr/localzookeeper-3.3.3/log

server.1=192.168.201.128:8881:7771 
server.2=192.168.201.131:8882:7772 
server.3=192.168.201.132:8883:7773

 

Server002目录下的zoo.cfg配置文件内容修改:

 

# The number of milliseconds of each tick
tickTime=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 port at which the clients will connect
clientPort=2182#注意主要就是修改这个端口,端口不能一样
# the directory where the snapshot is stored.
#dataDir=/export/crawlspace/mahadev/zookeeper/server1/data
dataDir=/usr/local/zookeeper-3.3.3/data# 

dataLogDir=/usr/localzookeeper-3.3.3/log

server.1=192.168.201.128:8881:7771 
server.2=192.168.201.131:8882:7772 
server.3=192.168.201.132:8883:7773

 

 

Server003目录下的zoo.cfg配置文件内容修改:

 

# The number of milliseconds of each tick
tickTime=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 port at which the clients will connect
clientPort=2183#注意主要就是修改这个端口,端口不能一样
# the directory where the snapshot is stored.
#dataDir=/export/crawlspace/mahadev/zookeeper/server1/data
dataDir=/usr/local/zookeeper-3.3.3/data# 

dataLogDir=/usr/localzookeeper-3.3.3/log

server.1=192.168.201.128:8881:7771 
server.2=192.168.201.131:8882:7772 
server.3=192.168.201.132:8883:7773

 

  1. 在/usr/local/server001目录下面创建两个文件data,log(三个节点目录下都要创建)

mkdir /usr/loca/server001/{data,log}

 

  1. 在data文件下面床架一个myid文件,内容分别对应你安装的zookeeper的端口号。如:2181内容则为1。2182内容则为2;

进入打他文件目录:cd /usr/local/server001/data

创建myid文件并且设置内容 vi myid

 

6.启动每个zookeeper

         /usr/local/server001/zookeeper-3.4.9/bin/zkServer.sh restart

/usr/local/server002/zookeeper-3.4.9/bin/zkServer.sh restart

/usr/local/server003/zookeeper-3.4.9/bin/zkServer.sh restart

 

  1. 查看是否存在进程:

输入jps

7.执行客户端脚本

         /usr/local/server001/zookeeper-3.4.9/bin/zkCli.sh –server 127.0.0.1:2181

成功

 

 

一、java连接zk实例

 

 

public class
DistributedLock implements Watcher{  
 
   
privateint
threadId;  
   
private
ZooKeeper zk = null;  
   
private
String selfPath;  
   
private
String waitPath;  
   
private
String LOG_PREFIX_OF_THREAD;  
   
privatestaticfinalintSESSION_TIMEOUT = 10000;  //session超时时间
   
privatestaticfinal
String GROUP_PATH
= "/disLocks";  
   
privatestaticfinal
String SUB_PATH
= "/disLocks/sub";  
   
privatestaticfinal
String CONNECTION_STRING = "localhost:2182,localhost:2181,localhsot:2183";//服务器地址  ,远程操作将地址修改一下
     

   
privatestaticfinalintTHREAD_NUM
= 10;   
zk成功;  
   
private
CountDownLatch connectedSemaphore = new
CountDownLatch(1);  
   
//确保所有线程运行结束;  
   
privatestaticfinal
CountDownLatch threadSemaphore = new
CountDownLatch(THREAD_NUM);  
//    private static final Logger LOG =
LoggerFactory.getLogger(AllZooKeeperWatcher.class);  
   
public
DistributedLock(int
id) {  
        this.threadId = id;  
        LOG_PREFIX_OF_THREAD = "【第"+threadId+"个线程】";  
   
}  
   
publicstaticvoid
main(String[] args)
{  
        for(int i=0; i < THREAD_NUM;
i++){  
            final int threadId
= i+1;  
            new Thread(){ 

                @Override  
                public void run() { 

                  DistributedLock dc = null;
                    try{  
                      dc = new DistributedLock(threadId);  
                        dc.createConnection(CONNECTION_STRING,
SESSION_TIMEOUT);  
                        //GROUP_PATH不存在的话,由一个线程创建即可; 
                       synchronized (threadSemaphore){  
                            dc.createPath(GROUP_PATH,
"该节点由线程" + threadId + "创建", true);  
                        }  
                      
                        dc.getLock();  
                    } catch (Exception e){  
                        System.out.println("【第"+threadId+"个线程】 抛出的异常:");  
                        e.printStackTrace();  
                        dc.releaseConnection();
                    }  
                }  
            }.start();  
        } 

        try {  
            threadSemaphore.await();  
            System.out.println("所有线程运行结束!");  
            System.out.println(DistribLock.ku);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        } 

   
}  
   
/** 
     * 获取锁 
     * @return 
     */  
   
privatevoid
getLock() throws
KeeperException, InterruptedException { 
   
   
        selfPath = zk.create(SUB_PATH,null,
ZooDefs.Ids.OPEN_ACL_UNSAFE, org.apache.zookeeper.CreateMode.EPHEMERAL_SEQUENTIAL);  
        System.out.println(LOG_PREFIX_OF_THREAD+"创建锁路径:"+selfPath);  
        if(checkMinPath()){  
            getLockSuccess();  
        } 

   
}  
   
/** 
     * 创建节点 
     * @param path 节点path 
     * @param data 初始数据内容 
     * @return 
     */  
   
publicboolean
createPath( String path,
String data,
boolean
needWatch)
throws
KeeperException, InterruptedException {  
        if(zk.exists(path,
needWatch)==null){  
         System.out.println( LOG_PREFIX_OF_THREAD
+ "节点创建成功, Path: " 

                    + this.zk.create( path,  
                    data.getBytes(), 

                    ZooDefs.Ids.OPEN_ACL_UNSAFE,  
                   
org.apache.zookeeper.CreateMode.PERSISTENT )  
                    + ", content: " + data );  
        } 

        return true;  
   
}  
   
/** 
     * 创建ZK连接 
     * @param connectString  ZK服务器地址列表 
     * @param sessionTimeout Session超时时间 
     */  
   
publicvoid
createConnection( String connectString, int
sessionTimeout
) throws
IOException, InterruptedException {  
            zk = new ZooKeeper( connectString, sessionTimeout, this);  
            connectedSemaphore.await();  
   
}  
   
/** 
     * 获取锁成功 
   
*/  
   
publicvoid
getLockSuccess() throws
KeeperException, InterruptedException {  
        if(zk.exists(this.selfPath,false) == null){  
         System.out.println(LOG_PREFIX_OF_THREAD+"本节点已不在了...");  
            return; 

        } 

        System.out.println(LOG_PREFIX_OF_THREAD + "获取锁成功,赶紧干活!");  
        Thread.sleep(2000);  
        System.out.println(LOG_PREFIX_OF_THREAD + "删除本节点:"+selfPath);  
        zk.delete(this.selfPath, -1);  
        releaseConnection();  
        threadSemaphore.countDown();  
   
}  
   
/** 
     * 关闭ZK连接 
     */  
   
publicvoid
releaseConnection() {  
        if ( this.zk !=null
) {  
            try {  
                this.zk.close();  
            } catch ( InterruptedException e ) {}  
        } 

        System.out.println(LOG_PREFIX_OF_THREAD + "释放连接");  
   
}  
   
/** 
     * 检查自己是不是最小的节点 
     * @return 

     */  
   
publicboolean
checkMinPath() throws
KeeperException, InterruptedException {  
         List<String> subNodes = zk.getChildren(GROUP_PATH,
false);  
         Collections.sort(subNodes);  
         int index = subNodes.indexOf(
selfPath.substring(GROUP_PATH.length()+1));  
         switch (index){  
             case -1:{  
              System.out.println(LOG_PREFIX_OF_THREAD+"本节点已不在了..."+selfPath);  
                 return false;  
             } 

             case 0:{  
              System.out.println(LOG_PREFIX_OF_THREAD+"子节点中,我果然是老大"+selfPath);  
                 return true;  
             } 

             default:{ 

                 this.waitPath = GROUP_PATH
+"/"+
subNodes.get(index - 1);  
                 System.out.println(LOG_PREFIX_OF_THREAD+"获取子节点中,排在我前面的"+waitPath);  
                 try{  
                     zk.getData(waitPath, true, new Stat()); 

                     return false;  
                 }catch(KeeperException e){  
                     if(zk.exists(waitPath,false) == null){  
                       System.out.println(LOG_PREFIX_OF_THREAD+"子节点中,排在我前面的"+waitPath+"已失踪,幸福来得太突然?");  
                         return checkMinPath();  
                     }else{  
                         throw e;  
                     }  
                 }  
             } 

                   
         } 

       
   
}  
   
@Override  
   
publicvoid
process(WatchedEvent event) {  
        if(event == null){  
            return; 

        } 

        Event.KeeperState keeperState = event.getState();  
        Event.EventType eventType = event.getType();  
        
        if ( Event.KeeperState.SyncConnected
== keeperState)
{  
            if ( Event.EventType.None == eventType ) {  
             System.out.println( LOG_PREFIX_OF_THREAD
+ "成功连接上ZK服务器" );  
                connectedSemaphore.countDown();  
            }else if (event.getType()
== Event.EventType.NodeDeleted && event.getPath().equals(waitPath)) {  
             System.out.println(LOG_PREFIX_OF_THREAD
+ "收到情报,排我前面的家伙已挂,我是不是可以出山了?");  
                try {  
                    if(checkMinPath()){  
                        getLockSuccess();  
                    }  
                } catch (KeeperException e) {  
                    e.printStackTrace();  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
            } 

        }else if ( Event.KeeperState.Disconnected == keeperState
) {  
         System.out.println( LOG_PREFIX_OF_THREAD
+ "与ZK服务器断开连接" );  
        } else if ( Event.KeeperState.fromInt(4) == keeperState ) { 

         System.out.println( LOG_PREFIX_OF_THREAD
+ "权限检查失败" );  
        } else if ( Event.KeeperState.Expired == keeperState
) {  
         System.out.println( LOG_PREFIX_OF_THREAD
+ "会话失效" );  
        } 

   
}  
}

完全分布部署zookeeper集群查看日志 zookeeper集群使用_apache