MySQL 与 NoSQL——SQL 与 NoSQL 的融合

  • 孙立

2011 年 5 月 10 日

话题:Java.NETRubyMySQLDevOps语言 & 开发AI

写这一篇内容的原因是 MySQL5.6.2 突然推出了 memcached 的功能。NoSQL to InnoDB with Memcached的出现,可以看出 NoSQL 对关系数据库的确产生了巨大的影响,个人觉得这是一个非常大的进步,可以让开发人员更加方便的使用 NoSQL 和关系数据库。NoSQL 一般被认为性能高于关系数据库,那么直接在 InnoDB 之上提供 NoSQL 功能并和 MySQL 共存是否是一个更好的选择呢?

MySQL with HandlerSocket

去年在 twitter 上看到HandlerSocket的出现,并宣称性能是 Memcached 的两倍时,非常令人吃惊,居然可以达到 750000qps。接着 HandlerSocket 成为 NoSQL 领域谈论的焦点之一, 大量的人开始想要尝试,并做过一些自己的性能测试。 下图是 HandlerSocket 的结构图:

图 1 HandlerSocket 结构图(来源于官方)

HandlerSocket 的出现,给我们眼前一亮的感觉。原来 InnoDB 的性能已经足够好,并可以直接提供 NoSQL 的功能。最大的好处就是可以共享 MySQL 的功能,DBA 以前的经验一样可以用。但是有些小小的风险:

  • HandlerSocket 没有与 MySQL 一起发布版本,因此对于使用 MyISAM 引擎的用户是无缘的。不过现在 Percona-Server 已经集成了 HandlerSocket,可以非常方便的使用。
  • 目前大规模的成功案例并不多,国内也只有少部分公司在尝试,我知道的有飞信开放平台,据说还不错。
  • 官方给出的测试数据在应用场景上其实并不充分,至少测试的场景跟我们实际使用的场景相差很大。但是毫无疑问, HandlerSocket 的性能比直接使用 MySQL 肯定要高效得多。

InnoDB with Memcached

也许是因为 HandlerSocket 的火爆的冲击,也许是受 HandlerSocket 的启发,MySQL 开始关注 NoSQL 领域的应用,并在 MySQL5.6.2 版本增加了通过 Memcached 协议直接访问原生 Innodb API 的功能。

InnoDB with Memcached 是在提供 MySQL 服务的同一进程中提供 Memcached 服务 ,这与 HandlerSocket 的架构模式几乎是一样的。虽然目前 InnoDB with Memcached 还是预览版本,但是我个人更看好它,因为:

  • 它使用 Memcached 协议,并同时支持文本和二进制协议,在 client 的选择和成熟度上就要胜出许多;
  • 其支持的三种 cache 模式,不但可以省去开发中使用 Memcached 来缓存数据的麻烦,并且具有更好的可靠性和数据一致性;
  • 在应用程序中,可以使用高效的 memcached 协议来操作数据,同时也可以使用 sql 进行复杂的查询操作;

注意:目前通过 memcached 的更新操作不会记录到 binlog 中,未来的版本会支持。

图二 InnoDB with Memcached

Memcached and MySQL Cluster

显而易见,我们会想到 MySQL Cluster 结合 Memcached 是一个更好的组合,MySQL Cluster 提供了 99.999% 高可用性,并真正提供了去中心化的无缝高可扩展性。还有什么比这更人兴奋的呢。

MySQL 已经提供了这样的功能,源代码在这里。这里有一个 O'Reilly MySql Conference 大会的PPT 演示 ,你也可以看下这个功能开发者的一篇博客

图三 NDB with Memcached

MySQL Cluster 虽然具有高可靠性和无缝扩展的优势,但是对于复杂 SQL 查询的效率却不能令人满意。不过对于仅仅依赖于 key-value 查询和写入的海量数据存储需求,MySQL Cluster with Memcached 应该是个很好的选择。

总结

Memcached 协议由于其简单、协议轻量、存在大量的 client,所以提供兼容 Memcached 协议的产品比较占据先天的优势。

MySQL 提供 NoSQL 的功能,个人觉得并不是 MySQL 耐不住寂寞,而是的确在响应用户的需求。我前面的文章也说过,“NoSQL 只是一个概念,并不是一个数据库 产品,MySQL 也可以是 NoSQL”,现在也正应了这句话。NoSQL 从架构上就约束了开发者的架构和开发方式,从而提高扩展性和性能,而 NoSQL 和 MySQL 的融合,也同时提供了复杂查询功能。

虽然 MySQL 提供了 NoSQL 功能,如果你要尝试的话,你的数据库设计必须从 NoSQL 出发,然后再考虑 SQL 查询功能。

SQL 与 NoSQL 的融合的确会给开发者带来方便,比如最近很流行的 Mongodb,它吸引开发最大的点就是支持简单的关系查询。SQL 与 NoSQL 的融合可能是未来很多数据库产品的一个趋势。但是纯 NoSQL 数据库的优势也是显著的,就是他的简单、高效、易扩展。

参考链接:

Java.NETRubyMySQLDevOps语言 & 开发AI