主頁 >  其他 > 關于配置,你必須要知道這一點....

關于配置,你必須要知道這一點....

2021-09-01 14:04:49 其他

kafka管控平臺推薦使用 滴滴開源 Kafka運維管控平臺(戳我呀) 更符合國人的操作習慣 更強大的管控能力 更高效的問題定位能力 更便捷的集群運維能力 更專業的資源治理 更友好的運維生態


BliBli視頻: 石臻臻的雜貨鋪

<iframe id="W8yFifRC-1630371671006" src="https://player.bilibili.com/player.html?aid=207735773" allowfullscreen="true" data-mediaembed="bilibili"></iframe>

kafka的動態配置

文章目錄

    • 原始碼分析
      • 1. Broker啟動加載動態配置
        • 1.1 啟動加載動態配置總流程
        • 1. 2 加載Topic動態配置
        • 1.3 加載Broker動態配置
      • 2. 查詢動態配置 流程 `--describe`
      • 3. 新增/修改/洗掉/動態配置 的流程
        • Topic配置
        • 其他的型別都一樣
      • 4. Broker監聽/config/changes的變更
    • 原始碼總結
    • Q&A
      • 如果我想在我的專案中獲取kafka的所有配置該怎么辦?
      • 是否可以直接在zk中寫入動態配置?
      • 為什么不直接監聽 `/config/`下面的配置?

Hello~~ 大家好,我是石臻臻~~~~

在這里插入圖片描述

今天這篇文章,給大家分享一下最近看kafka中的動態配置,不需要重啟Broker,即時生效的配置 歡迎留言一起探討!

kafka中的配置

  1. Broker靜態配置 .properties檔案
  2. ZK中的動態配置 全域 default配置
  3. ZK中動態配置 指定配置

優先級從底到高

不想看程序,可以直接看最后的原始碼總結部分

原始碼分析

1. Broker啟動加載動態配置

KafkaServer.startup

1.1 啟動加載動態配置總流程

1. 動態配置初始化

      config.dynamicConfig.initialize(zkClient)
  1. 構造當前組態檔 currentConfig, 然后從zk中獲取節點 /config/brokers/<default>資訊,然后更新配置updateDefaultConfig; (動態默認配置覆寫靜態配置)
  2. 從節點/config/brokers/{當前BrokerId}獲取配置, 如果配置中有ConfigType=PASSWORD的配置(例如ssl.keystore.password)存在,接著判斷 是否存在password.encoder.old.secret 配置,(這個配置是用來加解密ConfigType=PASSWORD的舊的秘鑰),嘗試用舊秘鑰解密秘鑰; 然后將這些配置重新加密回寫入/config/brokers/{當前BrokerId} ; 然后回傳配置 (這里主要是動態配置里面有密碼型別配置的時候需要做一次解密加密處理)
  3. 將上面得到的配置(password型別修改之后) 更新記憶體總的配置;優先級 靜態配置<動態默認配置<指定動態配置

2. 注冊可變更配置監聽器

如果有對應的配置變更了,那么相應的監聽器就會收到通知去修改自己相應的配置;

        
        config.dynamicConfig.addReconfigurables(this)
        

DynamicBrokerConfig.addReconfigurables

// .........
  def addReconfigurables(kafkaServer: KafkaServer): Unit = {
    kafkaServer.authorizer match {
      case Some(authz: Reconfigurable) => addReconfigurable(authz)
      case _ =>
    }
    addReconfigurable(new DynamicMetricsReporters(kafkaConfig.brokerId, kafkaServer))
    addReconfigurable(new DynamicClientQuotaCallback(kafkaConfig.brokerId, kafkaServer))

    addBrokerReconfigurable(new DynamicThreadPool(kafkaServer))
    if (kafkaServer.logManager.cleaner != null)
      addBrokerReconfigurable(kafkaServer.logManager.cleaner)
    addBrokerReconfigurable(new DynamicLogConfig(kafkaServer.logManager, kafkaServer))
    addBrokerReconfigurable(new DynamicListenerConfig(kafkaServer))
    addBrokerReconfigurable(kafkaServer.socketServer)
  }

