技术开发 频道

NoSQL:单服务器如何应付每秒75万次查询

  HandlerSocket的特点和优势

  HandlerSocket有许多特点和优势,其中有一些是对我们真正有益的。

  1、支持大量的查询模式

  HandlerSocket支持主键/唯一性查询,非唯一性索引查询,范围扫描,LIMIT和INSERT/UPDATE/DELETE,不支持未使用任何索引的操作,multi_get操作(类似于in(1,2,3)) - 通过单一网络往返获取多行数据 – 也是支持的。

  2、可以处理大量并发连接

  HandlerSocket连接是轻量级的,因为HandlerSocket采用了epoll()和工作线程/线程池架构,MySQL内部线程的数量是有限的(可以由my.cnf中的handlersocket_threads参数控制),因此你可以建立上千或上万的网络连接,稳定性不会受到任何影响(消耗太多的内存,造成巨大的互斥竞争等,如bug#26590,bug#33948,bug#49169)。

  3、极好的性能

  HandlerSocket相对于其它NoSQL阵容性能表现一点也不逊色,事实上,我还没有看到哪个NoSQL产品在一台普通服务器上可以执行750000+次查询。

  HandlerSocket不仅消除了SQL相关的函数调用,也优化了网络/并发相关的问题。

  ***更小的网络数据包

  HandlerSocket协议和传统MySQL协议相比更简单,更小,因此整个网络的流量也更小。

  ***运行有限的MySQL内部线程数

  参考上面的内容。

  ***客户端请求分组

  当大量的并发请求抵达HandlerSocket时,每个工作线程尽可能多地聚集请求,然后同时执行聚集起来的请求和返回结果,这样可以大大地提高性能,只是要牺牲一点响应时间,例如,你可以得到以下好处,如果有人感兴趣,我会在今后的文章中对它们加以深入的解释。

  减少fsync()调用的次数

  减少复制延迟

  4、没有重复的缓存

  当你使用Memcached缓存MySQL/InnoDB记录时,在Memcached和InnoDB缓冲池中均缓存了这些记录,因此效率非常低(内存仍然很贵!),由于HandlerSocket插件访问InnoDB存储引擎,记录可以缓存在InnoDB缓冲池中,这样其它SQL语句就可以重复使用它。

  5、没有数据不一致的现象

  由于数据只存储在一个地方(InnoDB内),不需要在Memcached和MySQL之间检查数据一致性。

  6、崩溃安全

  后端存储是InnoDB,它是事务性和崩溃安全的,即使你设置innodb-flush-log-at-trx-commit!=1,在服务器崩溃时也只会丢掉<1秒内的数据。

  7、可以从MySQL客户端使用SQL

  在许多情况下,人们仍然希望使用SQL(如生产摘要报告),这就是为什么我们不能使用嵌入式InnoDB的原因,大多数NoSQL产品都不支持SQL接口,HandlerSocket仅仅是一个MySQL插件,你可以从MySQL客户端发送SQL语句,当你需要高吞吐量时最好使用HandlerSocket协议。

  8、MySQL所有操作都将受益

  因为HandlerSocket在MySQL内部运行,因此所有MySQL操作,如SQL,在线备份,复制,通过Nagios/EnterpriseMonitor监控等都是支持的,HandlerSocket获得可以通过普通的MySQL命令监控,如SHOW GLOBAL STAUTS,SHOW ENGINE INNODB STATUS和SHOW PROCESSLIST等。

  9、不需要修改/重建MySQL

  因为HandlerSocket是一个插件,它支持MySQL社区版和企业服务器版,无需对MySQL做出任何修改就可以使用。

  10、独立于存储引擎

  虽然我们只测试了5.1和5.5 InnoDB插件,但HandlerSocket可以和任何存储引擎交互。

  注意事项和限制

  1、需要学习HandlerSocket API

  尽管它很容易使用,但你仍然需要学习如何与HandlerSocket交互,我们提供了C++ API和Perl绑定。

  2、没有安全功能

  和其它NoSQL数据库类似,HandlerSocket不支持安全功能,HandlerSocket的工作线程以系统用户权限运行,因此应用程序可以访问通过HandlerSocket协议的所有表,当然,你可以象其它NoSQL产品一样使用防火墙过滤数据包。

  3、对于HDD绑定工作负载没有优势

  对于HDD I/O绑定工作负载,数据库每秒无法执行数千次查询,通常只有1-10%的CPU利用率,在这种情况下,SQL执行层不会成为瓶颈,因此使用HandlerSocket没有什么优势,我们只在数据完全装载到内存的服务器上使用HandlerSocket。

  DeNA在生产环境中使用HandlerSocket

  我们已经在生产环境中使用了HandlerSocket插件,效果是很明显的,最终我们减少了许多Memcached和MySQL从属服务器,整个网络流量也减少了,目前我们还没有发现任何性能问题(如响应时间慢,延迟等)。

  我认为MySQL完全被NoSQL/数据库社区低估了,MySQL的历史悠久,我的前同事们也在不断改进它,从NDBAPI可以看出MySQL有成为NoSQL的潜力,存储引擎API和守护进程接口是完全独立的,使得Akira和DeNA开发HandlerSocket成为可能,作为MySQL一名前员工和对MySQL长期的了解,我想看到MySQL变得更好,更受欢迎,不只作为一个RDBMS,也应该成为NoSQL阵营中的一员。

  HandlerSocket插件是开源的,可以免费使用,欢迎你下载和使用,并希望听到你的反馈。

0
相关文章