kafka搭建和基礎知識

kafka學習
是一個分佈式、支持分區的(partition)、多副本的(replica),多訂閱者。基於zookeeper協調的分佈式消息系統  文件存儲機制設計很關鍵
高吞吐量、低延遲  kafka每秒可以處理幾十萬條消息   
可擴展性:kafka集羣支持熱擴展  
持久性、可靠性:消息被持久化到本地磁盤,並且支持數據備份防止數據丟失
容錯性:允許集羣中節點失敗(若副本數量爲n,則允許n-1個節點失敗)
高併發:支持數千個客戶端同時讀寫

數據緩存和削峯值和異步通信和緩衝

使用場景:
日誌收集 一個公司可以用Kafka可以收集各種服務的log,通過kafka以統一接口服務的方式開放給各種consumer,例如hadoop、Hbase、Solr等
消息系統:解耦和生產者和消費者、緩存消息等。
流式處理:比如spark streaming和storm

Broker Leader的選舉:Kakfa Broker集羣受Zookeeper管理,只會有一個註冊成功。失敗了,watcher會選舉其他的broker
bug:Zookeeper通信的timeout時間是6s,controller如果有6s中沒有和Zookeeper做心跳,就會判斷死掉了,重新選舉  由於網絡等原因慢  
概念意思
broker:服務器節點,存儲topic的數據。如果某topic有N個partition,集羣有N個broker,那麼每個broker存儲該topic的一個partition,一個broker可以存topic 零個,一個,多個partition
Topic: 每條發佈到Kafka集羣的消息都有一個類別,物理上不同Topic的消息分開存儲到多個broker,邏輯上一個Topic一起。  類似於數據庫的表名
Partition:topic中的數據分割爲一個或多個partition,在需要嚴格保證消息的消費順序的場景下,需要將partition數目設爲1!!!不同partition間的數據丟失了數據的順序,用segment文件存儲
            由於每臺機器的磁盤大小是有限的,所以即使有再多的機器,可處理的消息還是被磁盤所限制,無法超越當前磁盤大小.因此有了partition的概念.
segment:分成了多個segment(段),然後通過一個index,索引,來標識第幾段  segment文件保留的最長時間,默認保留7天(168小時)log.retention.hours   每個segment的大小,默認爲1G
offset:偏移量,讀到數據,根據二分發查找segment中的index索引來快速定位到位置
Producer:生產者發送的消息,存儲到一個partition中    
Consumer:可以消費多個topic中的數據
Consumer Group:每個Consumer屬於一個特定的Consumer Group
Leader:每個partition有多個副本,其中有且僅有一個作爲Leader,Leader是當前負責數據的讀寫的partition
Follower:Follower跟隨Leader,所有寫請求都通過Leader路由,數據變更會廣播給所有Follower,Follower與Leader保持數據同步。如果Leader失效,則從Follower中選舉出一個新的Leader
ISR:in sync replicas(複製)從複製品中刪除。

kafka搭建  安裝到/opt/kafka  https://blog.csdn.net/qq_37598011/article/details/88980317
基本操作和可視化: https://www.jianshu.com/p/2d83a67e2c79?nomobile=yes
首先安裝java https://blog.csdn.net/qq_37598011/article/details/88980317
kafaka裏面已經帶了zookeeper
Zookeeper集羣的工作是超過半數才能對外提供服務,3臺中超過兩臺超過半數,允許1臺掛掉 
安裝zookeeper wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz /config/zookeeper.properties
#broker.id=0  每臺服務器的broker.id都不能相同
安裝Kafka wget http://mirror.bit.edu.cn/apache/kafka/2.0.0/kafka_2.11-2.0.0.tgz  /config/server.properties
啓動 ./bin/*.sh config/*.properties    後臺 nohup ./kafka-server-start.sh ../config/server.properties 1>/dev/null 2>/dev/null &
集羣監控體量太大和數據監控kafka tool

listeners=PLAINTEXT://{內網ip}:9092  標識很重要

版本匹配!!!1.0 和 0.9坑!!!
<dependency>
        <groupId>org.springframework.kafka</groupId>
        <artifactId>spring-kafka</artifactId>
        <version>1.0.0.RELEASE</version>
</dependency>

spring:
  kafka:
    producer:
      retries: 0
      batch-size: 16384
      buffer-memory: 33554432
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
      bootstrap-servers: xxx:9092,xxx:9092
    consumer:
      bootstrap-servers: xxx:9092,xxx:9092
      group-id: test
      auto-offset-reset: earliest
      enable-auto-commit: true
      auto-commit-interval: 100
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      
      
      
 @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    public void send(String message) {
        System.out.println("sendssssssssssssssssssssssssssss");
        kafkaTemplate.send("test", message);
    }

    @PostConstruct
    public void sendM(){
        send("heqiang1");
    }
    
    
@KafkaListener(topics = {"test"})
    @Async
    public void getTopic(ConsumerRecord<?, ?> record) {

        Optional<?> kafkaMessage = Optional.ofNullable(record.value());
        if (kafkaMessage.isPresent()) {
            Object message = kafkaMessage.get();
            System.out.println("----------------- record =" + record);
            System.out.println("------------------ message =" + message);
            System.out.printf("topic = %s, offset = %d, value = %s \n", record.topic(), record.offset(), record.value());
        }
    }
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章