分割超大Redis数据库例子
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/124.html?1455853509
薄荷App上的伙伴功能大量使用了内存数据库Redis,随着数据量的快速增长,Redis膨胀得很快,已经接近12GB规模,这些数据全部放在单个Redis实例中。单个巨大Redis实例有如下几个坏处:
1.首先,需要一台内存很大的机器。Redis是内存数据库,它需要把所有需求全部放在内存中,需要为之装下12GB的Redis实例,至少需要12GB内存大小的机器,考虑的预留增长空间,一般需要12*1.5约18GB内存。另外还有一个考虑的因素是,Redis进行硬盘数据存储时,fork进程需要消耗同样大小的内存,因此一个12GB的redis实例需要32GB左右的内存比较合适,这对机器提出了很高的要求,常常难以满足。
2.然后,Redis容易成为性能瓶颈。Redis的并发模型是单进程单线程,它不能充分利用多核CPU,在请求数很高,或者某一些请求处理比较慢时(比如一些大的数据排序),可能会成为系统的性能瓶颈。有方法可以缓解甚至这个问题,就是建立多个Redis实例,通过多个Redis连接来实现。
3.另外,单个巨大的Redis实例也会增加数据管理难度,因为这么大的数据量,无论是复制,备份操作都比较慢,容易对线上系统造成冲击。
因此,十分有必要把单个巨大的Redis实例分割成多个小的Redis实例。
使用Redis的复制机制,可以在线平滑处理Redis实例分割,几乎不会对系统有很大的影响。
分割的具体操作思路如下:
1.首先,规划Redis分割策略,通常是基于业务划分,比如薄荷伙伴是基于业务分成timeline,user_relationship,other3个Redis实例。规划好之后,需要根据规划结果对应用程序中Redis程序代码做修改,通常是有一个统一的Redis链接修改为多个Redis连接,不同业务使用不同的连接。
2.然后,通过Redis复制功能建立多个Redis副本,让不同Redis连接使用不同的Redis副本,在Redis副本中删除多余的数据。批量删除某个模式的keys,可以使用下面的shell命令:
代码如下:#p#分页标题#e#
redis-cliKEYS"<pattern>"|xargsredis-cliDEL
改成实际的模式,如
代码如下:
redis-cliKEYS"user:*:followers"|xargsredis-cliDEL
表示删除userfollowers数据。
最后通过来回切换并重启Redis实例达到完全分割Redis实例。