日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux(CentOS)中常用软件安装,使用及异常——Zookeeper, Kafka

發(fā)布時(shí)間:2024/4/11 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux(CentOS)中常用软件安装,使用及异常——Zookeeper, Kafka 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計(jì)與實(shí)踐原理》和《RabbitMQ實(shí)戰(zhàn)指南》,同時(shí)歡迎關(guān)注筆者的微信公眾號(hào):朱小廝的博客。


歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/backend/linux-install-zookeeper-and-kafka/

本文主要是為了記錄在工作中遇到的常用軟件的安裝過程,方便以后遇到相同情形時(shí)可以快速的查閱。主要講述了zookeeper, kafka的安裝。
本文的操作系統(tǒng)采用的是CentOS,可以采用shell命令查閱:lsb_release -a.


Zookeeper

Zookeeper的安裝與配置

可以在http://zookeeper.apache.org/這里下載需要的安裝包。這里采用的是zookeeper-3.4.6.tar.gz安裝包。
1 首先將安裝包解壓:

[root@hidden util]# tar -zxvf zookeeper-3.4.6.tar.gz [root@hidden util]# cd zookeeper-3.4.6 [root@hidden zookeeper-3.4.6]#ls bin dist-maven LICENSE.txt src build.xml docs NOTICE.txt zookeeper-3.4.6.jar CHANGES.txt ivysettings.xml README-packaging.txt zookeeper-3.4.6.jar.asc conf ivy.xml README.txt zookeeper-3.4.6.jar,md5 contrib lib recipes zookeeper-3.4.6.jar.sha1

2 修改系統(tǒng)的環(huán)境變量

[root@hidden zookeeper-3.4.6]#vim /etc/profile #ZooKeeper配置 export ZOOKEEPER_INSTALL=/root/util/zookeeper-3.4.6 export PATH=$PATH:$ZOOKEEPER_INSTALL/bin [root@hidden zookeeper-3.4.6]# source /etc/profile

3 創(chuàng)建Zookeeper的配置文件

[root@hidden zookeeper-3.4.6]#cd conf [root@hidden conf]# cp zoo_example.cfg zoo.cfg

4 配置zoo.cfg

tickTime=2000 #ZooKeeper服務(wù)器心跳時(shí)間,單位為ms initLimit=10 #投票選舉心leader的初始化時(shí)間 syncLimit=5 #leader與follower心跳檢測(cè)最大容忍時(shí)間,響應(yīng)超過syncLimit*tickTime,leader認(rèn)為follower死掉,從服務(wù)器列表中刪除follower clientPort=2181 #端口 dataDir=/tmp/ZooKeeper/data #數(shù)據(jù)目錄 dataLogDir=/tmp/ZooKeeper/log #日志目錄

5 創(chuàng)建配置中的相應(yīng)目錄

cd /tmp mkdir ZooKeeper cd Zookeeper mkdir log mkdir data

或者可以試一下

mkdir -p /tmp/ZooKeeper/data mkdir -p /tmp/ZooKeeper/log

6 啟動(dòng)ZooKeeper

cd /usr/ZooKeeper/bin ./zkServer.sh start

7 可以使用ZooKeeper自帶的客戶端工具來查看ZooKeeper的節(jié)點(diǎn)建立情況(bin/zkCli.sh)
[圖片]

ZooKeeper API使用簡(jiǎn)介

