MySQL Cluster 配置详细介绍
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性能调优与架构设计》