官方文檔:https://zookeeper.apache.org/doc/current/zookeeperOver.html
一滨嘱、zookeeper數(shù)據(jù)結(jié)構(gòu)
ZooKeeper是一個(gè)分布式應(yīng)用程序的分布式協(xié)調(diào)服務(wù)扑庞,主要用來(lái)做注冊(cè)發(fā)現(xiàn)、配置管理、集群管理狭瞎、分布式鎖
ZooKeeper提供的名稱空間與linux系統(tǒng)的名稱空間非常相似。名稱是由斜杠(/)分隔的一系列路徑元素。ZooKeeper命名空間中的每個(gè)節(jié)點(diǎn)都有路徑標(biāo)識(shí),同時(shí)可以存儲(chǔ)少量數(shù)據(jù)
zookeeperServer主要命令
1犀呼、啟動(dòng)Zookeeper服務(wù): bin/zkServer.sh start
2、查看服務(wù)狀態(tài)薇组,包括節(jié)點(diǎn)類型: bin/zkServer.sh status
3外臂、停止服務(wù): bin/zkServer.sh stop
4、重啟服務(wù): bin/zkServer.sh restart
zookeeperClient主要命令
1体箕、客戶端創(chuàng)建連接: bin/zkCli.sh -server localhost:2181
2专钉、查看節(jié)點(diǎn)信息: ls /storm
3、create命令用于創(chuàng)建節(jié)點(diǎn)累铅,其中-s為順序充點(diǎn),-e臨時(shí)節(jié)點(diǎn):
create /zookeeper/node1"test_create" world:anyone:fdsfds
4站叼、delete命令用于刪除節(jié)點(diǎn)娃兽,如delete /nodeDelete
5、set命令用于設(shè)置節(jié)點(diǎn)的數(shù)據(jù)尽楔,如: set /usergrid hellUsergrid
6投储、addauth命令用于節(jié)點(diǎn)認(rèn)證,使用方式:如addauth digest username:password
7阔馋、setAcl命令用于設(shè)置節(jié)點(diǎn)Acl玛荞;Acl由三部分構(gòu)成:
1為scheme,2為user呕寝,3為permission勋眯,一般情況下表示為scheme:id:permissions
二、curator客戶端
<!-- 對(duì)zookeeper的底層api的一些封裝 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.0.0</version>
</dependency>
<!-- 封裝了一些高級(jí)特性下梢,如:Cache事件監(jiān)聽(tīng)客蹋、選舉、分布式鎖 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.0.0</version>
</dependency>
創(chuàng)建會(huì)話
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework zkClient =
CuratorFrameworkFactory.builder()
.connectString(ZKSERVERS)
.sessionTimeoutMs(SESSION_TIMEOUT)
.connectionTimeoutMs(CONNECTION_TIMEOUT)
.retryPolicy(retryPolicy)
.namespace("base")
.build();
zkClient.start();
//業(yè)務(wù)代碼
zkClient.close();
基礎(chǔ)操作
//普通創(chuàng)建
zkClient.create().forPath("/username");
//賦值創(chuàng)建
zkClient.create().forPath("/username", "xiaoqiaobian".getBytes());
//節(jié)點(diǎn)創(chuàng)建(遞歸創(chuàng)建) zkClient.create().creatingParentsIfNeeded().forPath("/user/name/zhangsan","create_data".getBytes());
//修改
zkClient.setData().forPath("/username","zhangsan".getBytes());
//刪除
zkClient.delete().forPath("/username");
// 臨時(shí)節(jié)點(diǎn)創(chuàng)建
zkClient.create().withMode(CreateMode.EPHEMERAL).forPath("/username/lisi");
// 臨時(shí)節(jié)點(diǎn)創(chuàng)建(遞歸創(chuàng)建) zkClient.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/username/wangwu","create_ephemeral_data".getBytes());
三孽江、分布式鎖
cruator實(shí)現(xiàn):通過(guò)創(chuàng)建順序臨時(shí)節(jié)點(diǎn)讶坯,在并發(fā)過(guò)程中去zookeeper中排隊(duì)獲取鎖,當(dāng)?shù)谝粋€(gè)順序獲取鎖時(shí)岗屏,第二個(gè)順序節(jié)點(diǎn)會(huì)被攔截在外辆琅,同時(shí)出發(fā)watch監(jiān)聽(tīng)第一個(gè)節(jié)點(diǎn)狀態(tài),當(dāng)?shù)谝粋€(gè)節(jié)點(diǎn)釋放鎖后这刷,判斷第二個(gè)順序節(jié)點(diǎn)是當(dāng)前優(yōu)先節(jié)點(diǎn)婉烟,使其獲取鎖
InterProcessMutex lock = new InterProcessMutex(zkClient, "/lock");
//獲取鎖
lock.acquire();
Thread.sleep(1000);
//業(yè)務(wù)代碼
getRandom(i);
//釋放所
lock.release();
// 生成隨機(jī)數(shù)
private static void getRandom(int i) {
Random random = new Random();
int result = random.nextInt(10);
System.out.println("第"+i+"個(gè),隨機(jī)數(shù)為" + result);
}