回档方法:

假设master1是当前主服务,slave1是从服务,master2是回档实例。master1在rockstore里面需要保留较长时间的binlog,以保证slave能够取得完整的binlog。slave1在rockstore里面保留较少的binlog,以保证新的binlog能够及时的落地,从而可保证定时回档到较新时间点的能力。

前提条件:master1持续运行,slave1持续运行。

  • redis-cli向slave1发送slaveof master1命令,使得mater1与slave1实时同步。

  • 在某个需要备份的时间点,redis-cli向slave1发送backup命令,生成全量备份。

  • 启动master2服务

  • 拷贝备份到master2,redis-cli向master2发送restorebackup命令,加载备份并启动服务。

  • 使用binlog_tool工具处理slave1生成的binlog文件,把在backup时间点之后和希望定点回档的时间点之前的binlog解析出来,并发送其中的命令给master2,master2按照日志加入到rockstore里面,进而实现定点回档的功能。

注意

restorebackup的时候,用于恢复的目标实例不能是从属实例,同时用于恢复的目标实例不能有从属实例,否则会报错。

相关命令或工具的使用方法:

backup命令

redis-cli里面输入命令。命令格式:

  1. backup $dir ckpt|copy

说明:备份所有的rockstore

ckpt采用硬链接的方式实现,备份速度更快。copy采用拷贝的方式使用,占用更大的存储空间,备份速度较慢,适合云盘。默认采用copy,兼容面更广。

restorebackup命令

redis-cli里面输入命令。命令格式:

  1. restorebackup $storeid $dir [force]
  2. restorebackup all $dir [force]

说明:

all是加载所有rockstore

如果已经有部分数据,则会加载失败,可以用force参数强行加载。

不需要指明备份的模式是ckpt还是copy,会自动在backup_meta中识别模式。

binlog_tool

工具使用方法:

  1. ./binlog_tool --logfile=$filename --mode=base64 --start-position=$binlogPos --end-datetime=$timestamp | redis-cli -h 127.0.0.1 -p 30000

说明:

对于binlog文件,可按文件名的顺序重复调用上述工具。其中$filename为日志文件名。 binlog文件保存在dump子目录里面,比如:m1_dir/dump/0/binlog-0-0000001-19700101080000.log

在base64的模式下,该工具会将binlog解析出来,然后按restorebinlogv2命令格式打印到标准输出,这时可以通过管道来让tendis执行解析出来的命令。解析完成的时候,会有一条“read logfile end.”日志打印到标准错误输出,这样可以避免该日志被管道接受到了。

对每个sotoreid重复上述操作,多个store之间并不影响,可以并行进行。

binlogPos为master2加载的备份中的最大binlogid,获取方法是在redis-cli中使用命令:

  1. binlogpos $storeid

timestamp是希望回档的时间点。

binlog_tool的完整参数:

  1. binlog_tool --logfile=binlog.log --mode=text|base64|scope --start-datetime=1111 --end-datetime=22222 --start-position=333333 --end-position=55555

注意: —start-position和—end-position是取的闭区间,即id相等的binlog会被输出。所以传入的id需要在master2中取得的最大binlogid基础上加1后传入。 —start-datetime和—end-datetime是取的闭区间,即时间戳相等的binlog会被输出。 如果传入的binlogid小于tendis内部最大的HighestBinlogid,内部会对restorebinlogv2命令中小于HighestBinlogid的binlog返回错误码,大于HighestBinlogid的binlog正常处理。

输出示例:

  1. ./binlog_tool --logfile=home/dump/5/binlog-5-0000002-20200327204351.log --mode=base64
  2. restorebinlogv2 5 ////Af////8BAAAAAAAAAAEAAAgA /wAAAAAAAAAAPIcAAwAAAAAAB8AkAAABcSp6QQj//////////wNzZXQBiILp05IuDgAAPIdEAAAAAGEAAAEACGEAAAAAAAAx
  3. restorebinlogv2 5 ////Af////8BAAAAAAAAAAIAAAgA /wAAAAAAAAAAPIcAAwAAAAAAB8BNAAABcSp6wdf//////////wNzZXQB14Pr05IuDgAAPIdEAAAAAGEAAAEACGEAAAAAAAAy
  4. read logfile end.