GeoEvent Server橫向伸縮擴(kuò)展(二)——熟悉事件中心概念

前言

本文主要做了一件事,通過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)注的焦點。而現(xiàn)在,GeoEvent團(tuán)隊提供了一個方案,用來提高GeoEvent的魯棒性以及橫向擴(kuò)展GeoEvent的能力。地址:http://www.arcgis.com/home/item.html?id=89048b1cfdda4a71a9b2b334fe8c8cc9

此教程旨在發(fā)布5篇文章,來分別敘述以下五個章節(jié)。本文為第二節(jié)。熟悉事件中心概念(Apache Kafka)。

目錄

1 GeoEvent彈性擴(kuò)展架構(gòu)

這一部分的目的是建立企業(yè)和ArcGIS的多個節(jié)點上,將在整個教程的其余部分使用ArcGIS GeoEvent Server。

2 熟悉事件中心概念(Apache Kafka)

本節(jié)中的練習(xí)將幫助您安裝和探索事件調(diào)度中心的特性,包括使用多個broker進(jìn)行冗余和伸縮。

3 安裝和配置一個分布式事件調(diào)度中心(Apache Kafka)

本節(jié)基于前一節(jié),將指導(dǎo)您在三個節(jié)點上安裝和配置分布式事件調(diào)度中心。在本教程中,您將在3臺已配置的GeoEvent Server節(jié)點上安裝事件調(diào)度中心。

4 配置GeoEvent Server啟用分布式事件調(diào)度中心

本節(jié)的目的是在一個分布式的事件調(diào)度中心完成GeoEvent Server配置。具體來說,你將學(xué)習(xí)如何使用Kafka 連接器配置GeoEvent Server接收消費從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)中。

正文

2 熟悉事件中心概念(Apache Kafka)

? ? ? ?在本節(jié)中,您將探索事件中心的概念。在這種情況下,事件調(diào)度中心是接收消息并將它們分發(fā)給一個或多個輸出的軟件。理想的情況是,一個事件的中心也允許傳入的消息可以并行來獲得更好的性能。在本教程中,您將使用Apache卡夫卡作為事件調(diào)度中心。

? ? ? ?本節(jié)中的練習(xí)提供了通過命令行使用卡夫卡的基本介紹。有關(guān)更多信息,請參見官方的Apache Kafka文檔。

? ? ? ?為了節(jié)省時間,建議這個練習(xí)你安裝和實驗kafka的是一個GeoEvent服務(wù)器節(jié)點的機(jī)器。

架構(gòu)圖

安裝Apache Kafka和必要的組件

1.下載并安裝jdk8 網(wǎng)址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

2.設(shè)置系統(tǒng)變量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:\并創(chuàng)建一個系統(tǒng)變量KAFKA_HOME=C:\kafka_2.11-0.10.1.0

4.啟動Zookeeper

? ?ZooKeeper服務(wù)器軟件,支持分布式協(xié)調(diào)和同步服務(wù)組。它也集中配置信息維護(hù)和命名。

? ?a.找到%KAFKA_HOME\config\zookeeper.properties 用記事本打開。

? ?b.更改clientPort一行。這個端口不能被機(jī)器上任何程序占用。更改clientPort=2181為 ? ? ? ? ?clientPort=2183

? ?c.更改日志文件存放目錄為dataDir=C:\\tmp\\zookeeper

? ?d.保存并關(guān)閉zookeeper.properties

? ?e.打開命令行(管理員)

? ?f.輸入如下命令來啟動ZooKeeper:

? ? cd %KAFKA_HOME%

? ? title zookeeper

? ? bin\windows\zookeeper-server-start.bat config\zookeeper.properties

啟動ZooKeeper

? ? 可以看到出現(xiàn)了很多消息

Zookeeper已啟動

? ?g.保持這個命令窗口開啟,以方便等會停止zookeeper的操作。

? ?你已經(jīng)在machine3成功的啟動了Zookeeper。接下來的練習(xí)是指導(dǎo)你通過一個簡單的kafka設(shè)置啟動一個單broker的kafka。

使用單個broker配置和測試kafka

? ? kafka是一個分布式的消息系統(tǒng)。一個broker是kafka集群中的一個節(jié)點。

