一、应用场景需求简要说明
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,具体部署结构如下图:
主要配置:
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 的插件以及自定义数据处理函数等
- auth.conf配置与说明
Authority {
Auth {
Mode write
}
Auth “aaaa@bbbb.com” {
Mode admin
}
} - standalone.conf配置与说明
StandaloneServerPool {
Password ccc@163.com #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
}
} - 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
}
} -
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 #延时监视与信息统计
-
常用命令测试
pub/sub、hset、hget等多种命令测试
scan测试(说明:scan 0 对应的是standalone.conf(或其他模式的配置文件)实例Group shard001,scan 1对应的是standalone.conf(或其他模式的配置文件)实例Group shard002 )
rejson自定义命令测试 -
数据迁移说明
当修改了standalone.conf(或其他模式的配置文件)实例对应的分布式节点个数后,如果要保证数据确定能通过predixy代理获取到现有数据,需要进行单实例redis全部数据重新根据key的哈希值取模等映射方法重新映射到redis实例中,目前采用产品中redis跨 闸同步程序进行迁移。
文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树首页概览8820 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!