資料節點的所有記憶體配置都是在節點啟動時執行。這樣可確保資料節點可以在穩定的方式下執行,而不會使用交換記憶體,以便 NDB
可以用於延遲敏感 (即時) 的應用程式。在資料節點啟動時會配置下列類型的記憶體
資料記憶體
共用全域記憶體
重做日誌緩衝區
工作緩衝區
傳送緩衝區
磁碟資料記錄的頁面快取
結構描述交易記憶體
交易記憶體
還原日誌緩衝區
查詢記憶體
區塊物件
結構描述記憶體
區塊資料結構
長訊號記憶體
共用記憶體通訊緩衝區
調節大部分資料節點記憶體的 NDB
記憶體管理員,會處理下列記憶體資源
資料記憶體 (
DataMemory
)重做日誌緩衝區 (
RedoBuffer
)工作緩衝區
傳送緩衝區 (
SendBufferMemory
、TotalSendBufferMemory
、ExtraSendBufferMemory
)磁碟資料記錄頁面快取 (
DiskPageBufferMemory
、DiskPageBufferEntries
)交易記憶體 (
TransactionMemory
)查詢記憶體
磁碟存取記錄
檔案緩衝區
這些資源中的每一個都是使用保留的記憶體區域和最大記憶體區域進行設定。保留的記憶體區域只能由為其保留的資源使用,且無法與其他資源共用;指定的資源永遠不會配置超過允許該資源使用的最大記憶體。沒有最大記憶體的資源可以擴充,以使用記憶體管理員中的所有共用記憶體。
這些資源的全域共用記憶體大小是由 SharedGlobalMemory
組態參數控制 (預設值:128 MB)。
資料記憶體一律會保留,且永遠不會從共用記憶體取得任何記憶體。它是使用 DataMemory
組態參數來控制,其最大值為 16384 GB。DataMemory
是儲存記錄的位置,包括雜湊索引 (每個資料列大約 15 個位元組)、排序索引 (每個索引的每個資料列 10-12 個位元組) 和資料列標頭 (每個資料列 16-32 個位元組)。
重做日誌緩衝區也只會使用保留的記憶體;這由 RedoBuffer
組態參數控制,此參數會設定每個 LDM 執行緒的重做日誌緩衝區大小。這表示實際使用的記憶體數量是此參數的值乘以資料節點中的 LDM 執行緒數量。
工作緩衝區只會使用保留的記憶體;此記憶體的大小由 NDB
計算,計算依據是各種執行緒類型的數量。
傳送緩衝區具有保留的部分,但也可以配置額外的 25% 共用全域記憶體。傳送緩衝區保留大小是分兩個步驟計算
使用
TotalSendBufferMemory
組態參數的值 (無預設值) 或連線到資料節點的所有個別連線所使用之個別傳送緩衝區的總和。資料節點會連線到所有其他資料節點、所有 API 節點和所有管理節點。這表示,在具有 2 個資料節點、2 個管理節點和 10 個 API 節點的叢集中,每個資料節點有 13 個節點連線。由於資料節點連線的SendBufferMemory
預設值為 2 MB,這總共是 26 MB。若要取得傳送緩衝區的總保留大小,
ExtraSendBufferMemory
組態參數的值 (若有) (預設值為 0) 會加入至上一個步驟中取得的值。
換句話說,如果已設定 TotalSendBufferMemory
,則傳送緩衝區大小為 TotalSendBufferMemory + ExtraSendBufferMemory
;否則,傳送緩衝區的大小等於 ([
。節點連線數
] * SendBufferMemory) + ExtraSendBufferMemory
磁碟資料記錄的頁面快取只會使用保留的資源;此資源的大小是由 DiskPageBufferMemory
組態參數控制 (預設值為 64 MB)。也會配置 32 KB 磁碟頁面項目的記憶體;這些項目的數量由 DiskPageBufferEntries
組態參數決定 (預設值為 10)。
交易記憶體具有由 NDB
計算的保留部分,或是使用 TransactionMemory
組態參數明確設定;交易記憶體也可以使用無限量的共用全域記憶體。交易記憶體用於處理交易的所有作業資源、掃描、鎖定、掃描緩衝區和觸發程序作業。在下一個提交將表格列寫入資料記憶體之前,它也會將表格列保留為已更新的狀態。
資源是從一般交易記憶體資源配置,也可以使用來自全域共用記憶體的資源。此資源的大小可以使用單一 TransactionMemory
組態參數來控制。
可以使用 InitialLogFileGroup
組態參數來設定還原日誌緩衝區的保留記憶體。如果還原日誌緩衝區是建立為 CREATE LOGFILE GROUP
SQL 陳述式的一部分,則會從交易記憶體中取得記憶體。
與磁碟資料資源的 metadata 相關的許多資源也沒有保留的部分,且只會使用共用全域記憶體。因此,共用全域共用記憶體會在傳送緩衝區、交易記憶體和磁碟資料 metadata 之間共用。
如果未設定 TransactionMemory
,則會根據下列參數計算
當明確設定 TransactionMemory
時,剛剛列出的任何組態參數都不會用來計算記憶體大小。此外,參數 MaxNoOfConcurrentIndexOperations
、MaxNoOfFiredTriggers
、MaxNoOfLocalOperations
和 MaxNoOfLocalScans
與 TransactionMemory
不相容,且無法與其同時設定;如果在 TransactionMemory
設定時,也在 config.ini
組態檔中設定這四個參數中的任何一個,則管理伺服器將無法啟動。
MaxNoOfConcurrentIndexOperations
、MaxNoOfFiredTriggers
、MaxNoOfLocalOperations
和 MaxNoOfLocalScans
參數都已過時;您應該預期它們會從未來版本的 MySQL NDB Cluster 中移除。
交易記憶體資源包含大量記憶體集區。每個記憶體集區代表一個物件類型,並包含一組物件;每個集區都包含一個在啟動時配置給集區的保留部分;此保留記憶體永遠不會返回共用全域記憶體。可以使用只有單一層級的資料結構來尋找保留的記錄以進行快速擷取,這表示應該在每個集區中保留一些記錄。每個集區中保留的記錄數量會對效能和保留記憶體配置產生一些影響,但通常只有在某些非常進階的使用案例中才需要明確設定保留的大小。
集區保留部分的大小可以透過設定下列組態參數來控制
對於任何未在 config.ini
中明確設定的參數,其保留設定值將計算為對應最大設定值的 25%。例如,如果未設定,ReservedConcurrentIndexOperations
將計算為 MaxNoOfConcurrentIndexOperations
的 25%,而 ReservedLocalScans
將計算為 MaxNoOfLocalScans
的 25%。
如果未設定 ReservedTransactionBufferMemory
,則會將其計算為 TransactionBufferMemory
的 25%。
保留記錄的數量是每個資料節點的數量;這些記錄會分散到每個節點上處理它們的執行緒(LDM 和 TC 執行緒)。在大多數情況下,僅設定 TransactionMemory
就足夠了,並允許池中的記錄數量由其值來控制。
MaxNoOfConcurrentScans
限制了每個 TC 執行緒中可以活動的並行掃描數量。這對於防止叢集超載非常重要。
MaxNoOfConcurrentOperations
限制了在更新交易中一次可以活動的作業數量。(簡單的讀取不受此參數影響。)這個數字需要限制,因為必須預先分配記憶體以用於節點故障處理,並且在與節點故障競爭時,必須有資源可用於處理一個 TC 執行緒中最大數量的活動作業。必須將所有節點上的 MaxNoOfConcurrentOperations
設定為相同的數字(最簡單的方法是在 config.ini
全域組態檔案的 [ndbd default]
區段中設定一次)。雖然可以使用滾動重新啟動來增加其值(請參閱第 25.6.5 節,「執行 NDB 叢集的滾動重新啟動」),但由於在滾動重新啟動期間可能發生節點故障,因此以這種方式減少它被認為是不安全的。
可以使用 MaxDMLOperationsPerTransaction
參數來限制 NDB 叢集中單個交易的大小。如果未設定此參數,則單個交易的大小將受到 MaxNoOfConcurrentOperations
的限制,因為此參數限制每個 TC 執行緒的並行操作總數。
Schema 記憶體大小由以下一組組態參數控制
節點數量和 LDM 執行緒數量也對 schema 記憶體的大小有重大影響,因為每個資料表和每個分割區(及其片段複本)中的分割區數量都必須在 schema 記憶體中表示。
此外,在啟動期間會配置許多其他記錄。這些記錄相對較小。每個執行緒中的每個區塊都包含使用記憶體的區塊物件。與其他資料節點記憶體結構相比,此記憶體大小通常也很小。