MySQL Cluster集群学习笔记

前期问题:
看整个运行过程,如何分配任务给SQL节点;OK
SQL节点如何接入数据节点;OK
各个节点蹦了可咋整;OK
管理节点的备份;OK
数据节点那一片是怎么个回事;NDB OK
隔离级别;OK

计算在哪里??


扩容NDBD :修改ndbd节点statefulset中的内存,修改mgmd节点config.ini中的DataMemory、IndexMemory两个内容各自占用ndbd节点内存60%和30%,循环重启mgmd,ndbd,mysqld节点。

7.5.10版本的管理节点mgmd无法识别7.6.6版本的ndbd



mysql集群分为同步集群和异步集群
异步集群(mysql replication)
结构:(master+slave)
特点:
1、主从数据库异步数据;
2、数据放在几台服务器上,冗余一般;
3、速度较快;
4、扩展性差;
5、无法实现高可用性和负载均衡(只能在程序级别实现读写分离,减轻对主数据库压力)
6、配置和管理较差,可能丢失数据

同步集群(mysql cluster)
结构:(data+sql+mgm节点)
特点:
1、内存级别,对硬件要求地,对内存要求大
2、数据同时存在多个地方,冗余好
3、速度一般
4、建表需要声明为engine= ndbcluster
5、扩展性强
6、可以实现高可用性和负载平衡,实现对大型应用的支持
7、必须是特定的mysql版本
9、配置和管理比较方便,不会丢失数据

MySQL Replication主从复制集群(不用)
提供了单点写入,多点读取的服务,实现了scale out.

如图一所示,一个主实例(M),三个从实例(S),通过replication,Master生成event的binlog,然后发给slave,slave将event存入relaylog,然后提交自身数据库,实现主从数据同步。以读写分离的方式,降低了Master的运行负载,同时提升了Slave的资源利用。
可能问题存在与:数据复制的时延。在通常情况下,MySQL Replication数据复制是异步的,在master写了binglog后发给slave,并不等待slave返回确认就提交了本地事物。如果有网络延迟导致发送给slave失败,则会出现主从数据v不一致的状况,无法做到数据v高可用。google提供的解决方案是半同步和同步复制。半同步复制是master等待slave将event写入relaylog后提交数据库。同步复制是master等待slave提交数据库后再提交数据库,这样每个实例读取的数据都是一致的,不会存在slave幻读。同步复制性能降低严重,需要进行折中处理。

MySQL Cluster同步集群
高度可扩展的,兼容ACID事务的实施数据库,基于分布式架构不存在单点故障,MySQL Cluster支持自动水平扩容,并能够自动读写负载均衡。
使用了一个叫做NDB的内存存储引擎来整合多个MySQL实例,提供统一的服务器集群。



MySQL Cluster的节点、节点组、数据副本以及分区 (即NDB 数据引擎控制下的数据层如何工作)
数据节点Data Node是一个ndbd进程,存储着一个数据副本,也是一个指到节点组中节点的分区的拷贝
节点组Node Group:一个节点组包含一个或多个数据节点,分区,或者副本。
    节点组的数量在MySQL集群中通过节点数量和副本数量(NoOfReplicas参数)来反映确定
分区Partition:NDB一张表的一个数据分片,包含有一张表的一部分数据。一个集群分区存储的机制。一个集群中有多少节点则一个集群有多少个分区。每个节点都至少负责一个分区的数据内容。
    一个分区是完全属于一个节点的,分区数据可以作为副本存在与组内其他节点,一个节点可以存储数个分区数据副本。
NDB和用户自定义分区:一般来说MySQL会自动进行数据分区,但是用户也可以自定义进行数据分区。自定义分区需要遵循以下主题:
    1、只有数据库的键和线性键可以在生产环境中做分区。
    2、使用ndbd的时候,最大分区的数量需要严格遵循公式 8 * [number of node groups]
副本:一个分区数据拷贝。每个节点组中的节点都保存有一个数据副本。有时候也叫做分区副本。副本的数量与每个节点组中节点的数量相同,即每个节点都持有着整个节点组中的所有数据,自身作为所持分区的主要副本,作为其他分区的后备副本。在一个节点组中有一个节点可以运行则整个集群可以拥有一个完备的数据的拷贝可用。

若一个电脑上有多个ndbd节点,则会按照NdbdId的顺序来依次放入各个机器
节点组是隐含形成的。第一个节点组是由具有最低节点ID的数据节点集合,由下一个最低节点身份集合构成的下一个节点组,以此类推。举例来说,假设我们有4个数据节点并且NoOfReplicas设置为2.四个数据节点具有节点ID 2,3,4和5.然后,第一节点组由节点2和3形成,并且第二个节点组,按节点4和5.以这样的方式配置集群很重要:相同节点组中的节点不会放在同一台计算机上,因为单个硬件故障会导致整个集群发生故障。
如果没有提供节点ID,则数据节点的顺序将成为节点组的决定因素。无论是否进行显式分配,都可以在管理客户端的SHOW命令的输出中查看它们。

NDB Cluster分布式存储引擎

本文出自 “划舞鱼” 博客,请务必保留此出处http://ty1992.blog.51cto.com/7098269/1534313

NDB存储引擎也叫NDB Cluster存储引擎,主要用于MySQL Cluster分布式集群环境

Mysql cluster主要由以下三部分组成:

1). 负责管理各个节点的Manage 节点主机:

管理节点负责整个Cluster 集群中各个节点的管理工作,包括集群的配置,启动关闭
各节点,以及实施数据的备份恢复等。管理节点会获取整个Cluster 环境中各节点的状态和
错误信息,并且将各Cluster 集群中各个节点的信息反馈给整个集群中其他的所有节点。由
于管理节点上保存在整个Cluster 环境的配置,同时担任了集群中各节点的基本沟通工作,

所以他必须是最先被启动的节点。MGM节点是用命令“ndb_mgmd”启动的。

2). SQL 层的SQL 服务器节点(后面简称为SQL 节点),也就是我们常说的Mysql Server:
主要负责实现一个数据库在存储层之上的所有事情,比如连接管理,query 优化和响
应,cache 管理等等,只有存储层的工作交给了NDB 数据节点去处理了。也就是说,在纯粹
的Mysql Cluster 环境中的SQL 节点,可以被认为是一个不需要提供任何存储引擎的Mysql
服务器,因为他的存储引擎有Cluster 环境中的NDB 节点来担任。所以,SQL 层各Mysql 服
务器的启动与普通的Mysql 启动有一定的区别,必须要添加ndbcluster 项,可以添加在

my.cnf 配置文件中,也可以通过启动命令行来指定。通常,SQL节点是使用命令“mysqld –ndbcluster”启动的,或将“ndbcluster”添加到“my.cnf”后使用“mysqld”启动。

3). Storage 层的NDB 数据节点,也就是上面说的NDB Cluster:
NDB 是一个内存式存储引擎也就是说,他会将所有的数据和索引数据都load 到内存中,但也会将数据持久化到存储设备上。不过,最新版本,已经支持用户自己选择数据可以不全部Load 到内存中了,这对于有些数据量太大或者基于成本考虑而没有足够内存空间来存放所有数据的用户来说的确是一个大好消息。数据节点是用命令“ndbd”启动的。数据节点也管理数据库的事务处理

NDB 节点主要是实现底层数据存储的功能,保存Cluster 的数据。每一个NDB 节点保存完整数据的一部分(或者一份完整的数据,视节点数目和配置而定),在MySQL CLuster 里面叫做一个fragment。而每一个fragment,正常情况来讲都会在其他的主机上面有一份(或者多分)完全相同的镜像存在。这些都是通过配置来完成的,所以只要配置得当,Mysql Cluster 在存储层不会出现单点的问题。

