1. 程式人生 > >kafka的簡單介紹

kafka的簡單介紹

kafka 分散式的訊息儲存服務


    kafka 術語:
        broker:安裝了kafka軟體的一臺機器
        topic:kafka內部訊息是分主題存放的
        partition:在Topic的內部,資料是按照分割槽存放
        leader: leader某個主題下的某個分割槽對外提供的讀寫服務的角色
        follower
:某個分割槽除了leader,其他的都是follower,同步leader資料
        replication:指的是某個主題的某個分割槽有多少個副本
        Producer:(生產者)kafka一個客戶端,用來將資料傳送到kafka
        Consumer:(消費者)kafka一個客戶端,用來從kafka獲取訊息的
        Consumer Group
:每一個消費者都擁有一個groupId,每個groupId只能從kafka中獲取一次資料
        Controller:kafka叢集中某臺broker上啟動的一個服務,用來leader的選舉和故障轉移failover

 

   //kafka的寫資料流程
    1.producer先從zookeeper的"/brokers/.../state" 節點找到該partition的leader
    2.producer將訊息傳送給該leader
    3.leader將訊息寫入本地log
    4.followers從leader pull訊息,寫入本地log後 leader傳送 ACK
    5.leader收到所有 ISR(in-sync replicas)中的replica 的ACK後向producer傳送ACK
    
    //訊息儲存方法(broker如何儲存資料)

    物理上把topic分成一個或多個partition(對應server.properties中的num.partitions=3 配置),每個partition物理上對應一個資料夾(該資料夾儲存該partition的所有訊息和索引檔案)
    
    //producer傳送訊息到broker時,會根據分割槽演算法選擇將其儲存到哪一個partition
    1.指定了partition,這直接使用;
    2.未指定partition但指定key,通過對key的value進行hash選出一個partition
    3.partition和key都未指定,使用輪詢挑選出一個partition
    
    
    //kafka log 儲存讀取的原理
        分段檔案(segment)
            .log  .index  .timeindex
        稀疏索引(索引檔案在kafka啟動的時候,會載入到記憶體中)
    假設offset =48
    1.先根據分段檔案的名稱進行二分查詢,找到offset在哪個分段檔案中
    2.計算相對offset(48-分段檔案的名稱),根據相對的offset在索引檔案中進行二分查詢,找到相對offset對應的position
    3.根據offset對應的絕對的position去log檔案中找
    4.最後讀取Message對應的size來讀取對應的資料
    
    
    //啟動kafka叢集
    /usr/local/kafka_2.11-0.10.2.1/bin/kafka-server-start.sh /usr/local/kafka_2.11-0.10.2.1/config/server.properties >> /var/kafka.log 2>&1 &
    
    //建立Topic
    /usr/local/kafka_2.11-0.10.2.1/bin/kafka-topics.sh --create --zookeeper hadoop01:2181,hadoop02:2181,hadoop03:2181 --replication-factor 3 --partitions 3 --topic user
    
    //檢視所有的topic
    /usr/local/kafka_2.11-0.10.2.1/bin/kafka-topics.sh --list --zookeeper hadoop01:2181,hadoop02:2181,hadoop03:2181 
    
    //啟動Producer
    /usr/local/kafka_2.11-0.10.2.1/bin/kafka-console-producer.sh --broker-list hadoop01:9092 --topic user
    
    //啟動Consumer
    /usr/local/kafka_2.11-0.10.2.1/bin/kafka-console-consumer.sh --bootstrap-server hadoop01:9092,hadoop02:9092,hadoop03:9092 --from-beginning --topic user