Oracle专家谈MySQL Cluster如何支持200M的QPS

  Andrew Morgan是Oracle MySQL首席产品经理。 近日,他撰文介绍了MySQL Cluster如何支持200M的QPS。

MySQL Cluster简介

MySQL Cluster是 一个实时可扩展且符合ACID的事务型内存数据库。该数据库有高达99.999%的可用性和低廉的开源软件总拥有成本。在设计方面,它采用了一种分布式、 多主节点的架构,消除了单点故障,能够在商用硬件上横向扩展,并借助“自动分片(auto-sharding)”功能为通过SQL和NoSQL接口访问数 据的读/写密集型工作负载提供服务。

最 初,MySQL Cluster被设计成一个嵌入式的电信数据库,用于网内应用程序,需要具备运营商级的可用性和实时性能。之后,其功能随着新功能集的增加迅速增强,其应 用领域随之也扩展到了本地或云上的Web、移动和企业应用程序,包括:大规模OLTP、实时分析、电子商务(库存管理、购物车、支付处理、订单追踪)、在 线游戏、金融交易(欺诈检测)、移动与微支付、会话管理&缓存、流式推送、分析及推荐、内容管理与交付、通信与在线感知服务、订阅者/用户信息管 理与权益等。

MySQL Cluster体系结构

在MySQL Cluster内部,总共有三种类型的节点为应用程序提供服务。下面是一张MySQL Cluster体系结构简图,其中包含6个节点组,共12个“数据节点(Data Node)”:

数据节点是MySQL Cluster的主要节点。它们提供如下功能:内存内及基于磁盘的数据存储与管理、表的自动“分片(sharding)”及按用户定义分区、数据节点间数据同步复制、事务与数据检索、自动故障恢复、自我修复(故障解决后自动重新同步)。

表会自动跨数据节点分区,每个数据节点都是一个可以接受写操作的主节点。这使得写密集型工作负载很容易在节点之间分配,而且对于应用程序而言,这个过程是透明的。

MySQL Cluster采用了一种无资源共享的体系结构(比如不使用共享磁盘)存储和分发数据,并同步生成至少一个数据副本,如果某个数据节点出现故障,则总是有 另一个数据节点存储了同样的信息, 使得请求和事务可以继续而不被中断。任何在数据节点故障期间短暂中断(亚秒级)的事务都可以回滚并重新执行。

MySQL Cluster允许用户选择如何存储数据:全部在内存中或者部分在磁盘上(仅限于未索引数据)。内存内存储对于经常变化的数据(活动工作集)而言尤其有 用。存储在内存中的数据会定期地(本地检查点)写入本地磁盘,并在所有数据节点之间协调,这样,MySQL Cluster可以从系统完全失效(比如停电)的情况下恢复过来。基于磁盘的存储可以用于存储性能要求不那么严格的数据,其数据集大于可用内存。与其它大 多数数据库服务器一样,为了提高性能,MySQL Cluster使用页缓存将经常使用的、基于磁盘存储的数据缓存在数据节点的内存中。

应用节点提供从应用逻辑到数据节点的连接。应用程序可以使用SQL访问数据库,通过一台或多个MySQL服务器对存储在MySQL Cluster中的数据执行SQL接口的功能。当访问MySQL服务器时,可以使用任何一种标准的MySQL连接器, 这使用户有许多种访问技术可选择。NDB API是其中一个可选的方案。这是一个基于C++的高性能接口,可以提供额外控制、更好的实时行为及更高的吞吐能力。NDB API还提供了一个层,使NoSQL接口可以绕过SQL层直接访问MySQL Cluster,降低了延迟,提高了开发灵活性。现有接口包括Java、JPA、Memcached、JavaScript与Node.js、 HTTP/REST(借助Apache Module)。所有应用节点都可以访问所有数据节点的数据,所以,它们即使出现故障也不会导致服务中断,因为应用程序只要使用剩下的节点就可以了。

