1. 程式人生 > >2-3安裝zoekeeper

2-3安裝zoekeeper

zk選舉有種簡單的理解方式,當zk啟動時候,假如有5個節點,當第一個zk節點啟動的時候,它會比較一下自己的id是否大於總節點數的一半(1<5/2),不大於,所以它不是master,同理第二個啟動的時候(2<5/2),所以它也不是,第三個啟動的時候(3>5/2),所以第三個就是master了,後邊的節點都不是了。當master掛了以後,也按此法選舉

Zookeeper詳解
zookeeper原理性詳解
一、單機模式
  獲取地址 : http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz

解壓到,這邊解壓複製到到  /usr 目錄下

  

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

tar -zxvf  zookeeper-3.4.11.tar.gz


在/tmp/linge/zptm下建立了data目錄及data日誌目錄用於存放資料

mkdir /tmp/linge/zptm/data
mkdir /tmp/linge/zptm/dataLog

進入zookeeper目錄下的conf目錄,複製zoo_sample.cfg為zoo.cfg,並將內容修改如下

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/linge/zptm/data
dataLogDir=/tmp/linge/zptm/dataLog
clientPort=2181
autopurge.snapRetainCount=500
autopurge.purgeInterval=24


 #tickTime:Zookeeper 伺服器之間或客戶端與伺服器之間心跳的時間間隔。
 #dataDir:Zookeeper 儲存資料的目錄,預設情況下,Zookeeper 將寫資料的日誌檔案也儲存在這個目錄裡。
 #clientPort:Zookeeper 伺服器監聽埠,用來接受客戶端的訪問請求。 

 

補充: 

  記得配  etc/profile

 


配置完以後,就可以啟動zookeeper服務了,進入Zookeeper/bin目錄,執行下面的命令來啟動Zookeeper服務

   ./zkServer.sh start  
    JMX enabled by default  
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg  
    Starting zookeeper ... STARTED  

啟動後可以使用下面的命令檢視服務
 

   $ ./zkServer.sh status  
    JMX enabled by default  
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg  
    Mode: standalone  

在Zookeeper伺服器啟動以後,就可以使用Zookeeper的客戶端來連線並測試了。

   

 $ ./zkCli.sh  
    或  
    $ ./zkCli.sh -server 127.0.0.1:2181 

 

二、偽叢集模式
建立偽叢集資料夾

mkdir /usr/zookeeperGroup

在此主資料夾下建三個資料夾,並分別子啊資料夾下解壓一個zookeeper壓縮包,建立data、dataLog、logs資料夾
mkdir service1
mkdir service2
mkdir service3

我解壓後的資料夾名字分別為zookeeper1、zookeeper2、zookeeper3
進入解壓後的資料夾

vim zookeeper1/conf/zoo_sample.cfg
我這邊linux的ip地址是192.168.88.129,故我修改為
# 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 directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/usr/zookeeperGroup/server1/data
dataLogDir=/usr/zookeeperGroup/server1/dataLog
# 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
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=192.168.88.129:2888:3888
server.2=192.168.88.129:2889:3889
server.3=192.168.88.129:2890:3890
然後退回上一個目錄,進入data目錄,建立一個myid的檔案,裡面寫入一個數字,比如我這個是server1,那麼就寫一個1,server2對應myid檔案就寫入2,server3對應myid檔案就寫個3

需要注意的是

①   clientPort這個埠如果你是在1臺機器上部署多個server,那麼每臺機器都要不同的clientPort,比如我server1是3181(2181這個埠好像被佔用了),server2是2182,server3是2183,dataDir和dataLogDir也需要區分下。

②   server.X 這個數字就是對應 data/myid中的數字。你在3個server的myid檔案中分別寫入了1,2,3,那麼每個server中的zoo.cfg都配server.1,server.2,server.3就OK了。因為在同一臺機器上,後面連著的2個埠3個server都不要一樣,否則埠衝突,其中第一個埠用來叢集成員的資訊交換,第二個埠是在leader掛掉時專門用來進行選舉leader所用。

最後分別進入每一個zookeeper/bin目錄下啟動服務,啟動完後觀看狀態  

.zkServer.sh  status   //會有follwer 和leader之一
進入任意一個伺服器的zookeeper/bin目錄下,啟動一個客戶端,接入服務。

例如zookeeper1

./zkCli.sh –server 192.168.88.129:2181 

三、叢集模式
將偽叢集上的檔案部署到不同的linux上即可

四、示例程式碼
所需jar包,官方下載,然後需要自己額外下載一個slf4的Jar包,否則報classnofoundException

package Demo;
 
import java.io.IOException;
 
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
 
public class MyZookeeper {
   
 
     //回話超時時間,設定為與系統預設時間一致
    private static final int SESSION_TIMEOUT = 30000;
    //建立ZooKeeper例項
    ZooKeeper zk;
    //建立Watcher例項
    Watcher wh = new Watcher() {
    
       @Override
       public void process(WatchedEvent event) {
           System.out.println(event.toString());
       }
    };
    
    //初始化ZooKeeper例項
    private void createZKInstance() throws IOException {
       zk = new ZooKeeper("192.168.88.129:2181,192.168.88.129:2182,192.168.88.129:2183",MyZookeeper.SESSION_TIMEOUT,this.wh);
    }
    
    private void ZKOperations() throws KeeperException, InterruptedException {
       System.out.println("\n1. 建立 ZooKeeper 節點 (znode : zoo2, 資料: myData2 ,許可權: OPEN_ACL_UNSAFE ,節點型別: Persistent");
       zk.create("/zoo2", "myData2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
       System.out.println("\n2.檢視是否建立成功:");
       System.out.println(new String(zk.getData("/zoo2", false, null)));
       System.out.println("\n3.修改節點資料");
       zk.setData("/zoo2", "toto".getBytes(), -1);
       System.out.println("\n4.檢視是否修改成功:");
       System.out.println(new String(zk.getData("/zoo2", false, null)));
       System.out.println("\n5.刪除節點");
       zk.delete("/zoo2", -1);
       System.out.println("\n6.檢視節點是否被刪除:");
       System.out.println("節點狀態:[" + zk.exists("/zoo2", false) + "]");
    }
    
    private void ZKClose() throws InterruptedException {
       zk.close();
    }
    
    public static void main(String[] args) throws KeeperException, InterruptedException, IOException {
        MyZookeeper dm = new MyZookeeper();
       dm.createZKInstance();
       dm.ZKOperations();
       dm.ZKClose();
    }
}


通解:

讀寫機制

l Zookeeper是一個由多個server組成的叢集

l 一個leader,多個follower

l 每個server儲存一份資料副本

l 全域性資料一致

l 分散式讀寫

l 更新請求轉發,由leader實施