1.訪問%KAFKA_HOME%\config\ 打開server.properties in a text editor。

2取消掉這句話的注釋

? ? listeners=PLAINTEXT://:9092

3更新ZooKeeper端口

? ? zookeeper.connect=localhost:2183

4.增加一行如下內(nèi)容,這將允許您刪除話題。

? ? delete.topic.enable=true

5.日志路徑,取決于windos版本

? ? log.dirs=C:\\tmp\\kafka-logs

6.新開啟一個命令行運(yùn)行kafka,使用下面的命令

? ? cd %KAFKA_HOME%

? ? title kafka0

? ? bin\windows\kafka-server-start.bat config\server.properties

啟動kafka

? ? 會看到各類消息出現(xiàn),保持這個命令行窗口開啟。

7.創(chuàng)建一個Kafka話題:

? ? kafka話題就是消息在kafka中的組織方式。消費者訂閱話題,生產(chǎn)者將消息推送到話題上。一個話題本質(zhì)上是流經(jīng)系統(tǒng)的潛在的許多獨立的數(shù)據(jù)流之一。

? ?a.打開一個命令行,創(chuàng)建一個分片數(shù)為1,復(fù)制因子為1的kafka話題。

? ? cd %KAFKA_HOME%

? ? title topics

? ? bin\windows\kafka-topics.bat --create --zookeeper localhost:2183 --replication-factor 1 --partitions 1 --topic test

創(chuàng)建kafka話題

? ? ? ?分片數(shù)是kafka話題被分割成的份數(shù)。你可以通過使用多個分區(qū),使消息分割成多份同時進(jìn)入多個kafka節(jié)點,并行這個話題,實現(xiàn)消息的高吞吐量。

? ? ? ?復(fù)制因子決定了一條消息被復(fù)制多少份。有一個以上的副本相當(dāng)于有備份數(shù)據(jù),有助于高可用性。在這個練習(xí)中,此kafka話題只有一個分區(qū),因此每個消息只能有一個分區(qū)。

? ?c.使用以下命令可以查看Kafka的話題列表

? ? bin\windows\kafka-topics.bat --list --zookeeper localhost:2183

查看已存在的話題

? ?d.現(xiàn)在你的話題test已經(jīng)創(chuàng)建完畢,最小化topics命令窗口

8.從Kafka話題消費接收消息。

? ?Kafka 消費者通過訂閱話題來接收消息,消息的順序按照出現(xiàn)在Kafka日志中的順序。

? ?a.打開一個管理員權(quán)限的命令窗口。

? ?b.輸入以下命令,在Kafka broker中創(chuàng)建一個消費者來接收“test”話題。

? ? cd %KAFKA_HOME%

? ? title consumer

? ? bin\windows\kafka-console-consumer.bat --zookeeper localhost:2183 --topic test --from-beginning

創(chuàng)建消費者

? ?輸入完命令后,進(jìn)入消費者模式。

? ?c.保持consumer命令行窗口可見。稍后會通過它查看接收消息的情況。

9.在Kafka話題上生產(chǎn)消息

? ? ? ?Kafka生產(chǎn)者推送消息到Kafka話題上。更具體的來說,一個生產(chǎn)者應(yīng)用程序?qū)懭胂⒌皆掝}分區(qū)的leader上,所以分區(qū)必須在寫入發(fā)生前被選中。Kafka包含了消息分割和負(fù)載均衡的基本邏輯。無論如何,定制的生產(chǎn)者應(yīng)用程序通過分析手頭的工作流來實現(xiàn)這種邏輯。

? ?a.打開一個管理員命令行窗口。

? ?b.輸入如下命令在Kafka broker上創(chuàng)建一個生產(chǎn)者,用來向test話題發(fā)送消息。注意指定broker正在運(yùn)行的端口

? ? cd %KAFKA_HOME%

? ? title producer

? ? bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic test

創(chuàng)建生產(chǎn)者

? ?輸入完這些命令,你會進(jìn)入生產(chǎn)者模式并且這個程序已經(jīng)做好了準(zhǔn)備去發(fā)送消息

? ?c.在producer命令窗口中輸入一些文字,敲擊回車鍵進(jìn)行發(fā)送。

發(fā)送消息