管理节点负责向MySQL Cluster中的所有节点发布集群配置信息以及节点管理。管理节点在启动、向集群加入节点及系统重新配置时使用。管理节点关闭和重启不会影响数据节点和应用节点的运行。在默认情况下,在遇到导致“集群分裂(split-brain)”或网络分区的网络故障时,管理节点还提供仲裁服务。

通过透明分片实现可扩展性

任 何表的行都可以透明地分成多个分区/片段。对于每一个片段,都会有一个单独的数据节点保存它所有的数据,并处理所有针对那些数据的读写操作。每个数据节点 还有一个伙伴节点,它们共同组成了一个节点组;伙伴节点存储了那个片段的第二个副本以及一个它自己原有的片段。MySQL Cluster使用同步两段提交协议确保事务提交的变化同时存储到两个数据节点。

MySQL Cluster默认使用表的主键作为“分片键(shard key)”,并对分片键执行MD5散列,从而选择数据应该存储的片段/分区。如果一个事务或查询需要访问多个数据节点的数据,那么其中一个数据节点将承担 事务协调器的角色,并将工作委派给其它所需的数据节点;结果会在提供给应用程序前合并。需要注意的是,事务或查询可以连接来自多个分片和多个表的数据,这 与传统的、实现了分片机制的NoSQL数据存储相比是一个巨大的优势。

当 单个节点就可以满足高强度查询/事务的数据操作需求时,就实现了最理想的(线性)扩展(因为这减少了数据节点间消息传递的网络延迟)。要做到这一点,应用 程序应该清楚地知道数据分布——这实际上就是说定义模式的人可以指定用作分片键的列。比如,上图中的表使用了由user-id和服务名组合而成的主键;如 果只使用user-id作为分片键,那么表中特定用户的所有行将会总是存储在同一个片段中。更为强大之处在于,如果其它表中也使用了同样的user-id 列,并将其设定为分片键,那么所有表中特定用户的数据都会存储在同一个片段中,那个用户的查询/事务就可以由单个数据节点处理。

利用NoSQL API最大限度地提高数据访问速度

MySQL Cluster提供了许多种数据访问方式;最常用的方法是SQL,但从下图可以看出,还有许多原生API可供应用程序从数据库直接读/写数据,避免了向 SQL转换并传递给MySQL服务器的低效和开发复杂度。目前,MySQL Cluster提供了面向C++、Java、JPA、JavaScript/Node.js、HTTP及Memcached协议的API。

基准测试:每秒2亿次查询

根据设计,MySQL Cluster用于处理以下两种工作负载:

  • OLTP(在线事务处理):内存优化型表可以提供次毫秒级的低延迟以及极高水平的OLTP工作负载并发能力,并且仍然可以提供良好的稳定性;此外,它们也能够用于基于磁盘存储的表。
  • 即时搜索:MySQL Cluster提高了执行表扫描时可以使用的并发数,极大地提高了未索引列的搜索速度。

话虽如此,MySQL Cluster旨在处理OLTP工作负载方面达到最佳,特别是在以并发方式发送大量查询/事务请求的情况下。为此,他们使用flexAsynch基准测试,测量更多数据节点加入集群后NoSQL访问性能的提升。

在 该基准测试中,每个数据节点运行在一个专用的56线程Intel E5-2697 v3(Haswell)机器上。上图显示了在数据节点从2增加到32(注意:MySQL Cluster目前最多支持48个数据节点)的过程中吞吐量的变化。从中可以看出,吞吐量呈线性增长,在32个数据节点时,达到了每秒2亿次NoSQL查询

读者可以登录MySQL Cluster基准测试页面,查看关于这次测试的最新结果及更详细的描述。

每秒2亿次查询的基准测试是在MySQL Cluster 7.4(最新的正式版本)上得出的,关于该版本的更多信息请查看这里

转自 http://www.infoq.com/cn/articles/oracle-expert-talk-how-mysql-cluster-support-200m-qps?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global

时间: 2024-10-02 04:28:03

Oracle专家谈MySQL Cluster如何支持200M的QPS的相关文章

mysql cluster 整理笔记

