linux之zookeeper-3.4.10安裝,命令行命令簡單使用及JAVA API的簡單實現
zookeeper-3.4.10在linux上安裝步驟
準備工作,將zookeeper-3.4.10文件上傳到服務器上
第一步,執行**tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/**命令,將文件解壓到opt下的module目錄下(根據自己上傳的版本更改命令,module目錄需要提前創建好)
第二步,移動到module目錄下的ZK文件夾中
cd /opt/module/zookeeper-3.4.10/
第三步,創建zkData文件夾,然後進入conf文件夾
mkdir zkData
cd conf/
第四步,將zoo_sample.cfg文件重命名爲zoo.cfg
mv zoo_sample.cfg zoo.cfg
第五步,打開zoo.cfg文件,將dataDir的值改爲剛剛創建的zkData的路徑
vi zoo.cfg
然後在最後增加代碼(主機名改爲自己linux系統對應的主機名,需要注意與hosts文件中的主機名一致)
#######################cluster##########################
server.1=bigdata2:2888:3888
server.2=bigdata1:2888:3888
server.3=bigdata3:2888:3888
第六步,進入到zkData文件夾中,創建並打開myid文件
在裏面輸入數值,數值與之前在zoo.cfg文件中設定的一致
server.1=bigdata2:2888:3888
第七步,回退到model目錄中
第八步,將zookeeper複製到其他linux系統上
scp -r zookeeper-3.4.10/ bigdata1:`pwd`
pwd代表相對路徑,也可以使用下面的絕對路徑
scp -r zookeeper-3.4.10/ bigdata1:'/opt/module/'
運行後結果如下:
第九步,將bigdata1和bigdata3的myid進行修改
第十步,配置環境變量
export ZK_HOME=/opt/module/zookeeper-3.4.10
export PATH=$PATH:$ZK_HOME/bin
第十一步,檢驗安裝配置成功
輸入zkS然後按tab鍵,如果可以自動將其補全爲zkServer.就代表配置成功
命令行操作
1.啓動zookeeper(集羣,最少兩個)
啓動集羣
zkServer.sh start
查看當前節點的zk狀態
zkServer.sh status
2.啓動zk客戶端
進入到ZK目錄下
cd /opt/module/zookeeper-3.4.10/
執行zkCli命令
bin/zkCli.sh
常用命令:
help:顯示所有操作命令
create:普通創建(永久節點)-s 含有序列 -e 臨時(重啓或者超時消失)
create /app1 "hello app1"
create /app1/server101 "192.168.1.101"
//創建短暫節點,退出當前客戶端然後再重啓客戶端,該節點消失
create -e /app-emphemeral 8888
//創建帶序號的節點,Created /app2/aa0000000000
create -s /app2/aa 888
get path [watch]:獲得節點的值
get /app1
get /app1/server101
set:設置節點的具體值
ls path [watch]:使用 ls 命令來查看當前znode中所包含的內容
ls /
ls / watch
delete:刪除節點
rmr:遞歸刪除節點
提升學歷
正規學信網可查,考研,考編,考公務員
必備學歷,
週期兩年半,請爲自己的未來做好鋪墊
如有需要請私信聯繫
JAVA API的簡單應用
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Zookeeper</groupId>
<artifactId>Zookeeper</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
API 簡單應用
import org.apache.zookeeper.*;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
public class Zookeeper {
//鏈接ZooKeeper集羣
private String connectString = "bigdata2:2181,bigdata1:2181";
private int sessionTimeout = 2000;
private ZooKeeper zkClient = null;
/**
*
* @throws IOException
*/
@Before
public void init() throws IOException {
//鏈接客戶端
zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println(watchedEvent.getType() + "--" + watchedEvent.getPath());
try {
zkClient.getChildren("/",true);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
/**
* 參數的意思分別是:
* 參數1-2:key-value
* 參數3:權限
* 參數4:類型(臨時|永久|序列化)
* @throws KeeperException
* @throws InterruptedException
*/
@Test
public void create() throws KeeperException, InterruptedException {
//主節點,節點的內容,
zkClient.create("/bigdataaaaaa",
"bigdataaaaaaaaaa".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
}
}
分佈式秒殺
pom.xml
<!-- zookeeper所需依賴 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>16.0.1</version>
</dependency>
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;
public class TestDistributedLock {
//定義共享資源
private static int count = 10;
private static void printCountNumber() {
System.out.println("***********" + Thread.currentThread().getName() + "**********");
System.out.println("當前值:" + count);
count--;
//睡2秒
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("***********" + Thread.currentThread().getName() + "**********");
}
public static void main(String[] args) {
//定義客戶端重試的策略
RetryPolicy policy = new ExponentialBackoffRetry(1000, //每次等待的時間
10); //最大重試的次數
//定義ZK的一個客戶端
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString("bigdata111:2181")
.retryPolicy(policy)
.build();
//在ZK生成鎖 ---> 就是ZK的目錄
client.start();
final InterProcessMutex lock = new InterProcessMutex(client, "/mylock");
// 啓動10個線程去訪問共享資源
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
public void run() {
try {
//請求得到鎖
lock.acquire();
//訪問共享資源
printCountNumber();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
//釋放鎖
try {
lock.release();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
}
}