ZooKeeper實(shí)現(xiàn)了一個(gè)層次命名空間的數(shù)據(jù)模型,也可以認(rèn)為它就是一個(gè)小型的、精簡(jiǎn)的文件系統(tǒng)。它的每個(gè)節(jié)點(diǎn)稱為znode, znode除了本身能夠包含一部分?jǐn)?shù)據(jù)之外,還能夠擁有子節(jié)點(diǎn),當(dāng)節(jié)點(diǎn)上的數(shù)據(jù)發(fā)生變化,或者其子節(jié)點(diǎn)發(fā)生變化,基于watcher機(jī)制,會(huì)發(fā)出相應(yīng)的通知給訂閱其狀態(tài)變化的客戶端。
首先,實(shí)例化一個(gè)ZooKeeper對(duì)象,指定其三個(gè)參數(shù)。url為ZooKeeper服務(wù)器的地址。sessionTimeOut為會(huì)話的超時(shí)時(shí)間,ZooKeeper的會(huì)話超時(shí)時(shí)間的長(zhǎng)度由客戶端來確定,但是ZooKeeper的Server端會(huì)有兩個(gè)配置,minSessionTimeout和maxSessionTimeout,minSessionTimeout的值默認(rèn)為2倍的tickTime, maxSessionTimeout的值默認(rèn)為20倍的tickTime,單位都是ms. tickTime也是服務(wù)端的一個(gè)配置項(xiàng),是Server內(nèi)部控制時(shí)間邏輯的最小時(shí)間單位,如果客戶端發(fā)來的sessionTimeout超過minSessionTimeout~maxSessionTimeout這個(gè)范圍,Server會(huì)自動(dòng)取minSessionTimeout或者maxSessionTimeout作為sessionTimeout, 然后為這個(gè)Client新建一個(gè)session對(duì)象。最后一個(gè)參數(shù)為默認(rèn)的watcher.如果包含boolean watch的讀方法中傳入true, 則將默認(rèn)的watcher注冊(cè)為所關(guān)注時(shí)間的watcher,如果傳入false,則不注冊(cè)任何watcher,這里暫且定為空。

ZooKeeper zooKeeper = new ZooKeeper(url,sesssionTimeout,null);//注意將安裝目錄下的zookeeper的jar包拷貝出來導(dǎo)入你的project的libs中;zookeeper的默認(rèn)端口號(hào)為2181

1 創(chuàng)建節(jié)點(diǎn)
通過ZooKeeper的API新增一個(gè)znode節(jié)點(diǎn),節(jié)點(diǎn)在被創(chuàng)建時(shí),需要制定節(jié)點(diǎn)的路徑(此處為/root)包含的字節(jié)數(shù)據(jù),訪問權(quán)限(如果不想設(shè)置,則制定為Ids.OPEN_ACL_UNSAFE),以及創(chuàng)建的節(jié)點(diǎn)類型,節(jié)點(diǎn)的類型如表所示:

節(jié)點(diǎn)類型解釋
CreateMode.PRESISTENT持久節(jié)點(diǎn),該節(jié)點(diǎn)在客戶端斷開連接后不會(huì)刪除
CreateMode.EPHEMERAL臨時(shí)節(jié)點(diǎn),該節(jié)點(diǎn)在客戶端斷開連接后刪除
CreateMode.PERSISTENT_SEQUENTIAL持久節(jié)點(diǎn),該節(jié)點(diǎn)在客戶端斷開后不會(huì)刪除,并將在其名下附加一個(gè)單調(diào)遞增數(shù)
CreateMode.EPHEMERAL_SEQUENTIAL臨時(shí)節(jié)點(diǎn),該節(jié)點(diǎn)在客戶端斷開后刪除,并將在其名下附加一個(gè)單調(diào)遞增數(shù)

創(chuàng)建節(jié)點(diǎn)實(shí)例:

//創(chuàng)建/root節(jié)點(diǎn),其包含的數(shù)據(jù)為“root data",訪問權(quán)限為開放,所有人均可以訪問,創(chuàng)建模式為持久化節(jié)點(diǎn) zooKeeper.create("/root","root data".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

2 刪除節(jié)點(diǎn)
當(dāng)不需要某個(gè)節(jié)點(diǎn),或者某個(gè)節(jié)點(diǎn)上的信息已經(jīng)失效時(shí),使用delete方法可以將該節(jié)點(diǎn)刪除,刪除時(shí)需要制定節(jié)點(diǎn)的版本號(hào)version,如果設(shè)置為-1,則匹配所有的版本,ZooKeeper會(huì)比較刪除的節(jié)點(diǎn)版本是否和服務(wù)器上的版本一致,如果不一致則拋出異常。
刪除節(jié)點(diǎn)實(shí)例:

zooKeeper.delete("/root",-1);

