MySQL集群 -- NDB Cluster

MySQL集群 -- NDB Cluster

 

MySQL集群的表使用的引擎是ndbcluster,简称ndb。

它的意思是: "网络数据库".NDB(也叫NDB Cluster或者NDBCLUSTER),使用它才能让MySQL支持集群。

 

  • 要想获得MySQL Cluster 的功能,必须安装 mysql-server 和 mysql-max RPM
  • 内存数据库
  • 由多个节点组成,每个节点有对应的内存和磁盘,没有单点故障的问题
  • MySQL Cluster 能够使用多种故障切换和负载平衡选项配置NDB存储引擎

 


 

 

 

 

以前有了解过MySQL主从,现在的集群必须和主从区分开来,两者的区别是:

 

  • 在复制系统中,一个MySQL主服务器会更新一个或多个从服务器.事务是顺序地提交的,因此一个慢事务就可能导致从服务器比主服务器落后一段时间.这也意 味着,如果主服务器出错失败了,那么从服务器可能会缺少记录最后的那一小部分事务日志.如果使用的是事务安全存储引擎的话,例如InnoDB, 那么事务日志则会完全记录到从服务器上去或者完全不记录,但是复制不能保证主和从服务器上的数据总是保持一致性.
  • 在MySQL集群中,所有的数据总是保持 同步,在任何数据节点上提交的事务都同步到所有其他的数据节点上了.如果有一个数据节点失败了,其他正常的数据节点照样能保持数据的一致性.

 

简单讲,就是主从会导致从数据库的事务慢一些,在事务出错时,从服务器就不会执行,导致主服务器有错误日志,从服务器没有,这样日志数据就不一致(对数据的及时性、完整性进行了优化)。

 

 

 

集群的建议

 

      集群最少要求有3台计算机.不过我们建议最好是4台;有2台分别运行管理节点和SQL节点,另外2台作为数据节点.采取2台数据节点的目的是提高数据的冗余度,管理节点放在一个独立的主机上是为了能够保证在万一有一台数据节点失败的情况下提供仲裁服务。

 

 

 

集群中各个节点的作用

 

      MySQL集群既有物理也有逻辑组织,每台计算机都作为物理基础元素.集群中的逻辑基础元素称为 节点,集群中的每个逻辑和功能基础元素也称为 集群主机.共有3中节点类型,每个在集群中都有对应的不同角色,分别如下:



 

  • 管理节点(MGM node): 提供整个集群的管理服务,包括启动,关闭,备份,数据配置等.管理节点是由 ndb_mgmd 应用程序来提供的;管理节点的客户端用 ndb_mgm。
  • 数据节点: 存储和复制数据,系统会尽量将数据放在内存中,由进程(ndbd 来处理的。
  • SQL 节点: 这是用来访问数据节点的,一个SQL节点就是一个使用NDB引擎的mysql server进程(mysqld),用于供外部应用提供集群数据的访问入口。

启动节点

 

需要按以下顺序分别启动集群中的各个节点:

 

  • 用 ndb_mgmd 命令启动管理节点.
  • 用 ndbd 分别启动每个数据节点.
  • 用 mysqld_safe --user=mysql & 命令启动每个SQL节点.

上面的命令都需要在系统的shell下运行(在服务器上执行或通过终端都可以).可以在管理节点上的 ndb_mgm 客户端工具中执行 SHOW 或 ALL STATUS 命令来确认集群是否在运行状态。

 

 

停止节点

 

在 MGM 客户端中运行 SHUTDOWN 命令即可关闭运行中的集群.另外,也可以在管理节点主机中执行一下命令来关闭:

 

shell> ndb_mgm -e "SHUTDOWN"

注意,括号中的内容可以是别的,并且 SHUTDOWN 可以不区分大小写.

 

这些命令的任何一个都能平和地关闭 ndb_mgm, ndb_mgmd(笔误?), ndbd 中的任何进程.运行MySQL集群的SQL节点服务器则通过 mysqladmin shutdown 来关闭.

 

 

 

 

缺点

 

      NDB的事务隔离级别只支持Read Committed,而Innodb支持所有的事务隔离级别,默认使用Repeatable Read。

 

 

 

 

使用集群时遇到的问题

 

ERROR 1114: The table 'my_cluster_table' is full

 

原因

很有可能是因为你设置的内存不足以装下所有的数据表及其索引,包括 NDB 存储引擎中所需的主键以及如果没有定义主键时自动创建的索引.

 

所有的数据节点的内存大小都要一样,由于集群中任何数据节点都不能使用比其他数据节点最小内存还多的内存.换句话说,如果集群中有4台计算机,如果有3台计算机的内存都是3GB,而另外一台只有1GB,那么每个数据节点最多只能拿出1GB内存用于集群。

 

 

 

MySQL集群的局限性

 

MySQL 5.0中的 NDB 表存在以下局限性:

 

  • 不支持临时表;执行 CREATE TEMPORARY TABLE 语句时如果指定 ENGINE=NDB 或者ENGINE=NDBCLUSTER 参数就会报错.
  • 不支持 FULLTEXT 索引以及前缀索引.只能对整个字段进行索引.
  • 不支持空间数据类型.详情请看 Chapter 16, Spatial Extensions.
  • 只支持完全的回滚事务.不支持部分回滚和回滚到保存点也不支持.
  • 一个表最大的属性数为128,并且每个属性名不能超过31个字符.对每个表来说,数据库和表明的联合长度最大是122个字符.
  • 表中一条记录最大值为8KB,不包含 BLOB 的值.表的大小取决于各种制约因素,尤其是每个数据节点最大的可用内存.
  • NDB 存储引擎不支持外键.跟 MyISAM 一样,它们都不支持.

 

 

 

MySQL集群数据类型

 

MySQL集群支持所有常用的数据类型,除了跟MySQL相关的空间扩展类型

 

另外,NDB

表的索引也有些不同. 注意: MySQL集群表(即 NDB 或 NDBCLUSTER 类型表)只支持固定长度记录.这也意味着(举例)如果有一条记录包含有 VARCHAR(255) 字段,那么它就会需要用到255个字符的空间(和数据表使用的字符集和校验所要求的空间一样大),而不管实际存储的字符数.这个问题在未来的发行版中会得到解决.

 

 

 

集群停止后,数据会怎样?

 

本来保存在内存中的集群数据都会写到磁盘中,下次集群启动的时候就会重新载入到内存中.

 

 

 

参考:

http://imysql.cn/node/161

https://www.2cto.com/database/201504/387166.html