主頁 > 軟體設計 > 分布式訊息中間件(2):Kafka系統學習—集群搭建與使用、副本機制和實時日志統計流程

分布式訊息中間件(2):Kafka系統學習—集群搭建與使用、副本機制和實時日志統計流程

2021-04-27 16:45:47 軟體設計

前言

這個系列主要是講解關于分布式訊息中間件的一些心得

關于分布式系統、中間件是什么、訊息中間件能做什么、分布式訊息中間件長什么樣諸如此類基礎概念在上一篇文章——

分布式訊息中間件(1):Rabbitmq入門到高可用實戰!都已經講過,這里就不贅述了,感興趣的朋友可以自己去看一下,

這是本系列的第二篇,準備寫kafka,

Kakfa 廣泛應用于國內外大廠,例如 BAT、位元組跳動、美團、Netflix、Airbnb、Twitter 等等,其重要性不言而喻,

kafka與其他三個主流中間件相比,優勢有兩個:

  • 性能高,每秒百萬級別;
  • 分布式,高可用,水平擴展,

今天我們通過這篇文章深入了解一下 Kafka的作業原理,由于篇幅所限,肯定不會完全寫到,只能挑比較重要的幾個點來跟大家分析一下,面試題的話也不會在這篇文章里決議了,單獨整理了一份kafka學習筆記PDF以及定經典高頻面試題決議,需要的朋友可以自行領取

  • 完整版kafka學習筆記
  • kafka高頻面試題

好了,話不多說,坐穩扶好,發車嘍!

一、Kafka集群搭建與使用

kafka官網圖

有中文官網,可以詳細看看,

地址:http://kafka.apachecn.org/intro.html

1、軟體下載

1.1 kakfa下載

地址:http://kafka.apache.org/downloads

1.2 zookeeper下載

(1)因為kafka要依賴于zookeeper做調度,kafka中實際自帶的有kafka,但是一般建議使用獨立的zookeeper,方便后續升級及公用,

(2)下載地址:

http://zookeeper.apache.org/

1.3 下載說明

檔案都不大,zk是9m多,kafka是50多兆

2、 kafka單機部署及集群部署

**說明:**北游在本地弄了三臺虛擬機,ip分別為:

192.168.85.158
192.168.85.168
192.168.85.178

2.1 單機部署

(1)上傳jar包,就不再新建用戶了,直接在root賬戶下執行,將kafka和zookeeper的tar包上傳到/root/tools目錄下,

(2)解壓

[root@ruanjianlaowang158 tools]# tar -zxvf kafka_2.12-2.4.1.tgz 
[root@ruanjianlaowang158 tools]# tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz  

(3)配置zookeeper及啟動

[root@ruanjianlaowang158 apache-zookeeper-3.5.7-bin]# cd /root/tools/apache-zookeeper-3.5.7-bin
#北游,首先創建個空檔案夾,在接下來的組態檔中配置
[root@ruanjianlaowang158 apache-zookeeper-3.5.7-bin]# mkdir data
[root@ruanjianlaowang158 conf]# cd /root/tools/apache-zookeeper-3.5.7-bin/conf
[root@ruanjianlaowang158 conf]# cp zoo_sample.cfg  zoo.cfg 
[root@ruanjianlaowang158 conf]# vi  zoo.cfg 
#單機只改一個值,保存退出,
#dataDir=/tmp/zookeeper
dataDir=/root/tools/apache-zookeeper-3.5.7-bin/data

#啟動zookeeper
[root@ruanjianlaowang158 bin]# cd /root/tools/apache-zookeeper-3.5.7-bin/bin
[root@ruanjianlaowang158 bin]# ./zkServer.sh  start

(4)配置kafka及啟動

[root@ruanjianlaowang158 kafka_2.12-2.4.1]# cd /root/tools/kafka_2.12-2.4.1

#北游,新建個空檔案夾
[root@ruanjianlaowang158 kafka_2.12-2.4.1]# mkdir data

#北游,更改組態檔
[root@ruanjianlaowang158 config]# cd /root/tools/kafka_2.12-2.4.1/config
[root@ruanjianlaowang158 config]# vi server.properties 

