Kafka分散式訊息佇列
基本架構
Kafka分散式訊息佇列的作用:
解耦:將訊息生產階段和處理階段拆分開,兩個階段互相獨立各自實現自己的處理邏輯,通過Kafka提供的訊息寫入和消費介面實現對訊息的連線處理。降低開發複雜度,提高系統穩定性。
高吞吐率:kafka通過順序讀寫磁碟提供可以和記憶體隨機讀寫相匹敵的讀寫速度,靈活的客戶端API設計,利用Linux作業系統提供“零拷貝”特性減少訊息網路傳輸時間,提供端到端的訊息壓縮傳輸,對同一主題下的訊息採用分割槽儲存。 kafka通過諸多良好的特性利用廉價的機器就可以實現高吞吐率。
高容錯、高可用:kafka允許使用者對分割槽配置多副本,kafka將副本均勻地分配到名broker儲存,保證同現代戰爭分割槽的副本不會在同一臺機器上儲存(叢集模式下),多副本之間採用leader-follower機制同步訊息,只有leader對外提供讀寫服務,當leader意外失敗、broker程序關閉、服務pdsm等情況導致資料不可用時,kafka會從Follower中選擇一個Leader繼續提供讀寫服務。
可擴充套件:理論上Kafka的效能隨著Broker的增多而增加,增加一個Broker只需要為新增加的Broker設定一個唯一編號,編寫好配置檔案後,Kafka通過Zookeeper就能發現新的Broker。
峰值處理:例如秒殺系統、雙十一等促銷活動的爆發式集中支付系統、推薦系統等都需要訊息佇列的介入,這類系統在某個時間點資料爆發式增長,後臺處理系統不能夠及時處理峰值請求,如果沒有訊息佇列的介入就會千萬後臺系統處理不及時,請求資料嚴重擠壓,如此惡性迴圈最終導致系統崩潰。Kafka的接入能夠使資料進行冗餘儲存,並保證訊息順序讀寫,相當於給系統接入了一個大的緩衝區,既能接收持續暴增的請求,又能根據後臺系統的處理能力提供資料服務,進而提高各業務系統的峰值處理能力。
kafka的架構如下:
Broker:啟動kafka的一個例項就是一個broker,預設埠9092。一個kafka叢集可以啟動多個broker同時對外提供服務,borker不儲存任何producer和consumer相關的資訊。
Topic:主題,kafka中同一種類型資料集的名稱,相當於資料庫中的表,producer將同一型別的資料寫入同一個topic下,consumer從同一個topic消費同一型別的資料。邏輯上同一個資料集只有一個topic,如果設定一個topic有多個
partition和多個partition,在物理上同一個topic下的資料集會被分成多份儲存到不同的物理機上。
Partition:分割槽,一個topic可以設定多個分割槽,相當於反一個數據集分成多份分別放到不同的分割槽中儲存。一個topic可以有一個或者多個分割槽,在建立topic的時候可以設定topic的partition數,如果不設定預設為1.理論上partiion資料越多,系統的整體吞吐率就越高,但是在實際應用中並不是partiition越多越好,反而過多的partition在broker宕機需要重新對partition選主,在這個過程中耗時太久會導致partition暫時無法提供服務,千萬寫入訊息失敗。分割槽命名規則是topicname-index(比如testtopic-0、testtopic-2等)。
Segment:段檔案,kafka中最小資料儲存單位,kafka可以儲存多個topic,各個topic之間隔離沒有影響,一個topic包含一個或者多個partition,每個partition在物理結構上是一個資料夾,資料夾名稱以topic名稱加partition索引的方式命名,一個partition包含多個segment,每個segment以message在partition中的起始偏移量命名以log結尾的檔案,producer向topic中釋出訊息會被順序寫入對應的segment檔案中。kafka為了提高寫入和查詢速度,在partition資料夾下每一個segment log檔案都有一個同名的索引檔案,索引檔案以index結尾。
Offset:訊息在分割槽中偏移量,用來在分割槽中唯一地標識這個訊息。
Replication:副本,一個partition可以設定一個或者多個副本,副本主要保證系統能夠持續不丟失地對外提供服務。在建立topic的時候可以設定partition的replication數。
Producer:訊息生產者,負責向kafka中釋出訊息。
Consumer Group:消費者所屬組,一個consumer group可以包含一個或者多個consumer,當一個topic被一個consumer group消費的時候,consumer group內只能有一個consumer消費同一條訊息,不會再現同一個consumer group
中多個consumer同時消費一條訊息千萬一個訊息被一個consumer group 消費多次的情況。
Consumer:訊息消費者,consumer從kafka指定的主題中拉取訊息,如果一個topic有多個分割槽,kafka只能保證一個分割槽內訊息的有序性,在不同的分割槽之間無法保證。
Zookeeper:Zookeeper在kafka叢集中主要用於協調管理,主要作用:
1)kafka將元資料資訊儲存在Zookeeper中。
2)通過Zookeeper的協調管理來實現整個kafka叢集的動態擴充套件。
3)實現整個叢集的負載均衡。
4)producer通過 Zookeeper感知partition的Leader。
5)Consumer消費的負載均衡。
6)儲存consumer消費的狀態資訊。
Kafka0.9版本之前Consumer消費訊息的偏移量記錄在Zookeeper中,0.9版本之後 則由kafka自己維護consumer消費訊息的偏移量。
摘自《企業大資料處理》