? ?d.在消費者命令窗口,你可以看到相同的消息已經(jīng)被此消費者接收。

消費消息

? ?在這個例子中,只有一個生產(chǎn)者和一個消費者,所以,這個消費者接收到了所有被生產(chǎn)的消息。

10.清空

? ?a.在消費者和生產(chǎn)者窗口都執(zhí)行以下操作:

? ? ? i.敲擊ctrl+c 結(jié)束這個進(jìn)程。

? ? ? ii.在出現(xiàn)提示后,輸入Y來終止批處理進(jìn)程。

終止producer

? ? ? iii.兩個進(jìn)程都停止后,你可以關(guān)閉消費者的命令窗口,留下生產(chǎn)者的命令窗口用于接下來的練習(xí)。

? ?b.在topics命令窗口,輸入以下命令來刪除test話題。

? ? ? bin\windows\kafka-topics.bat --zookeeper localhost:2183 --delete --topic test

刪除話題

? ?c.在kafka運(yùn)行的kafka0命令窗口:

? ? ? i.輸入Ctrl+c打斷Kafka進(jìn)程。

? ? ? ii.出現(xiàn)提示后,輸入Y來終止這個命令行運(yùn)行。

? ? 這將確保想要刪除的test話題被刪除。

? ? 留下kafka0命令窗口不要關(guān)閉,你會在下一個練習(xí)中用到它。

? ?d.不要對Zookeeper命令窗口做任何更改,ZooKeeper需要為了后面的練習(xí)繼續(xù)運(yùn)行。

使用3個broker配置和測試kafka

kafka可以在多個節(jié)點組成的集群中運(yùn)行,以獲得高可用性和可伸縮性。在這個練習(xí)中,你將通過在同一臺計算機(jī)上創(chuàng)建3個broker來模擬多個節(jié)點。

1.將%KAFKA_HOME%\config\server.properties文件復(fù)制3份,分別命名為。

? ?server-0.properties

? ?server-1.properties

? ?server-2.properties

2.在每個文件中修改指定的broker id 分別為0,1和2.

? ?broker.id=0

3.在每一個文件中修改下面這行,在你的機(jī)器上指定不同的端口。

? ? tips:因為您將要在一臺機(jī)器上運(yùn)行3個brokers,每一個broker都需要指定一個不同的監(jiān)聽端口,如9092,9093和9094

? ? listeners=PLAINTEXT://:9092

4.在每一個文件中,修改日志路徑為原始路徑+broker編號。

如 log.dirs=C:\\tmp\\kafka-logs-0

5.在每個文件中,更新zookeeper端口為正在運(yùn)行的這個zookeeper占用的端口。

? ?zookeeper.connect=localhost:2183

6.在文件底部,添加一行,通過它,允許刪除話題。

# Delete enablement?

delete.topic.enable=true

7.啟動3個kafka brokers

? ?a.打開3個管理員命令行,如果你在上一個練習(xí)中預(yù)留了kafka0命令行窗口沒有關(guān)閉,你可以只打開2個命令行窗口。

? ?b.在每個命令行窗口中。輸入以下命令啟動kafka。指定3個不同的題目名稱和不同的配置文件。

cd %KAFKA_HOME%

title kafka0

bin\windows\kafka-server-start.bat config\server-0.properties

啟動3個kafka broker

你應(yīng)該看到出現(xiàn)各種消息。你可以最小化命令窗口,但是保持他們是開啟狀態(tài),這樣你能輕易的停止kafka。

8.創(chuàng)建一個分布式的kafka話題

? ?a.在topics命令窗口,輸入以下命令以創(chuàng)建一個具有3個分片,3個復(fù)制因子的kafka話題taxis。

? ? ?bin\windows\kafka-topics.bat --create --zookeeper localhost:2183 --replication-factor 3 --partitions 3 --topic taxis

創(chuàng)建話題

? ?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的指揮者

? ?因為你有和副本數(shù)相同數(shù)量的broker。每個broker都維護(hù)每一個分片的一個副本。

? ?c.你可以最小化topics命令窗口。

9.在分布式kafka話題taxis上生產(chǎn)和消費消息

? ?a.以管理員身份打開3個命令窗口