一般来说,NDB 节点被组织成一个一个的NDB Group,一个NDB Group 实际上就是一组存有完全相同的物理数据的NDB 节点群。

上面提到了NDB 各个节点对数据的组织,可能每个节点都存有全部的数据也可能只保存 一部分数据,主要是受节点数目和参数来控制的。首先在Mysql Cluster 主配置文件(在管理节点上面,一般为config.ini)中,有一个非常重要的参数叫NoOfReplicas,这个参数指定了每一份数据被冗余存储在不同节点上面的份数,该参数一般至少应该被设置成2,也只需要设置成2 就可以了。因为正常来说,两个互为冗余的节点同时出现故障的概率还是非常小的,当然如果机器和内存足够多的话,也可以继续增大。一个节点上面是保存所有的数据还是一部分数据,还受到存储节点数目的限制。NDB 存储引擎首先保证NoOfReplicas 参数配置的要求对数据冗余,来使用存储节点,然后再根据节点数目将数据分段来继续使用多余的NDB 节点,分段的数目为节点总数除以NoOfReplicas 所得。因为有NDB的存在,我们也可以跳过SQL节点(SQL API)而直接使用NDB API来进行获取数据。

NDB的特点内存需求量巨大:新版本索引以及被索引的数据必须存放在内存中,老版本所有数据和索引必须存在与内存中

可以理解为NDB引擎是工作在mysql cluster中存储层的引擎。在管理节点上会进行节点组的划分,具体执行交由NDB来做。用户使用时,经由SQL节点进行交互,SQL节点由管理节点指导从存储层获取数据内容。

ndbd是用于处理使用NDB群集存储引擎的表中的所有数据的进程。 这是授权数据节点完成分布式事务处理,节点恢复,检查点到磁盘,联机备份和相关任务的过程。

在NDB集群中,一组ndbd进程合作处理数据。 这些进程可以在同一台计算机(主机)上或不同的计算机上执行。 数据节点和Cluster主机之间的对应关系是完全可配置的。

节点之间的数据交互是使用网络的,7.0之后加强了这个功能。各表数据是水平分割的,由此数据切分整合的性能瓶颈出现了。由这个架构,我们可以推论出,mysql cluster在执行类似where a=1且a唯一这样的查询时,由于其水平分割,并行处理,可以获得相对较好的性能。但当其执行类似where a>10这样的范围查询则不可避免的会执行多个NDB节点的记录集union,多表查询时多个NDB节点记录集的join,union。显而易见的,这样的应用并不适合在CLUSTER上去跑。

 优点:
 

  1)        99.999 %的高可用性

  2)        快速的自动失效切换

  3)        灵活的分布式体系结构,没有单点故障

  4)        高吞吐量和低延迟

  5)        可扩展性强,支持在线扩容

 
  缺点

  1)        存在很多限制,比如:不支持外键,数据行不能超过8K(不包括BLOB和text中的数据)

  2)        部署、管理、配置很复杂

  3)        占用磁盘空间大,内存大

  4)        备份和恢复不方便

  5)       复杂的sql查询性能一般


NDB同InnoDB的区别对比

Feature

InnoDB 1.1

NDB 7.5

MySQL Server Version

5.7

5.7

InnoDB Version

InnoDB 5.7.20

InnoDB 5.7.20

NDB Cluster Version

N/A

NDB 7.5.8

Storage Limits

64TB

128TB (as of NDB 7.5.2)

Foreign Keys

Yes

Yes

Transactions事务

All standard types

READ COMMITTED提交读

  1. 1. READ UNCOMMITTED:最低级别的隔离,通常又称为dirty read,它允许一个事务读取还没commit的数据,这样可能会提高性能,但是dirty read可能不是我们想要的  
  2. 2. READ COMMITTED:在一个事务中只允许已经commit的记录可见,如果session中select还在查询中,另一session此时insert一条记录,则新添加的数据不可见  
  3. 3. REPEATABLE READ:在一个事务开始后,其他session对数据库的修改在本事务中不可见,直到本事务commit或rollback。在一个事务中重复select的结果一样,除非本事务中update数据库  
  4. 4. SERIALIZABLE:最高级别的隔离,只允许事务串行执行。为了达到此目的,数据库会锁住每行已经读取的记录,其他session不能修改数据直到前一事务结束,事务 commit或取消时才释放锁  

MVCC多版本管理

Yes

No

Data Compression数据压缩

Yes

No (NDB checkpoint and backup files can be compressed)检查点和备用文件可以被压缩

Large Row Support (> 14K)大行支持

Supported for VARBINARYVARCHAR,BLOB, and TEXT columns

Supported for BLOB and TEXT columns only (Using these types to store very large amounts of data can lower NDB performance)

只支持BLOB和TEXT,存入大宗数据会降低NDB性能

Replication Support复制支持

Asynchronous and semisynchronous replication using MySQL Replication

Automatic synchronous replication within an NDB Cluster; asynchronous replication between NDB Clusters, using MySQL Replication

Scaleout for Read Operations读取操作的扩展

Yes (MySQL Replication)

Yes (Automatic partitioning in NDB Cluster; NDB Cluster Replication)自动分区,集群复制

Scaleout for Write Operations写操作扩展

Requires application-level partitioning (sharding)

Yes (Automatic partitioning in NDB Cluster is transparent to applications)自动分区对应用程序透明

High Availability (HA)

Requires additional software

额外的软件

Yes (Designed for 99.999% uptime)

Node Failure Recovery and Failover

Requires additional software

Automatic (Key element in NDB architecture)

Time for Node Failure Recovery

30 seconds or longer

Typically < 1 second

Real-Time Performance

No

Yes

In-Memory Tables

内存表

No

Yes (Some data can optionally be stored on disk; both in-memory and disk data storage are durable)

NoSQL Access to Storage Engine

Yes

Yes (Multiple APIs, including Memcached, Node.js/JavaScript, Java, JPA, C++, and HTTP/REST)

Concurrent and Parallel Writes并行和并行写入

Not supported

Up to 48 writers, optimized for concurrent writes

48个写入器,并进行了写入优化

Conflict Detection and Resolution (Multiple Replication Masters)

冲突解决和检测(master的多个副本)

No

Yes

Hash Indexes

No

Yes

Online Addition of Nodes

Read-only replicas using MySQL Replication

Yes (all node types)

Online Upgrades

No

Yes

Online Schema Modifications在线框架修改

Yes, as part of MySQL 5.7

Yes


集群配置:
除NDB集群管理服务器(ndb_mgmd)外,属于NDB集群一部分的每个节点都需要一个指向管理服务器位置的连接字符串。 此连接字符串用于建立到管理服务器的连接,以及根据节点在群集中的角色执行其他任务。链接字符串如下所示
[ nodeid = node_id ,   ] host-definition [ ,   host-definition [ ,   . . . ] ]   host-definition :   host_name [ : port_number ]

