天天看點

MySQL Cluster 配置詳細介紹

在上篇文章已經詳細說明了MySQL Cluster搭建與測試,現在來說說詳細的配置參數。在MySQL Cluster 環境的配置檔案 config.ini 裡面,每一類節點都有兩個(或以上)的相應配置項組,每一類節點的配置項都主要由兩部分組成,一部分是同類所有節點相同的配置項組,在[NDB_MGM DEFAULT]、[NDBD DEFAULT]和[MySQLD DEFAULT]這三個配置組裡面,而且每一個配置組隻出現一次;而另外一部分則是針對每一個節點獨有配置内容的配置項組[NDB_MGM]、[NDBD]和[MySQLD],由于這三類配置組中配置的每一個節點獨有的個性化配置,是以每一個配置組都能出現多次(每一個節點一次)。下面是每一類節點的各種配置說明:

1、管理節點相關配置

在整個MySQL Cluster 環境中,管理節點相關的配置為[NDBD_MGM DEFAULT]和[NDB_MGMD]相關的兩組:

1) [NDB_MGMD DEFAULT]中各管理節點的共用配置項:

PortNumber:配置管理節點的服務端程式(ndb_mgmd)監聽用戶端(ndb_mgm)連接配接請求和發送的指令,從文檔上可以查找到,預設端口是1186端口。一般來說這一項不需要更改,當然如果是為了在同一台主機上面啟動多個管理節點的話,肯定需要将兩個管理節點啟動不同的監聽端口;

LogDestination:配置管理節點上面的 cluster 日志處理方式。

a) 可以寫入檔案如:LogDestination=FILE:filename=mycluster.log,maxsize=500000,maxfiles=4;

b) 也可以通過标準輸出來列印出來如:LogDestination=CONSOLE;

c) 還可以計入 syslog 裡面如:LogDestination=SYSLOG:facility=syslog ;

d) 甚至多種方式共存:

LogDestination=CONSOLE;SYSLOG:facility=syslog;FILE:filename=/var/log/clusterlog

Datadir:設定用于管理節點存放檔案輸出的位置。如 process 文 件(.pid),clusterlog 檔案(當LogDestination 有FILE處理方式存在時候)。

ArbitrationRank:配置各節點在處理某些事件出現分歧的時候的級别。有 0,1,2三個值可以選擇。

a) 0 代表本節點完全聽其他節點的,不參與決策

b) 1 代表本節點有最高優先權,“一切由我來決策”

c) 2 代表本節點參與決策,但是優先權較1低,但是比0高

ArbitrationRank 參數不僅僅管理節點有,MySQL節點也有。而且一般來說,所有的管理節點一般都應該設定成1,所有SQL節點都設定成2。

2) [NDB_MGMD]是每個管理節點配置一組,所需配置項如下(下面的參數隻能設定在[NDB_MGMD]參數組中):

nodeid:為節點指定一個唯一的 ID 号,要求在整個 Cluster 環境中唯一;

Hostname:配置該節點的 IP 位址或者主機名,如果是主機名,則該主機名必須要在配置檔案所在的節點的/etc/hosts 檔案中存在,而且綁定的IP是準确的。上面[NDB_MGMD DEFAULT]裡面的所有參數項,都可以設定在下面的[NDB_MGMD]參數組裡面,但是 nodeid和Hostname兩個參數隻能設定在[NDB_MGMD]裡面,而不能設定在[NDB_MGMDDEFAULT]裡面,因為這兩個參數項針對每一個節點都是不相同的内容。

2、NDB 節點相關配置

NDB 節點和管理節點一樣,既有各個節點共用的配置資訊組[NDBD DEFAULT],也有每一個節點個性化配置的[NDBD]配置組(實際上 SQL 節點也是如此)。

1) [NDBD DEFAULT]中的配置項:

NoOfReplicas:定義在 Cluster 環境中相同資料的分數,通俗一點來說就是每一份資料存放NoOfReplicas份。如果希望能夠備援,那麼至少設定為2(一般情況來說此參數值設定為2就夠了),最大隻能設定為4。另外,NoOfReplicas值得大小,實際上也就是node group大小的定義。NoOfReplicas參數沒有系統預設值,是以必須設定,而且隻能設定在[NDBD DEFAULT]中,因為此數值在整個Cluster叢集中一個node group中所有的NDBD節點都需要一樣。另外NoOfReplicas 的數目對整個Cluster環境中NDB節點數量有較大的影響,因為NDB 節點總數量是 NoOfReplicas * 2 * node_group_num;

DataDir:指定本地的pid 檔案,trace檔案,日志檔案以及錯誤日志子等存放的路徑,無系統預設位址,是以必須設定;

DataMemory:設定用于存放資料和主鍵索引的記憶體段的大小。這個大小限制了能存放的資料的大小,因為ndb存儲引擎需屬于記憶體資料庫引擎,需要将所有的資料(包括索引 )都load到記憶體中。這個參數并不是一定需要設定的,但是預設值非常小(80M),隻也就是說如果使用預設值,将隻能存放很小的資料。參數設定需要帶上機關,如 512M,2G 等。另外,DataMemory 裡面還會存放 UNDO 相關的資訊,是以,事務的大小和事務并發量也決定了DataMemory 的使用量,建議盡量使用小事務;

IndexMemory:設定用于存放索引(非主鍵)資料的記憶體段大小。和 DataMemory類似,這個參數值的大小同樣也會限制該節點能存放的資料的大小,因為索引的大小是随着資料量增長而增長的。參數設定也如 DataMemory 一樣需要機關。IndexMemory 預設大小為18M;實際上,一個 NDB 節點能存放的資料量是會受到 DataMemory 和 IndexMemory 兩個參數設定的限制,兩者任何一個達到限制數量後,都無法再增加能存儲的資料量。如果繼續存入資料系統會報錯“table is full”。

FileSystemPath:指定 redo 日志,undo 日志,資料檔案以及meta 資料等的存放位置,預設位置為 DataDir 的設定,并且在 ndbd 初始化的時候,參數所設定的檔案夾必須存在。在第一次啟動的時候,ndbd 程序會在所設定的檔案夾下建立一個子檔案夾叫ndb_id_fs,這裡的 id 為節點的 ID 值,如節點 id 為3則檔案夾名稱為 ndb_3_fs。當然,這個參數也不一定非得設定在[NDBD DEFAULT]參數組裡面讓所有節點的設定都一樣(不過建議這樣設定),還可以設定在[NDBD]參數組下為每一個節點單獨設定自己的 FileSystemPath值;

BackupDataDir:設定備份目錄路徑,預設為 FileSystemPath/BACKUP。接下來的幾個參數也是非常重要的,主要都是與并行事務數和其他一些并行限制有關的參數設定。

MaxNoOfConcurrentTransactions:設定在一個節點上面的最大并行事務數目,預設為 4096,一般情況下來說是足夠了的。這個參數值所有節點必須設定一樣,是以一般都是設定在[NDBD DEFAULT]參數組下面;

MaxNoOfConcurrentOperations:設定同時能夠被更新(或者鎖定)的記錄數量。一般來說可以設定為在整個叢集中相同時間内可能被更新(或者鎖定)的總記錄數,除以 NDB節點數,所得到的值。比如,在叢集中有兩個 NDB 節點,而希望能夠處理同時更新(或鎖定 )100000 條記錄,那麼此參數應該被設定為:100000 / 4 = 25000。此外,這裡的記錄數量并不是指單純的表裡面的記錄數,而是指事物裡面的操作記錄。當使用到唯一索引的時候,表的資料和索引兩者都要算在裡面,也就是說,如果是通過一個唯一索引來作為過濾條件更新某一條記錄,那麼這裡算是兩條操作記錄。而且即使是鎖定也會産生操作記錄,比如通過唯一索引來查找一條記錄,就會産生如下兩條操作記錄:通過讀取唯一索引中的某個記錄資料會産生鎖定,産生一條操作記錄,然後讀取基表裡面的資料,這裡也會産生讀鎖,也會産生一條操作記錄。MaxNoOfConcurrentOperations 參數的預設值為 32768。當我們額度系統運作過程中,如果出現此參數不夠的時候,就會報出“Out of operation records intransaction coordinator”這樣的錯誤資訊;

MaxNoOfLocalOperations:此參數預設是 MaxNoOfConcurrentOperations * 1.1的大小,也就是說,每個節點一般可以處理超過平均值的 10%的操作記錄數量。但是一般來說,MySQL 建議單獨設定此參數而不要使用預設值,并且将此參數設定得更較大一些;

以下的三個參數主要是在一個事務中執行一條 query 的時候臨時用到存儲(或者記憶體)的情況下所使用到的,所使用的存儲資訊會在事務結束(commit 或者 rollback)的時候釋放資源;

MaxNoOfConcurrentIndexOperations:這個參數和 MaxNoOfConcurrentOperations參數比較類似,隻不過所針對的是 Index 的 record 而已。其預設值為 8192,對伊一般的系統來說都已經足夠了,隻有在事務并發非常非常大的系統上才有需要增加這個參數的設定。當然,此參數越大,系統運作時候為此而消耗的記憶體也會越大;

MaxNoOfFiredTriggers:觸發唯一索引(hash index)操作的最大的操作數,這個操作數是影響索引的操作條目數,而不是操作的次數。系統預設值為 4000,一般系統來說夠用了。當然,如果系統并發事務非常高,而且涉及到索引的操作也非常多,自然也就需要提高這個參數值的設定了;

TransactionBufferMemory:這個 buffer 值得設定主要是指定用于跟蹤索引操作而使用的。主要是用來存儲索引操作中涉及到的索引 key 值和 column 的實際資訊。這個參數的值一般來說也很少需要調整,因為實際系統中需要的這部分 buffer 量非常小,雖然預設值隻是 1M,但是對于一般應用也已經足夠了;

下面要介紹到的參數主要是在系統進行中做 table scan 或者 range scan 的時候使用的一些 buffer 的相關設定,設定的恰當可以既節省記憶體又達到足夠的性能要求。

MaxNoOfConcurrentScans:這個參數主要控制在 Cluster 環境中并發的 table scan和 range scan 的總數量平均配置設定到每一個節點後的平均值。一般來說,每一個 scan 都是通過并行的掃描所有的 partition 來完成的,每一個 partition 的掃描都會在該 partition所在的節點上面使用一個 scan record。是以,這個參數值得大小應該是“scan record”數目 * 節點數目。參數預設大小為 256,最大隻能設定為 500;MaxNoOfLocalScans:和上面的這個參數相對應,隻不過設定的是在本節點上面的并發 table scan 和 range scan 數量。如果在系統中有大量的并發而且一般都不使用并行的話,需要注意此參數的設定。預設為 MaxNoOfConcurrentScans * node 數目;

BatchSizePerLocalScan:該參用于計算在 Localscan(并發)過程中被鎖住的記錄數,文檔上說明預設為 64;

LongMessageBuffer:這個參數定義的是消息傳遞時候的 buffer 大小,而這裡的消息傳遞主要是内部資訊傳遞以及節點與節點之間的資訊傳遞。這個參數一般很少需要調整,預設大小為 1MB 大小;

下面介紹一下與 log 相關的參數配置說明,包括 log level。

這裡的 log level 有多種,從 0 到 15,也就是共 16 種。如果設定為 0,則表示不記錄任何 log。如果設定為最高 level,也就是 15,則表示所有的資訊都會通過标準輸出來記錄 log。由于這裡的所有資訊實際上都會傳遞到管理節點的 cluster log 中,是以,一般來說,除了啟動時候的 log級别需要設定為 1 之外,其他所有的 log level 都隻需要設定為 0 就可以了。NoOfFragmentLogFiles:這個參數實際上和 Oracle 的 redo log 的 group 一樣的。其實就是 ndb 的 redo log group 數目,這些 redo log 用于存放 ndb 引擎所做的所有需要變更資料的事情,以及各種 checkpoint 資訊等。預設值為 8;

MaxNoOfSavedMessages:這個參數設定了可以保留的 trace 檔案(在節點 crash的時候參數)的最大個數,文檔上面說此參數預設值為 25。