#需要改3個值
#log.dirs=/tmp/kafka-logs
log.dirs=/root/tools/kafka_2.12-2.4.1/data
#listeners = PLAINTEXT://your.host.name:9092
listeners=PLAINTEXT://192.168.85.158:9092
#zookeeper.connect=localhost:2181
zookeeper.connect=192.168.85.158:2181

#啟動kafka
[root@ruanjianlaowang158 bin]# cd /root/tools/kafka_2.12-2.4.1/bin
[root@ruanjianlaowang158 bin]# ./zookeeper-server-start.sh ../config/server.properties &

啟動完畢,單機驗證就不驗證了,直接在集群中進行驗證,

2.2 集群部署

(1)集群方式,首先把上面的單機模式,再在192.168.85.168和192.168.85.178服務器上先解壓配置一遍,

(2)zookeeper是還是更改zoo.cfg

158,168,178三臺服務器一樣:

[root@ruanjianlaowang158 conf]# cd /root/tools/apache-zookeeper-3.5.7-bin/conf

[root@ruanjianlaowang158 conf]# vi zoo.cfg
#其他不變,最后面新加,三行,三臺服務器配置一樣,北游
server.1=192.168.85.158:2888:3888
server.2=192.168.85.168:2888:3888
server.3=192.168.85.178:2888:3888

158服務器執行:
echo "1" > /root/tools/apache-zookeeper-3.5.7-bin/data/myid
168服務器執行:
echo "2" > /root/tools/apache-zookeeper-3.5.7-bin/data/myid
178服務器執行:
echo "3" > /root/tools/apache-zookeeper-3.5.7-bin/data/myid

(3)kafka集群配置

[root@ruanjianlaowang158 config]# cd /root/tools/kafka_2.12-2.4.1/config
[root@ruanjianlaowang158 config]# vi server.properties 
#broker.id 三臺服務器不一樣,158服務器設定為1,168服務器設定為2,178服務器設定為3 

broker.id=1
#三個服務器配置一樣
zookeeper.connect=192.168.85.158:2181,192.168.85.168:2181,192.168.85.178:2181

Kafka常用Broker配置說明:

配置項默認值/示例值說明
broker.id0Broker唯一標識
listenersPLAINTEXT://192.168.85.158:9092監聽資訊,PLAINTEXT表示明文傳輸
log.dirs/root/tools/apache-zookeeper-3.5.7-bin/datakafka資料存放地址,可以填寫多個,用","間隔
message.max.bytesmessage.max.bytes單個訊息長度限制,單位是位元組
num.partitions1默認磁區數
log.flush.interval.messagesLong.MaxValue在資料被寫入到硬碟和消費者可用前最大累積的訊息的數量
log.flush.interval.msLong.MaxValue在資料被寫入到硬碟前的最大時間
log.flush.scheduler.interval.msLong.MaxValue檢查資料是否要寫入到硬碟的時間間隔,
log.retention.hours24控制一個log保留時間,單位:小時
zookeeper.connect192.168.85.158:2181,

192.168.85.168:2181,
192.168.85.178:2181 | ZooKeeper服務器地址,多臺用","間隔 |

(4)集群啟動

啟動方式跟單機一樣:

#啟動zookeeper
[root@ruanjianlaowang158 bin]# cd /root/tools/apache-zookeeper-3.5.7-bin/bin
[root@ruanjianlaowang158 bin]# ./zkServer.sh  start

#啟動kafka
[root@ruanjianlaowang158 bin]# cd /root/tools/kafka_2.12-2.4.1/bin
[root@ruanjianlaowang158 bin]# ./zookeeper-server-start.sh ../config/server.properties &

(5)注意點

集群啟動的時候,單機那臺服務器(158)可能會報:Kafka:Configured broker.id 2 doesn't match stored broker.id 0 in meta.properties.
方案:在158服務器data中有個檔案:meta.properties,檔案中的broker.id也需要修改成與server.properties中的broker.id一樣,所以造成了這個問題,

(6)創建個topic,后面springboot專案測驗使用,

[root@ruanjianlaowang158 bin]# cd /root/tools/kafka_2.12-2.4.1/bin
[root@ruanjianlaowang158 bin]# ./kafka-topics.sh --create --zookeeper 192.168.85.158:2181,192.168.85.168:2181,192.168.85.178:2181 --replication-factor 3 --partitions 5 --topic aaaa