[mgmd配置信息]:
NodeId范围1-255
PortNumber定义了管理服务器监听配置请求和管理命令的端口,默认1186
Property Value
Version (or later) NDB 7.5.0
Type or units unsigned
Default 1186
Range 0 - 64K
Restart Type
S
LocationDomainId定义了mgmd在云中的可用性区域,通过指定可以提高集群在云中工作性能
LogDestination定义了将集群日志信息发送到哪儿
ArbitrationRank定义了节点的仲裁等级,分成012三级,默认一级
DataDir定义了节点的输出文件放在哪儿,包还有日志文件,进程输出文件和守护进程ID(PID),默认ndb_mgmd所在目录
PortNumberStats定义了指定用于从NDB集群管理服务器获取统计信息的端口号。 它没有默认值。
HeartbeatThreadPriority定义了心跳线程优先级
TotalSendBufferMemory定义了此参数用于确定在此节点上为所有已配置的传输器之间的共享发送缓冲区内存分配的总内存量。如果设置了此参数,则其最小允许值为256KB; 0表示参数尚未设置。
HeartbeatIntervalMgmdMgmd指定心跳消息之间的时间间隔,用于确定是否有其他管理节点正在与其联系。 管理节点在这些间隔中的3个之后等待声明连接停止; 因此,默认设置为1500毫秒会导致管理节点在超时之前等待大约1600毫秒。
!Note:当变换config.ini内容或者增加新的节点到运行的集群中需要滚动更新重启所有的节点。

[ndbd配置信息]:
对于那些影响内存使用量或缓冲区大小的参数,可以使用K,M或G作为后缀来表示1024,1024×1024或1024×1024×1024的单位。 (例如,100K表示100×1024 = 102400)。
除非在MySQL服务器my.cnf或my.ini文件中使用,否则参数名称和值不区分大小写,在这种情况下,它们区分大小写。
所有这些参数也适用于ndbmtd(ndbd的多线程版本)。 另外三个数据节点配置参数-MaxNoOfExecutionThreads,ThreadConfig和NoOfFragmentLogParts-仅适用于ndbmtd; 这些在与ndbd一起使用时不起作用。
NodeId、HostName等和mgmd相同
ServerPort群集中的每个节点都使用一个端口连接到其他节点。 默认情况下,该端口是动态分配的,以确保同一主机上没有两个节点接收相同的端口号,因此通常不需要为此参数指定值。
!Note:注意从数据节点到管理节点的连接使用ndb_mgmd管理端口(管理服务器的端口号)完成,因此始终允许从任何数据节点到该端口的传出连接。
NodeGroup指定了此节点的所属nodegroup。它仅在群集第一次启动时读取,不能用于在线将数据节点重新分配给其他节点组。NodeGroup参数主要用于将新节点组添加到正在运行的NDB群集,而无需执行滚动重启。 为此,您应该将其设置为65536(最大值)。 不需要为所有群集数据节点设置NodeGroup值,仅限于那些将在稍后时间启动并添加到群集中作为新节点组的节点。
LocationDomainId同上
NoOfReplicas定义了每一个数据分区的副本数量,此全局参数只能在[ndbd default]部分中设置。同时根据此值确定节点组的数量=节点数/NoOfReplicas。数据分区的数量等于数据节点的数量。相同节点组中的节点不会放在同一台计算机上
!!Important:虽然此参数的最大可能值为4,但在生产中不支持将NoOfReplicas设置为大于2的值。此参数的值必须均匀划分为群集中数据节点的数量。
FileSystemPath此参数指定为元数据创建的所有文件,REDO日志,UNDO日志(用于磁盘数据表)和数据文件的目录。 默认值是由DataDir指定的目录。该目录必须在ndbd进程启动之前存在。NDB集群的建议目录层次包括/ var / lib / mysql-cluster,在该目录下创建节点文件系统的目录。 该子目录的名称包含节点ID。 例如,如果节点标识为2,则该子目录名为ndb_2_fs。
BackupDataDir定义了数据备份的存储位置
数据存储器,索引存储器和字符串存储器
DataMemory和IndexMemory是[ndbd]参数,用于指定用于存储实际记录及其索引的内存段的大小。 在设置这些值时,了解如何使用DataMemory和IndexMemory非常重要,因为它们通常需要更新以反映集群的实际使用情况。

DataMemory和IndexMemory分别占用ndbd内存的60%和30%是不错的策略
在此处的定义值是指每个ndbd上的值
例:ndbd内存2G  DataMemory可以设置为1200M IndexMemory为600M

DataMemory
Property Value
Version (or later) NDB 7.5.0
Type or units bytes
Default 80M
Range 1M - 1T
Restart Type N
Version (or later) NDB 7.6.2
Type or units bytes
Default 98M
Range 1M - 1T
Restart Type N
该参数定义了可用于存储数据库记录的空间量(以字节为单位)。 由此值指定的全部数量将分配到内存中,因此机器具有足够的物理内存以容纳它非常重要。(如果物理内存不足则会在ndbd连接mgmd的时候失败)
DataMemory分配的内存用于存储实际记录和索引。 每条记录有16个字节的开销; 每个记录都会产生额外的金额,因为它存储在一个32KB的页面中,其页面开销为128字节(见下文)。 由于每条记录仅存储在一个页面中,因此每页还有少量浪费。
对于可变大小的表格属性,数据存储在从DataMemory分配的单独数据页面上。 可变长度记录使用固定大小的部分,额外开销4字节来引用可变长度部分。 可变大小的部分有2个字节的开销加上每个属性2个字节。最大记录大小是14000字节。
在NDB 7.5(及更早版本)中,由DataMemory定义的内存空间也用于存储有序索引,每个记录约使用10个字节。每个表格行都在有序索引中表示。用户之间的一个常见错误是假设所有索引都存储在由IndexMemory分配的内存中,但情况并非如此:只有主键和唯一散列索引使用此内存;有序索引使用由DataMemory分配的内存。但是,除非在索引创建语句中指定USING HASH,否则创建主键或唯一散列索引也会在相同键上创建有序索引。这可以通过运行ndb_desc -d db_name table_name来验证。
在NDB 7.6中,分配给DataMemory的资源用于存储所有数据和索引;任何配置为IndexMemory的内存会自动添加到DataMemory使用的内存中以形成公共资源池。
IndexMemory
Property Value
Version (or later) NDB 7.5.0
Type or units bytes
Default 18M
Range 1M - 1T
Restart Type N
Version (or later) NDB 7.6.2
Type or units bytes
Default 0
Range 1M - 1T
Restart Type N
NDB 7.5及更低版本,此参数控制用于NDB群集中散列索引的存储量。 散列索引始终用于主键索引,唯一索引和唯一约束。 定义主键或唯一索引时,会创建两个索引,其中一个索引是用于所有元组访问以及锁定处理的散列索引。 该索引也用于强制执行唯一约束。
从NDB 7.6.2开始,IndexMemory参数已被弃用(并将来可能会被删除); 任何分配给IndexMemory的内存都被分配到与DataMemory相同的池中,该内存单独负责将内存中的数据和索引存储所需的所有资源。 在NDB 7.6.2和更高版本中,在集群配置文件中使用IndexMemory会触发管理服务器的警告。
对hash索引的大小估算
size  =   (   ( fragments   *  32K )   +   ( rows   *  18 )   )   *   replicas
(未完)
LockPagesInMainMemory对于许多操作系统(包括Solaris和Linux),可以将进程锁定到内存中,并避免任何交换到磁盘。这可以用来帮助保证群集的实时特性。
该参数采用整数值0,1或2中的一个,其作用如下列表中所示:
0:禁用锁定。这是默认值。
1:为进程分配内存后执行锁定。
2:在分配进程的内存之前执行锁定。
!!Important:从glibc 2.10开始,glibc使用per-thread arenas来减少共享池上的锁争用,这会消耗实际的内存。一般来说,数据节点进程不需要每线程场所,因为它在启动后不会执行任何内存分配。 (这种分配器的差异似乎不会显着影响性能。)
glibc行为旨在通过MALLOC_ARENA_MAX环境变量进行配置,但glibc 2.16之前的此机制中的一个错误意味着此变量不能设置为小于8,这样无法回收浪费的内存。 (错误#15907219;有关此问题的更多信息,另请参阅http://sourceware.org/bugzilla/show_bug.cgi?id=13137)。
解决此问题的一种可能的解决方法是使用LD_PRELOAD环境变量来预加载jemalloc内存分配库,以取代glibc提供的内存分配库。

多管理节点

当单一管理节点因某些原因宕机之后将会导致整个集群崩溃,因而引入多个管理节点,当某一个管理节点出现宕机之后,其他的管理节点自动接过MySQL集群的管理权限,保证集群的正常运行。

下面给出一个双管理节点的配置

管理节点的config.ini文件:

[ndbd default]
NoOfReplicas=2
DataMemory=160M
IndexMemory=64M
MaxNoOfTables=1024
MaxNoOfAttributes=5000
MaxNoOfOrderedIndexes=1000

[ndb_mgmd]
nodeid=1
hostname=192.168.1.207
datadir=/var/lib/mysql-cluster

[ndb_mgmd]
nodeid=2
hostname=192.168.1.208
datadir=/var/lib/mysql-cluster

[ndbd]
hostname=192.168.1.209
datadir=/usr/local/mysql/data

[ndbd]
hostname=192.168.1.210
datadir=/usr/local/mysql/data

[mysqld]
hostname=192.168.1.203

[mysqld]
hostname=192.168.1.204


数据节点和sql节点的my.cnf文件:

[client]
socket=/var/lib/mysql/mysql.sock

[mysqld]
max_connections=100
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
default_storage_engine=NDBCLUSTER
character-set-server=utf8
ndbcluster
ndb-connectstring=192.168.1.207,192.168.1.208

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql_cluster]
ndb-connectstring=192.168.1.207,192.168.1.208


