Kafka Broker配置


  Kafka發行包里自帶的配置樣本可以用來安裝單機服務,但並不能滿足大多數安裝場景的要求。kafka有很多配置選項,Kafka有很多配置選項,涉及安裝和調優的方方面面。不過大多數調優選項可以使用默認配置,除非你對調優有特別的要求。

常規配置和主題配置(服務端的配置文件)

  kafka安裝包里自帶的config目錄下有一個名字叫做server.properties的配置文件,這里面的配置項對應的就是標題里說的常規配置和主題配置了。在我的試驗環境下,這個文件的絕對路徑是:/usr/local/kafka/kafka_2.11-2.0.0/config/server.properties。

#每一個broker都需要一個標識符,使用broker.id來表示。它的默認值是0,也可以被設置成任意其它整數。這個值在整個kafka集群里必須是唯一的。這個值可以任意選定。建議把他們設置成語機器名具有相關性的整數,這樣在維護時,將ID號映射到機器名就沒有那么麻煩了。
broker.id=0

#用來監聽連接的端口,producer或consumer將在此端口建立連接,修改port可以配置參數可以把它設置成其他任意可用的端口,如果要使用1024以下的端口,需要使用root權限啟動kafka,不推薦這么做
port=9092

#用於保存broker元數據的Zookeeper地址是通過zookeeper.connect來指定的,localhost:2181表示這個Zookeeper是運行在本地的2181端口上。該參數配置是用逗號(原書寫的是冒號,但是kafka自帶的配置文件是用逗號分隔做的示例)分隔的一組hostname:port/path列表,
#每一部分的含義如下:hostname是Zookeeper服務器的機器名或IP地址;
#port是Zookeeper的客戶端連接端口
#/path是可選的Zookeeper路徑,作為Kafka集群的chroot環境,如果不指定,默認使用根目錄,如果指定的chroot路徑不存在,broker會在啟動的時候創建它。
#chroot在kafka集群里使用chroot路徑是一種最佳實踐。Zookeeper群組可以共享給其它應用程序,即使還有其它kafka集群存在,也不會產生沖突。最好是在配置文件里指定一組Zookeeper服務器
#用逗號(原書《kafka權威指南》寫的是分號)把他們隔開,一旦有一個Zookeeper服務器宕機,broker可以連接到Zookeeper群組的另一個結點上。

zookeeper.connect=zk01:2181,zk02:2181,zk03:2181

#kafka把所有的消息都保存在磁盤上,存放這些日志片段的目錄是通過log.dirs指定的。它是一組用逗號分隔的本地文件系統路徑。如果指定了多個路徑,那么Broker會根據
#“最少使用”原則,把同一個分區的日志片段保存到同一個路徑下。要注意,broker會往擁有最好數目分區的路徑新增分區,而不是往用於最小磁盤空間的路徑新增分區。 log.dirs=/export/servers/logs/kafka

#我們知道segment文件默認會被保留7天的時間,超時的話就
#會被清理,那么清理這件事情就需要有一些線程來做。這里就是
#用來設置恢復和清理data下數據的線程數量
#對以下3種情況,kafka會使用可配置的線程池來處理日志片段
#服務器正常啟動,用於打開每個分區的日志片段;
#服務器崩潰后重啟,用於檢查和截短每個分區的日志片段;
#服務器正常關閉,用於關閉日志片段
#默認情況下,每個日志目錄只使用一個線程,因為這些線程只是在服務器啟動和關閉時會用到,所以完全可以設置大量的線程來達到並行操作的目的。特別是對於包含大量分區的服務器來說
#一旦發生崩潰,在進行恢復時使用並行操作可能會省下數小時的時間。設置此參數時需要注意,所配置的數字對應的是log.dirs指定的單個目錄,也就是說該項配置為8,並且log.dirs被
#指定了3個路徑,那么總共需要24個線程 num.recovery.threads.per.data.dir=1
#默認情況下,kafka會在如下情況下自動創建主題:
#當一個生產者開始往主題寫入消息時
#當一個消費者開始從主題讀取消息時
#當任意一個客戶端向主題發送元數據請求時
#很多時候,這些行為都是非預期的,而且,根據kafka協議,如果一個主題不先被創建,根本無法知道它是否已經存在。如果顯示的創建主題,不管是手動創建還是通過其它配置系統來創建
#都可以把auto.create.topics.enable設為false
auto.create.topics.enable=true

#以上為常規配置

#num.partitions參數指定了新創建的主題將包含多少個分區。如果啟用了主題自動創建功能(該功能是默認啟用的),主題分區的個數就是該參數指定的值。
#該參數的默認值是1。注意,我們可以增加主題分區的個數,但不能減少分區的個數。所以,如果要讓一個主題的分區數個數少於num.partitions指定的值,需要手動創建該主題。
#kafka集群通過分區對主題進行橫向擴展,所以當有新的Broker加入集群時,可以通過分區的個數來實現集群負載的均衡。為了能讓分區分布到所有broker上,主題分區的個數必須要大於Broker的個數
#擁有大量消息的主題如果要進行負載均衡,就需要大量的分區。分區的大小限制在25GB以內可以得到比較理想的效果
#分區數量的估算可以通過主題每秒鍾的吞吐量/消費者每秒鍾的吞吐量來進行估算 num.partitions=2
#segment文件保留的最長時間,默認保留7天(168小時),
#超時將被刪除,也就是說7天之前的數據將被清理掉。
#Kafka可以根據時間來決定數據可以被保留多久。默認使用log.retention.hours參數來配置時間,默認是168小時。
#除此之外還有其它兩個參數log.retention.minutes和log.retention.ms。使用log.retention.ms為宜
#如果指定了不知一個參數,Kafka會優先使用具有最小值的那個參數
#根據時間保留數據是通過檢查磁盤上日志片段文件的最后修改時間來實現的。一般來說,最后修改時間指的就是日志片段關閉的時間,也就是文件里最后一個消息的時間戳。
#不過如果使用管理工具在服務器間移動分區,最后修改時間就不准確了,時間誤差可能會導致這些分區過多的保留數據
log.retention.hours=168
#log.retention.bytes,這是另一種決定日志片段是否被刪除的方式。(這兩種方式都是作用在日志片段上的,而不是作用在單個消息上)
#通過保留的消息的字節數來判斷是否過期。它的值通過log.retention.bytes來指定,作用在每一個分區上,就是說這個值被設置為了1024,一個主題有8個分區,那么這個主題一共可以保存8K數據
#如果同時指定了log.retention.bytes和log.retention.ms,只要任意一個條件滿足,消息就會被刪除。
log.retention.bytes=1024

