Kafka Topic
可以根據(jù)業(yè)務類型,分發(fā)到不同的Topic中,對于每一個Topic,下面可以有多個分區(qū)(Partition)日志文件:
kafka 下的Topic的多個分區(qū),每一個分區(qū)實質上就是一個隊列,將接收到的消息暫時存儲到隊列中,根據(jù)配置以及消息消費情況來對隊列消息刪除。
Partition是一個有序的message序列 這些message按順序添加到一個叫做commit log的文件中。每個partition中的消息都有一個唯一的編號,稱之為offset,用來唯一標示某個分區(qū)中的message。
每個partition,都對應一個commit log文件。一個partition中的message的offset都是唯一的,但是不同的partition中的message的offset可能是相同的。
可以這么來理解Topic,Partition和Broker
一個topic,代表邏輯上的一個業(yè)務數(shù)據(jù)集,比如按數(shù)據(jù)庫里不同表的數(shù)據(jù)操作消息區(qū)分放入不同topic,訂單相關操作消息放入訂單topic,用戶相關操作消息放入用戶topic,
對于大型網(wǎng)站來說,后端數(shù)據(jù)都是海量的,訂單消息很可能是非常巨量的,比如有幾百個G甚至達到TB級別,如果把這么多數(shù)據(jù)都放在一臺機器上可定會有容量限制問題,
那么就可以在topic內(nèi)部劃分多個partition來分片存儲數(shù)據(jù),不同的partition可以位于不同的機器上,每臺機器上都運行一個Kafka的進程Broker。
為什么要對Topic下數(shù)據(jù)進行分區(qū)存儲?
1、commit log文件會受到所在機器的文件系統(tǒng)大小的限制,分區(qū)之后可以將不同的分區(qū)放在不同的機器上,相當于對數(shù)據(jù)做了分布式存儲,理論上一個topic可以處理任意數(shù)量的數(shù)據(jù)。
2、為了提高并行度。
消費者消費消息的offset記錄機制
每個consumer會定期將自己消費分區(qū)的offset提交給kafka內(nèi)部
topic:__consumer_offsets,提交過去的時候,
key是 consumerGroupId+topic+分區(qū)號,value就是當前offset的值,kafka會定期清理topic里的消息,最后就保留最新的那條數(shù)據(jù)。
因為__consumer_offsets可能會接收高并發(fā)的請求,kafka默認給其分配50個分區(qū)(可以通過offsets.topic.num.partitions設置),這樣可以通過加機器的方式抗大并發(fā)
kafka 日志存儲
查看指定topic信息
bin/kafka-topics.sh --describe --bootstrap-server node02:9092 --topic test
可以進入kafka的數(shù)據(jù)文件存儲目錄查看test和test1主題的消息日志文件:默認log目錄 /tmp/kafka-logs
消息日志文件主要存放在分區(qū)文件夾里的以log結尾的日志文件里,如下是test-1主題對應的分區(qū)0的消息日志:
kafka一般不會刪除消息,不管這些消息有沒有被消費。只會根據(jù)配置的日志保留時間(log.retention.hours)確認消息多久被刪除,
默認保留最近一周的日志消息。kafka的性能與保留的消息數(shù)據(jù)量大小沒有關系,
因此保存大量的數(shù)據(jù)消息日志信息不會有什么影響。
每個consumer是基于自己在commit log中的消費進度(offset)來進行工作的。
在kafka中,消費offset由consumer自己來維護;一般情況下我們按照順序逐條消費commit log中的消息,
當然我可以通過指定offset來重復消費某些消息,或者跳過某些消息。
這意味kafka中的consumer對集群的影響是非常小的,添加一個或者減少一個consumer,
對于集群或者其他consumer來說,都是沒有影響的,因為每個consumer維護各自的消費offset。
Kafka 一個分區(qū)的消息數(shù)據(jù)對應存儲在一個文件夾下,以topic名稱+分區(qū)號命名,消息在分區(qū)內(nèi)是分段(segment)存儲,
每個段的消息都存儲在不一樣的log文件里,這種特性方便old segment file快速被刪除,kafka規(guī)定了一個段位的 log 文件最大為 1G,做這個限制目的是為了方便把 log 文件加載到內(nèi)存去操作:
部分消息的offset索引文件,kafka每次往分區(qū)發(fā)4K(可配置)消息就會記錄一條當前消息的offset到index文件,
如果要定位消息的offset會先在這個文件里快速定位,再去log文件里找具體消息
00000000000009936472.index
消息存儲文件,主要存offset和消息體
00000000000009936472.log
消息的發(fā)送時間索引文件,kafka每次往分區(qū)發(fā)4K(可配置)消息就會記錄一條當前消息的發(fā)送時間戳與對應的offset到timeindex文件,
如果需要按照時間來定位消息的offset,,會先在這個文件里查找
00000000000009936472.timeindex
這個 9936472 之類的數(shù)字,就是代表了這個日志段文件里包含的起始 Offset,也就說明這個分區(qū)里至少都寫入了接近1000 萬條數(shù)據(jù)了。文章來源:http://www.zghlxwxcb.cn/news/detail-438600.html
Kafka Broker 有一個參數(shù),log.segment.bytes,限定了每個日志段文件的大小,最大就是 1GB。
一個日志段文件滿了,就自動開一個新的日志段文件來寫入,避免單個文件過大,影響文件的讀寫性能,這個過程叫做 log rolling,正在被寫入的那個日志段文件,叫做 active log segment。文章來源地址http://www.zghlxwxcb.cn/news/detail-438600.html
到了這里,關于Kafka - 主題Topic與消費者消息Offset日志記錄機制的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!