启动管理节点的命令:

在第一个管理节点上执行  ndb_mgmd -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster --initial

在第二个管理节点上执行 ndb_mgmd -c 192.168.1.207 --ndb-nodeid=2 --configdir=/var/lib/mysql-cluster (注意nodeid要和第二个管理节点在config.ini中配置的nodeid一致。)

Mysql Cluster Q&A

官方原文:https://dev.mysql.com/doc/mysql-cluster-excerpt/5.7/en/faqs-mysql-cluster.html

答1:哪些版本的MySQL软件支持NDB集群?我需要从源代码编译吗

标准的MySQL Server 5.7版本不支持NDB集群。相反,MySQL NDB集群是作为单独的产品提供的。可用的NDB Cluster发布系列包括以下内容:

NDB群集7.3。尽管我们建议新部署使用最新的NDB Cluster 7.5版本,但该系列仍是可用于生产的NDB群集的通用版本(GA)。最新的NDB Cluster 7.3版本可以从http://dev.mysql.com/downloads/cluster/获得。

NDB集群7.4。尽管我们建议新部署使用最新的NDB Cluster 7.5发行版,但本系列是基于NDB存储引擎7.4版和MySQL Server 5.6的NDB集群的最新通用版(GA)版本,仍可用于生产。最近的NDB Cluster 7.4版本可以从http://dev.mysql.com/downloads/cluster/获得。

NDB Cluster 7.5。本系列是基于NDB存储引擎7.5版和MySQL Server 5.7的最新NDB集群通用版(GA)版本。 NDB Cluster 7.5可用于生产;用于生产的新部署应使用本系列中的最新GA版本,该版本目前是NDB Cluster 7.5.11。最新的NDB Cluster 7.5版本可以从http://dev.mysql.com/downloads/cluster/获得。

NDB群集7.6。该系列基于NDB存储引擎7.6版,目前正在开发中,但尚未考虑在生产环境中使用。它可用作开发人员预览版本,用于评估和测试目的。您可以从http://dev.mysql.com/downloads/cluster/获取最新的NDB Cluster 7.6版本。有关本系列中新增功能和其他重要更改的信息,请参阅NDB Cluster 7.6中的新增功能。

您应该使用NDB Cluster 7.5进行任何新的部署;如果您使用的是旧版本的NDB群集,则应尽快升级到此版本。有关NDB Cluster 7.5中所做改进的概述,请参阅NDB Cluster中的新增功能。有关NDB Cluster 7.4中所做改进的概述,请参阅NDB Cluster 7.4中的新增功能;有关NDB Cluster 7.3中所做改进的信息,请参阅NDB Cluster 7.3中的新增功能。

A.2:“NDB”和“NDBCLUSTER”是什么意思?

“NDB”代表“网络数据库”。 NDB和NDBCLUSTER都是存储引擎的名称,它支持MySQL的集群支持。 NDB是首选,但任何名称都是正确的。

A.3:使用NDB集群与使用MySQL复制有什么区别?

在传统的MySQL复制中,主MySQL服务器更新一个或多个从站。事务是按顺序提交的,而慢事务会导致从服务器落后于主服务器。这意味着如果主站发生故障,从站可能没有记录最后几个事务。如果正在使用诸如InnoDB之类的交易安全引擎,交易将在从属上完成或根本不应用,但复制并不能保证主控和从属上的所有数据始终保持一致。在NDB集群中,所有数据节点都保持同步,并且任何一个数据节点提交的事务都将提交给所有数据节点。在数据节点发生故障的情况下,所有剩余的数据节点保持一致状态。

简而言之,标准的MySQL复制是异步的,NDB集群是同步的。

异步复制也可在NDB群集中使用。 NDB群集复制(有时也称为“地理复制”)包括在两个NDB群集之间以及从NDB群集到非群集MySQL服务器之间复制的能力。请参阅第8章NDB群集复制。

A.4:我是否需要任何特殊网络来运行NDB群集?集群中的计算机如何通信?

NDB群集旨在用于高带宽环境,并使用TCP / IP连接计算机。其性能直接取决于集群计算机之间的连接速度。 NDB群集的最低连接要求包括一个典型的100兆以太网或等效网络。我们建议您尽可能使用千兆以太网。

A.5:我需要多少台计算机来运行NDB群集,为什么?

运行一个可行的集群至少需要三台计算机。但是,NDB群集中计算机的最低建议数量为4:每个运行管理和SQL节点一台,以及两台计算机充当数据节点。这两个数据节点的目的是提供冗余;管理节点必须在单独的机器上运行,以保证在其中一个数据节点出现故障的情况下继续仲裁服务。


为了提供更高的吞吐量和高可用性,您应该使用多个SQL节点(连接到集群的MySQL服务器)。运行多个管理服务器也有可能(尽管不是绝对必要)。


A.6:不同计算机在NDB集群中做什么?


NDB集群既有物理组织也有逻辑组织,计算机是物理元素。集群的逻辑或功能元素被称为节点,并且容纳集群节点的计算机有时被称为集群主机。有三种类型的节点,每种都对应于群集中的特定角色。这些是:


管理节点。此节点为整个集群提供管理服务,包括其他节点的启动,关闭,备份和配置数据。管理节点服务器被实现为应用程序ndb_mgmd;用于控制NDB群集的管理客户端是ndb_mgm。有关这些程序的信息,请参见第6.4节“ndb_mgmd - NDB群集管理服务器守护程序”和第6.5节“ndb_mgm - NDB群集管理客户机”。


数据节点。这种类型的节点存储和复制数据。数据节点功能由NDB数据节点进程ndbd的实例处理。有关更多信息,请参见部分6.1,“ndbd - NDB群集数据节点守护进程”。


