HandlerSocket使用经验

HandlerSocket 是一个日本人开发的mysql的插件,目的是用HandlerSocket把mysql改造成nosql的数据库。官方称qps可以到达70w/s+。
HandlerSocket其实是绕过mysql的sql解析部分,直接读写innodb,然后对外维护一个epoll的连接,通过简单的文本协议与客户端通讯。他对外提供的服务也是简单的k-v增删改。mysql的sql解析是非常耗时的,HandlerSocket绕开这一过程,大大加速了读写速率,又加上innodb的数据和索引放在一块,直接读写速度很快。
我们最近的项目使用了HandlerSocket,下面介绍一些我的经验。

1. 消减数据

HandlerSocket达到高性能的必要点是:数据必须能够放到缓存中。一旦缓存经常性命中失败,HandlerSocket性能将会大幅度下降。一个简单的估计方式是查看原始数据大小与db server的内存,如果原始数据远大于db server,就要考虑拆分或者换用别的技术方案。

2. 多线程读写数据库

要想榨干HandlerSocket的性能,必须建立多条tcp的链接读写数据库。单链路读写数据库的性能远远小于期望值。可能也就性能差几十倍多吧。

3. 长连接读写数据库

HandlerSocket提供的客户端支持的语言非常少,很多情况需要自己去读写客户端实现协议。这时候注意,由于建立连接的消耗非常大,除非在业务非常变态,否则都要建立长连接读写数据库。

4. 尽量用批量操作

HandlerSocket提供两种方式,一种是单条模式,这种模式下客户端发送一个相应,等待服务器端回复相应(通常是这条成功还是失败,或者是读取的数值)以后在进行后续过程,第二种方式是批量的访问,客户端批量发送一批增删改的指令,服务器端也回复对应着一批指令的效应。第一种方式说白了就是阻塞是访问,阻塞的开销非常大,大大降低数据库的性能,建议尽量用批量操作的性能。可以在本地做一个buffer,批量读写进数据库。

5. 锁表问题

HandlerSocket在有客户端链接的情况下,会将mysql表锁住。由于innodb是行锁,所以针对数据的查询修改删除不受影响,但是针对表级的rename, drop, truncate会被阻住,得不到表。如果你的应用有离线数据入库的场景,需要在入库的时候停止其他客户端的读写。
一个比较好的方案是:假设数据库为A,先入库到A_tmp表;停止客户端读写,rename A到A_mp2, rename A_tmp 到 A;启动客户端读写;后台truncate A_tmp2;删除 A_tmp2;
先truncate在drop的原因是drop耗时太长。

6. 其他

handlersocket使用起来注意的地方挺多,最好的方法是将他封装成中间件。

你可能感兴趣的:(LINUX,php技术,数据库)