3. 動態配置啟動監聽

        // Create the config manager. start listening to notifications
        dynamicConfigManager = new DynamicConfigManager(zkClient, dynamicConfigHandlers)
        dynamicConfigManager.startup()
  1. 注冊節點處理器change-notification-/config/changes = stateChangeHandler
  2. 注冊節點處理器/config/changes = zNodeChildChangeHandler
  3. 獲取/config/changes 所有子節點看看有哪些變更
  4. 遍歷所有節點并截取節點的編號, 判斷一下是不是大于上一次執行過變更的節點ID lastExecutedChange(啟動的時候是-1)
  5. 上個條件滿足的話,則執行通知操作;不同entity執行的操作不一樣,具體請看下面每個型別
  6. 更新lastExecutedChange
  7. 清除過期的通知節點, 默認過期時間15 * 60 * 1000(15分鐘) 就是洗掉/config/changes /下面的過期節點

1. 2 加載Topic動態配置

TopicConfigHandler.processConfigChanges
在這里插入圖片描述

  1. 獲取節點的data資料, 如果獲取到了則執行通知流程notificationHandler.processNotification(d),處理器是ConfigChangedNotificationHandler; 它先決議節點的json資料,根據版本資訊不同呼叫不同的處理方法; 下面是version=2的處理方式;
  2. 根據json資料可以得到 entityTypeentityName; 那么久可以去對應的zk資料里面getData獲取資料; 并且將獲取到的資料Decode成Properties物件entityConfig;
  3. 將key為下圖中的屬性 隱藏掉; 替換成value: [hidden]
    在這里插入圖片描述
  4. 呼叫EntityHandler; 這里是TopicConfigHandler.processConfigChanges來進行處理,方法里面再看看流程 ->
  5. 從動態配置entityConfig里面獲取message.format.version配置訊息格式版本號; 如果當前Broker的版本inter.broker.protocol.version 小于message.format.version配置; 則將message.format.version配置 排除掉
  6. 呼叫TopicConfigHandler.updateLogConfig 來更新指定Topic的所有TopicPartition的配置,其實是將TP正在加載或初始化的狀態標記為沒有完成初始化,這將會在后續程序中促成TP重新加載并初始化
  7. 將動態配置和并覆寫Server的默認配置為新的 newConfig, 然后根據Topic獲取對應的Logs物件; 遍歷Logs去更新newConfig;并嘗試執行 initializeLeaderEpochCache; (需要注意的是:這里的動態配置不是支持所有的配置引數,請看【kafka運維】Kafka全網最全最詳細運維命令合集(精品強烈建議收藏!!!)的附件部分)
  8. 當然特殊配置如leader.replication.throttled.replicas,follower.replication.throttled.replicas這兩個限流相關;決議配置之后,然后通過quotaManager.markThrottled/quotaManager.removeThrottle更新/移除對應的限流磁區集合
  9. 如果動態配置了unclean.leader.election.enable=true(允許非同步副本選主 );那么就會執行TopicUncleanLeaderElectionEnable方法來讓它改變選舉策略(前提是當前Broker是Controller角色)

1.3 加載Broker動態配置

BrokerConfigHandler.processConfigChanges

假設我們配置了默認配置; zk里面的節點是<default>

sh bin/kafka-configs.sh --bootstrap-server xxxxx:9090 --alter --entity-type brokers --entity-default --add-config log.segment.bytes=88888888

在這里插入圖片描述

  1. 從zk節點/config/changes里面獲取變更節點的json資料.然后去對應的 /config/{entityType}/{entituName}獲取對應的資料
  2. 如果是<default>節點,說明有配置動態默認配置; 則按照 靜態配置<動態默認配置<動態指定配置 的順序重新加載覆寫一下; 如果 新舊配置有變更(有可能執行了一次命令但是引數并沒有變化的情況,修改了個寂寞)的情況下 才會做更新的; 并且 通知到所有的 BrokerReconfigurable; 這個就是上面啟動時候 1.1 啟動加載動態配置總流程的第2步驟 (注冊可變更配置監聽器) 注冊的;
  3. 如果是指定BrokerId, 則除了上面2重新加載覆寫之外, 相關限流 配置leader.replication.throttled.ratefollower.replication.throttled.ratereplica.alter.log.dirs.io.max.bytes.per.second 都會被更新一下quotaManagers.leader/leader/alterLogDirs.updateQuota ;如果這些配置沒有配置的話,則用 Long.MaxValue(相當于是不限流)來更新