3 設(shè)置和獲取節(jié)點(diǎn)內(nèi)容
如果想在已有節(jié)點(diǎn)中保存數(shù)據(jù),可以通過ZooKeeper的setData方法,將數(shù)據(jù)保存到節(jié)點(diǎn)上,也可以通過ZooKeeper的getData方法來獲取該節(jié)點(diǎn)保存的數(shù)據(jù),一個(gè)znode中最多能夠保存1MB的數(shù)據(jù)。
設(shè)置和獲取節(jié)點(diǎn)內(nèi)容的實(shí)例。

//設(shè)置/root節(jié)點(diǎn)的數(shù)據(jù),版本號(hào)為-1,如果匹配不到相應(yīng)的節(jié)點(diǎn),會(huì)拋出異常 zooKeeper.setData("/root","hello".getBytes(),-1); //取得/root節(jié)點(diǎn)的數(shù)據(jù),并反回其stat Stat stat = new Stat(); byte[] data = zooKeeper.getData("/root",false,stat);

setData方法設(shè)置/root節(jié)點(diǎn)的數(shù)據(jù)為“hello",getData方法取得root節(jié)點(diǎn)上保存的節(jié)點(diǎn)數(shù)據(jù),false表示不使用默認(rèn)的watcher,第三個(gè)參數(shù)為Stat, 表示節(jié)點(diǎn)的狀態(tài),是一個(gè)傳出的參數(shù),將會(huì)返回該節(jié)點(diǎn)當(dāng)前的狀態(tài)信息。
4 添加子節(jié)點(diǎn)
ZooKeeper支持在已有的節(jié)點(diǎn)下添加子節(jié)點(diǎn),同樣也是用使用create()方法,但是父節(jié)點(diǎn)必須存在,否則會(huì)跑出異常。
創(chuàng)建子節(jié)點(diǎn)的實(shí)例:

zooKeeper.create("/root","root data".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zooKeeper.create("/root/child","child data".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

5 判斷節(jié)點(diǎn)是否存在
當(dāng)進(jìn)行系統(tǒng)初始化時(shí),或者當(dāng)前需要給一個(gè)節(jié)點(diǎn)創(chuàng)建子節(jié)點(diǎn)時(shí),通常需要判斷系統(tǒng)中的一些節(jié)點(diǎn)是否存在。

Stat stat = zooKeeper.exists("/root/child1",false); if(stat==null){ System.out.println("節(jié)點(diǎn)不存在"); }else{ System.out.println("節(jié)點(diǎn)存在"); }

判斷/root/child1節(jié)點(diǎn)是否存在,如果存在,返回stat不為null,否則為null.
6 watcher的實(shí)現(xiàn)
當(dāng)節(jié)點(diǎn)的狀態(tài)發(fā)生變化,通過watcher機(jī)制,可以讓客戶端得到通知,watcher需要實(shí)現(xiàn)org.apache.ZooKeeper.Watcher接口。節(jié)點(diǎn)的狀態(tài)變化主要包含如表所示的幾種情況。

節(jié)點(diǎn)狀態(tài)變化解釋
EventType.NodeDeleted刪除節(jié)點(diǎn)
EventType.NodeChildrenChanged修改節(jié)點(diǎn)的子節(jié)點(diǎn)
EventType.NodeCreated創(chuàng)建節(jié)點(diǎn)
EventType.NodeDataChanged修改節(jié)點(diǎn)數(shù)據(jù)

watcher的實(shí)現(xiàn)實(shí)例:

public class ZKWatcher implements Watcher{ @Override public void process(WacthedEvent event){ if(event.getType()==EventType.NodeDeleted) //del if(event.getType()==EventType.NodeChildrenChanged ) //del if(event.getType()==EventType.NodeCreated) //del if(event.getType()==EventType.NodeDataChanged ) //del } }

需要注意的是,ZooKeeper的watcher是一次性的,也就是說,每次在處理完?duì)顟B(tài)變化時(shí)間之后,需要重新注冊(cè)watcher,這一點(diǎn)很讓人抓狂。這個(gè)特性也使得在處理時(shí)間和重新加上watcher這段時(shí)間發(fā)生的節(jié)點(diǎn)狀態(tài)變化將無法被感知。

異常

1 ZooKeeer常常發(fā)生下面兩種系統(tǒng)異常:
org.apache.ZooKeeper.KeeperException.ConnectionLossException,客戶端與其中的一臺(tái)服務(wù)器socket連接出現(xiàn)異常,連接丟失;
org.apache.ZooKeeper.KeeperException.SessionExpiredException, 客戶端的session已經(jīng)超過sessionTimeout,未進(jìn)行任何操作。
ConnectionLossException異??梢酝ㄟ^重試進(jìn)行處理,客戶端會(huì)根據(jù)初始化ZooKeeper時(shí)傳遞的服務(wù)列表,自動(dòng)嘗試下一個(gè)服務(wù)端節(jié)點(diǎn),而在這段時(shí)間內(nèi),服務(wù)端節(jié)點(diǎn)變更的事件就會(huì)丟失。
SessionExpiredException異常不能通過重試解決,需要應(yīng)用重新創(chuàng)建一個(gè)新的客戶端(new ZooKeeper()),這時(shí)所有的watcher和EPHEMERAL節(jié)點(diǎn)都將失效。
一般情況下,不采用原生態(tài)的API進(jìn)行客戶端操作,而是采用zkClient或者Curator進(jìn)行操作,這個(gè)會(huì)在后續(xù)的文章中講述。
2 異常

2016-08-04 20:12:54 -[INFO] - [Opening socket connection to server xx.xx.xx.86/xx.xx.xx.86:2181. Will not attempt to authenticate using SASL (unknown error)] - [org.apache.zookeeper.ClientCnxn$SendThread:975] 2016-08-04 20:12:55 -[WARN] - [Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect] - [org.apache.zookeeper.ClientCnxn$SendThread:1102] java.net.ConnectException: Connection refused: no further informationat sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)at sun.nio.ch.SocketChannelImpl.finishConnect(Unknown Source)at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:361)at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1081)