? ?b.在三個命令窗口中輸入以下命令分別創(chuàng)建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.在生產(chǎn)者命令窗口,輸入以下命令來給taxis話題設(shè)置一個生產(chǎn)者。

? ? ? bin\windows\kafka-console-producer.bat --broker-list localhost:9092,localhost:9093,localhost:9094 --topic taxis

? ? ?為了確??煽啃裕?dāng)消息寫入一個話題時,生產(chǎn)者應(yīng)用程序應(yīng)該至少列出三個kafka broker,這樣即使節(jié)點已經(jīng)關(guān)閉,集群依然是可獲取的。

? ?d.整理一下消費者命令窗口和生產(chǎn)者命令窗口,以便可以同時看到它們。

3個消費者1個生產(chǎn)者

? ?e.重頭戲來了。在生產(chǎn)者命令窗口,輸入消息并敲擊回車鍵發(fā)送。例如:

? ? ?hello

? ? ?hello world

? ? ?it’s a good day

? ? ?Windows Server, 2012 R2, 64-bit

? ?f.你應(yīng)該能看到相同的消息出現(xiàn)在了三個消費者命令窗口中。通過當(dāng)前這種配置,每一個消費者將接收所有的消息。

每一個consumer接收所有的消息

g.在這四個命令窗口:

? ? i.使用Ctrl+c 殺掉進(jìn)程

? ? ii.當(dāng)出現(xiàn)提示時,輸入Y來結(jié)束批處理任務(wù)

? ? iii.留下這些窗口不要關(guān)閉,用于下一步的練習(xí)。

10.在分布式的Kafka話題上生產(chǎn)和消費消息,通過配置多個分片,支持跨消費者的負(fù)載均衡

? ?a.在%KAFKA_HOME%\config文件夾,創(chuàng)建一個名叫common-consumer.config的文件。

? ?b.用文本編輯器編輯文件輸入 group.id=taxis-consumer-group

? ?c.保存并關(guān)閉這個文件,這個文件定義了一個消費者群組,多個消費者都可以使用它。

? ?d.進(jìn)入上一步留下來的命令窗口,輸入以下命令,在taxis話題下創(chuàng)建三個消費者,共享同一個消費者群組。

? ? ? bin\windows\kafka-console-consumer.bat --zookeeper localhost:2183 --consumer.config config\common-consumer.config --topic taxis

共享同一個群組的消費者

? ?e.在生產(chǎn)者命令窗口,輸入以下命令創(chuàng)建一個向taxis話題發(fā)送消息的生產(chǎn)者。

? ? ? bin\windows\kafka-console-producer.bat --broker-list localhost:9092,localhost:9093,localhost:9094 --topic taxis

? f.開始將文本信息輸入到生產(chǎn)者命令窗口中,在消息之間單擊回車鍵。

? ? ?使用這種方法,消費者只從分配給他們的話題分區(qū)中消費消息??ǚ蚩ǖ暮唵畏謪^(qū)是基于消息散列的負(fù)載平衡,因此消息在消費者之間分布相對均勻。

消息分布均勻

對比9和10,可以清晰的看出Kafka消費者群組所起到的作用。

在這個練習(xí)中,你探索了在Kafka集群中配置多個消費者實現(xiàn)可靠性和擴(kuò)展性(通過相同的消費者群組)。在下一個練習(xí)中,你將繼續(xù)使用當(dāng)前的Kafka配置來測試消費者的可靠性。

探索跨訂閱者的kafka可靠性

在前面的練習(xí)中,你配置了三個代理卡夫卡集群、一個分布式主題和三個訂閱者/消費者,它們都共享相同的公共消費組來消費消息。接下來,你將模擬訂戶間的失敗以探索彈性。

1.排列好三個消費者命令窗口和一個生產(chǎn)者命令窗口以便你能同時看到它們。

? ?注意:在消費者窗口中依然有上一個練習(xí)中留下的消息。

上個練習(xí)中留下的消息

2.選擇一個消費者窗口,Ctrl+c 然后輸入y 結(jié)束這個批處理工作。

停掉一個消費者

? ?這個消費者進(jìn)程被停掉后,意味著只有兩個消費者共享相同的一個消費者群組了。

