技术开发 频道

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

  你听说过NDBAPI吗?

  在MySQL的SQL层有什么好的解决办法可以减少CPU资源争用吗?如果你使用的是MySQL集群,NDBAPI可能是最好的解决方案,我在MySQL/Sun/Oracle担任顾问时,我看到许多客户对SQL节点+NDB的性能表现很失望,当使用NDBAPI客户端性能提高N倍后,他们高兴极了,你可以在MySQL集群中同时使用NDBAPI和SQL,建议频繁访问模式使用NDBAPI,即席查询或非频繁模式使用SQL+MySQL+NDB。

  这正是我们想要的,我们希望更快速地访问API,我们也希望对即席查询或复杂查询使用SQL,但DeNA使用的是InnoDB,和许多其它Web服务一样,切换到NDB不是小事,嵌入式InnoDB不支持SQL也不没有网络接口,因此它不适合我们。

  HandlerSocket插件,一个懂NoSQL网络协议的MySQL插件

  我们认为最好的办法是在MySQL内部实现一个NoSQL网络服务器,也就是说,写一个网络服务器作为MySQL插件(守护进程插件)监听指定端口,接受NoSQL协议/API,然后使用MySQL内部存储引擎API直接访问InnoDB。这个方法和NDBAPI类似,但它可以和InnoDB交互,这个概念最初是由Kazuho Oku去年在Cybozu实验室提出并创建了原型,他编写了使用memcached协议的MyCached UDF,我的同事Akira Higuchi实现了另一个插件:HandlerSocket,下图显示了HandlerSocket可以做的事情。

你听说过NDBAPI吗?

  图 1 Hanldersocket是什么?

  Hanldersocket是一个MySQL守护进程插件,它让应用程序可以将MySQL当NoSQL使,Hanldersocket的主要目的是与存储引擎,如InnoDB交互,而不需要SQL相关的开销。访问MySQL表时,Hanldersocket仍然需要打开和关闭表,但不是每次访问都要求打开和关闭,因此减少了互斥争夺,极大地提高了系统性能,当流量变小时,Hanldersocket会关闭表,因此它永远不会阻止管理命令(DDL)。

  它和使用MySQL+Memcached有什么不同?比较图1和图2,我想你会发现很多差异的,图2显示了典型的Memcached和MySQL用法,Memcached用于缓存数据库记录,这是因为Memcached的get操作比MySQL的内存中/磁盘上的主键查询要快很多,如果HandlerSocket的查询速度和Memcached一样快,我们就不用Memcached缓存记录了。

你听说过NDBAPI吗?

  图 2 MySQL+Memcached的常见架构模式

  使用HandlerSocket

  举一个例子,假设有一个“user”表,我们需要通过user_id获取用户信息。

CREATE TABLE user
(  
user_id
INT UNSIGNED PRIMARY KEY,    
user_name VARCHAR(
50),    
user_email VARCHAR(
255),    
created DATETIME  
)
ENGINE
=InnoDB;

 

  在MySQL中,可以通过SELECT语句获取用户信息。

mysql> SELECT user_name, user_email, created FROM user WHERE user_id=101;
+---------------+-----------------------+---------------------+  
| user_name     | user_email            | created            
|  
+---------------+-----------------------+---------------------+  
| Yukari Takeba | yukari.takeba@dena.jp |
2010-02-03 11:22:33
|  
+---------------+-----------------------+---------------------+  
1 row in set (0.00 sec)

 

  下面我们来看看如何使用HandlerSocket完成同样的事情。

  首先需要安装HandlerSocket,具体安装步骤请参考这里,基本步骤如下:

  1、从这里下载HandlerSocket;

  2、生成HandlerSocket(客户端和服务器端);

./configure --with-mysql-source=... --with-mysql-bindir=... ; make; make install

 

  3、安装HandlerSocket

mysql> INSTALL PLUGIN 'HandlerSocket' soname 'HandlerSocket.so';

 

  因为HandlerSocket是MySQL插件,你可以象使用其它插件,如InnoDB、Q4M和Spider插件那样使用它,也就是说,你不需要修改MySQL源代码,MySQL最好是5.1或更高版本,生成HandlerSocket时需要MySQL源代码和MySQL库。  

0
相关文章