原因:

  • 網(wǎng)絡(luò)不通,端口不可用等;
  • zookeeper服務(wù)程序未正常啟動(dòng);
  • 防火墻未關(guān)閉;

  • Kafka

    Kafka的安裝與配置

    Kafka的下載頁面:http://kafka.apache.org/downloads.html。下載之后解壓:

    [root@hidden util]# tar -zxvf kafka_2.8.9-0.8.1.1 [root@hidden util]# cd kafka_2.8.9-0.8.1.1 [root@hidden util]# ls bin config libs LICENSE logs NOTICE

    /bin 啟動(dòng)和停止命令等
    /config 配置文件
    /libs 類庫

    啟動(dòng)

    在Kafka啟動(dòng)之前需要先啟動(dòng)ZooKeeper:

    bin/zookeeper-server-start.sh config/zookeeper.properties

    之后啟動(dòng)Kafka Server:

    bin/kafka-server-start.sh config/server.properties

    停止kafka:

    bin/kafka-server-stop.sh

    停止zookeeper

    bin/zookeeper-server-stop.sh

    測(cè)試

    運(yùn)行producer

    bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

    運(yùn)行consumer

    bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning

    在producer端輸入字符串并回車,查看consumer端是否顯示。

    關(guān)于kafka的介紹以及在java中如何操作kafka會(huì)在之后的博文中展開介紹。


    參考資料

  • 《大型分布式網(wǎng)站架構(gòu)設(shè)計(jì)與實(shí)踐》陳康賢著。
  • Zookeeper 安裝和配置
  • Kafka 安裝和測(cè)試
  • 歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/backend/linux-install-zookeeper-and-kafka/

    歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計(jì)與實(shí)踐原理》和《RabbitMQ實(shí)戰(zhàn)指南》,同時(shí)歡迎關(guān)注筆者的微信公眾號(hào):朱小廝的博客。


    總結(jié)

    以上是生活随笔為你收集整理的Linux(CentOS)中常用软件安装,使用及异常——Zookeeper, Kafka的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。