天天看點

MySQL Cluste(進階篇)—叢集配置前言1 概念腦補2 重新開機類型資訊表3 管理節點配置3.3 LogDestination4 資料節點配置5 sql節點和api節點配置6 NDB叢集的TCP/IP連接配接7 NDB叢集的發送緩沖區配置8 總結

目錄

前言

1 概念腦補

1.1 節點組

1.2 分區

1.3 副本

1.4 聯系

2 重新開機類型資訊表

3 管理節點配置

3.1 NodeId

3.2 HostName

3.3 LogDestination

3.4 ArbitrationRank

3.5 ArbitrationDelay

3.6 DataDir

3.7 HeartbeatThreadPriority

3.8 TotalSendBufferMemory

3.9 HeartbeatIntervalMgmdMgmd

4 資料節點配置

4.1 NodeId

4.2 HostName

4.3 ServerPort

4.4 NodeGroup

4.5 NoOfReplicas

4.6 DataDir

4.7 FileSystemPath

4.8 BackupDataDir

4.9 DataMemory、IndexMemory和StringMemory

4.9.1 DataMemory

4.9.2 IndexMemory

4.9.3 StringMemory

5 sql節點和api節點配置

5.1 NodeId

5.2 HostName

5.3 ConnectionMap

5.4 ArbitrationRank

5.5 ArbitrationDelay

6 NDB叢集的TCP/IP連接配接

6.1 NodeId1和NodeId2

6.2 HostName1和HostName2

6.3 SendBufferMemory

6.4 使用TCP/IP直接連接配接的NDB叢集

7 NDB叢集的發送緩沖區配置

7.1 TotalSendBufferMemory

7.2 OverloadLimit

7.3 SendBufferMemory

8 總結

前言

之前,寫了一篇文章——MySQL Cluste(入門篇)—分布式資料庫叢集搭建。我們也大緻了解到mysql cluster的基本概念和搭建的簡單操作,知道mysql分布式資料庫的高可用性和高備援。當然,入門篇的配置是一些典型的預設配置,也基本上符合大部分的系統要求。下面,本篇主要講的是一些比較常用和系統要求比較高的叢集配置,以mysql-5.7.23和ndb-7.6.7為準。

本文mysql ndb cluster,即mysql cluster或ndb cluster,mysql資料庫叢集的意思。

1 概念腦補

1.1 節點組

由一個或多個資料節點組成,也稱為副本集。在叢集中的節點組數量不可直接配置,它是由資料節點數量和副本數量(NoOfReplicas 配置參數)決定的,如下所示:

[# of node groups] = [# of data nodes] / NoOfReplicas

故資料節點數量必須為副本數量的整數倍。

1.2 分區

這是叢集存儲資料的一部分。每個節點負責保留配置設定給它的任何分區的至少一個副本。叢集預設使用的分區數取決于資料節點的數量和資料節點使用的LDM線程數,如下所示:

[# of partitions] = [# of data nodes] * [# of LDM threads]

使用ndbmtd(多線程)運作資料節點時,LDM線程的數量由MaxNoOfExecutionThreads設定。使用ndbd(單線程)運作資料節點時,隻有一個LDM線程,這意味叢集分區數量與資料節點數量一樣多。

使用ndbmtd(多線程)運作的情況下, MaxNoOfExecutionThreads設定為3或更小時,上面的表達式才比較準确,即LDM線程的數量随着此參數的值而呈線性增加。但是,如果MaxNoOfExecutionThreads設定的值大于3,則不是嚴格線性的,并且設定它還有其他限制。

1.3 副本

叢集分區的副本,在節點組中的每個節點都存儲一個分區副本。副本數量等于每個節點組的節點數量,故節點組也稱為副本集。

副本完全屬于單個節點,但是節點可以(通常會)存儲多個副本。

1.4 聯系

下圖是兩個節點組的叢集,下面就以其來總結說明叢集的資料節點、節點組、分區和副本之間的關系。為了描繪清楚,這裡就把管理節點和sql節點省略了。

MySQL Cluste(進階篇)—叢集配置前言1 概念腦補2 重新開機類型資訊表3 管理節點配置3.3 LogDestination4 資料節點配置5 sql節點和api節點配置6 NDB叢集的TCP/IP連接配接7 NDB叢集的發送緩沖區配置8 總結

叢集存儲的資料分為四個分區,編号為0,1,2和3,每個分區在同一節點組中存儲多個副本。分區存儲在備用節點組中,如下所示:

  • 分區0存儲在節點組0上,一個主副本(分區的主副本)被存儲在節點1和一個備份副本(分區的備份副本)被存儲在節點2上。
  • 分區1存儲在另一個節點組(節點組1)上,此分區的主副本位于節點3上,其備份副本位于節點4上。
  • 分區2存儲在節點組0上。但是,它的兩個副本的放置與分區0的放置相反,對于分區2,主副本存儲在節點2上,備份存儲在節點1上。
  • 分區3存儲在節點組1上,其兩個副本的位置與分區1的副本相反。即其主副本位于節點4上,備份位于節點3上。

這對于NDB叢集的持續運作意味着:隻要參與叢集的每個節點組至少有一個節點運作,叢集就擁有所有資料的完整副本并且仍然可行。但是,這裡要特别說明的是,若其中一個節點組的所有節點同時挂了,那叢集就會丢失這整一個分區,無法再提供對所有叢集資料的完整集合的通路。

2 重新開機類型資訊表

符号 重新開機類型 描述
N Node 可以使用滾動重新啟動來更新該參數
S System 必須完全關閉所有群集節點,然後重新啟動,以實作此參數的更改
I Initial 必須使用該--initial選項重新啟動資料節點

3 管理節點配置

在config.ini檔案中,該[ndb_mgmd]部分用于配置管理伺服器的行為。如果使用多個管理伺服器,則可以在一個[ndb_mgmd default]部分中指定所有這些伺服器共有的參數。 [mgm]并且[mgm default] 是這些的較舊别名,支援向後相容性。

以下參數都是可選的,并且如果省略則采用其預設值。但是,需要注意的是,如果既不存在ExecuteOnComputer也不存在 HostName參數,localhost則将假定兩者都具有預設值。

3.1 NodeId

重新開機類型:IS

數值類型:1到255的整數

預設值:null

群集中的每個節點都具有唯一辨別。對于管理節點,這由1到255(包括1和255)範圍内的整數值表示。所有内部群集消息都使用此ID來尋址節點,是以無論節點類型如何,每個NDB群集節點都必須是唯一的。

另外,NodeId 是辨別管理節點時使用的首選參數名稱。雖然舊版本Id 繼續支援向後相容性,但現在不推薦使用它,并在使用時生成警告,因為它會在将來的NDB Cluster版本中删除。

注意

資料節點ID必須小于49。如果計劃部署大量資料節點,最好将管理節點、sql節點或api節點的ID限制為大于48的值。

3.2 HostName

重新開機類型:N

數值類型:主機名或IP位址

預設值:none

指定此參數定義管理節點所駐留的計算機的主機名,或IP位址。需要注意的是,要指定除

localhost

之外的主機名,或者 

ExecuteOnComputer

是必需的。

另外,HostName 是指定管理節點所駐留計算機主機名或IP位址的首選參數名稱。雖然舊版本

ExecuteOnComputer

繼續支援向後相容性,但現在不推薦使用它,并在使用時生成警告,因為它會在将來的NDB Cluster版本中删除。

3.3 LogDestination

重新開機類型:N

數值類型:{CONSOLE | SYSLOG | FILE}

預設值:FILE:filename=ndb_

node_id

_cluster.log,maxsize=1000000,maxfiles=6(

node_id為節點ID

此參數指定發送群集日志記錄資訊的位置。該參數的值有三個選項:CONSOLE、SYSLOG和FILE,其中FILE是預設值。

(1)CONSOLE 将日志輸出到stdout。

CONSOLE

(2)SYSLOG 将日志發送到 syslog設施,可能的值是以下之一:auth, authpriv,cron, daemon,ftp, kern,lpr, mail,news, syslog,user, uucp,local0, local1,local2, local3,local4, local5,local6,或 local7。

SYSLOG:facility=syslog

(3)FILE 将群集日志輸出通過管道傳輸到同一台計算機上的正常檔案。可以指定以下值:

  • filename:日志檔案的名稱。一般情況下,使用的預設日志檔案名是:ndb_nodeid_cluster.log
  • maxsize:記錄轉到新檔案之前,檔案可以增長的最大大小(以位元組為機關),即單個日志檔案的最大大小。發生這種情況時,通過附加.N到檔案名重命名舊的日志檔案 ,其中N下一個數字尚未與此名稱一起使用。例如:ndb_1_cluster.log.1。
  • maxfiles:最大日志檔案數。
FILE:filename=cluster.log,maxsize=1000000,maxfiles=6

FILE 參數的預設值是 ,FILE:filename=ndb_node_id_cluster.log,maxsize=1000000,maxfiles=6,其中node_id是節點的ID。

當然,也可以指定由分号分隔的多個日志目标,如下所示:

CONSOLE;SYSLOG:facility=local0;FILE:filename=/var/log/mgmd

3.4 ArbitrationRank

重新開機類型:N

數值類型:0-2

預設值:1

此參數用于定義哪些節點可以充當仲裁器。隻有管​​理節點和SQL節點可以是仲裁者。ArbitrationRank可以采用以下值之一:

  • 0:該節點永遠不會用作仲裁程式。
  • 1:該節點具有高優先級; 也就是說,它将充當仲裁器,并優先作用在低優先級節點上。
  • 2:表示僅在具有較高優先級的節點不可作為仲裁器時,才讓低優先級節點充當仲裁器。

通常,應将管理伺服器配置為仲裁器,方法是将其設定ArbitrationRank 為1(管理節點的預設值),将所有SQL節點的值設定為0(SQL節點的預設值)。

3.5 ArbitrationDelay

重新開機類型:N

數值類型:毫秒

預設值:0

一個整數值,它使管理伺服器對仲裁請求的響應延遲該毫秒數。預設情況下,此值為0,通常沒有必要改變它。

3.6 DataDir

重新開機類型:N

數值類型:檔案路徑

預設值:.

此參數指定了放置管理伺服器的輸出檔案的目錄。這些檔案包括叢集日志檔案,程序輸出檔案和守護程式的程序ID(PID)檔案。(對于日志檔案,可以通過設定FILE參數來覆寫此位置,詳見本文的LogDestination)

此參數的預設值是.,即目前目錄(ndb_mgmd所在的目錄)。

3.7 HeartbeatThreadPriority

重新開機類型:S

數值類型:string

預設值:none

為管理節點和API節點設定心跳線程的排程政策和優先級。

設定此參數的文法如下所示:

HeartbeatThreadPriority = policy[, priority]

policy: {FIFO | RR}

FIFO:先進先出

RR:輪詢排程

3.8 TotalSendBufferMemory

重新開機類型:N

數值類型:位元組

預設值:0

此參數用于确定,此節點配置設定的記憶體總量(以位元組為機關),在所有已配置的傳輸器中将其設定為使用。

如果設定了此參數,則其最小值為256KB,最大值是4294967039,0表示尚未設定參數。

3.9 HeartbeatIntervalMgmdMgmd

重新開機類型:N

數值類型:毫秒

預設值:1500

此參數用于确定,另一個管理節點是否與此節點聯系的心跳消息之間的間隔。管理節點在這些間隔中的3個等待之後,則聲明連接配接已死。是以,1500毫秒的預設設定使管理節點在逾時之前等待大約1600毫秒。

4 資料節點配置

在config.ini檔案中,在[ndbd]與[ndbd default]部分用于配置資料節點的行為。無論是使用ndbd還是ndbmtd二進制檔案進行資料節點程序,[ndbd]與[ndbd default]始終作為節名稱。[ndbd default]是資料節點參數的預設值,隻要這裡配置了,所有資料節點均可用到這裡的參數值。參數名稱和值不區分大小寫,除非在MySQL伺服器my.cnf或 my.ini檔案中使用,在這種情況下它們區分大小寫。

4.1 NodeId

可見1.1 NodeId。

4.2 HostName

可見1.2 HostName。

4.3 ServerPort

重新開機類型:N

數值類型:端口号

預設值:none

群集中的每個節點都使用端口連接配接到其他節點。預設情況下,此端口是動态配置設定的,以確定同一主機上沒有兩個節點接收相同的端口号,是以通常不需要為此參數指定值。

但是,如果您需要能夠在防火牆中打開特定端口以允許資料節點和API節點(包括SQL節點)之間的通信,則設定此參數。還記得在入門篇安裝資料節點時提到的最好關閉防火牆嗎?原因就在這裡。

注意

從資料節點到管理節點的連接配接是使用ndb_mgmd管理端口(管理伺服器 PortNumber)完成的,是以應始終允許從任何資料節點到該端口(管理節點的端口)的傳出連接配接。

4.4 NodeGroup

重新開機類型:IS

數值類型:0-65536

預設值:none

此參數可用于将資料節點配置設定給特定節點組。它僅在首次啟動叢集時才會被讀取,并且不能用于線上将資料節點重新配置設定給其他節點組。通常不希望在config.ini檔案的[ndbd default]部分中使用該參數,并且必須注意不要将無效節點配置設定給任何節點組。

該NodeGroup 參數主要用于将新節點組添加到正在運作的NDB群集,而無需執行滾動重新啟動。為此,你應将其設定為65536(最大值)。你不需要NodeGroup為所有群集資料節點設定值,僅适用于那些要在以後啟動并作為新節點組添加到群集的節點。

4.5 NoOfReplicas

重新開機類型:IS

數值類型:1-4

預設值:2

此全局參數隻能在[ndbd default]節中設定,定義存儲在叢集中的每個表的副本數,指定了節點組的大小。

節點組是隐式形成的。第一節點組,由具有最低節點ID的資料節點集合形成,下一個節點組,由下一個最低節點辨別的集合形成,以此類推。舉個例子,假設我們有4個資料節點并且NoOfReplicas設定為2,四個資料節點具有節點ID 2,3,4和5,那麼第一個節點組就由節點2和3形成,而第二個節點組由節點4和5組成。同一節點組中的節點不會放在同一台計算機上,因為單個硬體故障會導緻整個叢集發生故障。如果未提供節點ID,則資料節點的順序将是節點組的決定因素。如果未提供節點ID,則資料節點的順序将是節點組的決定因素。

注意

雖然此參數的最大可能值為4,但生産中不支援将

NoOfReplicas的

值設定為大于2。

資料節點數量必須要是NoOfReplicas的整數倍。

4.6 DataDir

重新開機類型:IN

數值類型:檔案路徑

預設值:.

此參數指定了放置資料節點的輸出檔案的目錄,包括跟蹤檔案、日志檔案、pid檔案和​​錯誤日志。預設值是資料節點程序工作目錄。

4.7 FileSystemPath

重新開機類型:IN

數值類型:檔案路徑

預設值:DataDir

此參數指定為中繼資料、REDO日志、UNDO日志(對于磁盤資料表)和資料檔案的放置目錄。預設值是指定的目錄DataDir。

4.8 BackupDataDir

重新開機類型:IN

數值類型:檔案路徑

預設值:FileSystemPath/BACKUP

此參數指定放置備份的目錄。

注意

字元串' /BACKUP'始終附加在此值中。例如,如果将BackupDataDir值設定為 /var/lib/cluster-data,則所有備份都存儲在 /var/lib/cluster-data/BACKUP。這也意味着有效的預設備份位置是在FileSystemPath參數指定的目錄下,BACKUP命名的檔案目錄 。

4.9 DataMemory、IndexMemory和StringMemory

DataMemory和IndexMemory,是[ndbd]指定用于存儲實際記錄及其索引的記憶體大小的參數。

注意

IndexMemory在NDB 7.6中已棄用,并且将在未來版本的NDB Cluster中删除。

IndexMemory配置設定的任何記憶體都被DataMemory配置設定的記憶體所替代,DataMemory獨自負責在記憶體中存儲資料和索引所需的所有資源。在NDB 7.6.2及更高版本中,IndexMemory在群集配置檔案中使用會觸發來自管理伺服器的警告。

4.9.1 DataMemory

重新開機類型:N

數值類型:1M - 1T

預設值:98M

在NDB 7.6及以上版本,DataMemory配置設定的資源用于存儲所有資料和索引,以前版本則隻是用于存儲資料。

4.9.2 IndexMemory

重新開機類型:N

數值類型:1M - 1T

預設值:0

在NDB 7.5及更早版本中,此參數控制NDB Cluster中用于哈希索引的存儲量。

從NDB 7.6.2開始,不推薦使用IndexMemory 參數(并且将來可以删除),IndexMemory配置設定的任何記憶體都被配置設定給同一個記憶體池DataMemory,後者獨自負責在記憶體中存儲資料和索引所需的所有資源。在NDB 7.6.2及更高版本中,IndexMemory在群集配置檔案中使用會觸發來自管理伺服器的警告。

4.9.3 StringMemory

重新開機類型:S

數值類型:%或位元組

預設值:25

此參數确定為表名等字元串配置設定的記憶體量,并在config.ini檔案的一個[ndbd]或[ndbd default]一部分中設定。

介于0和100之間的值被解釋為最大預設值的百分比,該最大預設值是根據許多因素計算的,包括表的數量、最大表名稱大小、.FRM檔案的最大大小 MaxNoOfTriggers、最大列名稱大小和最大預設值列值。

大于100的值被解釋為位元組數。

預設值為25,即預設最大值的25%。

在大多數情況下,預設值應該足夠,但是當你有很多 NDB表(1000或更多)時,可能會出現錯誤773 超出字元串記憶體,請修改StringMemory配置參數。

還有更多資料節點的其他參數詳解,可見官網文檔:https://dev.mysql.com/doc/refman/5.7/en/mysql-cluster-ndbd-definition.html

5 sql節點和api節點配置

在config.ini檔案中,在[mysqld]與[api]部分用于定義mysql伺服器(sql節點)和用于通路群集資料的其他應用程式(API節點)的行為。一般來說,一個[mysqld]部分用于表示為叢集提供SQL接口的MySQL伺服器,一個[api]部分用于通路叢集資料的mysqld程序以外的應用程式。

5.1 NodeId

可見3.1 NodeId。

5.2 HostName

可見3.2 HostName。

5.3 ConnectionMap

重新開機類型:N

數值類型:string

預設值:none

指定要連接配接的資料節點。

5.4 ArbitrationRank

可見3.4 ArbitrationRank。

5.5 ArbitrationDelay

可見3.5 ArbitrationDelay

還有更多資料節點的其他參數詳解,可見官網文檔:https://dev.mysql.com/doc/refman/5.7/en/mysql-cluster-api-definition.html

6 NDB叢集的TCP/IP連接配接

TCP / IP是NDB叢集中節點之間所有連接配接的預設傳輸機制,通常沒有必要定義TCP / IP連接配接。NDB Cluster自動為所有資料節點,管理節點和SQL或API節點設定此類連接配接。

要覆寫預設連接配接參數,必須使用檔案config.ini中的一個或多個[tcp]部分定義連接配接。每個[tcp]部分明确定義了兩個NDB節點之間的TCP / IP連接配接,并且必須包含至少參數 NodeId1和NodeId2,以及将任何連接配接參數來覆寫。當然,也可以通過在[tcp default]部分中設定這些參數來更改這些參數的預設值。

以下隻列部分比較常用的參數,若想了解更多其他參數,可見https://dev.mysql.com/doc/refman/5.7/en/mysql-cluster-tcp-definition.html

6.1 NodeId1和NodeId2

重新開機類型:N

數值類型:1到255的整數

預設值:none

為了識别兩個節點之間的連接配接,需要提供他們的節點ID在配置檔案中的[tcp]部分的NodeId1和 NodeId2的值,這些是每個節點Id。

6.2 HostName1和HostName2

重新開機類型:N

數值類型:名稱或IP位址

預設值:none

HostName1和HostName2參數可用于指定兩個節點之間的TCP連接配接的特定網絡接口,這些參數的值可以是主機名或IP位址。

6.3 SendBufferMemory

重新開機類型:N

數值類型:位元組

預設值:2M

表示發送緩沖區,即TCP傳輸器在執行對作業系統的發送調用之前,使用緩沖區來存儲所有消息。當此緩沖區達到64KB時,其内容将被發送。要處理臨時過載情況,還可以定義更大的發送緩沖區。

如果明确設定此參數,則記憶體不專用于每個傳輸器。此參數的值用來表示單個傳輸器可以使用多少記憶體的硬限制 ,可能會大于TotalSendBufferMemory參數的值。因為,所有已配置SendBufferMemory的傳輸器的總和可能大于TotalSendBufferMemory為給定節點設定的總和。這是一種在使用許多節點時節省記憶體的方法,即所有傳輸器同時不需要最大記憶體量。

發送緩沖區的預設大小為2MB,這是大多數情況下建議的大小。其最小大小為64KB,理論最大值為4GB。

6.4 使用TCP/IP直接連接配接的NDB叢集

若需要資料節點之間的直接連接配接,那麼設定叢集配置時,需要在叢集配置檔案config.ini中的[tcp]部分明确指定連接配接的資料節點的交叉IP位址。

下面我們舉個例子說明一下,設想一個包含四個主機的叢集,分别為一個管理節點,一個SQL節點和兩個資料節點。叢集作為一個整體駐留在172.23.72.*LAN 的子網上。除了通常的網絡連接配接外,兩個資料節點還使用标準交叉電纜直接連接配接,并使用1.1.0.*位址範圍内的IP位址直接互相通信, 如下所示:

# Management Server
[ndb_mgmd]
Id=1
HostName=172.23.72.20

# SQL Node
[mysqld]
Id=2
HostName=172.23.72.21

# Data Nodes
[ndbd]
Id=3
HostName=172.23.72.22

[ndbd]
Id=4
HostName=172.23.72.23

# TCP/IP Connections
[tcp]
NodeId1=3
NodeId2=4
HostName1=1.1.0.1
HostName2=1.1.0.2
           

通過使資料節點繞過以太網裝置(如交換機,集線器或路由器),在資料節點之間使用直接TCP連接配接可以提高叢集的整體效率,進而減少叢集的延遲。但是,需要注意的是,若想要以這種方式直接連接配接兩個以上資料節點的最佳優勢,那麼你必須令每個資料節點與同一節點組中的每個其他資料節點之間建立直接連接配接。

7 NDB叢集的發送緩沖區配置

NDB叢集核心采用統一的發送緩沖區,其記憶體是由所有運輸共享池動态配置設定。這意味着可以根據需要調整發送緩沖區的大小,通過設定以下參數可以完成統一的發送緩沖區的配置。

注意

NDB叢集的發送緩沖區的預設傳輸器類型為TCP。

7.1 TotalSendBufferMemory

該參數可以為叢集中的所有類型的節點使用設定,即它可以在config.ini檔案的[ndbd]、[ndb_mgmd]、[mysqld]或[api]等地方設定。它表示由每個節點配置設定的記憶體總量(以位元組為機關),在所有已配置的傳輸器中将其設定為使用。如果設定,其最小值為256KB; 最大值是4294967039。

為了與現有配置向後相容,此參數将所有已配置傳輸器的最大發送緩沖區大小的總和作為其預設值,再加上每個傳輸器的額外32KB/頁。最大值取決于傳輸器的類型,如下表所示:

傳輸器類型 最大發送緩沖區大小(位元組)
TCP(預設) SendBufferMemory (預設2M)
SCI SendLimit (預設= 8K)+16K
SHM 20K

7.2 OverloadLimit

此參數在config.ini檔案的[tcp]部分中使用,表示在認為連接配接過載之前必須存在于發送緩沖區中的未發送資料量(以位元組為機關)。預設值為0,在這種情況下,将根據SendBufferMemory * 0.8給定連接配接計算有效過載限制。此參數的最大值為4G。

7.3 SendBufferMemory

可見6.3 SendBufferMemory。

8 總結

雖然,mysql cluster的預設配置加上典型配置,已經可以滿足大部分系統的需求,但是,還是有那麼一些比較特殊的系統需要一些特殊配置。不知通過本文對mysql cluster的相應配置講解,你能否配置出你想要的分布式資料庫叢集呢?

在叢集中機器間的傳輸方式上,其實,在NDB Cluster的代碼庫提供了4種傳輸方式。而至今為止,我們隻說過,使用100 Mbps或千兆以太網的TCP / IP(叢集的預設傳輸方式),和本文6.4說到的直接(機器對機器)TCP / IP連接配接。另外還有兩種傳輸方式,共享記憶體(SHM)方式和可擴充的相幹接口(SCI)方式,這裡就不多講了。若需要了解更多這兩種方式,可以見官網文檔 第21.3.3.12節“NDB叢集共享記憶體連接配接” 和 第21.3.3.13節“NDB叢集中的SCI傳輸連接配接” 。