SQL节点。这只是一个MySQL Server实例(mysqld),它支持NDBCLUSTER存储引擎,并使用--ndb-cluster选项启动引擎,使用--ndb-connectingtring选项启用它以连接到NDB群集管理服务器。有关这些选项的更多信息,请参见第5.3.9.1节“NDB群集的MySQL服务器选项”。


注意
API节点是直接使用群集数据节点进行数据存储和检索的任何应用程序。因此,SQL节点可以被认为是使用MySQL服务器为集群提供SQL接口的API节点类型。您可以使用NDB API编写这样的应用程序(不依赖于MySQL服务器),NDB API向NDB集群数据提供直接面向对象的事务和扫描接口;有关更多信息,请参阅NDB群集API概述:NDB API。


A.7:当我在NDB集群管理客户端中运行SHOW命令时,我看到一行输出如下所示:

id = 2 @ 10.100.10.32(版本:5.6.41-ndb-7.4.21节点组:0,*)
*表示什么?这个节点与其他节点有什么不同?



最简单的答案是,“这不是你可以控制的东西,除非你是编写或分析NDB集群源代码的软件工程师,否则你不需要担心任何事情。”


如果你没有找到满意的答案,这是一个更长和更技术的版本:


NDB集群中的一些机制需要数据节点之间的分布式协调。这些分布式算法和协议包括全局检查点,DDL(模式)更改和节点重新启动处理。为了使这种协调更简单,数据节点“选举”其中一个数字来充当领导者。 (这个节点曾经被称为“主”,但为了避免与MySQL复制中的主服务器混淆,该术语被删除。)没有用户面对的机制来影响此选择,这是完全自动的;自动化是NDB Cluster内部架构的关键部分。


当一个节点充当这些机制中的“领导者”时,它通常是活动的协调点,其他节点充当“追随者”,按照领导者的指示执行其活动的部分内容。如果充当领导者的节点失败,则其余节点选出新的领导者。由老领导协调的正在进行的任务可能要么失败,要么由新领导继续进行,这取决于所涉及的实际机制。


对于这些不同的机制和协议中的一些来说,有可能具有不同的领导者节点,但总的来说,为他们选择相同的领导者。在管理客户端中作为SHOW输出的领导者指示的节点在内部被称为DICT管理器(有关详细信息,请参阅NDB群集API开发人员指南中的DBDICT块),负责协调DDL和元数据活动。


NDB集群的设计方式使得领导者的选择在集群本身之外没有明显的影响。例如,当前领导者没有比ot更高的CPU或资源使用率

A.8:我可以使用哪些操作系统使用NDB群集?

NDB集群在大多数类Unix操作系统上受支持。 NDB群集在Microsoft Windows操作系统上的生产设置中也受支持。


有关在不同操作系统版本,操作系统分布和硬件平台上为NDB集群提供的支持级别的更多详细信息,请参阅http://www.mysql.com/support/supportedplatforms/cluster.html。


A.9:运行NDB集群的硬件要求是什么?


NDB群集应该在支持NDB的二进制文件可用的任何平台上运行。对于数据节点和API节点,更快的CPU和更多内存可能会提高性能,而64位CPU可能比32位处理器更有效。在用于数据节点的机器上必须有足够的内存来保存每个节点的数据库份额(有关更多信息,请参阅我需要多少内存?)。对于仅用于运行NDB集群管理服务器的计算机,要求很低;一个普通的台式个人电脑(或相当的)通常就足以完成这项任务。节点可以通过标准的TCP / IP网络和硬件进行通信。他们也可以使用高速SCI协议;然而,使用SCI需要特殊的网络硬件和软件(请参见第5.4节“与NDB群集使用高速互连”)。


A.10:使用NDB集群需要多少内存?是否有可能使用磁盘存储器?


NDB集群最初仅作为内存实现,但目前可用的所有版本也提供了将NDB集群存储在磁盘上的功能。有关更多信息,请参见第7.13节“NDB群集磁盘数据表”。


对于内存中的NDB表,可以使用以下公式来获得群集中每个数据节点需要多少内存的粗略估计值:


(SizeofDatabase×NumberOfReplicas×1.1)/ NumberOfDataNodes
要更精确地计算内存需求,需要为集群数据库中的每个表确定每行所需的存储空间(有关详细信息,请参阅数据类型存储要求),并将其乘以行数。您还必须记住对任何列索引进行解释如下:


为NDBCLUSTER表创建的每个主键或散列索引需要每个记录21-25个字节。这些索引使用IndexMemory。


使用DataMemory,每个有序索引需要每个记录10个字节的存储空间。


创建主键或唯一索引也会创建一个有序索引,除非该索引是使用USING HASH创建的。换一种说法:


簇表上的主键或唯一索引通常占用每条记录31到35个字节。


但是,如果使用USING HASH创建主键或唯一索引,则每个记录仅需要21到25个字节。


使用HASH对所有主键和唯一索引创建NDB簇表通常会导致表更新运行得更快 - 在某些情况下,比创建主表的USING HASH时未使用USING HASH的表的更新快20%至30%独特的钥匙。这是因为需要更少的内存(因为没有创建有序索引),并且必须使用更少的CPU(因为必须读取更少的索引并且可能更新)。但是,这也意味着可能使用范围扫描的查询必须通过其他方式来满足,这可能导致选择速度变慢。


在计算群集内存需求时,您可能会发现最近MySQL 5.7版本中提供的ndb_size.pl实用程序很有用。这个Perl脚本连接到当前(非集群)MySQL数据库,并创建一个报告,说明使用NDBCLUSTER存储引擎时数据库需要多少空间。有关更多信息,请参见第6.29节“ndb_size.pl - NDBCLUSTER大小需求估计器”。


请记住,每个NDB簇表必须具有主键,这一点尤为重要。如果没有定义,NDB存储引擎会自动创建一个主键;这个主键是在不使用HASH的情况下创建的。


您可以使用ndb_mgm客户端中的REPORT MEMORYUSAGE命令来确定在任何给定时间内有多少内存用于存储NDB集群数据和索引;有关更多信息,请参见第7.2节“NDB集群管理客户端中的命令”。此外,当80%的可用DataMemory或IndexMemory正在使用时,警告将写入群集日志,并且在使用率达到85%,90%等时再次发出警告。

A.11:我可以在NDB群集中使用哪些文件系统?网络文件系统或网络共享怎么样?


通常,主机操作系统本地的任何文件系统都应与NDB群集配合使用。如果您发现给定的文件系统在NDB群集中运行得特别好(或不那么好),我们邀请您在NDB群集论坛中讨论您的发现。


对于Windows,我们建议您将NDFS文件系统用于NDB群集,就像我们对标准MySQL所做的一样。我们不使用FAT或VFAT文件系统测试NDB群集。因此,我们不建议将它们用于MySQL或NDB群集。


NDB集群实施为无共享解决方案;这背后的想法是,单个硬件的故障不应该导致多个集群节点的故障,或者甚至可能导致整个集群的故障。为此,NDB群集不支持使用网络共享或网络文件系统。这也适用于共享存储设备,如SAN。


A.12:我可以在虚拟机内运行NDB群集节点吗(例如由VMWare,Parallels或Xen创建的节点)?


NDB群集支持在虚拟机中使用。我们目前支持并使用Oracle VM进行测试。


一些NDB集群用户已经使用其他虚拟化产品成功部署了NDB集群;在这种情况下,Oracle可以提供NDB群集支持,但是特定于虚拟环境的问题必须提交给该产品的供应商。