2. 查詢動態配置 流程 --describe

  1. 簡單檢驗

  2. 根據型別查詢entities ; type是topics就獲取所有topic; type是broker|broker-loggers則查詢所有Broker節點

  3. 遍歷entities獲取配置 ;做些簡單校驗;然后想Broker發起describeConfigs請求; 節點策略是LeastLoadedNodeProvider
    節點呼叫方法 KafkaApis.handleDescribeConfigsRequest

    1. 未經授權配置不查詢
    2. 經過授權的配置開始查詢 ;
    3. 當查詢的是topics時, 去zk節點/confgi/型別/型別名 ,獲取到動態配置資料之后, 然后將其覆寫本地跟Log相關的靜態配置, 完事之后組裝一下回傳;(1.資料為空過濾2.敏感資料設定value=null; ConfigType=PASSWORD和不知道型別是啥的都是敏感資料 3. 組裝所有的同義配置(靜態默認配置、本地靜態、默認動態配置、指定動態配置、等等多個配置))
      回傳的資料型別如下:
      在這里插入圖片描述
      在這里插入圖片描述
  4. 如果有broker|broker-loggers節點, 則在 獲取到資料之后 然后指定nodeId節點發起 describeBrokerConfigs請求

    1. 如果查詢的是brokers
      在這里插入圖片描述
    2. 如果查詢的是 broker-loggers
      在這里插入圖片描述

3. 新增/修改/洗掉/動態配置 的流程

1. 發起請求

  1. 查詢當前的型別配置; 這里的查詢 跟上面的--describe流程是一樣的
  2. 相關校驗;如果有delete-config配置, 需要校驗一下當前配置有沒有;如果沒有拋出例外;
  3. 計算出需要變更的配置之后, 發起請求incrementalAlterConfigs;如果請求型別是 brokers/broker-loggers 則發起請求的接收方是 指定的Broker 節點; 否則就是LeastLoadedNodeProvider (當前負載最少的節點)

2. incrementalAlterConfigs 增量修改配置

KafkaApis.handleIncrementalAlterConfigsRequest

  1. 通過請求引數決議 配置 configs
  2. 過濾一下未授權的配置
  3. 如果配置中有重復的項則拋出例外

Topic配置

  1. 獲取節點 /config/topics/{topicName} 中的配置資料;
  2. 然后根據請求引數的屬性 ,組裝好變更后的配置是什么樣的 configs
  3. 簡單校驗一下, 并且支持自定義校驗,如果有 alter.config.policy.class.name= 配置(默認null)的話,則會實體化指定的類(需要繼承 AlterConfigPolicy類);并呼叫他的 validate方法來校驗;
  4. 呼叫寫入zk配置的介面, 將動態配置重新寫入(SetDataRequest)到介面 /config/topics/{topicName}中;
  5. 創建并寫入配置變更記錄順序節點 /config/changes/config_change_序列號 中; 這個節點主要是讓Broker們來監聽這個節點的來了解到哪個配置有變更的;

其他的型別都一樣

省略

4. Broker監聽/config/changes的變更

1. Broker啟動加載動態配置 中我們了解到有對節點/config/change注冊一個子節點變更的監聽處理器

在這里插入圖片描述

那么對動態配置做出修改之后, 這個節點就會新增一條資料,那么所有的Broker都會收到這個通知;
在這里插入圖片描述

所以我們就要來看一看收到通知之后又做了哪些事情

這個流程是又回到了上面的 1. 2 加載Topics/Brokers動態配置 的流程中了;

原始碼總結

原理部分講解比較詳細的可以看 : Kafka動態配置實作原理決議 - 李志濤 - 博客園

在這里插入圖片描述

在這里插入圖片描述

Q&A

如果我想在我的專案中獲取kafka的所有配置該怎么辦?

  1. 啟動的時候加載一次所有Broker的配置
  2. 監聽節點/config/change節點的變化

是否可以直接在zk中寫入動態配置?

不可以,因為Broker是監聽 /config/changes/里面的Broker節點,來實時得知有資料變更;

為什么不直接監聽 /config/下面的配置?

沒有必要,這樣監聽的資料資料太多了,而且 你不知道具體是改了哪個配置,所以每次都要全部更新一遍,無緣無故的加重負擔了, 用/config/change 節點來得知哪個型別的資料變更, 只變更這個相關資料就可以了

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

標籤:其他

上一篇:RabbitMq (一)理論篇部分 MQ作用是什么 MQ的優缺點 RabbitMQ的基礎架構 RabbitMQ 五種常用作業模式 RabbitMQ訊息確認機制

下一篇:【Webpack 性能優化系列(3) - oneOf】

標籤雲
其他(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)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more