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實施