3、結合springboot專案

3.1 pom檔案

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.itany</groupId>
    <artifactId>kafka</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>kafka</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

說明:

主要就兩個gav,一個是spring-boot-starter-web,啟動web服務使用;一個是spring-kafka,這個是springboot集成額kafka核心包,

3.2 application.yml

spring:
  kafka:
    # 北游,kafka集群服務器地址
    bootstrap-servers: 192.168.85.158:9092,192.168.85.168:9092,192.168.85.178:9092
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    consumer:
      group-id: test
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

3.3 producer(訊息生產者)

@RestController
public class KafkaProducer {
    @Autowired
    private KafkaTemplate template;
 		//北游,topic使用上測驗創建的aaaa
    @RequestMapping("/sendMsg")
    public String sendMsg(String topic, String message){
        template.send(topic,message);
        return "success";
    }
}

3.4 consumer(消費者)

@Component
public class KafkaConsumer {
   //北游,這里是監控aaaa這個topic,直接列印到idea中,北游
    @KafkaListener(topics = {"aaaa"})
    public void listen(ConsumerRecord record){
        System.out.println(record.topic()+":"+record.value());
    }
}

3.5 驗證結果

(1)瀏覽器上輸入

http://localhost:8080/sendMsg?topic=aaaa&message=bbbb

(2)北游的idea控制臺列印資訊

  • 完整版kafka學習筆記領取

二、Kafka副本機制

1、什么是副本機制:

通常是指分布式系統在多臺網路互聯的機器上保存有相同的資料拷貝

2、副本機制的好處:

2.1 提供資料冗余

系統部分組件失效,系統依然能夠繼續運轉,因而增加了整體可用性以及資料持久性

2.2 提供高伸縮性

支持橫向擴展,能夠通過增加機器的方式來提升讀性能,進而提高讀操作吞吐量

2.3 改善資料區域性

允許將資料放入與用戶地理位置相近的地方,從而降低系統延時,

3、kafka的副本

(1)、 本質就是一個只能追加寫訊息的日志檔案

(2)、同一個磁區下的所有副本保存有相同的訊息序列

(3)、副本分散保存在不同的 Broker 上,從而能夠對抗部分 Broker 宕機帶來的資料不可用(Kafka 是有若干主題概,每個主題可進一步劃分成若干個磁區,每個磁區配置有若干個副本)

如下:有 3 臺 Broker 的 Kafka 集群上的副本分布情況

4、kafka如何保證同一個磁區下的所有副本保存有相同的訊息序列:

基于領導者(Leader-based)的副本機制

作業原理如圖:

(1)、Kafka 中分成兩類副本:領導者副本(Leader Replica)和追隨者副本(Follower Replica),每個磁區在創建時都要選舉一個副本,稱為領導者副本,其余的副本自動稱為追隨者副本,

(2)、Kafka 中,追隨者副本是不對外提供服務的,追隨者副本不處理客戶端請求,它唯一的任務就是從領導者副本,所有的讀寫請求都必須發往領導者副本所在的 Broker,由該 Broker 負責處理,(因此目前kafka只能享受到副本機制帶來的第 1 個好處,也就是提供資料冗余實作高可用性和高持久性)

(3)、領導者副本所在的 Broker 宕機時,Kafka 依托于 ZooKeeper 提供的監控功能能夠實時感知到,并立即開啟新一輪的領導者選舉,從追隨者副本中選一個作為新的領導者,老 Leader 副本重啟回來后,只能作為追隨者副本加入到集群中,

5、kafka追隨者副本到底在什么條件下才算與 Leader 同步

Kafka 引入了 In-sync Replicas,也就是所謂的 ISR 副本集合,ISR 中的副本都是與 Leader 同步的副本,相反,不在 ISR 中的追隨者副本就被認為是與 Leader 不同步的

6、kafka In-sync Replicas(ISR)

(1)、ISR不只是追隨者副本集合,它必然包括 Leader 副本,甚至在某些情況下,ISR 只有 Leader 這一個副本

