kafka 基礎知識

kafka 對消息保存時根據Topic 進行歸類;發送者爲producer 接收者爲Consumer;kafka集羣有多個實例,每個實例稱爲broker
zookeeper 爲集羣保存一些meta信息
一個Topic 可以認爲是一類消息,每個topic 將被分成多個 partition(區),每個partition 在存儲層面是append log 文件
kafka 中幾乎不允許對消息進行“隨機讀寫“
每條消息在文件中的位置稱爲offset(偏移量),offset 爲一個long型數字,它是唯一標記一條消息 保存在zookeeper中
在kafka 中,即使消息被消費,消息仍然不會被立即刪除。日誌文件將會根據broker 中的配置要求,保留一定的時間之後刪除;比如
log 文件保留2 天,那麼兩天後,文件會被清除,無論其中的消息是否被消費
kafka集羣幾乎不需要維護任何consumer 和producer 狀態信息,這些信息由zookeeper 保存
設計原理:

  1. 持久性
    kafka 使用文件存儲消息,因此依賴文件系統本身;kafka對日誌文件進行append操作,broker會將消息暫存在buffer中,當buffer中滿了後
    在flush到磁盤
  2. 性能
    kafka除了需要考慮到磁盤的IO之外,還要考慮網絡的IO;
    對於producer 端,可以將消息buffer 起來,當消息的條數達到一定閥值時,批量發送給broker;對於consumer 端也是一樣,批量fetch 多條消息
    broker 端,似乎有個sendfile 系統調用可以潛在的提升網絡IO 的性能
    對於producer/consumer/broker 三者而言,CPU 的開支應該都不大,因此啓用消息壓縮機制是一個良好的策略
    kafka 支持gzip/snappy 等多種壓縮方式
  3. 生產者
    producer 將會和Topic 下所有partition leader 保持socket 連接
    消息被路由到哪個partition 上由producer 客戶端決定
    其中partition leader 的位置(host:port)註冊在zookeeper中,producer 作爲zookeeper 的client,已經註冊了watch 用來監聽
    partition leader 的變更事件
  4. 消費者
    consumer 端向broker 發送"fetch"請求,並告知其獲取消息的offset;
    在kafka 中,producers 將消息推送給broker 端,consumer 在和broker 建立連接之後,主動去pull(或者說fetch)消息
    在kafka 中,partition 中的消息只有一個consumer 在消費 當消息被consumer 接收之後,consumer可以在本地保存最後消息的offset,並間歇性的向zookeeper 註冊offset
    Kafka 提供了兩套API 給Consumer:
    高度抽象的Consumer API :
    消息消費以Consumer Group 爲單位,每個Consumer Group 中可以有多個consumer,每個consumer 是一個線程,topic 的每個
    partition 同時只能被某一個consumer 讀取,Consumer Group對應的每個partition 都有一個最新的offset 的值,存儲在zk中
    High Level Consumer 可以並且應該被使用在多線程的環境,線程模型中線程的數量(也代表group 中consumer 的數量)和topic 的
    partition 數量有關
    ● 當提供的線程數量多於partition 的數量,則部分線程將不會接收到消息
    ● 當提供的線程數量少於partition 的數量,則部分線程將從多個partition 接收消息
    ● 當某個線程從多個partition 接收消息時,不保證接收消息的順序;可能出現從partition3接收5條消息
    從partition4接收6條消息,接着又從partition3接收10條消息
    ● 當添加更多線程時,會引起kafka 做re-balance, 可能改變partition 和線程的對應關係
    消息傳送機制
    at most once:最多一次,發送一次,無論成敗,將不會重發
    at least once:消息至少發送一次,如果消息未能接受成功,可能會重發,直到接收成功 (首選)
    複製備份
    kafka 將每個partition 數據複製到多個server 上,任何一個partition 有一個leader 和多個follower(可以沒有);
    備份的個數可以通過broker 配置文件來設定。
    leader 處理所有的read-writer請求,follower 需要和leader保持同步,如果follower落後太多就從replicas中刪除
    日誌
    每個partition 在物理存儲層面,有多個log file 組成(稱爲segment)。segment file 的命名爲" 最小offset".kafka
    zookeeper
    kafka 使用zookeeper 來存儲一些meta 信息,並使用了zookeeperwatch 機制來發現meta 信息的變更並作出相應的動作(比如consumer
    失效,觸發負載均衡等)
    ● Broker node registry:kafka broker 啓動後,首先會向zookeeper 註冊自己的節點信息(臨時znode),同時當broker 和
    zookeeper 斷開連接時,此znode 也會被刪除 /brokers/ids/[0。。。N]
    ● Broker Topic Registry:broker 啓動時, 會向zookeeper 註冊自己持有的topic 和partitions 信息 /brokers/topics/[topic]/partitions/[0。。。N]
    ● Consumer and Consumer group:每個consumer 客戶端被創建時,會向zookeeper 註冊自己的信息;此作用主要是爲了"負載均衡"。
    一個group 中的多個consumer 可以交錯的消費一個topic 的所有partitions;簡而言之,保證此topic 的所有partitions 都能被此
    group 所消費,且消費時爲了性能考慮,讓partition 相對均衡的分散到每個consumer 上

● Consumer id Registry:每個consumer 都有一個唯一的ID,此id 用來標記消費者信息 /consumers/[group_id]/ids/[consumer_id]
● Consumer offset Tracking:跟蹤每個consumer 目前所消費的partition 中最大的offset
/consumers/[group_id]/offsets/[topic]/[broker_id-partition_id]-->offset_value
● Partition Owner registry:標記partition 被哪個consumer 消費
/consumers/[group_id]/owners/[topic]/[broker_id-partition_id] -->consumer_node_id
Producer 端使用zookeeper 用來"發現"broker 列表,以及和Topic下每個partition leader 建立socket 連接併發送消息。
Broker 端使用zookeeper 用來註冊broker 信息, 已經監測partition leader 存活性。
Consumer 端使用zookeeper 用來註冊consumer 信息,其中包括consumer 消費的partition 列表等,同時也用來發現broker 列表,並和partition leader 建立socket 連接,並獲取消息

  1. 查看所有的topics
    ./kafka-topics.sh --list --zookeeper 192.168.137.5:2181
  2. 創建topics
    kafka-create-topic.sh --replica 2 --partition 8 --topic test --zookeeper 192.168.197.170:2181
  3. 查看kafka中的具體消息內容
    ./kafka-simple-consumer-shell.sh --broker-list 10.204.243.40:9092,10.204.243.39:9092,10.204.243.38:9092 --topic fcbox_sms_log --partition 0
  4. 查看topic的分片和副本情況
    ./kafka-topics.sh --describe --zookeeper 10.204.243.40:2181,10.204.243.39:2181,10.204.243.38:2181 --topic fcbox_sms_log
  5. 查看所有的topic列表
    ./kafka-topics.sh --list --zookeeper 192.168.137.5:2181,10.204.243.40:2181,10.204.243.39:2181,10.204.243.38:2181
  6. 查看topic積壓情況
    ./kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --–zookeeper 10.204.8.20:2181,10.204.8.111:2181,10.204.8.122:2181 --topic fcbox-epsp-custm-info --group fcbox-g01
  7. 查看topic的擠壓情況
    ./kafka-consumer-offset-checker.sh --zookeeper 10.204.5.209:2181,10.204.5.210:2181,10.204.5.211:2181 --group fcbox-log --topic fcbox-r2s-info
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章