#日志文件中每個segment的大小,默認為1G
#當消息到達broker時,它們被追加到分區的當前日志片段上,當日志片段大小達到log.segment.bytes指定的上限時,當前日志片段就會被關閉,一個新的日志片段被打開。
#如果一個新的日志片段被關閉,就開始等待過期。這個參數的值越小,就會越頻繁的關閉和分配新文件,從而降低磁盤寫入的整體效率。
#如果主題的消息量不大,那么怎么調整這個參數就非常重要了。
#使用時間戳獲取偏移量:日志片段大小會影響使用時間戳獲取便宜浪。在使用時間戳獲取日志偏移量時,kafka會檢查分區里最后修改時間大於指定時間戳的日志片段(已經被關閉而定),
#該日志片段的前一個文件的最后修改時間小於指定時間戳。然后kafka返回該日志片段(也就是文件名)開頭的偏移量。對於使用時間戳獲取偏移量的操作來說,日志片段越小,結果越准確。 log.segment.bytes=1073741824
#控制日志片段關閉的另一個參數是:log.segment.ms,它指定了多長時間之后日志片段就會被關閉。log.segment.bytes和log.segment.bytes兩個參數,哪個條件先達到就使用哪個條件關閉日志片段
#默認情況下log.segment.ms沒有設定值,所以只根據大小來關閉日志片段。如果使用基於時間的日志片段,要着重考慮並行關閉多個日志片段對磁盤性能的影響。

#message.max.bytes,broker通過設置message.max.bytes參數來限制單個消息的大小,默認值是1000000,也就是1MB,如果生產者嘗試發送的消息超過這個大小,不僅消息不會被接收,
#還會收到broker返回的錯誤信息。跟其它與字節相關的配置參數一樣,該參數指的是壓縮后的消息大小,也就是說,只要壓縮后消息大小小於message.max.bytes指定的值,消息的實際大小
#可以遠大於這個值。這個值對性能有着顯著的影響,值越大,那么復雜處理網絡連接和請求得到線程就需要花越多的時間處理這些請求。它還會增加磁盤寫入塊的大小,從而影響IO吞吐量。
#在服務端和客戶端之間協調消息大小的配置
#消費者客戶端設置的fetch.message.max.bytes必須與服務器端設置的消息大小進行協調。如果這個值比message.max.bytes小,那么消費者就無法讀取比較大的消息,導致出現消費者被
#阻塞的情況。在為集群里的broker配置replica.fetch.max.bytes參數時也需要遵守同樣的規則。
message.max.bytes=1000000

#以上為主題的默認配置
#處理網絡請求的線程數量,也就是接收消息的線程數。
#接收線程會將接收到的消息放到內存中,然后再從內存中寫入磁盤。
num.network.threads=3

#消息從內存中寫入磁盤是時候使用的線程數量。
#用來處理磁盤IO的線程數量
num.io.threads=8

#發送套接字的緩沖區大小
socket.send.buffer.bytes=102400

#接受套接字的緩沖區大小
socket.receive.buffer.bytes=102400

#請求套接字的緩沖區大小
socket.request.max.bytes=104857600

#滾動生成新的segment文件的最大時間
log.roll.hours=168

#上面的參數設置了每一個segment文件的大小是1G,那么
#就需要有一個東西去定期檢查segment文件有沒有達到1G,
#多長時間去檢查一次,就需要設置一個周期性檢查文件大小
#的時間(單位是毫秒)。
log.retention.check.interval.ms=300000

#日志清理是否打開
log.cleaner.enable=true
#zookeeper鏈接超時時間
zookeeper.connection.timeout.ms=6000

#上面我們說過接收線程會將接收到的消息放到內存中,然后再從內存
#寫到磁盤上,那么什么時候將消息從內存中寫入磁盤,就有一個
#時間限制(時間閾值)和一個數量限制(數量閾值),這里設置的是
#數量閾值,下一個參數設置的則是時間閾值。
#partion buffer中,消息的條數達到閾值,將觸發flush到磁盤。
log.flush.interval.messages=10000

#消息buffer的時間,達到閾值,將觸發將消息從內存flush到磁盤,
#單位是毫秒。
log.flush.interval.ms=3000

#刪除topic需要server.properties中設置delete.topic.enable=true否則只是標記刪除
delete.topic.enable=true

#此處的host.name為本機IP(重要),如果不改,則客戶端會拋出:
#Producer connection to localhost:9092 unsuccessful 錯誤!
host.name=kafka01

advertised.host.name=192.168.239.128


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM