目录
前言
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数据库集群的意思。
由一个或多个数据节点组成,也称为副本集。在集群中的节点组数量不可直接配置,它是由数据节点数量和副本数量(NoOfReplicas 配置参数)决定的,如下所示:
[# of node groups] = [# of data nodes] / NoOfReplicas
故数据节点数量必须为副本数量的整数倍。
这是集群存储数据的一部分。每个节点负责保留分配给它的任何分区的至少一个副本。集群默认使用的分区数取决于数据节点的数量和数据节点使用的LDM线程数,如下所示:
[# of partitions] = [# of data nodes] * [# of LDM threads]
使用ndbmtd(多线程)运行数据节点时,LDM线程的数量由MaxNoOfExecutionThreads设置。使用ndbd(单线程)运行数据节点时,只有一个LDM线程,这意味集群分区数量与数据节点数量一样多。
使用ndbmtd(多线程)运行的情况下, MaxNoOfExecutionThreads设置为3或更小时,上面的表达式才比较准确,即LDM线程的数量随着此参数的值而呈线性增加。但是,如果MaxNoOfExecutionThreads设置的值大于3,则不是严格线性的,并且设置它还有其他限制。
集群分区的副本,在节点组中的每个节点都存储一个分区副本。副本数量等于每个节点组的节点数量,故节点组也称为副本集。
副本完全属于单个节点,但是节点可以(通常会)存储多个副本。
下图是两个节点组的集群,下面就以其来总结说明集群的数据节点、节点组、分区和副本之间的关系。为了描绘清楚,这里就把管理节点和sql节点省略了。
集群存储的数据分为四个分区,编号为0,1,2和3,每个分区在同一节点组中存储多个副本。分区存储在备用节点组中,如下所示:
这对于NDB集群的持续运行意味着:只要参与集群的每个节点组至少有一个节点运行,集群就拥有所有数据的完整副本并且仍然可行。但是,这里要特别说明的是,若其中一个节点组的所有节点同时挂了,那集群就会丢失这整一个分区,无法再提供对所有集群数据的完整集合的访问。
符号 | 重启类型 | 描述 |
N | Node | 可以使用滚动重新启动来更新该参数 |
S | System | 必须完全关闭所有群集节点,然后重新启动,以实现此参数的更改 |
I | Initial | 必须使用该--initial选项重新启动数据节点 |
在config.ini文件中,该[ndb_mgmd]部分用于配置管理服务器的行为。如果使用多个管理服务器,则可以在一个[ndb_mgmd default]部分中指定所有这些服务器共有的参数。 [mgm]并且[mgm default] 是这些的较旧别名,支持向后兼容性。
以下参数都是可选的,并且如果省略则采用其默认值。但是,需要注意的是,如果既不存在ExecuteOnComputer也不存在 HostName参数,localhost则将假定两者都具有默认值。
重启类型:IS
数值类型:1到255的整数
默认值:null
群集中的每个节点都具有唯一标识。对于管理节点,这由1到255(包括1和255)范围内的整数值表示。所有内部群集消息都使用此ID来寻址节点,因此无论节点类型如何,每个NDB群集节点都必须是唯一的。
另外,NodeId 是标识管理节点时使用的首选参数名称。虽然旧版本Id 继续支持向后兼容性,但现在不推荐使用它,并在使用时生成警告,因为它会在将来的NDB Cluster版本中删除。
注意
数据节点ID必须小于49。如果计划部署大量数据节点,最好将管理节点、sql节点或api节点的ID限制为大于48的值。
重启类型:N
数值类型:主机名或IP地址
默认值:none
指定此参数定义管理节点所驻留的计算机的主机名,或IP地址。需要注意的是,要指定除localhost
之外的主机名,或者 ExecuteOnComputer
是必需的。
另外,HostName 是指定管理节点所驻留计算机主机名或IP地址的首选参数名称。虽然旧版本ExecuteOnComputer
继续支持向后兼容性,但现在不推荐使用它,并在使用时生成警告,因为它会在将来的NDB Cluster版本中删除。
重启类型: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 将群集日志输出通过管道传输到同一台计算机上的常规文件。可以指定以下值:
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
重启类型:N
数值类型:0-2
默认值:1
此参数用于定义哪些节点可以充当仲裁器。只有管理节点和SQL节点可以是仲裁者。ArbitrationRank可以采用以下值之一:
通常,应将管理服务器配置为仲裁器,方法是将其设置ArbitrationRank 为1(管理节点的默认值),将所有SQL节点的值设置为0(SQL节点的默认值)。
重启类型:N
数值类型:毫秒
默认值:0
一个整数值,它使管理服务器对仲裁请求的响应延迟该毫秒数。默认情况下,此值为0,通常没有必要改变它。
重启类型:N
数值类型:文件路径
默认值:.
此参数指定了放置管理服务器的输出文件的目录。这些文件包括集群日志文件,进程输出文件和守护程序的进程ID(PID)文件。(对于日志文件,可以通过设置FILE参数来覆盖此位置,详见本文的LogDestination)
此参数的默认值是.,即当前目录(ndb_mgmd所在的目录)。
重启类型:S
数值类型:string
默认值:none
为管理节点和API节点设置心跳线程的调度策略和优先级。
设置此参数的语法如下所示:
HeartbeatThreadPriority = policy[, priority]
policy: {FIFO | RR}
FIFO:先进先出
RR:轮询调度
重启类型:N
数值类型:字节
默认值:0
此参数用于确定,此节点分配的内存总量(以字节为单位),在所有已配置的传输器中将其设置为使用。
如果设置了此参数,则其最小值为256KB,最大值是4294967039,0表示尚未设置参数。
重启类型:N
数值类型:毫秒
默认值:1500
此参数用于确定,另一个管理节点是否与此节点联系的心跳消息之间的间隔。管理节点在这些间隔中的3个等待之后,则声明连接已死。因此,1500毫秒的默认设置使管理节点在超时之前等待大约1600毫秒。
在config.ini文件中,在[ndbd]与[ndbd default]部分用于配置数据节点的行为。无论是使用ndbd还是ndbmtd二进制文件进行数据节点进程,[ndbd]与[ndbd default]始终作为节名称。[ndbd default]是数据节点参数的缺省值,只要这里配置了,所有数据节点均可用到这里的参数值。参数名称和值不区分大小写,除非在MySQL服务器my.cnf或 my.ini文件中使用,在这种情况下它们区分大小写。
可见1.1 NodeId。
可见1.2 HostName。
重启类型:N
数值类型:端口号
默认值:none
群集中的每个节点都使用端口连接到其他节点。默认情况下,此端口是动态分配的,以确保同一主机上没有两个节点接收相同的端口号,因此通常不需要为此参数指定值。
但是,如果您需要能够在防火墙中打开特定端口以允许数据节点和API节点(包括SQL节点)之间的通信,则设置此参数。还记得在入门篇安装数据节点时提到的最好关闭防火墙吗?原因就在这里。
注意
从数据节点到管理节点的连接是使用ndb_mgmd管理端口(管理服务器 PortNumber)完成的,因此应始终允许从任何数据节点到该端口(管理节点的端口)的传出连接。
重启类型:IS
数值类型:0-65536
默认值:none
此参数可用于将数据节点分配给特定节点组。它仅在首次启动集群时才会被读取,并且不能用于在线将数据节点重新分配给其他节点组。通常不希望在config.ini文件的[ndbd default]部分中使用该参数,并且必须注意不要将无效节点分配给任何节点组。
该NodeGroup 参数主要用于将新节点组添加到正在运行的NDB群集,而无需执行滚动重新启动。为此,你应将其设置为65536(最大值)。你不需要NodeGroup为所有群集数据节点设置值,仅适用于那些要在以后启动并作为新节点组添加到群集的节点。
重启类型: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的整数倍。
重启类型:IN
数值类型:文件路径
默认值:.
此参数指定了放置数据节点的输出文件的目录,包括跟踪文件、日志文件、pid文件和错误日志。默认值是数据节点进程工作目录。
重启类型:IN
数值类型:文件路径
默认值:DataDir
此参数指定为元数据、REDO日志、UNDO日志(对于磁盘数据表)和数据文件的放置目录。默认值是指定的目录DataDir。
重启类型:IN
数值类型:文件路径
默认值:FileSystemPath/BACKUP
此参数指定放置备份的目录。
注意
字符串' /BACKUP'始终附加在此值中。例如,如果将BackupDataDir值设置为 /var/lib/cluster-data,则所有备份都存储在 /var/lib/cluster-data/BACKUP。这也意味着有效的默认备份位置是在FileSystemPath参数指定的目录下,BACKUP命名的文件目录 。
DataMemory和IndexMemory,是[ndbd]指定用于存储实际记录及其索引的内存大小的参数。
注意
IndexMemory在NDB 7.6中已弃用,并且将在未来版本的NDB Cluster中删除。
IndexMemory分配的任何内存都被DataMemory分配的内存所替代,DataMemory独自负责在内存中存储数据和索引所需的所有资源。在NDB 7.6.2及更高版本中,IndexMemory在群集配置文件中使用会触发来自管理服务器的警告。
重启类型:N
数值类型:1M - 1T
默认值:98M
在NDB 7.6及以上版本,DataMemory分配的资源用于存储所有数据和索引,以前版本则只是用于存储数据。
重启类型:N
数值类型:1M - 1T
默认值:0
在NDB 7.5及更早版本中,此参数控制NDB Cluster中用于哈希索引的存储量。
从NDB 7.6.2开始,不推荐使用IndexMemory 参数(并且将来可以删除),IndexMemory分配的任何内存都被分配给同一个内存池DataMemory,后者独自负责在内存中存储数据和索引所需的所有资源。在NDB 7.6.2及更高版本中,IndexMemory在群集配置文件中使用会触发来自管理服务器的警告。
重启类型: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
在config.ini文件中,在[mysqld]与[api]部分用于定义mysql服务器(sql节点)和用于访问群集数据的其他应用程序(API节点)的行为。一般来说,一个[mysqld]部分用于表示为集群提供SQL接口的MySQL服务器,一个[api]部分用于访问集群数据的mysqld进程以外的应用程序。
可见3.1 NodeId。
可见3.2 HostName。
重启类型:N
数值类型:string
默认值:none
指定要连接的数据节点。
可见3.4 ArbitrationRank。
可见3.5 ArbitrationDelay
还有更多数据节点的其他参数详解,可见官网文档:https://dev.mysql.com/doc/refman/5.7/en/mysql-cluster-api-definition.html
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
重启类型:N
数值类型:1到255的整数
默认值:none
为了识别两个节点之间的连接,需要提供他们的节点ID在配置文件中的[tcp]部分的NodeId1和 NodeId2的值,这些是每个节点Id。
重启类型:N
数值类型:名称或IP地址
默认值:none
HostName1和HostName2参数可用于指定两个节点之间的TCP连接的特定网络接口,这些参数的值可以是主机名或IP地址。
重启类型:N
数值类型:字节
默认值:2M
表示发送缓冲区,即TCP传输器在执行对操作系统的发送调用之前,使用缓冲区来存储所有消息。当此缓冲区达到64KB时,其内容将被发送。要处理临时过载情况,还可以定义更大的发送缓冲区。
如果明确设置此参数,则内存不专用于每个传输器。此参数的值用来表示单个传输器可以使用多少内存的硬限制 ,可能会大于TotalSendBufferMemory参数的值。因为,所有已配置SendBufferMemory的传输器的总和可能大于TotalSendBufferMemory为给定节点设置的总和。这是一种在使用许多节点时节省内存的方法,即所有传输器同时不需要最大内存量。
发送缓冲区的默认大小为2MB,这是大多数情况下建议的大小。其最小大小为64KB,理论最大值为4GB。
若需要数据节点之间的直接连接,那么设置集群配置时,需要在集群配置文件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连接可以提高集群的整体效率,从而减少集群的延迟。但是,需要注意的是,若想要以这种方式直接连接两个以上数据节点的最佳优势,那么你必须令每个数据节点与同一节点组中的每个其他数据节点之间建立直接连接。
NDB集群核心采用统一的发送缓冲区,其内存是由所有运输共享池动态分配。这意味着可以根据需要调整发送缓冲区的大小,通过设置以下参数可以完成统一的发送缓冲区的配置。
注意
NDB集群的发送缓冲区的默认传输器类型为TCP。
该参数可以为集群中的所有类型的节点使用设定,即它可以在config.ini文件的[ndbd]、[ndb_mgmd]、[mysqld]或[api]等地方设置。它表示由每个节点分配的内存总量(以字节为单位),在所有已配置的传输器中将其设置为使用。如果设置,其最小值为256KB; 最大值是4294967039。
为了与现有配置向后兼容,此参数将所有已配置传输器的最大发送缓冲区大小的总和作为其默认值,再加上每个传输器的额外32KB/页。最大值取决于传输器的类型,如下表所示:
传输器类型 | 最大发送缓冲区大小(字节) |
TCP(默认) | SendBufferMemory (默认2M) |
SCI | SendLimit (默认= 8K)+16K |
SHM | 20K |
此参数在config.ini文件的[tcp]部分中使用,表示在认为连接过载之前必须存在于发送缓冲区中的未发送数据量(以字节为单位)。默认值为0,在这种情况下,将根据SendBufferMemory * 0.8给定连接计算有效过载限制。此参数的最大值为4G。
可见6.3 SendBufferMemory。
虽然,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传输连接” 。