前言
本文主要做了一件事,通過kafka橫向擴(kuò)展GeoEvent Server,構(gòu)建GeoEvent+kafka集群部署。這件事有兩個作用,其一,利用多臺GeoEvent提高數(shù)據(jù)的吞吐量。其二,利用kafka集群的機(jī)制來提高GeoEvent Server軟件的魯棒性。
GeoEvent Server是用來實時接入的GIS數(shù)據(jù)的GIS實時服務(wù)器。而對于實時服務(wù)器來說,最重要的是系統(tǒng)的魯棒性(Robustness)。什么是魯棒性?魯棒是Robust的音譯,也就是健壯和強(qiáng)壯的意思。它是在異常和危險情況下系統(tǒng)生存的關(guān)鍵。比如說,計算機(jī)軟件在輸入錯誤、磁盤故障、網(wǎng)絡(luò)過載或有意攻擊情況下,能否不死機(jī)、不崩潰,就是該軟件的魯棒性。所謂“魯棒性”,是指控制系統(tǒng)在一定(結(jié)構(gòu),大小)的參數(shù)攝動下,維持其它某些性能的特性。
自從Esri不推薦使用GeoEvent Server集群,而推薦采用GeoEvent Server單機(jī)部署后,GeoEvent Server的魯棒性就成了用戶關(guān)注的焦點(diǎn)。而現(xiàn)在,GeoEvent團(tuán)隊提供了一個方案,用來提高GeoEvent的魯棒性以及橫向擴(kuò)展GeoEvent的能力。地址:http://www.arcgis.com/home/item.html?id=89048b1cfdda4a71a9b2b334fe8c8cc9。為了完成本教程,請您提前下載此鏈接中教程的附件。
此教程旨在發(fā)布5篇文章,來分別敘述以下五個章節(jié)。本文為第三節(jié)。安裝和配置一個分布式事件調(diào)度中心(Apache Kafka)。
目錄
1 GeoEvent彈性擴(kuò)展架構(gòu)
這一部分的目的是建立企業(yè)和ArcGIS的多個節(jié)點(diǎn)上,將在整個教程的其余部分使用ArcGIS GeoEvent Server。
2 熟悉事件中心概念(Apache Kafka)
本節(jié)中的練習(xí)將幫助您安裝和探索事件調(diào)度中心的特性,包括使用多個broker進(jìn)行冗余和伸縮。
3 安裝和配置一個分布式事件調(diào)度中心(Apache Kafka)
本節(jié)基于前一節(jié),將指導(dǎo)您在三個節(jié)點(diǎn)上安裝和配置分布式事件調(diào)度中心。在本教程中,您將在3臺已配置的GeoEvent Server節(jié)點(diǎn)上安裝事件調(diào)度中心。
4 配置GeoEvent Server啟用分布式事件調(diào)度中心
本節(jié)的目的是在一個分布式的事件調(diào)度中心完成GeoEvent Server配置。具體來說,你將學(xué)習(xí)如何使用Kafka 連接器配置GeoEvent Server接收消費(fèi)從Apache Kafka生產(chǎn)的信息。 自定義連接器可在ArcGIS GeoEvent Gallery找到。
5 探討GeoEvent Server利用分布式事件調(diào)度中心(Apache Kafka)實現(xiàn)魯棒性
最后,在本節(jié)中,您將測試你的GeoEvent Server和kafka部署的魯棒性,通過試驗丟失brokers和丟失consumers,確保預(yù)期的消息仍然被接收并存儲在系統(tǒng)中。
正文
3 安裝和配置一個分布式事件調(diào)度中心(Apache Kafka)
? ? ? ?在上一節(jié)中,您安裝并探索了具有多個broker、分區(qū)話題和多個消費(fèi)者的事件調(diào)度中心(Kafka),但都在單臺計算機(jī)環(huán)境中。在本節(jié)中,您將配置一個分布式事件中心(Kafka)在ArcGIS GeoEvent Server三臺機(jī)器上。
? ? ? ?在下面的練習(xí)中,您將配置三個ZooKeeper實例和三個Kafka broker在三臺不同的計算機(jī)上。在生產(chǎn)環(huán)境中,最好的做法是將這些資源與其他軟件隔離,以獲得最大的可靠性。為簡單起見,在這個練習(xí)中,你將在之前配置的GeoEvent Server機(jī)器上建立分布式事件調(diào)度中心。
配置ZooKeeper實例
在Apache Kafka搭建的分布式事件中心,最好的方法是使用多個ZooKeeper實例實現(xiàn)可靠性。不同的ZooKeeper節(jié)點(diǎn)會協(xié)調(diào)選舉一個主節(jié)點(diǎn),并且當(dāng)前主節(jié)點(diǎn)崩潰掉后,會選取一個新的主節(jié)點(diǎn)。
在每個GeoEvent Server機(jī)器重復(fù)以下步驟(machine3,machine4 和 machine5)為分布式事件調(diào)度中心運(yùn)行ZooKeeper。
首先你需要像上一章“GeoEvent Server橫向伸縮擴(kuò)展(二)——熟悉事件中心概念”里的做法,給每臺GE機(jī)器安裝jdk,解壓提取Apache Kafka下載包。
1.復(fù)制一個文件副本%KAFKA_HOME%\config\zookeeper.properties文件命名為zookeeper-replicated.properties.
2.編輯Zookeeper-replicated.properties文件,指定你將使用的端口。
? ? 注意:如果以這個練習(xí)為例,你在GeoEvent Server節(jié)點(diǎn)上運(yùn)行Zookeeper,確保你使用的端口與ArcGIS Zookeeper平臺服務(wù)運(yùn)行的端口不沖突。
3.取決于windows系統(tǒng),你可能需要更改log文件的路徑。例如:
dataDir=C:\\tmp\\zookeeper
4.添加下面幾行到zookeeper-replicated.properties文件:
initLimit=5
syncLimit=2
initLimit參數(shù)設(shè)定了允許所有跟隨者與領(lǐng)導(dǎo)者進(jìn)行連接并同步的時間,如果在設(shè)定的時間段內(nèi),半數(shù)以上的跟隨者未能完成同步,領(lǐng)導(dǎo)者便會宣布放棄領(lǐng)導(dǎo)地位,進(jìn)行另一次的領(lǐng)導(dǎo)選舉。如果zk集群環(huán)境數(shù)量確實很大,同步數(shù)據(jù)的時間會變長,因此這種情況下可以適當(dāng)調(diào)大該參數(shù)。默認(rèn)為10
syncLimit參數(shù)設(shè)定了允許一個跟隨者與一個領(lǐng)導(dǎo)者進(jìn)行同步的時間,如果在設(shè)定的時間段內(nèi),跟隨者未完成同步,它將會被集群丟棄。所有關(guān)聯(lián)到這個跟隨者的客戶端將連接到另外一個跟隨者。
5.向zookeeper-replicated.properties文件中添加下面幾行,每行用每臺GeoEvent 機(jī)器的全域名限定格式的主機(jī)名替換掉zoo1/zoo2/zoo3.
例如:
server.1=machine3.domain.com:2888:3888
server.2=machine4.domain.com:2888:3888
server.3=machine5.domain.com:2888:3888
第一個端口(2888)是Zookeeper節(jié)點(diǎn)之間相互連接和協(xié)定更新順序所使用的。第二個端口(3888)是用于選舉的端口,更多信息請參考ApacheZookeeper文檔
6.保存并關(guān)閉文件。拷貝這個文件到另外兩個GeoEvent Server節(jié)點(diǎn)機(jī)器上可以節(jié)省重復(fù)以上操作的時間。
完成了以上步驟后,你的每一個GeoEvent Server節(jié)點(diǎn)都成為了ZooKeeper的一員。當(dāng)Zookeeper開始運(yùn)行時,它需要知道它代表的是哪個節(jié)點(diǎn)。你將要創(chuàng)建id文件來告訴ZooKeeper它的節(jié)點(diǎn)(服務(wù)器)的id。
7.訪問C:\tmp\zookeeper,如果不存在請創(chuàng)建。
8.創(chuàng)建一個新文件叫做myid,不帶任何擴(kuò)展名。
? ? 注意一個新文件myid.txt然后重命名移除擴(kuò)展名。
9.使用文本編輯器編輯文件輸入你指定此節(jié)點(diǎn)replicated.properties文件的id
例如,如果在這臺GeoEvent Server節(jié)點(diǎn)你定為Server1,你的myid文件中就應(yīng)該是如下內(nèi)容。
10.保存并關(guān)閉myid文件
11.確定文件存在C:\tmp\zookeeper\myid(沒有文件后綴名)。
12.用下面的命令啟動ZooKeeper:
bin\windows\zookeeper-server-start.bat config\zookeeper-replicated.properties
13.當(dāng)你在每個GeoEvent Server機(jī)器上使用ZooKeeper-replicated.properties配置文件啟動ZooKeeper時,關(guān)于leader選取的消息會出現(xiàn)。
14.在每臺GeoEvent機(jī)器上,保持ZooKeeper命令行開啟,進(jìn)程正在運(yùn)行。方便后面的練習(xí)使用。
配置Kafka broker
使用你前面的練習(xí)中已有的知識在每臺GeoEvent Server機(jī)器上啟動Kafka broker。
1.在%KAFKA_HOME%\config 目錄,編輯server properties 文件(或者創(chuàng)建一個新的)反映Kafka broker在機(jī)器上的配置屬性。
? ?a.設(shè)置broker.id為0,1和2,取決于在哪個GeoEvent Server節(jié)點(diǎn)上。
? ?b.設(shè)置listeners端口,在每個機(jī)器上可以是一樣的端口。
? ?c.為你的日志設(shè)置路徑
? ? ? ?可選項:取決于你的windows版本,你需要修改路徑格式。
? ? ? ?dataDir=c:\\tmp\\kafka-log-0
? ?d.設(shè)置ZooKeeper端口,可以是2183,和之前一樣。
? ?e.添加一個屬性,開啟話題可刪除功能。
2.從命令行運(yùn)行Kafka,使用上一步你剛剛編輯的配置文件:
注意:如果你看到錯誤在ZooKeeper,你可能需要首先停止并重啟ZooKeeper進(jìn)程。
3.保持Kafka broker進(jìn)程運(yùn)行,方便后面的練習(xí)。
配置Kafka訂閱者和生產(chǎn)者
1.使用前面練習(xí)中已有知識創(chuàng)建新話題具有3個分片和3個副本。你可以給話題任意名稱。
bin\windows\kafka-topics.bat --create --zookeeper localhost:2183 --replication-factor 3 --partitions 3 --topic trains
2.使用前面練習(xí)中獲得的創(chuàng)建三個trains話題下的訂閱者/消費(fèi)者,每臺GeoEvent Server 機(jī)器上有一個。
3.當(dāng)你有了三個消費(fèi)者,可以創(chuàng)建生產(chǎn)者在話題上生產(chǎn)消息并開始發(fā)送消息。
例如:
如果你配置的消費(fèi)者沒有一個共有的消費(fèi)者group id ,你將看到相同的消息流向三個消費(fèi)者(在不同的機(jī)器上)。
如果使用共有的消費(fèi)者群組,就會看到消息被分發(fā)到每一個消費(fèi)者上,不出現(xiàn)重復(fù)。
4.可選項:如果需要,你還可以測試分布式部署中的高可用性。
? ?a.不停止你的生產(chǎn)者和消費(fèi)者,在一臺GeoEvent Server機(jī)器上,停止Kafka 進(jìn)程。
? ?b.回到你的生產(chǎn)者命令窗口,繼續(xù)發(fā)送消息。
在所有的三個消費(fèi)者上,你的消費(fèi)者會顯示丟失broker的消息,但會繼續(xù)接收所有的消息。
? ?c.你可以繼續(xù)測試停止掉消費(fèi)者中的一個,然后觀察剩下的兩個消費(fèi)者繼續(xù)接收所有事件。
5.清空。
? ?a.在每一個GeoEvent Server節(jié)點(diǎn),停止消費(fèi)者進(jìn)程,關(guān)閉他們的命令行窗口。
? ?b.結(jié)束生產(chǎn)者進(jìn)程,刪除上一個練習(xí)中創(chuàng)建的分布式話題并關(guān)閉他們的命令行窗口。
? ?c.如果你執(zhí)行了高可用性測試的可選項,你現(xiàn)在有一個已停止的Kafka broker——重啟這個Kafka broker 使用相同的配置文件。
? ?d.保持所有的ZooKeeper實例和Kafka broker都在運(yùn)行狀態(tài),為后面的練習(xí)做準(zhǔn)備。
在這一節(jié)中,你成功的使用Apache Kafka配置了一個分布式事件調(diào)度中心。在下一節(jié)中,你將配置每一個GeoEvent節(jié)點(diǎn)從Kafka話題中接收事件。
本篇教程配置了一個分布式事件調(diào)度中心,可以看出Apache Kafka在做分布式擴(kuò)展時是非常容易配置的。和前一篇的區(qū)別就是跨機(jī)器運(yùn)行。在下一篇文章中,我們將會使用GeoEvent和Kafka結(jié)合,充分利用分布式事件調(diào)度的機(jī)制,事件將會被分發(fā)到各個GeoEvent Server中,確保每個GeoEvent接收的事件不重復(fù),并通過分發(fā)事件,實現(xiàn)GeoEvent橫向擴(kuò)展,提高吞吐量和魯棒性。請期待下一篇文章......