MySQL Cluster集群学习笔记
计算在哪里??下面绿字
扩容NDBD :修改ndbd节点statefulset中的内存,修改mgmd节点config.ini中的DataMemory、IndexMemory两个内容各自占用ndbd节点内存60%和30%,循环重启mgmd,ndbd,mysqld节点。
增加NDBD节点是一个麻烦的事情,除了修改config.ini和滚动更新之外,还得手动创建分组,然后进行数据迁移。数据迁移过程很麻烦。具体看https://blog.****.net/chenxingzhen001/article/details/7598509
7.5.10版本的管理节点mgmd无法识别7.6.6版本的ndbd
如果没有提供节点ID,则数据节点的顺序将成为节点组的决定因素。无论是否进行显式分配,都可以在管理客户端的SHOW命令的输出中查看它们。
本文出自 “划舞鱼” 博客,请务必保留此出处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”启动。
当需要更好的性能时,可以使用NDB API来获取更好的处理速度
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查询性能一般
MysqlNDBcluster集群数据操作可能出现的问题
Ndbcluster 版本7.5:
1.非ndbcluster引擎的表集群不会同步;若要同步,需要使engine=ndbcluster;如果表有外键约束需先删除外键,同步成功后再建立外键【否则会报错】。
2.每一个ndbcluster表最好建立主键,否则Ndbcluster引擎会自动创建。
3.当集群死了,再重新启动时,所有表会变得不可写[只读]。??????
4.在对整个集群初始化时【--initial】,一定先备份,否则会清除数据文件.对策:在不关闭Sql节点的情况下,先--initial管理节点,然后一一initial数据节点,并不断核实数据是否存在。
5.当配置文件修改时,一定要对管理节点重新加载【--initial】
NDB同InnoDB的区别对比
Feature |
|
|
---|---|---|
MySQL Server Version |
5.7 |
5.7 |
|
|
|
NDB Cluster Version |
N/A |
|
Storage Limits |
64TB |
128TB (as of NDB 7.5.2) |
Foreign Keys |
Yes |
Yes |
Transactions事务 |
All standard types |
|
MVCC多版本管理 |
Yes |
No |
Data Compression数据压缩 |
Yes |
No (NDB checkpoint and backup files can be compressed)检查点和备用文件可以被压缩 |
Large Row Support (> 14K)大行支持 |
Supported for 只支持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 |
Property | Value |
---|---|
Version (or later) | NDB 7.5.0 |
Type or units | unsigned |
Default | 1186 |
Range | 0 - 64K |
Restart Type | S |
DataMemory和IndexMemory是[ndbd]参数,用于指定用于存储实际记录及其索引的内存段的大小。 在设置这些值时,了解如何使用DataMemory和IndexMemory非常重要,因为它们通常需要更新以反映集群的实际使用情况。
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 |
对于可变大小的表格属性,数据存储在从DataMemory分配的单独数据页面上。 可变长度记录使用固定大小的部分,额外开销4字节来引用可变长度部分。 可变大小的部分有2个字节的开销加上每个属性2个字节。最大记录大小是14000字节。
在NDB 7.6中,分配给DataMemory的资源用于存储所有数据和索引;任何配置为IndexMemory的内存会自动添加到DataMemory使用的内存中以形成公共资源池。
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 |
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提供的内存分配库。
多管理节点
下面给出一个双管理节点的配置
管理节点的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
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兆以太网或等效网络。我们建议您尽可能使用千兆以太网。
运行一个可行的集群至少需要三台计算机。但是,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%等时再次发出警告。
通常,主机操作系统本地的任何文件系统都应与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集群安全问题”。
不需要。尽管一些专用命令用于管理和配置群集本身,但以下操作只需要标准(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。
是。对于使用NDB存储引擎创建的表,支持事务。目前,NDB群集仅支持READ COMMITTED事务隔离级别。
A.20:NDB集群支持哪些存储引擎?
仅使用NDB存储引擎支持使用MySQL进行群集。也就是说,为了在NDB群集中的节点之间共享表格,必须使用ENGINE = NDB(或等效选项ENGINE = NDBCLUSTER)创建表格。
可以在与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群集的滚动重启”)。
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和更高版本提供对外键约束的支持,与InnoDB存储引擎中的相似;请参阅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存储引擎外也不支持。