redis分布式代理工具选型与功能验证

一、应用场景需求简要说明

       1、目前产品架构基于redis单实例设计,因单实例QPS受限(都在10万级QPS以下),不适用于中大型项目,设计要求通过服务器与多实例redis水平扩展使QPS能达到1000万级别;

       2、要求支持一般的string、hash、lish、set、zset数据结构对应的命令以及pub/sub消息发送订阅等命令;

       3、要求支持scan等命令,并且能扩展支持redis 的rejson插件对应的主要命令等;

       4、要求多线程,支持redis集群与哨兵模式;

       5、要求支持auth认证等;

       6、对现有程序访问redis的client库能完全兼容,不需要对程序进行改造;

二、选型总结

       通过百度搜索以及github上查找,先后考虑了如下几种redis代理开源中间件:

       1、codis:由豌豆荚开源的Redis分布式中间件;

       2、twemproxy:由Twitter开源;

       3、predisxy:由joyieldInc个人开源,入选了华为云鲲鹏社区开源中间件     (https://www.huaweicloud.com/kunpeng/software/predixy.html);

       几大代理工具具体对比可以参考博客:https://blog.csdn.net/rebaic/article/details/76384028

       没有选择codis的原因:

       1)自有的redis分支(基于redis-3.2.8源码改造), 不能与原版的redis保持同步;

       2)不支持BLPOP/BRPOP/pub/sub/scan等命令,不支持rejson等插件的扩展指令等;

       3)比较重型,依赖的软件比较多,包括第三方的软件;

       没有选择twemproxy的原因:

       1)不支持BLPOP/BRPOP/pub/sub/scan/auth等命令,不支持rejson等插件的扩展指令等;

三、主要功能测试点

       1、多个实例代理测试;

       2、自定义命令测试;

       3、pub/sub等指令测试;

       4、增加节点并迁移数据;

四、测试环境与主要配置

        测试环境准备:

              采用virualbox 安装linux centos7.7虚拟机,通过源码编译最新版的redis6.0.1,并配置3个单实例,对应的端口分别为16379、16380、16381,同时源码编译predixy并采用默认的端口7617,具体部署结构如下图:

redis分布式代理工具选型与功能验证_第1张图片

      

     主要配置:

redis分布式代理工具选型与功能验证_第2张图片

       1)redis6.0.1源码编译与安装与多实例配置(略)

       2)predixy源码编译,见https://github.com/joyieldInc/predixy/blob/master/README_CN.md说明

       3)配置文件作用:

  • predixy.conf,整体配置文件,会引用下面的配置文件
  • cluster.conf,用于Redis Cluster时,配置后端redis信息
  • sentinel.conf,用于Redis Sentinel时,配置后端redis信息
  • auth.conf,代理中心访问权限控制配置,可以定义多个验证密码,可每个密码指定读、写、管理权限,以及定义可访问的健空间
  • dc.conf,多数据中心支持,可以定义读写分离规则,读流量权重分配
  • latency.conf, 延迟监控规则定义,可以指定需要监控的命令以及延时时间间隔
  • command.conf,自定义命令扩展,用于命令扩展,支持redis 的插件以及自定义数据处理函数等
  1.  auth.conf配置与说明  
     Authority {
        Auth {
            Mode write
        }
        Auth "[email protected]" {
            Mode admin
        }
    }  
  2. standalone.conf配置与说明
    StandaloneServerPool {
        Password [email protected]                  #redis实例访问权限密码
        Databases 16                                   #支持的db分区数目
        Hash crc16                                       #采用的分布式映射的hash算法,目前支持crc16或atol
        HashTag "{}"
        Distribution modula                          #采用的分布式映射到redis实例的方法,目前支持modula(取模法)和random(随机法)
        MasterReadPriority 60
        StaticSlaveReadPriority 50
        DynamicSlaveReadPriority 50
        RefreshMethod fixed
        ServerTimeout 1
        ServerFailureLimit 10
        ServerRetryTimeout 1
        KeepAlive 120
        Group shard001 {                            #分区对应的redis实例地址
           + 127.0.0.1:26379
        }
        Group shard002 {
           + 127.0.0.1:26380
        }
        Group shard003 {
           + 127.0.0.1:26381
        }
        Group shard004 {
           + 127.0.0.1:26382
        }
    }
  3. command.conf

    CustomCommand {
         json.get {                                  #定义扩展了redis的rejson插件的get方法
             Mode read                            #定义扩展命令类型,支持read|write|admin[|[keyAt2|keyAt3]
             MinArgs 2                             #支持的输入最小参数个数,包括命令在内
             MaxArgs 10                          #支持的输入最大参数个数,包括命令在内
         }

         json.set {
             Mode write
             MinArgs 2
             MaxArgs 10
         }

         json.objkeys {
             Mode read 
             MinArgs 2
             MaxArgs 10
         }
    }     

  4. predixy.conf
    主要修改配置
     

    ################################### AUTHORITY ##################################
    Include auth.conf

    ################################### SERVERS ####################################
    # Include cluster.conf            #集群模式的redis配置
    # Include sentinel.conf          #哨兵模式的redis配置
    # Include try.conf                   #测试用简约版配置
    Include standalone.conf        #使用单击模式的redis配置

    ################################### DATACENTER #################################
    ## LocalDC specify current machine dc
    # LocalDC bj                         

    ## see dc.conf
    # Include dc.conf                  #“异地”数据中心配置


    ################################### COMMAND ####################################
    ## Custom command define, see command.conf
    Include command.conf         #使用自定义扩展命令

    ################################### LATENCY ####################################
    ## Latency monitor define, see latency.conf
    Include latency.conf              #延时监视与信息统计
     

  5. 常用命令测试
    pub/sub、hset、hget等多种命令测试
    scan测试(说明:scan 0 对应的是standalone.conf(或其他模式的配置文件)实例Group shard001,scan 1对应的是standalone.conf(或其他模式的配置文件)实例Group shard002 )
    rejson自定义命令测试

  6. 数据迁移说明
    当修改了standalone.conf(或其他模式的配置文件)实例对应的分布式节点个数后,如果要保证数据确定能通过predixy代理获取到现有数据,需要进行单实例redis全部数据重新根据key的哈希值取模等映射方法重新映射到redis实例中,目前采用产品中redis跨网闸同步程序进行迁移。

你可能感兴趣的:(数据库,redis,分布式,中间件)