MySQL NDB Cluster 集群简介

简介

MySQL Cluster 是一个实时、高度可扩展且符合 ACID 要求的事务型数据库,既可以实现 99.999% 的可用性,又具备开源产品低 TCO 的优势。MySQL Cluster 采用一种分布式架构,无单点故障。它可在商业硬件上横向扩展,并且可通过自动分片来同时支持读取和写入密集型负载,支持通过 SQL 和 NoSQL API 访问。

MySQL Cluster 的实时设计提供可预测的毫秒级响应,每秒可处理数百万次操作。它支持内存中和基于磁盘的数据、自动数据分区(分片)以及负载平衡,无需停机即可在正在运行的集群中添加节点,因此可实现线性的数据库扩展能力,能够处理最变幻莫测的 Web、移动和电信负载。

通过自动分片来扩展读取和写入操作


MySQL Cluster 部署为一个双活、多主机的数据库,确保能对任何节点进行更新,且更新将在集群其他节点上即时生效,没有任何复制延迟。

通过在低成本的商用数据节点池中对表进行自动分片,数据库将具备横向扩展能力,可通过 SQL 进行访问或直接通过 NoSQLAPI 访问。用户可以联机添加新节点,立即扩展数据库容量和性能,甚至可支持最重的写入负载。通过在数据库内部对表进行自动分片,MySQL Cluster 不必在应用层处理分片,极大地简化了开发和维护工作。分片对应用程序完全透明,这样应用程序便可连接至集群中任何节点,并且查询操作会自动访问所需的正确片区来满足查询需要或提交事务。

与其他分布式数据库不同,MySQL Cluster 既符合 ACID 要求又具备 JOIN 操作的灵活性,并且可在不同节点、不同分片、甚至不同数据中心的表之间维持参照完整性。

调适性查询本地化可将 JOIN 操作降位到数据节点,从而实现高吞吐量和低延迟。这样一来,用户便可在数据库上执行复杂的查询,这让 MySQL Cluster 能够为那些需要对动态数据集做实时分析以及处理高吞吐量 OLTP 操作的用例提供支持。

通过内存中优化,MySQL Cluster 可确保响应速度满足对延迟敏感的应用程序的要求。MySQL Cluster 还通过将事务日志异步写入到磁盘中来限制磁盘 I/O 瓶颈。

通过 99.999% 的可用性来确保持续运营

MySQL Cluster 可实现 99.999% 的可用性,从而消除了计划内和计划外停机时间。它采用分布式、无共享架构,可通过同步数据复制使事务在节点组中自动传播,从而确保读取和写入操作的一致性,同时还支持无丢失故障切换。


亚秒级故障切换和自我修复式恢复

MySQL Cluster 可即时检测到任何故障,并通过故障切换自动将控制权转移到集群中的其他节点,不会因此而中断提供给客户端的服务。节点会自动恢复并随时与集群中的其他节点重新同步。自我修复功能对应用程序是完全透明的,消除了管理开销。

联机操作:扩展、重新分区和维护

MySQL Cluster 支持将节点联机添加到正在运行的集群中,重新分片、备份、修补和升级底层硬件和软件基础架构。MySQLCluster 设计为按需扩展,可让服务从小规模开始然后按需快速扩展,同时可按需重新供应资源。

此外,MySQL Cluster 还支持联机更新到当前的数据库结构,用户可通过增加新的列和表以及增删索引和外键约束来快速扩展新应用,同时可持续处理读取和写入请求,不会影响响应的速度。

跨数据中心部署:覆盖全球用户

当今的服务是全球性的,因此开发人员希望其数据库能跨区域扩展,同时确保数据中心在发生故障后能快速恢复。MySQLCluster 通过地理复制将数据库分布到远程数据中心,除了提供灾难恢复之外,还可以减少网络延迟的影响。地理复制中内置的冲突检测机制可让每个数据中心中的各 MySQL Cluster 均处于完全**状态,解决了全球各地用户同时更新的问题,同时避免闲置的硬件。

MySQL Cluster 还支持将同一集群的数据节点分布到不同的数据中心。用户可以在不同站点间同步复制更新,并在发生故障时自动切换。

SQL 和 NoSQL 接口为开发人员带来灵活性

MySQL Cluster 提供了多个用于数据访问的 API,每个 API 都可以同时访问同一数据集,从而为开发人员提供了最大的灵活性。 使用 SQL API 进行关系查询;

 使用 JavaScript、Memcached 或 REST/HTTP API 提供键/值和键/物种 Web 服务;

 使用 ORM ClusterJ 和 JPA API 实现企业应用程序;

 使用 C++ NDB API 提供实时服务。

使用 Memcached API 的无结构数据结构

为了在新的 Web 和移动服务领域中促成快速创新,开发人员不必事先定义数据库结构。