A.13:我正在尝试填充NDB群集数据库。加载过程提前终止,并收到如下错误消息:错误1114:表'my_cluster_table'已满为什么会发生这种情况?


原因很可能是您的安装程序不能为所有表数据和所有索引提供足够的RAM,包括NDB存储引擎所需的主键,并且在表定义不包含首要的关键。


同样值得注意的是,所有数据节点都应该具有相同数量的RAM,因为群集中的数据节点不能使用比可用于任何单个数据节点的最少量更多的内存。例如,如果有四台计算机托管集群数据节点,并且其中三台计算机具有3GB的RAM可用于存储集群数据,而剩余的数据节点只有1GB RAM,则每个数据节点最多可将1GB用于NDB集群数据,索引。


在某些情况下,即使在ndb_mgm -e“ALL REPORT MEMORYUSAGE”显示重要的免费DataMemory时,也有可能在MySQL客户端应用程序中出现表错误。您可以强制NDB为NDB群集表创建额外的分区,并因此通过使用CREATE TABLE的MAX_ROWS选项为散列索引提供更多内存。通常,将MAX_ROWS设置为您希望存储在表中的行数的两倍应该足够。


出于类似的原因,您有时也会遇到重载数据的节点上重新启动数据节点的问题。 MinFreePct参数可通过预留一部分(默认为5%)的DataMemory和IndexMemory用于重新启动来帮助解决此问题。该保留的内存不可用于存储NDB表或数据。


A.14:NDB群集使用TCP / IP。这是否意味着我可以在Internet上运行它,并且在远程位置有一个或多个节点?


在这样的条件下,集群不太可能可靠地运行,因为NDB集群的设计和实施假定它将在保证专用高速连接的条件下运行,例如在LAN设置中使用100 Mbps或千兆位以太网 - 最好是后者。我们既不测试也不保证它的性能,使用比这慢的任何东西。


另外,记住NDB群集中的节点之间的通信不安全是非常重要的。他们既没有加密也没有任何其他保护机制的保障。群集的最安全配置位于防火墙后的专用网络中,不能直接访问任何群集数据或外部管理节点。 (对于SQL节点,您应该采取与其他任何MySQL服务器实例相同的预防措施。)有关更多信息,请参见第7.12节“NDB集群安全问题”。

答15:我是否必须学习一种新的编程或查询语言才能使用NDB群集?


不需要。尽管一些专用命令用于管理和配置群集本身,但以下操作只需要标准(My)SQL语句:


创建,更改和删除表格


插入,更新和删除表格数据


创建,更改和删除主要索引和唯一索引


需要一些专门的配置参数和文件来设置NDB群集 - 请参见第5.3节“NDB群集配置文件”,了解有关这些的信息。


在NDB集群管理客户端(ndb_mgm)中使用一些简单的命令来执行启动和停止集群节点等任务。请参见第7.2节“NDB集群管理客户端中的命令”。


A.16:NDB集群支持哪些编程语言和API?


NDB集群支持与标准MySQL服务器相同的编程API和语言,包括ODBC,.Net,MySQL C API以及多种流行脚本语言(如PHP,Perl和Python)的驱动程序。使用这些API编写的NDB Cluster应用程序的行为与其他MySQL应用程序的行为相似;它们将SQL语句传输到MySQL服务器(在NDB群集的情况下是一个SQL节点),并接收包含数据行的响应。有关这些API的更多信息,请参阅连接器和API。


NDB集群还支持使用NDB API的应用程序编程,NDB API提供了一个低级别的C ++接口到NDB集群数据,而无需通过MySQL服务器。请参阅NDB API。另外,许多NDBCLUSTER管理功能由C语言MGM API公开;请参阅MGM API,了解更多信息。


NDB集群还支持使用ClusterJ进行Java应用程序编程,ClusterJ支持使用会话和事务的数据的域对象模型。有关更多信息,请参阅Java和NDB集群。


此外,NDB集群提供对memcached的支持,允许开发人员使用memcached接口访问存储在NDB集群中的数据;有关更多信息,请参阅NDB群集的ndbmemcache-Memcache API。


NDB Cluster 7.3和更高版本包括支持针对Node.js编写NoSQL应用程序的适配器,并将NDB Cluster作为数据存储。有关更多信息,请参阅适用于JavaScript的MySQL NoSQL连接器。


A.17:NDB Cluster是否包含任何管理工具?


NDB集群包含用于执行基本管理功能的命令行客户端。请参见第6.5节“ndb_mgm - NDB集群管理客户端”和第7.2节“NDB集群管理客户端中的命令”。


MySQL集群管理器也支持NDB集群,这是一种独立的产品,提供了高级命令行界面,可以自动执行许多NDB集群管理任务,例如滚动重启和配置更改。有关MySQL Cluster Manager的更多信息,请参阅MySQL™Cluster Manager 1.4.6用户手册。


作为NDB Cluster软件分发的一部分,NDB集群(版本7.3和更高版本)提供了一个基于浏览器的图形化自动安装程序,用于设置和部署NDB集群。有关更多信息,请参见第4.1节“NDB群集自动安装程序”。


A.18:如何在使用NDB群集时了解错误或警告消息的含义?


有两种方法可以做到这一点:


从mysql客户端中,在收到错误或警告条件通知后立即使用SHOW ERRORS或SHOW WARNINGS。


在系统shell提示符下,使用perror --ndb error_code。

A.19:NDB集群是否交易安全?支持什么隔离级别?


是。对于使用NDB存储引擎创建的表,支持事务。目前,NDB群集仅支持READ COMMITTED事务隔离级别。


A.20:NDB集群支持哪些存储引擎?


仅使用NDB存储引擎支持使用MySQL进行群集。也就是说,为了在NDB群集中的节点之间共享表格,必须使用ENGINE = NDB(或等效选项ENGINE = NDBCLUSTER)创建表格。

如果使用了INNODB的数据表,innodb原来存放在什么地方就在什么地方,和ndb没有任何关系。只是innodb的数据保存在执行的那个sql节点上而已。ndb的数据保存在后端的数据节点。

可以在与NDB集群一起使用的MySQL服务器上使用其他存储引擎(如InnoDB或MyISAM)创建表,但由于这些表不使用NDB,因此它们不参与集群;每个这样的表对于创建它的单个MySQL服务器实例来说都是严格本地的。


A.21:如果发生灾难性故障 - 例如,整个城市失去电力,我的UPS发生故障 - 我是否会丢失所有数据?


所有提交的事务都被记录。因此,尽管在灾难事件中可能会丢失一些数据,但这应该是相当有限的。通过最小化每次交易的操作次数可以进一步减少数据丢失。 (在任何情况下,对每笔交易执行大量操作不是一个好主意。)


A.22:是否可以在NDB集群中使用FULLTEXT索引?


FULLTEXT索引目前仅支持InnoDB和MyISAM存储引擎。有关更多信息,请参见全文搜索功能。


A.23:我可以在一台计算机上运行多个节点吗?


这是可能的,但并非总是可取的。运行集群的主要原因之一是提供冗余。为了获得这种冗余的全部好处,每个节点应该驻留在一台独立的机器上。如果您将多个节点放置在单台计算机上并且该计算机发生故障,则会丢失所有这些节点。因此,如果您在一台计算机上运行多个数据节点,那么设置它们非常重要,因为这台计算机的故障不会导致给定节点组中所有数据节点的丢失。


