专栏首页程序员升级之路redis-port支持前缀迁移

redis-port支持前缀迁移

一、介绍

redis-port是一款redis数据迁移工具,用来将数据从一个redis迁移到另一个redis实例/redis集群中 ,以下是官方地址:

https://github.com/CodisLabs/redis-port

使用也是非常的简单:

/redis-port sync -f 127.0.0.1:6379 -t 127.0.0.1:6380 -n 8

上述命令将127.0.0.1:6379这个redis实例的数据迁移到 127.0.0.1:6380 中。

我们在生产上迁移了多个redis集群的数据,运行非常稳定。

最近有这么一个场景:只迁移指定前缀的key,因为一个redis集群有好几个应用在用,如果全部都迁,时间太长,占的内存也比较大。

二、改造过程

我们先整理下redis-port的工作流程:

1、伪装一个从,向主redis 发起同步请求;

2、主redis将当前数据以rdb发送给redis-port;

3、redis-port解析rdb文件,然后1条1条的向目标redis写入数据;

4、接收主redis发送过来的增量命令,发往目标redis。

所以如果要改造的话,需要修改3和4两处,当然了还得增加参数解析的代码,具体步骤如下:

1、先修改cmd/flags.go 增加前缀的参数:

type Flags struct {
   Source, Target string
   
  //过滤前缀,即只迁移这个前缀的key
  SourcePrefixs []string
 
   AofPath string
   TmpFile struct {
     Path string
     Size int64
   }
   ExpireOffset time.Duration
 }

其中SourcePrefixs为新加的字段,类型为一个字符串数组,因为前缀可能有多个。

2、修改cmd/flags.go解析参数函数parseFlagsFromArgs

  // 解析 sourcePrefix 前缀
  for _, key := range []string{"--sourcePrefix"} {
    var prefix string
     if s, ok := d[key].(string); ok && s != "" {
      prefix = s
     }

    //通过,分隔
    flags.SourcePrefixs = strings.Split(prefix, ",")
   }
  

3、修改cmd/libs.go,增加判断key是否包含指定前缀的函数

func strHasPrefix(key string, sourcePrefix []string)  bool{
  if len(sourcePrefix) < 1 {
    return  true
  }

  var hasPrefix bool
  hasPrefix = false
  for i := 0; i < len(sourcePrefix); i++{
    if (strings.HasPrefix(key, sourcePrefix[i])) {
      hasPrefix = true
      break
     }
  }

  return hasPrefix
}

4、修改cmd/libs.go处理rdb文件的函数genRestoreCommands增加相应逻辑

//过滤非前缀的key
  if (strHasPrefix(e.Key.String(), sourcePrefix) != true) {
    log.Debug(e.Key.String() + " has no prefix: ignore it")
    return
  }

doRestoreDBEntry增加sourcePrefix参数

func doRestoreDBEntry(entryChan <-chan *rdb.DBEntry
, targetPrefix string, sourcePrefix []string, addr, auth string, on func(e *rdb.DBEntry) bool) {

5、修改cmd/libs.go回放aof文件函数doRestoreAoflog

func doRestoreAoflog(reader *bufio2.Reader, targetPrefix string, sourcePrefix []string, addr, auth string, on func(db uint64, cmd string) bool) {

//省略一些代码

//如果前缀不为空,则判断是否为这个前缀
    if (len(r.Array) > 1) {
      var key= string(r.Array[1].Value)
      if strHasPrefix(key, sourcePrefix) != true {
        continue
      }
    }

  //后续逻辑处理
}

6、在入口cmd/sync.go增加参数声明

Options:
   -n N, --ncpu=N                    Set runtime.GOMAXPROCS to N.
   -m MASTER, --master=MASTER        The master redis instance ([auth@]host:port).
   -t TARGET, --target=TARGET        The target redis instance ([auth@]host:port).
  --sourcePrefix=SP            filter source key use prefix, separte with, .
   --db=DB                           Accept db = DB, default is *.
   --tmpfile=FILE                    Use FILE to as socket buffer.

再make编译下,可以试下效果:

开两个redis实例,实例A为6379端口,实例B为6380端口,实例A数据如下:

执行redis-sync:

看下实例B中的数据:

可以看到只有order前缀的数据才迁移过来了。

本文分享自微信公众号 - 程序员升级之路(gh_1fab42db66cb),作者:刘江华

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从一次线上故障来看redis删除机制

    公司去年上线一个抽奖系统,主要用来拉新、提升流量,所有新注册的用户在指定时间都可以抽奖,为了保证安全性,程序中做了频率限制,每个用户30秒只能抽1次,...

    心平气和
  • 也谈限流

    限流的技术现在用的比较普遍了,网上一搜应该有大把的文章,为什么还来凑这个热闹呢,因为最近我们公司也在做限流,限流参考是以并发请求数作为限流参考的,即来一...

    心平气和
  • 升级Php Curl扩展遇到的坑

    线上服务器php引用的curl扩展依赖的curl库版本是7.29.0,业务想升级到7.71以上版本,因为这个版本支持域名配置HOST,即做一个后台推送功能,在后...

    心平气和
  • 基于光芯片的内存内计算(memory-in computing)

    这篇笔记介绍一篇牛津大学在光子计算领域的最新进展,该文章发表于最新一期的Science Advances,标题为“In-memory computing on ...

    光学小豆芽
  • 在Angular的index.html里插入script,拦截所有动态创建标签页的场景

    注意,下面这段代码只能插入在Angular应用的index.html里,直接插入任何Component的index.html里不会生效:

    Jerry Wang
  • php中几个字符处理函数的说明

    使用字符串 dellimiter 把 data 分割成一个数组返回 类似函数:split()

    数据和云01
  • C#操作注册表,设置系统环境变量

    最近重装系统,NX9.0太大了,不想重装,原来的话重装LicenceServer后,NX9.0是可以直接打开的,但是.NET二次开发的时候有错误,这次试一下添...

    望天
  • 实现用于意图识别的文本分类神经网络

    在这个教程中,我们将使用2层神经元(1个隐层)和词袋(bag of words)方法来组织我们的训练数据。 文本分类的方法有三种 : 模式匹配 , 传统算法和神...

    机器学习AI算法工程
  • 单例的必要认识(深刻理解)

    Dwyane
  • 基础渲染系列(十四)——雾

    这是渲染教程系列的第14篇文章。上一章我们介绍了延迟着色,这次我们把雾效果添加到场景中。

    放牛的星星

扫码关注云+社区

领取腾讯云代金券