Kafka官方說明不是臺詳細,但網上也有不少參考,現仍是將本身在CentOS7.6上架設生產環境的筆記記錄下。同時因爲Kafka的版本也在不斷的升級,有些參數也許有變化,這裏也將持續更新,若有錯誤還望指出。java
# vi /etc/sysctl.d/99-kafka.conf # swap vm.swappiness = 1 # dirty page vm.dirty_background_ratio = 5 vm.dirty_ratio = 70 # tcp socket net.core.rmem_default = 4194304 net.core.wmem_default = 4194304 # tcp socket net.ipv4_tcp_rmem = 4096 65536 4194304 net.ipv4_tcp_wmem = 4096 65536 4194304 # other network net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_max_syn_backlog = 5120 net.core.netdev_max_backlog = 100000
以前配置好kafka後,運行一段時間會報打開的文件太多,日誌中具體發現以下記錄apache
... Caused by: java.io.IOException: Too many open files ...
經過命令能夠查看當前系統中對最大文件打開數的設置,默認是1024,運行命令爲'ulimit -a'(root用戶)bootstrap
# ulimit -n 65535 # ulimit -u 65535
# vim /etc/security/limits.conf ... # Add following items at end * - nofile 65535 * - nproc 65535
#vim /etc/pam.d/login ... session required pam_limit.so
修改完成中重啓生效,對於/etc/security/limits.conf文件的詳細說明請見個人另一篇筆記https://blog.51cto.com/huanghai/2437446vim
經過kafka自帶工具實現topic的管理,主要依靠kafka-topic.sh工具實現服務器
> kafka-topics.sh --bootstrap-server <kafka_host1>:9092,<kafka_host2>:9092,... --list
> kafka-topics.sh --bootstrap-server <kafka_host1>:9092,<kafka_host2>:9092,... --delete --topic <topic_name>
說明:
1.若是Kafka服務配置了delete.topic.enable=true,直接經過命令行刪除,未能刪除Topic則能夠經過zookeeper-client來進行刪除。如下是單獨使用zookeeper的二進制程序包的說明,而且已經進入bin目錄。網絡
# 進入zookeeper命令行客戶端 > zkCli.sh -server <zkhost1:2181>[,<zkhost:2181>,...] # 執行刪除topic的操做 ] deleteall /brokers/topics/<topic_name>
2.若是Kafka服務未配置delete.topic.enable=false,直接經過delete命令刪除topic,刪除時只會將topic標記爲「marked for deletion」,而後經過zookeeper-client進行刪除是不會刪除topic的data.log數據目錄的,須要將相應的broker服務器上的log目錄下相應的topic目錄刪除。session
設置了多個副本的kafka集羣,存在副本間的同步問題,會有replica由於不能同步成功而掉線,最終topic的可用isr只剩下一個。查看log4j.properties(log4j.logger.kafka默認TRACE),有以下:app
TRACE Did not finish writing, registering for write again on connection /192.168.1.238:46389 (kafka.network.Processor)
這條日誌代表broker一直在發送數據,而後失敗重試。kafka的配置文件中,replica.fetch.max.bytes默認值是1048576(1MiB),在短消息的應用場景下是沒有問題的,可是咱們的消息長度比較大,常常有大於1MiB的消息,雖然在topic中定義了max.message.bytes=52428700,即50MiB,可是對於broker,replica.fetch.max.bytes是不會隨着topic的max.message.bytes變大而自動更新的,這樣就致使一個問題,一旦消息的長度大於1M,而配置文件中沒有定義 replica.fetch.max.bytes,就會致使replica之間數據同步失敗。所以,我本身是將配置中max.message.bytes賦給replica.fetch.max.bytes。
另外,在apache上相關的issue也有相似的討論, https://issues.apache.org/jira/browse/KAFKA-1756 socket