鉴于NDB集群可以在装有低成本(甚至是免费)操作系统的商用硬件上运行,因此额外的一两台机器的费用非常值得保护关键任务数据。还值得注意的是,运行管理节点的集群主机的要求很小。该任务可以使用300 MHz奔腾或等效CPU以及操作系统所需的足够RAM来完成,另外还需要少量的ndb_mgmd和ndb_mgm进程的开销。


在具有多个CPU,内核或两者的单个主机上运行多个群集数据节点是可以接受的。 NDB集群分布还提供了旨在用于此类系统的数据节点二进制文件的多线程版本。有关更多信息,请参见第6.3节“ndbmtd - NDB群集数据节点守护进程(多线程)”。


在某些情况下,也有可能在同一台机器上同时运行数据节点和SQL节点;这种安排的效果取决于许多因素,如内核数量和CPU数量以及数据节点和SQL节点进程可用的磁盘和内存数量,并且在规划时必须考虑这些因素一个配置。


A.24:我可以将数据节点添加到NDB群集而无需重新启动它吗?


可以将新数据节点添加到正在运行的NDB群集,而无需使群集脱机。有关更多信息,请参见第7.14节“在线添加NDB群集数据节点”。


对于其他类型的NDB群集节点,只需要滚动重启(请参见第7.5节“执行NDB群集的滚动重启”)。

A.25:使用NDB Cluster时应该注意哪些限制?


MySQL NDB集群7.3及更高版本中对NDB表的限制包括:


临时表格不受支持;使用ENGINE = NDB或ENGINE = NDBCLUSTER的CREATE TEMPORARY TABLE语句会失败并显示错误。


NDBCLUSTER表支持的唯一用户定义分区类型是KEY和LINEAR KEY。尝试使用任何其他分区类型创建NDB表失败,并显示错误。


FULLTEXT索引不受支持。


索引前缀不受支持。只有完整的列可能被编入索引。


不支持空间索引(尽管可以使用空间列)。请参阅空间数据类型。


对部分事务和部分回滚的支持与其他可以回滚单个语句的事务性存储引擎(如InnoDB)相当。


每个表允许的最大属性数为512.属性名不能超过31个字符。对于每个表,表和数据库名称的最大组合长度为122个字符。


表行的最大大小为14千字节,不包括BLOB值。


每个NDB表的行数没有限制。表大小的限制取决于许多因素,特别是每个数据节点可用的RAM数量。


有关NDB集群的完整限制列表,请参见第3.6节“NDB集群的已知限制”。另请参阅NDB群集7.3中已解决的以前的NDB群集问题。


A.26:NDB群集是否支持外键?


NDB Cluster 7.3和更高版本提供对外键约束的支持,与In​​noDB存储引擎中的相似;请参阅FOREIGN KEY约束,以获取更多详细信息以及使用FOREIGN KEY约束。需要外键支持的应用程序应使用NDB集群7.3,7.4,7.5或更高版本。


A.27:如何将现有的MySQL数据库导入NDB群集?


您可以像使用任何其他版本的MySQL一样将数据库导入NDB群集。除了本常见问题中其他地方提到的限制之外,唯一的其他特殊要求是要包含在群集中的任何表必须使用NDB存储引擎。这意味着必须使用ENGINE = NDB或ENGINE = NDBCLUSTER创建表格。


也可以使用一个或多个ALTER TABLE语句将使用其他存储引擎的现有表转换为NDBCLUSTER。但是,在进行转换之前,表格的定义必须与NDBCLUSTER存储引擎兼容。在MySQL 5.7中,还需要额外的解决方法;有关详细信息,请参见第3.6节“NDB群集的已知限制”。


A.28:NDB群集节点如何相互通信?


集群节点可以通过三种不同的传输机制进行通信:TCP / IP,SHM(共享内存)和SCI(可伸缩相关接口)。在可用的情况下,SHM在驻留在同一集群主机上的节点之间默认使用;然而,这被认为是实验性的。 SCI是一种高速(1吉比特每秒或更高)的高可用性协议,用于构建可扩展的多处理器系统;它需要特殊的硬件和驱动程序。有关将SCI用作NDB群集的传输机制的更多信息,请参见第5.4节“使用与NDB群集的高速互连”。


A.29:什么是仲裁员?


如果群集中的一个或多个数据节点发生故障,则可能并非所有群集数据节点都能够“看到”彼此。事实上,两组数据节点可能会在网络分区中彼此隔离,也称为“裂脑”场景。这种情况是不可取的,因为每一组数据节点都试图像整个集群那样工作。仲裁员需要在竞争的数据节点集之间做出决定。


当至少一个节点组中的所有数据节点都处于活动状态时,网络分区不是问题,因为没有任何一个集群子集可以单独形成功能集群。当没有单个节点组的所有节点都处于活动状态时,就会出现真正的问题,在这种情况下,网络分区(“裂脑”场景)就成为可能。那么仲裁员是必需的。所有集群节点都将仲裁器识别为同一节点,仲裁器通常是管理服务器;但是,可以将群集中的任何MySQL服务器配置为充当仲裁者。仲裁员接受第一组集群节点来联系它,并告知其余集合关闭。仲裁器选择由MySQL服务器和管理服务器节点的ArbitrationRank配置参数控制。您也可以使用ArbitrationRank配置参数来控制仲裁器选择过程。有关这些参数的更多信息,请参见第5.3.5节“定义NDB群集管理服务器”。


仲裁员的角色本身并不会对所指定的东道国以及因此而强加任何要求

A.30:NDB集群支持哪些数据类型?


NDB集群支持所有常见的MySQL数据类型,包括与MySQL空间扩展相关的数据类型;但是,NDB存储引擎不支持空间索引。 (空间索引仅受MyISAM支持;有关详细信息,请参阅空间数据类型。)此外,与NDB表一起使用时,索引方面也存在一些差异。


注意
NDB集群磁盘数据表(即使用TABLESPACE ... STORAGE DISK ENGINE = NDB或TABLESPACE ... STORAGE DISK ENGINE = NDBCLUSTER创建的表)只有固定宽度的行。这意味着(例如)包含VARCHAR(255)列的每个磁盘数据表记录需要255个字符的空间(正如用于该表的字符集和整理所需的),而不管其中存储的实际字符数。


有关这些问题的更多信息,请参见第3.6节“NDB群集的已知限制”。


A.31:如何启动和停止NDB群集?


有必要按照以下顺序分别启动集群中的每个节点:


使用ndb_mgmd命令启动管理节点。


您必须包含-f或--config-file选项以告知管理节点可以找到其配置文件的位置。


用ndbd命令启动每个数据节点。


每个数据节点必须使用-c或--ndb-connectionstring选项启动,以便数据节点知道如何连接到管理服务器。


使用您的首选启动脚本(如mysqld_safe)启动每个MySQL服务器(SQL节点)。


每个MySQL服务器必须以--ndbcluster和--ndb-connectingtring选项启动。这些选项会导致mysqld启用NDBCLUSTER存储引擎支持以及如何连接到管理服务器。


每个命令都必须从容纳受影响节点的机器上的系统shell运行。 (您不必实际在机器上出现 - 为此可以使用远程登录shell。)可以通过在容纳管理节点的计算机上启动NDB管理客户机ndb_mgm来验证群集是否正在运行, SHOW或ALL STATUS命令。


要关闭正在运行的集群,请在管理客户端中发出SHUTDOWN命令。或者,您可以在系统shell中输入以下命令:


shell> ndb_mgm -e“SHUTDOWN”
(本示例中的引号是可选的,因为-e选项后面的命令字符串中没有空格;另外,SHUTDOWN命令与其他管理客户端命令一样,不区分大小写。)


