消息中間件kafka+zookeeper集羣部署、測試與應用(1)

業務系統中,一般會遇到這些場景:A系統向B系統主動推送一個處理請求;A系統向B系統發送一個業務處理請求,由於某些緣由(斷電、宕機。。),B業務系統掛機了,A系統發起的請求處理失敗;前端應用併發量過大,部分請求丟失或後端業務系統卡死。。。。這個時候,消息中間件就派上用場了--提高系統穩定性、可用性、可擴展性。前端

1、消息中間件linux

消息隊列技術是分佈式應用間交換信息的一種技術。消息隊列可駐留在內存或磁盤上,隊列存儲消息直到它們被應用程序讀走。經過消息隊列,應用程序可獨立地執行--它們不須要知道彼此的位置、或在繼續執行前不須要等待接收程序接收此消息。數據庫

整體來講,消息中間件有如下做用:下降耦合、流量消峯(防浪涌)、可靠性傳輸、事件驅動後端

1.下降耦合:經過發佈訂閱的方式鬆耦合服務器

咱們以註冊業務爲例,註冊成功會發送短信、郵件給用戶來確認,傳統架構模型是這樣:網絡

郵件業務和短信業務的代碼是寫在用戶註冊的流程裏,不管是經過接口的方式來實現,仍是遠程調用的方式來實現,耦合度都很高,如今,新增一個需求,用戶註冊完成之後不發送郵件了,而是給用戶「增長積分」,咱們來分析這幾種狀況:架構

第1、都在一個業務系統內經過代碼堆積、接口調用的方式來實現註冊成功後的業務處理,咱們須要改動註冊代碼,上線時須要啓停應用,這種方式耦合度最高。併發

第2、經過遠程調用的方式,代碼相似以下分佈式

當咱們要新增業務處理時,以下性能

仍是要改動主流程代碼,避免不了啓停應用。

若是咱們引入消息中間件,以下:

經過發佈訂閱的方式,用戶註冊成功後,給消息中間件發送一個消息,各個業務端訂閱同一個頻道的消息,接收到註冊成功的消息後就執行相應業務。新增「增長積分」,就讓積分系統相關處理訂閱這個消息就夠了,不用改動用戶業務代碼,不用啓停應用,就能夠實現業務的平滑擴展。

CRM中,這種應用場景有不少,再好比,用戶回訪業務,回訪成功後發短信追評、記錄歷史工單等等,均可以使用消息中間件來送耦合,實現業務的平滑擴展。

3.流量消峯、防浪涌:消息中間件能夠在峯值時堆積消息,而在峯值過去後下游系統慢慢消費消息解決流量洪峯的問題

併發量達到高峯時,後端系統壓力一般會很大,不管是應用服務器仍是數據庫服務器,這個時候能夠將相似請求放到消息中間件的消息隊列中堆積起來慢慢處理,也能夠設置消息隊列的大小達到控制併發量的目的,商品秒殺的業務場景比較典型,在實際工做中遇到的業務場景也有不少,不一一列舉。

4.可靠性傳輸:基於消息的通訊是可靠的,消息不會丟失。大多數消息中間件都提供將消息持久化到磁盤的功能。開篇的第一個場景中,消息中間件能夠將生產者生產的消息持久化到磁盤,後端應用宕機,但消息不會丟失,應用重啓繼續處理。

你可能會有這樣的疑問,那消息中間件宕機了,接收不到消息怎麼持久化?不要緊,消息中間件提供了多種消息複製策略、持久化策略,集羣部署策略等均可以保證消息的可靠性傳輸。那若是你是個愛鑽牛角尖的人,你也許會問,集羣中全部的節點都掛了怎麼辦。。。那若是世界末日了你還在care消息不消息的事情的話只能說明你足夠敬業。

5.事件驅動:系統與系統之間能夠經過消息傳遞的形式驅動業務

能夠將複雜的應用系統重構成爲事件驅動的系統。事件溯源(Event Sourcing),表示一個對象從建立到消亡,會通過的多種狀態。若是把對象的狀態變化都存儲下來,不但能夠根據狀態變化記錄獲取對象的當前狀態,也能夠回溯對象的變化過程。消息中間件能很好地支持這樣的系統設計方式,將觸發對象狀態變化的事件放入消息隊列。

6.分佈式事務支持

這個老生常談的問題了,若是你不明白什麼是分佈式事務,請移步www.baidu.com。

kafka提供了對分佈式事務的支持。欲知如何支持,且聽下回分解。

2、kafka介紹

 

Kafka是由LinkedIn開發的一個分佈式的消息系統,使用Scala編寫,它以可水平擴展和高吞吐率而被普遍使用。目前愈來愈多的開源分佈式處理系統如Cloudera、Apache Storm、Spark都支持與Kafka集成。淘寶的兩款消息中間件,notify 和最近被Apache 加冕爲頂級開源項目的RocketMQ都有kafka的影子。

