librelist archives

« back to archive

Re: redis数据备份转移

Re: redis数据备份转移

From:
道哥
Date:
2011-07-04 @ 14:28
Gmail发的紧到不出来。用这个邮箱发下。


和西哥讨论后,得到如下方法(仅针对目前使用的单机版):大体思路是,把redis的数据库中的内容全部按类型dump到一个lua表结构文件中去,将此lua数据文件上传到服务器上后,再使用同一个脚本,把数据导入某一个数据库中去。

具体实现如下:

写一个脚本,实现如下工作:
使用redis-lua,进入某一个数据库(select n);
使用 keys * 命令,将此数据库中所有的key字符串找到;
根据每个key,对key对应的value求类型(type指令);
根据key,及类型,采用不同的结构生成算法(最直接的就是序列化方法seri()了)将序列化结果写入目标文件中去;
将此文件传到服务器上;
执行import命令,将此目标文件的数据全部写入redis文件中的某一个库中;
导入完毕。

理论依据:
redis中,所有内容的存储都是string。不管是单独的key-string,还是更复杂一些的list, set, 
zset结构,每一个单独的个体元素都以字符串存储和呈现;
lua的table是一个完备的数据容器。能容纳redis的任何结构。

要做的事情:写一个导入脚本export,一个导入脚本import,这个应该不算太难。


--
Nothing is impossible.


在 2011-07-04 21:02:44,"Lu Wenlong" <a88i99@gmail.com> 写道:

http://groups.google.com/group/redis-db/browse_thread/thread/4c3d80c7b056b3ef?hl=en#


是最新的讨论,关于类似的问题。
作者的大概意思是,集群肯定不会支持database+select,因为有hash slot + migrate 等更合适的概念; 但单机版是否继续支持,还不确定。


2011/7/4 Lu Wenlong<a88i99@gmail.com>
我们知道,redis数据库(instance A)的备份方式就是简单地将硬盘上的rdb或aof文件保存在另外的地方;而转移到instance 
B中,只需多加一步,即将rdb/aof文件(可能)通过网络传送到instance 
B的相应路径下,系统会将该文件loading到内存去(在master-slave replication中,内部命令sync会起动这个过程)。


单机版的基本结构
1th level:  redis instance,每个物理机器可以运行多个instances, 
只要配置它们的端口port不同即可。redis是单进程的。硬盘上的rdb/aof文件是以instance为基本单位存储的,好似不能再分。


2nd level: database number, 默认是16, 相当于namespace,彼此之间是独立的。database 
并不能直接作为独立的个体在硬盘上存在,除非,提供新的工具将rdb/aof文件的内容按不同的database提取出来,我还没见到这样的工具。自己现在也不知道怎么写,因刚刚开始看源代码。


3rd level: key-value pairs,所有的键值对都是平等的。但在实际应用时,还是会根据读操作特点与数据的结构 
来建立有效indexing, 如某个set中装的都是 具有某种特征的 keys。 
在存储改变结构方面,可以利用move命令,在同一个instance中的不同databases之间移动key-value pair;


集群的基本结构
1th level: instance(node),基本同上。它有个原则是,尽量使得每个instance独立,实现理想的 线性扩展关系,即存储量 
vs  instance数量(假设每个instance的费用是相等的)。


2nd level: hash slot, 相当于单机版的database。但给定keys后,怎样将相关的一组keys都存放到同一个hash 
slot中?作者用了个trick. 若将keys写成如下形式,{myappOne}name, {myappOne}password, 
{myappOne}xxxx,  通过hash函数的作用,这些keys就会得到相同的hash值,这个值就会对应某个hash slot。 
关键点是,hash函数只作用在第一个{}内的字符串上,而它们现在相同。


而且,集群提供命令migrate,可以将slot作为整体在不同的instance之间原子性地移动。这是单机版里没有对应的。


3rd level: key-value pairs, 同单机版。


建议

在keys的命名方面可以参考{myappOne}xxxx这种方式,以便将来升级。其实,将来升级的话,我想作者会提供一种工具,将现在的rdb/aof文件
转化成 未来的rdb/aof文件格式。 


在备份与转移方面,我现在也想不出好办法,只能以整体来备份/转移,浪费部分空间。或者每个instance只有一个database, 
通过设置参数,来备份/移动instance。 为了弥补,此时可以在一台机器上,运行多个instances. 


基本是我现在的理解,不清楚之处,可以继续讨论哈。








Wenlong



















2011/7/4 Tang Daogang<daogangtang@gmail.com>
木有了。



2011/7/4 Lu Wenlong<a88i99@gmail.com>
可能是繁体字的原因,我重新输入一次了,不好意思哈。





------------------------------------------------------------------------------------------
之前与唐刚讨论过类似的问题,如下(我觉得它们本质是一致的?)


如何把 redis的存储文件A中的数据库 Ai 移到另一台机器上的存储文件B中的Bj数据库中去


我当时的想法是:利用redis-cluster
1. 在redis cluster中,每个node中的hash slot相当于 单机版 redis的database,在cluster中并不支持database 
2. 可以利用redis-trib命令集 来动态地将 node A 的hash slot X 转移到 node B的hash slot 


但是现在cluster还没有发布,我想要找到个好点的办法,现在可以用;以后cluster出来后,也可以很容易的转移过去。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



看下还有没乱码哈?
Wenlong

2011/7/4 刚子<trustmore@163.com>

问题描述清楚了.....不过怎么有乱码,好多地方用????代替了,

在 2011-07-04,"Lu Wenlong" <a88i99@gmail.com> 写道:

之前?唐????????,如下(我?得??在????本?一致?)
 
如何把 redis的存储文件A中的数据库 Ai 移到另一台机器上的存储文件B中的Bj数据库中去


我??的想法是:
利用 redis cluster 
1. 在redis cluster中,每?node中的hash slot相?於 ??版redis的database,在cluster中?不支持database 
2. 可以利用redis-trib命令集 ???的?node A 的hash slot X ?移到node B的hash slot 


但是?在cluster???布,我想?是找?好?的?法,?在可以用;??cluster出?後,可以容易?渡?去。




Wenlong

2011/7/418602871035<18602871035@163.com>

这篇帖子说了一个方法:set up replication with the new instance as a slave node - then
you can switch the new node to master with a single command and do the 
move with zero downtime.

http://stackoverflow.com/questions/6004915/how-do-i-move-a-redis-database-from-one-server-to-another
 
 
 
2011-07-04
18602871035
发件人: 刚子
发送时间: 2011-07-04  09:08:07
收件人: legerobot
抄送:
主题: redis数据备份转移
当多个网站数据都放在redis数据军库时,怎么对单个网站数据进行备份或者转移到其它地方的redis数据库.
(ps:redis-cli里是利用select xx来选择不同的数据模块也就是不同网站的数据)



收到此邮件是因为您加入了网易邮件列表,点击这里进入列表管理
收到此邮件是因为您加入了网易邮件列表,点击这里进入列表管理



--

?有理想走不?,不面????今天都走不?.
 




收到此邮件是因为您加入了网易邮件列表,点击这里进入列表管理






--

?有理想走不?,不面????今天都走不?.
 




收到此邮件是因为您加入了网易邮件列表,点击这里进入列表管理



--

Nothing is impossible.






--

沒有理想走不遠,不面對現實連今天都走不過.
 







--

沒有理想走不遠,不面對現實連今天都走不過.