(2)、通過Broker 端replica.lag.time.max.ms 引數(Follower 副本能夠落后 Leader 副本的最長時間間隔)值來控制哪個追隨者副本與 Leader 同步?只要一個 Follower 副本落后 Leader 副本的時間不連續超過 10 秒,那么 Kafka 就認為該 Follower 副本與 Leader 是同步的,即使此時 Follower 副本中保存的訊息明顯少于 Leader 副本中的訊息,

(3)、ISR 是一個動態調整的集合,而非靜態不變的,

某個追隨者副本從領導者副本中拉取資料的程序持續慢于 Leader 副本的訊息寫入速度,那么在 replica.lag.time.max.ms 時間后,此 Follower 副本就會被認為是與 Leader 副本不同步的,因此不能再放入 ISR 中,此時,Kafka 會自動收縮 ISR 集合,將該副本“踢出”ISR,

倘若該副本后面慢慢地追上了 Leader 的進度,那么它是能夠重新被加回 ISR 的,

(4)、ISR集合為空則leader副本也掛了,這個磁區就不可用了,producer也無法向這個磁區發送任何訊息了,(反之leader副本掛了可以從ISR集合中選舉leader副本)

7、kafka leader副本所在broker掛了,leader副本如何選舉

(1)、ISR不為空,從ISR中選舉

(2)、ISR為空,Kafka也可以從不在 ISR 中的存活副本中選舉,這個程序稱為Unclean 領導者選舉,通過Broker 端引數unclean.leader.election.enable控制是否允許 Unclean 領導者選舉,

開啟 Unclean 領導者選舉可能會造成資料丟失,但好處是,它使得磁區 Leader 副本一直存在,不至于停止對外提供服務,因此提升了高可用性,反之,禁止 Unclean 領導者選舉的好處在于維護了資料的一致性,避免了訊息丟失,但犧牲了高可用性,

一個分布式系統通常只能同時滿足一致性(Consistency)、可用性(Availability)、磁區容錯性(Partition tolerance)中的兩個,顯然,在這個問題上,Kafka 賦予你選擇 C 或 A 的權利,

強烈建議不要開啟unclean leader election,畢竟我們還可以通過其他的方式來提升高可用性,如果為了這點兒高可用性的改善,犧牲了資料一致性,那就非常不值當了,

ps1:leader副本的選舉也可以理解為磁區leader的選舉

ps2:broker的leader選舉與磁區leader的選舉不同,

Kafka的Leader選舉是通過在zookeeper上創建/controller臨時節點來實作leader選舉,并在該節點中寫入當前broker的資訊

{“version”:1,”brokerid”:1,”timestamp”:”1512018424988”} 

利用Zookeeper的強一致性特性,一個節點只能被一個客戶端創建成功,創建成功的broker即為leader,即先到先得原則,leader也就是集群中的controller,負責集群中所有大小事務,

當leader和zookeeper失去連接時,臨時節點會洗掉,而其他broker會監聽該節點的變化,當節點洗掉時,其他broker會收到事件通知,重新發起leader選舉

再給你們留個小問題:如果允許 Follower 副本對外提供讀服務,你覺得應該如何避免或緩解因 Follower 副本與 Leader 副本不同步而導致的資料不一致的情形?

三、實時日志統計流程

1、專案流程

在整合這套方案的時候,專案組也是經過一番討論,在討論中,觀點很多,有人認為直接使用Storm進行實時處理,去掉Kafka環節;也有認為直接使用Kafka的API去消費,去掉Storm的消費環節等等,但是最終組內還是一致決定使用這套方案,原因有如下幾點:

  • 業務模塊化
  • 功能組件化

我們認為,Kafka在整個環節中充當的職責應該單一,這專案的整個環節她就是一個中間件,下面用一個圖來說明這個原因,如下圖所示:

整個專案流程如上圖所示,這樣劃分使得各個業務模塊化,功能更加的清晰明了,

  • Data Collection

負責從各個節點上實時收集用戶上報的日志資料,我們選用的是Apache的Flume NG來實作,

  • Data Access