mysql cluster是基于ndb存储引擎. 整体分为三大部分,管理节点,存储节点,sql节点. 管理节点用于管理整个集群:存储节点及ndb节点,用来存储数据:sql节点则负责接收客户端的sql请求. mysql cluster 特性如下 性能和扩展能力 自动分片 数据库自动.透明地分布于低成本的商用服務器上,这样无需更改应用程序即可以向外扩展的方式增加读写查询的能量. 多主复制 每个数据节点都可以接受写操作.这项功能与自动分片功能相结合,提供了非常高的写操作扩展能力. 分布式跨分片 JOI

浅谈mysql主从复制的高可用解决方案

1.熟悉几个组件(部分摘自网络)1.1.drbd     —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID",开源软件,由 LINBIT 公司开发.DRBD 实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中.他是有内核 模块和相关程序而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID的功能.也就是说当你将数据写入本地的DRBD设备上的文件系统 时, 数据会同时被发送到网

从Oracle迁移到MySQL的各种坑及自救方案

当企业内部使用的数据库种类繁杂时,或者有需求更换数据库种类时,都可能会做很多数据迁移的工作.有些迁移很简单,有些迁移可能就会很复杂,大家有没有考虑过为了顺利完成复杂的数据库迁移任务,都需要考虑并解决哪些问题呢? 在以前的工作中,我迁移过Oracle到Informix.Oracle和SQLServer.Oracle到MySQL. 在目前的公司又因为去O的关系,做了大量的迁移工作,栽了不少坑,所以和大家交流一下在迁移的过程中的一些实践. 分享大纲: 去O前的准备与考虑 确定目标数据库 表和数据对象的

浅谈mysql

关于数据库其实我们可以简单的理解为存储货物的一个厂库,里面分别是按照一定的分类存放的物品,然后人们有时会从厂库中拿走或存储一些物品,有时也会更改或增加一些分类 这些物品都分门别类的存放在厂库中,方便人们的查询和存储. MySQL是一个关系型数据库管理系统,开发者为瑞典MySQL AB公司.目前MySQL被广泛地应用在互联网行业.由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多互联网公司选择了MySQL作为后端数据库.2008年MySQL被Sun公司收购,2010年甲骨文成功收购

再谈MySQL全库备份

再谈MySQL全库备份 简介 Part1:写在最前 在很早之前,我写过一个MySQL生产库全库备份脚本,今天有同事问我是不是要再加一个-R参数来备份存储过程,理由的话是由于mysqldump --help中 关于存储过程的默认备份是false. routines                          FALSE MySQL生产库全库备份脚本 http://suifu.blog.51cto.com/9167728/1758022 实战 Part1:写在最前 我备份一般就三个参数 --s

MySQL Cluster(MySQL 集群) 初试(转)

作/译者:叶金荣(imysql#imysql.com>),来源:http://imysql.com,欢迎转载. 作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究. MySQL Cluster 是MySQL适合于分布式计算环境的高实用.高冗余版本.它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器.在MyQL 5.0及以上的二进制版本中.以及与最新的Linux版本兼容的

mysql cluster (mysql 集群)安装配置方案(转)

一.准备 1.准备服务器 计划建立有5个节点的MySQL CLuster体系,需要用到5台服务器,但是我们做实验时没有这么多机器,可以只用2台,我就是一台本机,一台虚拟机搭建了有5个节点的MySQL CLuster体系,将一个SQL节点一个数据节点一个SQL节点放在了一台服务器上(192.168.1.252),将另一个SQL节点和一个数据节点放在了另外一台服务器上(192.168.1.52). 节点配置说明 节点 对应的IP和端口 管理节点(1个) 192.168.1.252 SQL节点 (2个

运维角度浅谈MySQL数据库优化

一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影响的因素很多,比如慢查询.低效的查询语句.没有适当建立索引.数据库堵塞(死锁)等.当然,有测试工程师的团队

浅谈MySQL数据库优化

一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影响的因素很多,比如慢查询.低效的查询语句.没有适当建立索引.数据库堵塞(死锁)等.当然,有测试工程师的团队