NDB语法
1,不支持创建临时表(temporary tables);
2,创建索引和键的限制:
(1),在列上创建索引长度超过3072bytes会成功,但是只能使用索引的前3072bytes。并且会显示警告信息"specified key was too long,max key lenght is 3072 keys"
不支持的特征
1,在NDB创建create table时,一定要指定tablespace.
For NDB tables, beginning with MySQL Cluster NDB 6.2.5 and MySQL Cluster NDB 6.3.2, it is also possible to specify whether the column is stored on disk or in memory by using a STORAGE clause. STORAGE DISK causes the column to be stored on disk, and STORAGE MEMORY causes in-memory storage to be used. The CREATE TABLE statement used must still include a TABLESPACE clause:
mysql> CREATE TABLE t1 (
-> c1 INT STORAGE DISK,
-> c2 INT STORAGE MEMORY
-> ) ENGINE NDB;
ERROR 1005 (HY000): Can't create table 'c.t1' (errno: 140)
mysql> CREATE TABLE t1 (
-> c1 INT STORAGE DISK,
-> c2 INT STORAGE MEMORY
-> ) TABLESPACE ts_1 ENGINE NDB;
Query OK, 0 rows affected (1.06 sec)
//NDB参数解释 ---from 《mysql性能调优和架构设计》
1) [NDBD DEFAULT]中的配置项:
NoOfReplicas:定义在Cluster 环境中相同数据的分数,通俗一点来说就是每一份数据存放NoOfReplicas 份。如果希望能够冗余,那么至少设置为2(一般情况来说此参数值设置为2 就够了),最大只能设置为4。另外,NoOfReplicas 值得大小,实际上也就是nodegroup 大小的定义。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节点数,所得到的值。
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 参数需要配置,在之前各类节点均有介绍了,这里就不再累述。