前言
本文主要做了一件事,通過kafka橫向擴展GeoEvent Server,構建GeoEvent+kafka集群部署。這件事有兩個作用,其一,利用多臺GeoEvent提高數據的吞吐量。其二,利用kafka集群的機制來提高GeoEvent Server軟件的魯棒性。
GeoEvent Server是用來實時接入的GIS數據的GIS實時服務器。而對于實時服務器來說,最重要的是系統的魯棒性(Robustness)。什么是魯棒性?魯棒是Robust的音譯,也就是健壯和強壯的意思。它是在異常和危險情況下系統生存的關鍵。比如說,計算機軟件在輸入錯誤、磁盤故障、網絡過載或有意攻擊情況下,能否不死機、不崩潰,就是該軟件的魯棒性。所謂“魯棒性”,是指控制系統在一定(結構,大小)的參數攝動下,維持其它某些性能的特性。
自從Esri不推薦使用GeoEvent Server集群,而推薦采用GeoEvent Server單機部署后,GeoEvent Server的魯棒性就成了用戶關注的焦點。而現在,GeoEvent團隊提供了一個方案,用來提高GeoEvent的魯棒性以及橫向擴展GeoEvent的能力。地址:http://www.arcgis.com/home/item.html?id=89048b1cfdda4a71a9b2b334fe8c8cc9
此教程旨在發布5篇文章,來分別敘述以下五個章節。本文為第二節。熟悉事件中心概念(Apache Kafka)。
目錄
1 GeoEvent彈性擴展架構
這一部分的目的是建立企業和ArcGIS的多個節點上,將在整個教程的其余部分使用ArcGIS GeoEvent Server。
2 熟悉事件中心概念(Apache Kafka)
本節中的練習將幫助您安裝和探索事件調度中心的特性,包括使用多個broker進行冗余和伸縮。
3 安裝和配置一個分布式事件調度中心(Apache Kafka)
本節基于前一節,將指導您在三個節點上安裝和配置分布式事件調度中心。在本教程中,您將在3臺已配置的GeoEvent Server節點上安裝事件調度中心。
4 配置GeoEvent Server啟用分布式事件調度中心
本節的目的是在一個分布式的事件調度中心完成GeoEvent Server配置。具體來說,你將學習如何使用Kafka 連接器配置GeoEvent Server接收消費從Apache Kafka生產的信息。 自定義連接器可在ArcGIS GeoEvent Gallery找到。
5 探討了GeoEvent Server利用分布式事件調度中心(Apache Kafka)實現魯棒性
最后,在本節中,您將測試你的GeoEvent Server和kafka部署的魯棒性,通過試驗丟失brokers和丟失consumers,確保預期的消息仍然被接收并存儲在系統中。
正文
2 熟悉事件中心概念(Apache Kafka)
? ? ? ?在本節中,您將探索事件中心的概念。在這種情況下,事件調度中心是接收消息并將它們分發給一個或多個輸出的軟件。理想的情況是,一個事件的中心也允許傳入的消息可以并行來獲得更好的性能。在本教程中,您將使用Apache卡夫卡作為事件調度中心。
? ? ? ?本節中的練習提供了通過命令行使用卡夫卡的基本介紹。有關更多信息,請參見官方的Apache Kafka文檔。
? ? ? ?為了節省時間,建議這個練習你安裝和實驗kafka的是一個GeoEvent服務器節點的機器。
安裝Apache Kafka和必要的組件
1.下載并安裝jdk8 網址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
2.設置系統變量JAVA_HOME為C:\Program Files\Java\jdk1.8.0_111
? ?添加path:C:\Program Files\Java\jdk1.8.0_111\bin;
3.下載Apache Kafka 2.11-0.10.1.0 地址:https://www.apache.org/dyn/closer.cgi?path=/kafka/0.10.1.0/kafka_2.11-0.10.1.0.tgz
? ?解壓到C:\并創建一個系統變量KAFKA_HOME=C:\kafka_2.11-0.10.1.0
4.啟動Zookeeper
? ?ZooKeeper服務器軟件,支持分布式協調和同步服務組。它也集中配置信息維護和命名。
? ?a.找到%KAFKA_HOME\config\zookeeper.properties 用記事本打開。
? ?b.更改clientPort一行。這個端口不能被機器上任何程序占用。更改clientPort=2181為 ? ? ? ? ?clientPort=2183
? ?c.更改日志文件存放目錄為dataDir=C:\\tmp\\zookeeper
? ?d.保存并關閉zookeeper.properties
? ?e.打開命令行(管理員)
? ?f.輸入如下命令來啟動ZooKeeper:
? ? cd %KAFKA_HOME%
? ? title zookeeper
? ? bin\windows\zookeeper-server-start.bat config\zookeeper.properties
? ? 可以看到出現了很多消息
? ?g.保持這個命令窗口開啟,以方便等會停止zookeeper的操作。
? ?你已經在machine3成功的啟動了Zookeeper。接下來的練習是指導你通過一個簡單的kafka設置啟動一個單broker的kafka。
使用單個broker配置和測試kafka
? ? kafka是一個分布式的消息系統。一個broker是kafka集群中的一個節點。
1.訪問%KAFKA_HOME%\config\ 打開server.properties in a text editor。
2取消掉這句話的注釋
? ? listeners=PLAINTEXT://:9092
3更新ZooKeeper端口
? ? zookeeper.connect=localhost:2183
4.增加一行如下內容,這將允許您刪除話題。
? ? delete.topic.enable=true
5.日志路徑,取決于windos版本
? ? log.dirs=C:\\tmp\\kafka-logs
6.新開啟一個命令行運行kafka,使用下面的命令
? ? cd %KAFKA_HOME%
? ? title kafka0
? ? bin\windows\kafka-server-start.bat config\server.properties
? ? 會看到各類消息出現,保持這個命令行窗口開啟。
7.創建一個Kafka話題:
? ? kafka話題就是消息在kafka中的組織方式。消費者訂閱話題,生產者將消息推送到話題上。一個話題本質上是流經系統的潛在的許多獨立的數據流之一。
? ?a.打開一個命令行,創建一個分片數為1,復制因子為1的kafka話題。
? ? cd %KAFKA_HOME%
? ? title topics
? ? bin\windows\kafka-topics.bat --create --zookeeper localhost:2183 --replication-factor 1 --partitions 1 --topic test
? ? ? ?分片數是kafka話題被分割成的份數。你可以通過使用多個分區,使消息分割成多份同時進入多個kafka節點,并行這個話題,實現消息的高吞吐量。
? ? ? ?復制因子決定了一條消息被復制多少份。有一個以上的副本相當于有備份數據,有助于高可用性。在這個練習中,此kafka話題只有一個分區,因此每個消息只能有一個分區。
? ?c.使用以下命令可以查看Kafka的話題列表
? ? bin\windows\kafka-topics.bat --list --zookeeper localhost:2183
? ?d.現在你的話題test已經創建完畢,最小化topics命令窗口
8.從Kafka話題消費接收消息。
? ?Kafka 消費者通過訂閱話題來接收消息,消息的順序按照出現在Kafka日志中的順序。
? ?a.打開一個管理員權限的命令窗口。
? ?b.輸入以下命令,在Kafka broker中創建一個消費者來接收“test”話題。
? ? cd %KAFKA_HOME%
? ? title consumer
? ? bin\windows\kafka-console-consumer.bat --zookeeper localhost:2183 --topic test --from-beginning
? ?輸入完命令后,進入消費者模式。
? ?c.保持consumer命令行窗口可見。稍后會通過它查看接收消息的情況。
9.在Kafka話題上生產消息
? ? ? ?Kafka生產者推送消息到Kafka話題上。更具體的來說,一個生產者應用程序寫入消息到話題分區的leader上,所以分區必須在寫入發生前被選中。Kafka包含了消息分割和負載均衡的基本邏輯。無論如何,定制的生產者應用程序通過分析手頭的工作流來實現這種邏輯。
? ?a.打開一個管理員命令行窗口。
? ?b.輸入如下命令在Kafka broker上創建一個生產者,用來向test話題發送消息。注意指定broker正在運行的端口
? ? cd %KAFKA_HOME%
? ? title producer
? ? bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic test
? ?輸入完這些命令,你會進入生產者模式并且這個程序已經做好了準備去發送消息
? ?c.在producer命令窗口中輸入一些文字,敲擊回車鍵進行發送。
? ?d.在消費者命令窗口,你可以看到相同的消息已經被此消費者接收。
? ?在這個例子中,只有一個生產者和一個消費者,所以,這個消費者接收到了所有被生產的消息。
10.清空
? ?a.在消費者和生產者窗口都執行以下操作:
? ? ? i.敲擊ctrl+c 結束這個進程。
? ? ? ii.在出現提示后,輸入Y來終止批處理進程。
? ? ? iii.兩個進程都停止后,你可以關閉消費者的命令窗口,留下生產者的命令窗口用于接下來的練習。
? ?b.在topics命令窗口,輸入以下命令來刪除test話題。
? ? ? bin\windows\kafka-topics.bat --zookeeper localhost:2183 --delete --topic test
? ?c.在kafka運行的kafka0命令窗口:
? ? ? i.輸入Ctrl+c打斷Kafka進程。
? ? ? ii.出現提示后,輸入Y來終止這個命令行運行。
? ? 這將確保想要刪除的test話題被刪除。
? ? 留下kafka0命令窗口不要關閉,你會在下一個練習中用到它。
? ?d.不要對Zookeeper命令窗口做任何更改,ZooKeeper需要為了后面的練習繼續運行。
使用3個broker配置和測試kafka
kafka可以在多個節點組成的集群中運行,以獲得高可用性和可伸縮性。在這個練習中,你將通過在同一臺計算機上創建3個broker來模擬多個節點。
1.將%KAFKA_HOME%\config\server.properties文件復制3份,分別命名為。
? ?server-0.properties
? ?server-1.properties
? ?server-2.properties
2.在每個文件中修改指定的broker id 分別為0,1和2.
? ?broker.id=0
3.在每一個文件中修改下面這行,在你的機器上指定不同的端口。
? ? tips:因為您將要在一臺機器上運行3個brokers,每一個broker都需要指定一個不同的監聽端口,如9092,9093和9094
? ? listeners=PLAINTEXT://:9092
4.在每一個文件中,修改日志路徑為原始路徑+broker編號。
如 log.dirs=C:\\tmp\\kafka-logs-0
5.在每個文件中,更新zookeeper端口為正在運行的這個zookeeper占用的端口。
? ?zookeeper.connect=localhost:2183
6.在文件底部,添加一行,通過它,允許刪除話題。
# Delete enablement?
delete.topic.enable=true
7.啟動3個kafka brokers
? ?a.打開3個管理員命令行,如果你在上一個練習中預留了kafka0命令行窗口沒有關閉,你可以只打開2個命令行窗口。
? ?b.在每個命令行窗口中。輸入以下命令啟動kafka。指定3個不同的題目名稱和不同的配置文件。
cd %KAFKA_HOME%
title kafka0
bin\windows\kafka-server-start.bat config\server-0.properties
你應該看到出現各種消息。你可以最小化命令窗口,但是保持他們是開啟狀態,這樣你能輕易的停止kafka。
8.創建一個分布式的kafka話題
? ?a.在topics命令窗口,輸入以下命令以創建一個具有3個分片,3個復制因子的kafka話題taxis。
? ? ?bin\windows\kafka-topics.bat --create --zookeeper localhost:2183 --replication-factor 3 --partitions 3 --topic taxis
? ?b. 輸入以下命令查看新話題taxis的描述
? ? ? bin\windows\kafka-topics.bat --describe --zookeeper localhost:2183 –-topic taxis
? ?在這個例子中:
? ?Broker 2 是 Partition 0的指揮者
? ?Broker 0 是 Partition 1的指揮者
? ?Broker 1 是 Partition 2的指揮者
? ?因為你有和副本數相同數量的broker。每個broker都維護每一個分片的一個副本。
? ?c.你可以最小化topics命令窗口。
9.在分布式kafka話題taxis上生產和消費消息
? ?a.以管理員身份打開3個命令窗口
? ?b.在三個命令窗口中輸入以下命令分別創建3個taxis話題下的消費者。
? ? ?cd %KAFKA_HOME%
? ? ?title consumer0
? ? ?bin\windows\kafka-console-consumer.bat --zookeeper localhost:2183 --topic taxis
? ? ?cd %KAFKA_HOME%
? ? ?title consumer1
? ? ?bin\windows\kafka-console-consumer.bat --zookeeper localhost:2183 --topic taxis
? ? ?cd %KAFKA_HOME%
? ? ?title consumer2
? ? ?bin\windows\kafka-console-consumer.bat --zookeeper localhost:2183 --topic taxis
? ?c.在生產者命令窗口,輸入以下命令來給taxis話題設置一個生產者。
? ? ? bin\windows\kafka-console-producer.bat --broker-list localhost:9092,localhost:9093,localhost:9094 --topic taxis
? ? ?為了確保可靠性,當消息寫入一個話題時,生產者應用程序應該至少列出三個kafka broker,這樣即使節點已經關閉,集群依然是可獲取的。
? ?d.整理一下消費者命令窗口和生產者命令窗口,以便可以同時看到它們。
? ?e.重頭戲來了。在生產者命令窗口,輸入消息并敲擊回車鍵發送。例如:
? ? ?hello
? ? ?hello world
? ? ?it’s a good day
? ? ?Windows Server, 2012 R2, 64-bit
? ?f.你應該能看到相同的消息出現在了三個消費者命令窗口中。通過當前這種配置,每一個消費者將接收所有的消息。
g.在這四個命令窗口:
? ? i.使用Ctrl+c 殺掉進程
? ? ii.當出現提示時,輸入Y來結束批處理任務
? ? iii.留下這些窗口不要關閉,用于下一步的練習。
10.在分布式的Kafka話題上生產和消費消息,通過配置多個分片,支持跨消費者的負載均衡
? ?a.在%KAFKA_HOME%\config文件夾,創建一個名叫common-consumer.config的文件。
? ?b.用文本編輯器編輯文件輸入 group.id=taxis-consumer-group
? ?c.保存并關閉這個文件,這個文件定義了一個消費者群組,多個消費者都可以使用它。
? ?d.進入上一步留下來的命令窗口,輸入以下命令,在taxis話題下創建三個消費者,共享同一個消費者群組。
? ? ? bin\windows\kafka-console-consumer.bat --zookeeper localhost:2183 --consumer.config config\common-consumer.config --topic taxis
? ?e.在生產者命令窗口,輸入以下命令創建一個向taxis話題發送消息的生產者。
? ? ? bin\windows\kafka-console-producer.bat --broker-list localhost:9092,localhost:9093,localhost:9094 --topic taxis
? f.開始將文本信息輸入到生產者命令窗口中,在消息之間單擊回車鍵。
? ? ?使用這種方法,消費者只從分配給他們的話題分區中消費消息。卡夫卡的簡單分區是基于消息散列的負載平衡,因此消息在消費者之間分布相對均勻。
對比9和10,可以清晰的看出Kafka消費者群組所起到的作用。
在這個練習中,你探索了在Kafka集群中配置多個消費者實現可靠性和擴展性(通過相同的消費者群組)。在下一個練習中,你將繼續使用當前的Kafka配置來測試消費者的可靠性。
探索跨訂閱者的kafka可靠性
在前面的練習中,你配置了三個代理卡夫卡集群、一個分布式主題和三個訂閱者/消費者,它們都共享相同的公共消費組來消費消息。接下來,你將模擬訂戶間的失敗以探索彈性。
1.排列好三個消費者命令窗口和一個生產者命令窗口以便你能同時看到它們。
? ?注意:在消費者窗口中依然有上一個練習中留下的消息。
2.選擇一個消費者窗口,Ctrl+c 然后輸入y 結束這個批處理工作。
? ?這個消費者進程被停掉后,意味著只有兩個消費者共享相同的一個消費者群組了。
3.在生產者窗口中開始輸入消息,敲擊回車發送。當年發送消息,你會看到消息現在分布在剩下的兩個消費者窗口中。
? ?當消費者共享一個相同的消費者群組,Kafka會根據消費者的數量變化動態地重新分配消息。
4.清除環境
? ?a.在正在運行的兩個消費者命令窗口里,
? ? ?i.Ctrl+c打斷進程。
? ? ?ii.出現提示后,輸入Y終止這個批處理工作。
? ?你可以保留這些消費者窗口打開,你將在下一個練習中使用它們。
? ?b.在生產者命令窗口:
? ? ?i.點擊Ctrl+c打斷進程。
? ? ?ii.當出現提示后,輸入Y終止這個批處理工作。
? ?保留producer窗口打開,下個練習中還要用到它們。
在這個練習中,您探索了kafka消費者的可靠性,觀察到即使消費者的數量變化,消息仍會在當前的消費者之間被接收。在下一個練習中,您將探索跨broker的卡夫卡可靠性。
探索Kafka跨broker的可靠性
在前面的練習中,你探索了跨訂閱者的Kafka可靠性。接下來,你將看到跨broker的可靠性。
1.排列3個消費者窗口和一個生產者窗口,以便你能同時看到它們。
2.在消費者命令窗口輸入以下命令創建3個taxis話題下的消費者。
? 注意:它們現在沒有共享一個消費者群組。
? bin\windows\kafka-console-consumer.bat --zookeeper localhost:2183 --topic taxis
3.在生產者命令窗口輸入以下命令設置一個taxis話題的生產者。
? ?bin\windows\kafka-console-producer.bat --broker-list localhost:9092,localhost:9093,localhost:9094 --topic taxis
4.在生產者命令窗口中,開始發送文本消息,觀察到所有消息被每個消費者接收
5.現在,停止3個broker命令窗口中的任意一個。在前面的練習中,你設置他們的title為kafka0,kafka1,kafka2.
6.使用前一節中的方法終止掉你選擇的那個kafka broker。
7.現在,最小化那個命令窗口,查看你的消費者命令窗口。在每個消費者命令窗口中,你將會看到如下相似的消息。
這表示broker中的一個已經消失,但這并不會打斷或終止消費者進程的運行。
8.繼續在生產者命令窗口中輸入消息,你將會看到所有消息被每一個消費者接收到。
即使一個broker壞掉,所有的消費者依然可以接收本該他們接收到的消息。
9.清空環境。
? ?a.使用已有的經驗來結束掉如下進程:
? ? ?i.Consumer 0-2
? ? ?ii.Producer
? ? ?iii.Kafka brokers 0-2
? ? ?iv.Zookeeper
10.當進程都結束后,關閉這些命令窗口。
在這個練習中,你使用單臺計算機環境來確認了跨broker的kafka可靠性。在下一節中,你將在分布式機器上展開Kafka部署。
在上面的幾個練習中,我們漸漸對kafka的消息機制有了概念。以及感受到了kafka自帶的可靠性以及擴展性帶來的便利。這讓我們更加強烈的想讓Kafka和GeoEvent結合,使GeoEvent也具有Kafka的這些能力。這一節真的非常重要同時也是非常基礎、非常簡單。希望這能引發你對Kafka消息調度中心的興趣。