使用适用于 MySQL Cluster 的 Memcached API 时,每个键值都将以键值对的形式写入同一表中,每个键值对存储在表的一行中,这样便可实现无结构数据存储。或者,开发人员可以定义一个键字首,这样每个键值对都将与特定表中的预先定义的字段相关联。

降低总拥有成本

MySQL Cluster 无需额外的基础设施(如共享存储),可在各种商用硬体和操作系统上运行。作为一个开源解决方案,MySQLCluster 是一个极其经济高效的数据库,适合要求卓越的 Web 扩展能力和 99.999% 可用性的服务。

久经考验的部署

Alcatel-Lucent、Big Fish Games、PayPal、Shopatron、Telenor、美国海军和 Zillow 等组织都在极其苛刻的 Web、云和移动应用环境中部署了 MySQL Cluster。

架构简介

MySQL集群是一种在无共享架构(SNA,Share Nothing Architecture)系统里应用内存数据库集群的技术。这种无共享的架构可以使得系统使用低廉的硬件获取高的可扩展性。

MySQL集群是一种分布式设计,目标是要达到没有任何单点故障点。因此,任何组成部分都应该拥有自己的内存和磁盘。任何共享存储方案如网络共享,网络文件系统和SAN设备是不推荐或不支持的。通过这种冗余设计,MySQL声称数据的可用度可以达到99.999%。

实际上,MySQL集群是把一个叫做NDB的内存集群存储引擎集成与标准的MySQL服务器集成。它包含一组计算机,每个都跑一个或者多个进程,这可能包括一个MySQL服务器,一个数据节点,一个管理服务器和一个专有的一个数据访问程序。它们之间的关系如下图所示:

MySQL NDB Cluster 集群简介

存储引擎

MySQL Cluster 使用了一个专用的基于内存的存储引擎(NDB引擎),这样做的好处是速度快, 没有磁盘I/O的瓶颈,但是由于是基于内存的,所以数据库的规模受系统总内存的限制,如果运行NDB的MySQL服务器一定要内存够大,比如4G, 8G, 甚至16G。NDB引擎是分布式的,它可以配置在多台服务器上来实现数据的可靠性和扩展性,理论上 通过配置2台NDB的存储节点就能实现整个数据库集群的冗余性和解决单点故障问题。

该存储引擎有下列缺点

1、基于内存,数据库的规模受集群总内存的大小限制

2、基于内存,断电后数据可能会有数据丢失,这点还需要通过测试验证。

3、多个节点通过网络实现通讯和数据同步、查询等操作,因此整体性受网络速度影响,

4、因此速度也比较慢

当然也有它的优点

1、多个节点之间可以分布在不同的地理位置,因此也是一个实现分布式数据库的方案。

2、扩展性很好,增加节点即可实现数据库集群的扩展。

3、冗余性很好,多个节点上都有完整的数据库数据,因此任何一个节点宕机都不会造成服务中断。

4、实现高可用性的成本比较低,不象传统的高可用方案一样需要共享的存储设备和专用的软件才能实现,NDB 只要有足够的内存就能实现

 

体系结构

MySQL Cluster 由3个不同功能的服务构成,每个服务由一个专用的守护进程提供,一项 服务也叫做一个节点,下面来介绍每个节点的功能。

The management (MGM) node:

管理节点(MGM节点),用来实现整个集群的管理,理论上一般只启动一个,而且宕机也不影响 cluster 的服务,这个进程只在cluster 启动以及节点加入集群时起作用, 所以这个节点不是很需要冗余,理论上通过一台服务器提供服务就可以了。

通过 ndb_mgmd 命令启动,使用 config.ini 配置文件

 

The storage or database (DB) node:

数据节点(NDB节点),用来存储数据,可以和管理节点(MGM)、 用户端节点(API)处在不同的机器上,也可以在同一个机器上面,集群中至少要有一个DB节点,2个以上 时就能实现集群的高可用保证,DB节点增加时,集群的处理速度会变慢。

通过 ndbd 命令启动,第一次创建好cluster DB 节点时,需要使用 –init参数初始化。

例如: bin/ndbd –ndb-connectstring=ndb_mgmd.mysqlcluster.net –initial

 

The client (API) node:

SQL节点(MySqld节点),通过他实现 Cluster DB 的访问,这个节点也就是普通的 mysqld 进程, 需要在配置文件中配置ndbcluster 指令打开 NDB Cluster storage engine 存储引擎,增加 API 节点会提高整个集群的并发访问速度和整体的吞吐量,该节点 可以部署在Web应用服务器上,也可以部署在专用的服务器上,也开以和DB部署在 同一台服务器上。

 

通过 mysqld_safe 命令启动,

这3类节点可以分布在不同的主机上,比如 DB 可以是多台专用的服务器,也可以 每个DB都有一个API,当然也可以把API分布在Web前端的服务器上去,通常来说, API越多cluster的性能会越好。