这些命令都会导致ndb_mgm,ndb_mgm和任何ndbd进程正常终止。作为SQL节点运行的MySQL服务器可以使用mysqladmin shutdown停止。


有关更多信息,请参见第7.2节“NDB集群管理客户端中的命令”和第4.7节“安全关闭并重新启动NDB集群”。


A.32:关闭NDB群集时NDB群集数据会发生什么情况?


集群数据节点在内存中保存的数据将写入磁盘,并在下次启动集群时重新加载到内存中。


A.33:为一个NDB集群配备多个管理节点是一个好主意吗?


它可以作为故障安全有用。只有一个管理节点在任何给定时间控制集群,但可以将一个管理节点配置为主节点,并且在主管理节点发生故障时可以配置一个或多个其他管理节点。


有关如何配置NDB集群管理节点的信息,请参见第5.3节“NDB集群配置文件”。

A.34:我可以在一个NDB群集中混合使用不同种类的硬件和操作系统吗?


是的,只要所有机器和操作系统具有相同的“字节序”(全部是大端或全部小端)。


也可以在不同节点上使用来自不同NDB集群版本的软件。但是,我们仅在滚动升级过程中支持此操作(请参见第7.5节“执行NDB群集的滚动重新启动”)。


A.35:我可以在单个主机上运行两个数据节点吗?两个SQL节点?


是的,这是可能的。在多数据节点的情况下,每个节点使用不同的数据目录是明智的(但不是必需的)。如果您想在一台机器上运行多个SQL节点,则每个mysqld实例都必须使用不同的TCP / IP端口。


在同一主机上同时运行数据节点和SQL节点是可能的,但您应该知道ndbd(或ndbmtd)和mysqld进程可能会争用内存。


A.36:我可以将主机名与NDB群集一起使用吗?


是的,可以为群集主机使用DNS和DHCP。但是,如果您的应用程序需要“五个九”可用性,则应使用固定(数字)IP地址,因为在依赖于DNS和DHCP等服务的群集主机之间进行通信会引入其他潜在的故障点。


A.37:NDB集群是否支持IPv6?


IPv6节点(MySQL服务器)之间的连接支持IPv6,但所有其他类型的NDB群集节点之间的连接必须使用IPv4。


实际上,这意味着您可以在NDB群集之间使用IPv6进行复制,但同一NDB群集中的节点之间的连接必须使用IPv4。有关更多信息,请参见部分8.3,“NDB群集复制中的已知问题”。


A.38:如何处理具有多个MySQL服务器的NDB群集中的MySQL用户?


MySQL用户帐户和权限通常不会在访问同一NDB群集的不同MySQL服务器之间自动传播。 MySQL NDB集群提供对分布式权限的支持,您可以按照文档中提供的步骤启用它们;有关更多信息,请参见第7.15节“NDB群集的分布式MySQL权限”。


A.39:如果其中一个SQL节点失败,我该如何继续发送查询?


MySQL NDB群集不提供SQL节点之间的任何类型的自动故障转移。您的应用程序必须准备好处理SQL节点的丢失并在它们之间进行故障切换。


A.40:如何备份和恢复NDB群集?


您可以在NDB管理客户端和ndb_restore程序中使用NDB集群本地备份和还原功能。请参见第7.3节“NDB群集的联机备份”和第6.24节“ndb_restore - 恢复NDB群集备份”。


你也可以在mysqldump和MySQL服务器中使用为此提供的传统功能。有关更多信息,请参阅mysqldump - 数据库备份程序。


关于连接

MySQL集群适合用于高速带宽的环境中,采用TCP/IP方式连接。它的性能跟主机间的连接速率有直接关系。集群中的最小速率要求是常规的100Mb以太网或者等同的网络。我们建议可能的话就采用G级网络。


关于内存

MySQL集群可以运行在任何启用NDB的平台上。显然,CPU越快,内存越大,对集群性能提升越明显,64位的CPU也可能比32位的处理器更快。每个作为数据节点的机器都必须有足够的内存来保存共享数据库。


在MySQL 5.0中,集群只能基于内存。意思是所有表的数据(包括索引)都保存在内存中。如果你的数据有1GB那么大,你想要复制一份到集群中的话,那么就必须要 2GB的内存才行(每份复制占用1GB),这是运行集群的计算机上相对其他操作系统额外要求的内存。


如果一个数据节点上的内存使用超出了可用的范围,则操作系统会使用交换内存来达到上限值DataMemory。不过这会导致性能严重下降,并且可能导致相应时间变慢。正是由于这个原因,我们不推荐在生产环境中使用磁盘交换空间。在任何情况下,只要达到DataMemory上限了,那么所有的操作请求(比如插入)都会失败。


在MySQL 5.1中实现了基于磁盘存储的集群,但是5.0中没有这个功能。对于包含主键哈希索引的有索引字段,必须仍保存在RAM中,但可以将所有其他字段保存在磁盘上。


需要特别注意: 每个MySQL集群表都需要主键。如果没有定义主键,则 NDB 存储引擎会自动创建一个所有的数据节点的内存大小都要一样,由于集群中任何数据节点都不能使用比其他数据节点最小内存还多的内存。换句话说,如果集群中有4台计算机,如果有3台计算机的内存都是3GB,而另外一台只有1GB,那么每个数据节点最多只能拿出1GB内存用于集群。


关于安全

MySQL集群的2个节点之间的通信是不安全的;它们没有经过任何保护机制加密或者防护。安全的集群是放在防火墙之内的私网中,在外界中无法直接访问数据和管理节点(SQL节点也要和其他MySQL服务器一样注意安全防护)。


关于存储引擎

MySQL集群只支持 NDB 存储引擎。也就是说,想要让一个表在集群节点中共享,就必须指定ENGINE=NDB(或 ENGINE=NDBCLUSTER 也一样)。


MySQL集群中也可以使用MyISAM或InnoDB存储引擎来创建数据表,但是那些非NDB的表不会存储在集群节点间共享;它们独立于创建的MySQL服务器或者实例中。


关于导入

你可以把各种版本的MySQL数据导入到集群中去。唯一的要求就是要导入的表必须是 NDB 存储引擎,也就是用 ENGINE=NDB 或 ENGINE=NDBCLUSTER方式创建的表。


关于数据类型

MySQL集群支持所有常用的数据类型,除了跟MySQL相关的空间扩展类型(详情请看 Chapter 16, Spatial Extensions)。另外,NDB表的索引也有些不同。


注意: MySQL集群表(即 NDB 或 NDBCLUSTER 类型表)只支持固定长度记录。这也意味着(举例)如果有一条记录包含有 VARCHAR(255) 字段,那么它就会需要用到255个字符的空间(和数据表使用的字符集和校验所要求的空间一样大),而不管实际存储的字符数。但是在MySQL 5.1中,只保存被记录实际占用的字段部分。


在NDB表中,数据库名称、表名称和属性名称不能与其他表处理程序中的一样长。属性名称将被截短至31个字符,截短后如果不是唯一的,将导致错误。数据库名称和表名的总最大长度为122个字符(也就是说,NDB簇表名的最大长度为122个字符减去该表所属的数据库的名称中的字符数)。


关于事务

NDB存储引擎的表都支持事务。在MySQL 5.0中,集群只支持READ COMMITTED隔离级别。


关于外键

NDB存储引擎不支持外键。跟MyISAM一样,它们都不支持。


关于FULLTEXT索引

在MySQL 5.0中,NDB存储引擎不支持FULLTEXT索引,其他除了MyISAM存储引擎外也不支持。


猜你喜欢

转载自blog.csdn.net/u014156250/article/details/80334858