總之,它很牛逼。

  • Kafka 專用術語

Broker:Kafka 集羣包含一個或多個服務器,這種服務器被稱爲 broker。

Topic:每條發佈到 Kafka 集羣的消息都有一個類別,這個類別被稱爲 Topic。(物理上不一樣 Topic 的消息分開存儲,邏輯上一個 Topic 的消息雖然保存於一個或多個 broker 上,但用戶只需指定消息的 Topic 便可生產或消費數據而沒必要關心數據存於何處)。

Partition:Partition 是物理上的概念,每一個 Topic 包含一個或多個 Partition。

Producer:負責發佈消息到 Kafka broker。

Consumer:消息消費者,向 Kafka broker 讀取消息的客戶端。

Consumer Group:每一個 Consumer 屬於一個特定的 Consumer Group(可爲每一個 Consumer 指定 group name,若不指定 group name 則屬於默認的 group)

kafka的架構圖以下(來自網絡):

3、集羣部署和測試

kafka須要一個服務註冊中心,你能夠選擇kafka自帶的zookeeper,也能夠單獨部署。爲了更好的管理,筆者單獨部署zookeeper集羣--實際上是個僞集羣,一臺liux主機開放了三個端口便可。

zookeeper的運行須要jdk,因此先下載安裝jdk,本文使用的jdk1.8

1.)下載安裝jdk

jdk的安裝步驟不作贅述, 筆者的版本是 jdk-8u144-linux-x64.tar.gz

配置環境變量(不會找度娘)

2.)下載zookeeper

先關閉防火牆,或者開放下文中須要用到的全部端口。

移步阿帕奇官網下載最新版zookeeper,

Zookeeper集羣的工做是超過半數才能對外提供服務,3臺中超過兩臺超過半數,容許1臺掛掉。

建立目錄 zookeeper :

mkdir zookeeper

解壓下載後的壓縮文件 tar -zxvf zookeeper-3.4.6.tar.gz 

拷貝三份:

cp -r zookeeper-3.4.6 zookeeper0

cp -r zookeeper-3.4.6 zookeeper1

cp -r zookeeper-3.4.6 zookeeper2

進入zookeeper目錄,其餘的兩個zookeeper實例一樣操做:

  建立兩個目錄zkdata、zkdatalog

進入conf目錄,

拷貝zoo_sample.cfg 爲zoo.cfg,詳細配置以下:

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/usr/zookeeper/zookeeper0/zkdata
dataLogDir=/usr/zookeeper/zookeeper0/zkdatalog
# the port at which the clients will connect
clientPort=4180
server.0=192.168.217.129:8880:7770    
server.1=192.168.217.129:8881:7771    
server.2=192.168.217.129:8882:7772 
#server.0 這個0是服務器的標識也能夠是其餘的數字, 表示這個是第幾號服務器,用來標識服務器,這個標識要寫到快照目錄下面myid文件裏
#192.168.217.129爲集羣裏的IP地址,第一個端口是master和slave之間的通訊端口

 

如下是配置文件的解釋:

#tickTime:
這個時間是做爲 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每一個 tickTime 時間就會發送一個心跳。
#initLimit:
這個配置項是用來配置 Zookeeper 接受客戶端(這裏所說的客戶端不是用戶鏈接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集羣中鏈接到 Leader 的 Follower 服務器)初始化鏈接時最長能忍受多少個心跳時間間隔數。當已經超過 5個心跳的時間(也就是 tickTime)長度後 Zookeeper 服務器尚未收到客戶端的返回信息,那麼代表這個客戶端鏈接失敗。總的時間長度就是 5*2000=10 秒
#syncLimit:
這個配置項標識 Leader 與Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是5*2000=10秒
#dataDir:
快照日誌的存儲路徑
#dataLogDir:
事物日誌的存儲路徑,若是不配置這個那麼事物日誌會默認存儲到dataDir制定的目錄,這樣會嚴重影響zk的性能,當zk吞吐量較大的時候,產生的事物日誌、快照日誌太多
#clientPort:
這個端口就是客戶端鏈接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。

建立myid

#server0
echo "0" > /usr/zookeeper/zookeeper0/zkdata
#server2
echo "1" > /usr/zookeeper/zookeeper1/zkdata
#server3
echo "2" > /usr/zookeeper/zookeeper2/zkdata

 

其餘兩個實例修改端口,一樣操做。

 

啓動zookeeper

進入bin目錄;執行 ./zkServer.sh ../conf/zoo.cfg命令

檢查啓動狀態:

./zkServer.sh status

 

mode:leader 表示這是個leader節點

其餘兩個實例一樣操做。至此zookeeper僞集羣搭建完畢。

未完待續。。。

相關文章
相關標籤/搜索