3.在生產(chǎn)者窗口中開始輸入消息,敲擊回車發(fā)送。當(dāng)年發(fā)送消息,你會看到消息現(xiàn)在分布在剩下的兩個消費者窗口中。

新消息分布在剩下的兩個消費者

? ?當(dāng)消費者共享一個相同的消費者群組,Kafka會根據(jù)消費者的數(shù)量變化動態(tài)地重新分配消息。

4.清除環(huán)境

? ?a.在正在運(yùn)行的兩個消費者命令窗口里,

? ? ?i.Ctrl+c打斷進(jìn)程。

? ? ?ii.出現(xiàn)提示后,輸入Y終止這個批處理工作。

? ?你可以保留這些消費者窗口打開,你將在下一個練習(xí)中使用它們。

? ?b.在生產(chǎn)者命令窗口:

? ? ?i.點擊Ctrl+c打斷進(jìn)程。

? ? ?ii.當(dāng)出現(xiàn)提示后,輸入Y終止這個批處理工作。

? ?保留producer窗口打開,下個練習(xí)中還要用到它們。

在這個練習(xí)中,您探索了kafka消費者的可靠性,觀察到即使消費者的數(shù)量變化,消息仍會在當(dāng)前的消費者之間被接收。在下一個練習(xí)中,您將探索跨broker的卡夫卡可靠性。

探索Kafka跨broker的可靠性

在前面的練習(xí)中,你探索了跨訂閱者的Kafka可靠性。接下來,你將看到跨broker的可靠性。

1.排列3個消費者窗口和一個生產(chǎn)者窗口,以便你能同時看到它們。

3consumer1producer

2.在消費者命令窗口輸入以下命令創(chuàng)建3個taxis話題下的消費者。

? 注意:它們現(xiàn)在沒有共享一個消費者群組。

? bin\windows\kafka-console-consumer.bat --zookeeper localhost:2183 --topic taxis

3.在生產(chǎn)者命令窗口輸入以下命令設(shè)置一個taxis話題的生產(chǎn)者。

? ?bin\windows\kafka-console-producer.bat --broker-list localhost:9092,localhost:9093,localhost:9094 --topic taxis

4.在生產(chǎn)者命令窗口中,開始發(fā)送文本消息,觀察到所有消息被每個消費者接收

每個消費者接收所有消息

5.現(xiàn)在,停止3個broker命令窗口中的任意一個。在前面的練習(xí)中,你設(shè)置他們的title為kafka0,kafka1,kafka2.

6.使用前一節(jié)中的方法終止掉你選擇的那個kafka broker。

終止broker

7.現(xiàn)在,最小化那個命令窗口,查看你的消費者命令窗口。在每個消費者命令窗口中,你將會看到如下相似的消息。

減少一個broker

這表示broker中的一個已經(jīng)消失,但這并不會打斷或終止消費者進(jìn)程的運(yùn)行。

8.繼續(xù)在生產(chǎn)者命令窗口中輸入消息,你將會看到所有消息被每一個消費者接收到。

關(guān)閉broker依然接收消息

即使一個broker壞掉,所有的消費者依然可以接收本該他們接收到的消息。

9.清空環(huán)境。

? ?a.使用已有的經(jīng)驗來結(jié)束掉如下進(jìn)程:

? ? ?i.Consumer 0-2

? ? ?ii.Producer

? ? ?iii.Kafka brokers 0-2

? ? ?iv.Zookeeper

10.當(dāng)進(jìn)程都結(jié)束后,關(guān)閉這些命令窗口。

在這個練習(xí)中,你使用單臺計算機(jī)環(huán)境來確認(rèn)了跨broker的kafka可靠性。在下一節(jié)中,你將在分布式機(jī)器上展開Kafka部署。

在上面的幾個練習(xí)中,我們漸漸對kafka的消息機(jī)制有了概念。以及感受到了kafka自帶的可靠性以及擴(kuò)展性帶來的便利。這讓我們更加強(qiáng)烈的想讓Kafka和GeoEvent結(jié)合,使GeoEvent也具有Kafka的這些能力。這一節(jié)真的非常重要同時也是非常基礎(chǔ)、非常簡單。希望這能引發(fā)你對Kafka消息調(diào)度中心的興趣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容