LogLevelStartup:設定啟動 ndb 節點時候需要記錄的資訊的級别(不同級别所記錄的資訊的詳細程度不一樣),預設級别為 1;

LogLevelShutdown:設定關閉 ndb 節點時候記錄日志的資訊的級别,預設為 0;

LogLevelStatistic:這個參數是針對于統計相關的日志的,就像更新數量,插入數量,buffer 使用情況,主鍵數量等等統計資訊。預設日志級别為 0;

LogLevelCheckpoint:checkpoint 日志記錄級别(包括 local 和 global 的),預設為 0;

LogLevelNodeRestart:ndb 節點重新開機過程日志級别,預設為 0;

LogLevelConnection:各節點之間連接配接相關日志記錄的級别,預設 0;

LogLevelError:在整個 Cluster 中錯誤或者警告資訊的日志記錄級别,預設 0;

LogLevelInfo:普通資訊的日志記錄級别,預設為 0。

這裡再介紹幾個用來作為 log 記錄時候需要用到的 Buffer 相關參數,這些參數對于性能都有一定的影響。當然,如果節點運作在無盤模式下的話,則影響不大。

UndoIndexBuffer:undo index buffer 主要是用于存儲主鍵 hash 索引在變更之後産生的 undo 資訊的緩沖區。預設值為 2M 大小,最小可以設定為 1M,對于大多數應用來說,2M 的預設值是夠的。當然,在更新非常頻繁的應用裡面,适當的調大此參數值對性能還是有一定幫助的。如果此參數太小,會報出 677 錯誤:Index UNDO buffers overloaded;

UndoDataBuffer:和 undo index buffer 類似,undo data buffer 主要是在資料發生變更的時候所需要的 undo 資訊的緩沖區。預設大小為 16M,最小同樣為 1M。當這個參數值太小的時候,系統會報出如下的錯誤: Data UNDO buffers overloaded,錯誤号為 891;

RedoBuffer:Redo buffer 是用 redo log 資訊的緩沖區,預設大小為 8M,最小為 1M。如果此 buffer 太小,會報 1221 錯誤:REDO log buffers overloaded。此外,NDB 節點還有一些和 metadata 以及内部控制相關的參數,但大部分參數都基本上不需要任何調整,是以就不做進一步介紹。如果有興趣希望詳細了解,可以根據 MySQL官方的相關參考手冊,手冊上面都有較為詳細的介紹。

3、SQL 節點相關配置說明

1) 和其他節點一樣,先介紹一些适用于所有節點的[MySQLD DEFAULT]參數ArbitrationRank:這個參數在介紹管理節點的參數時候已經介紹過了,用于設定節點級别(主要是在多個節點在處理相關操作時候出現分歧時候設定裁定者)的。一般來說 ,所有的 SQL 節點都應該設定為 2;

ArbitrationDelay:預設為 0,裁定者在開始裁定之前需要被 delay 多久,機關為毫秒。一般不需要更改預設值。

BatchByteSize:在做全表掃描或者索引範圍掃描的時候,每一次 fatch 的資料量,預設為 32KB;

BatchSize:類似 BatchByteSize 參數,隻不過 BatchSize 所設定的是每一次 fetch的 record 數量,而不是實體總量,預設為 64,最大為 992(暫時還不知道這個值是基于什麼理論而設定的)。在實際運作 query 的過程中, fetch 的量受到 BatchByteSize 和 BatchSize兩個參數的共同制約,二者取最小值;

MaxScanBatchSize:在 Cluster 環境中,進行并行處理的情況下,所有節點的BatchSize 總和的最大值。預設值為 256KB,最大值為 16MB。

2) 每個節點獨有的[MySQLD]參數組,僅有 id 和 hostname 參數需要配置,在之前各類節點均有介紹了,這裡就不再說明了。

參考文章:

《MySQL性能調優與架構設計》

作者:Atlas

出處:Atlas的部落格 http://www.cnblogs.com/gomysql

您的支援是對部落客最大的鼓勵,感謝您的認真閱讀。本文版權歸作者所有,歡迎轉載,但請保留該聲明。如果您需要技術支援,本人亦提供有償服務。

繼續閱讀