由于收集的資料的速度和資料處理的速度不一定是一致的,因此,這里添加了一個中間件來做處理,所使用的是Apache的Kafka,關于Kafka集群部署,另外,有一部分資料是流向HDFS分布式檔案系統了的,方便于為離線統計業務提供資料源,

  • Stream Computing

在收集到資料后,我們需要對這些資料做實時處理,所選用的是Apache的Storm,關于Storm的集群搭建部署博客后面補上,較為簡單,

  • Data Output

在使用Storm對資料做處理后,我們需要將處理后的結果做持久化,由于對回應速度要求較高,這里采用Redis+MySQL來做持久化,整個專案的流程架構圖,如下圖所示:

2、Flume

Flume是一個分布式的、高可用的海量日志收集、聚合和傳輸日志收集系統,支持在日志系統中定制各類資料發送方(如:Kafka,HDFS等),便于收集資料,Flume提供了豐富的日志源收集型別,有:Console、RPC、Text、Tail、Syslog、Exec等資料源的收集,在我們的日志系統中目前我們所使用的是spooldir方式進行日志檔案采集,配置內容資訊如下所示:

producer.sources.s.type = spooldir
producer.sources.s.spoolDir = /home/hadoop/dir/logdfs

當然,Flume的資料發送方型別也是多種型別的,有:Console、Text、HDFS、RPC等,這里我們系統所使用的是Kafka中間件來接收,配置內容如下所示:

producer.sinks.r.type = org.apache.flume.plugins.KafkaSink
producer.sinks.r.metadata.broker.list=dn1:9092,dn2:9092,dn3:9092
producer.sinks.r.partition.key=0
producer.sinks.r.partitioner.class=org.apache.flume.plugins.SinglePartition
producer.sinks.r.serializer.class=kafka.serializer.StringEncoder
producer.sinks.r.request.required.acks=0
producer.sinks.r.max.message.size=1000000
producer.sinks.r.producer.type=sync
producer.sinks.r.custom.encoding=UTF-8
producer.sinks.r.custom.topic.name=test

3、Kafka

Kafka是一種提供高吞吐量的分布式發布訂閱訊息系統,她的特性如下所示:

  • 通過磁盤資料結構提供訊息的持久化,這種結構對于即使資料達到TB+級別的訊息,存盤也能夠保持長時間的穩定,
  • 搞吞吐特性使得Kafka即使使用普通的機器硬體,也可以支持每秒數10W的訊息,
  • 能夠通過Kafka Cluster和Consumer Cluster來Partition訊息,

Kafka的目的是提供一個發布訂閱解決方案,他可以處理Consumer網站中的所有流動資料,在網頁瀏覽,搜索以及用戶的一些行為,這些動作是較為關鍵的因素,這些資料通常是由于吞吐量的要求而通過處理日志和日志聚合來解決,對于Hadoop這樣的日志資料和離線計算系統,這樣的方案是一個解決實時處理較好的一種方案,

關于Kafka集群的搭建部署和使用,上面已經寫了,不會的朋友翻上去再看一下,這里就不贅述了,

4、Storm

Twitter將Storm開源了,這是一個分布式的、容錯的實時計算系統,已被貢獻到Apache基金會,下載地址如下所示:

http://storm.apache.org/downloads.html

Storm的主要特點如下:

  • 簡單的編程模型,類似于MapReduce降低了并行批處理復雜性,Storm降低了進行實時處理的復雜性,
  • 可以使用各種編程語言,你可以在Storm之上使用各種編程語言,默認支持Clojure、Java、Ruby和Python,要增加對其他語言的支持,只需實作一個簡單的Storm通信協議即可,
  • 容錯性,Storm會管理作業行程和節點的故障,
  • 水平擴展,計算是在多個執行緒、行程和服務器之間并行進行的,
  • 可靠的訊息處理,Storm保證每個訊息至少能得到一次完整處理,任務失敗時,它會負責從訊息源重試訊息,
  • 快速,系統的設計保證了訊息能得到快速的處理,使用?MQ作為其底層訊息佇列,
  • 本地模式,Storm有一個本地模式,可以在處理程序中完全模擬Storm集群,這讓你可以快速進行開發和單元測驗,

Storm集群由一個主節點和多個作業節點組成,主節點運行了一個名為“Nimbus”的守護行程,用于分配代碼、布置任務及故障檢測,每個作業節 點都運行了一個名為“Supervisor”的守護行程,用于監聽作業,開始并終止作業行程,

Nimbus和Supervisor都能快速失敗,而且是無 狀態的,這樣一來它們就變得十分健壯,兩者的協調作業是由Apache的ZooKeeper來完成的,

Storm的術語包括StreamSpoutBoltTaskWorkerStream GroupingTopology

  • Stream是被處理的資料,
  • Spout是資料源,
  • Bolt處理資料,
  • Task是運行于Spout或Bolt中的 執行緒,
  • Worker是運行這些執行緒的行程,
  • Stream Grouping規定了Bolt接收什么東西作為輸入資料,資料可以隨機分配(術語為Shuffle),或者根據欄位值分配(術語為Fields),或者廣播(術語為All),或者總是發給一個Task(術語為Global),也可以不關心該資料(術語為None),或者由自定義邏輯來決定(術語為 Direct),
  • Topology是由Stream Grouping連接起來的Spout和Bolt節點網路,在Storm Concepts頁面里對這些術語有更詳細的描述,

關于Storm集群的搭建部署,博客在下一篇中更新,到時候會將更新地址附在這里,這里就先不對Storm集群的搭建部署做過多的贅述了,

5、總結

Kafka 日志訊息保存時間總結
Kafka 作為一個高吞吐的訊息中間件和傳統的訊息中間件一個很大的不同點就在于它的日志實際上是以日志的方式默認保存在/kafka-logs檔案夾中的,雖然默認有7天清楚的機制,但是在資料量大,而磁盤容量不足的情況下,經常出現無法寫入的情況,如何調整Kafka的一些默認引數就顯得比較關鍵了,這里筆者整理了一些常見的配置引數供大家參考:

分段策略屬性

屬性名含義默認值
log.roll.{hours,ms}日志滾動的周期時間,到達指定周期時間時,強制生成一個新的segment168(7day)
log.segment.bytes每個segment的最大容量,到達指定容量時,將強制生成一個新的segment1G(-1為不限制)
log.retention.check.interval.ms日志片段檔案檢查的周期時間60000

日志重繪策略

Kafka的日志實際上是開始是在快取中的,然后根據策略定期一批一批寫入到日志檔案中去,以提高吞吐率,

屬性名含義默認值
log.flush.interval.messages訊息達到多少條時將資料寫入到日志檔案10000
log.flush.interval.ms當達到該時間時,強制執行一次flushnull
log.flush.scheduler.interval.ms周期性檢查,是否需要將資訊flush很大的值

日志保存清理策略

屬性名含義默認值
log.cleanup.polict日志清理保存的策略只有delete和compact兩種delete
log.retention.hours日志保存的時間,可以選擇hours,minutes和ms168(7day)
log.retention.bytes洗掉前日志檔案允許保存的最大值-1
log.segment.delete.delay.ms日志檔案被真正洗掉前的保留時間60000
log.cleanup.interval.mins每隔一段時間多久呼叫一次清理的步驟10
log.retention.check.interval.ms周期性檢查是否有日志符合洗掉的條件(新版本使用) 300000

這里特別說明一下,日志的真正清楚時間,當洗掉的條件滿足以后,日志將被“洗掉”,但是這里的洗掉其實只是將該日志進行了“delete”標注,檔案只是無法被索引到了而已,

但是檔案本身,仍然是存在的,只有當過了log.segment.delete.delay.ms 這個時間以后,檔案才會被真正的從檔案系統中洗掉,


文章寫到這里差不多了,比我預計要寫得短一些,因為還有一些東西要寫出來難免長篇大論,篇幅不允許,想更透徹的掌握kafka的同學可以領取我整理的完整版kafka學習筆記,最近要準備面試的同學可以看看我這份kafka高頻面試題整理

后面我會把另外兩個中間件也分別寫文章分析,可以給我點個關注第一時間接到通知

然后,可以點個贊嗎兄弟們!

end

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/280669.html

標籤:其他

上一篇:深圳一個商城公司運維面試題目帶答案

下一篇:Java:(一)自己動手實作一個好用的SpringBoot后端框架(專案搭建、組件依賴)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more