camellia-redis-proxy(English)
camellia-redis-proxy是一款高性能的redis代理,使用netty4开发,最低要求java21
- 支持代理到redis-standalone、redis-sentinel、redis-cluster
- 支持其他proxy作为后端(如双写迁移场景),如 twemproxy 、codis 等
- 支持 kvrocks 、 pika 、 tendis 等作为后端
- 支持使用hbase/obkv/tikv等作为底层存储,构建一个类redis的系统,具体见:kv
- 支持普通的GET/SET/EVAL,也支持MGET/MSET,也支持阻塞型的BLPOP,也支持PUBSUB和TRANSACTION,也支持STREAMS/JSON/SEARCH,也支持TAIR_HASH/TAIR_ZSET/TAIR_STRING
- 支持的命令列表,具体见:supported_commands
- 支持自定义分片
- 支持读写分离
- 支持双(多)写,可以proxy直连双写,也可以基于mq(如kafka)双写,也可以基于插件体系自定义双写规则
- 支持双(多)读
- 支持设置密码
- 支持SELECT命令,当前仅当后端redis不包含redis-cluster(此时仅支持SELECT 0),可以是redis-standalone/redis-sentinel/redis-proxies或者其组合(分片/读写分离)
- 支持阻塞式命令,如BLPOP/BRPOP/BRPOPLPUSH/BZPOPMIN/BZPOPMAX等
- 支持PUBSUB系列命令,代理到redis-standalone/redis-sentinel/redis-cluster均支持
- 支持事务命令(MULTI/EXEC/DISCARD/WATCH/UNWATCH),代理到redis-standalone/redis-sentinel/redis-cluster均支持
- 支持redis5.0的STREAMS系列命令
- 支持SCAN命令(代理到redis-standalone/redis-sentinel/redis-cluster均支持,自定义分片时也支持)
- 支持阿里TairZSet、TairHash、TairString系列命令
- 支持RedisJSON和RedisSearch系列命令
- 支持读slave(redis-sentinel/redis-cluster均支持配置读从节点)
- 支持SSL/TLS(proxy到client支持,proxy到redis也支持),具体见:ssl/tls
- 支持unix-domain-socket(client到proxy支持,proxy到redis也支持),具体见:uds
- 支持使用http协议访问proxy,类似于 webdis ,但是接口定义不一样,具体见:http
- 支持多租户,即租户A路由到redis1,租户B路由到redis2(可以通过不同的clientname区分,也可以通过不同的password区分)
- 支持多租户动态路由,支持自定义的动态路由数据源(内置:本地配置文件、nacos、etcd等,也可以自定义)
- 支持自定义插件,并且内置了很多插件,可以按需使用(包括:大key监控、热key监控、热key缓存、key命名空间、ip黑白名单、速率控制等等)
- 支持丰富的监控,可以监控客户端连接数、调用量、方法耗时、大key、热key、后端redis连接数和耗时等,并且支持以http接口形式获取监控数据
- 支持使用prometheus/grafana来监控proxy集群,参考:prometheus-grafana
- 支持info命令获取服务器相关信息(包括后端redis集群的信息)
- 提供了一个spring-boot-starter,可以快速搭建proxy集群
- 高可用,可以基于lb组成集群,也可以基于注册中心组成集群,也可以伪装成redis-cluster组成集群,也可以伪装成redis-sentinel组成集群
- 提供了一个默认的注册发现实现组件(依赖zookeeper),如果端侧是java,则可以很简单的将JedisPool替换为RedisProxyJedisPool,即可接入redis proxy
- 提供了一个spring-boot-starter用于SpringRedisTemplate以注册发现模式接入proxy
参见:camellia-redis-proxy-bootstrap
具体可见:代码结构
路由配置表示了camellia-redis-proxy在收到客户端的redis命令之后的转发规则,包括:
- 最简单的示例
- 支持的后端redis类型
- 动态配置和复杂配置(读写分离、分片等)
- 多租户支持
- 使用camellia-dashboard管理多租户动态路由
- 集成ProxyRouteConfUpdater自定义管理多租户动态路由
具体可见:路由配置
- 插件使用统一的接口来拦截和控制请求和响应
- proxy内置了很多插件,可以通过简单配置后即可直接使用,按需选择
- 你也可以实现自定义插件
具体可见:插件
在生产环境,需要部署至少2个proxy实例来保证高可用,并且proxy是可以水平扩展的,包括:
- 基于lb组成集群(如lvs等,或者k8s中的service等)
- 基于注册中心组成集群
- 伪redis-cluster模式
- 伪redis-sentinel模式
- jvm-in-sidecar模式
- 优雅上下线
具体可见:部署和接入
camellia-redis-proxy提供了丰富的监控功能,包括:
- 提供的监控项
- 监控数据获取方式
- 通过info命令获取服务器相关信息
- 把proxy当做一个监控redis集群状态的平台(通过http接口暴露)
- 使用prometheus和grafana监控proxy集群
具体可见:监控
- 如何控制客户端连接数,具体见客户端连接控制
- netty配置,具体见:netty-conf
- 使用nacos托管proxy配置,具体见:nacos-conf
- 关于双(多)写的若干问题,具体见:multi-write
- 关于scan和相关说明,具体见:scan
- 关于lua/function/tfunction的相关说明,具体见:lua
- 使用redis-shake进行数据迁移的说明,具体见:redis-shake
- 关于自定义分片函数,具体见:sharding
- 如何使用spring管理bean生成,具体见:spring
- 关于多租户的一个完整示例,具体见:multi-tenant
- 另一个关于多租户的一个完整示例,具体见:multi-tenant2
- 多读场景下自动摘除故障读节点,具体见:multi-read
- 关于ProxyDynamicConf(camellia-redis-proxy.properties),具体见:dynamic-conf
- 在使用haproxy/nginx等四层负载均衡器时,redis-proxy如何获取真实的客户端地址,具体见:proxy_protocol
- 热key使用自定义转发路由的一个完整示例,具体见:hot-key-route-rewrite-sample
- redis和proxy混合部署时使用UpstreamAddrConverter提升服务性能的一个例子,具体见:upstream-addr-converter
- 使用自定义分片时调整分片数量的一个思路,具体见:custom_resharding
- 使用etcd管理proxy配置的一个完整示例【运维实施】,具体见:etcd-sample
- 使用nacos管理proxy配置的一个完整示例【运维实施】,具体见:nacos-sample
- 使用proxy命令批量管理proxy集群配置的说明,具体见:proxy_command
- 关于redis_proxy初始化和预热,具体见:init
- 关于application.yml的配置项,具体见:application_yml
- 业务开始使用redis-standalone或者redis-sentinel,现在需要切换到redis-cluster,但是客户端需要改造(比如jedis访问redis-sentinel和redis-cluster是不一样的),此时你可以使用proxy,从而做到不改造(使用四层代理LB)或者很少的改造(使用注册中心)
- 使用双写功能进行集群的迁移或者灾备
- 使用分片功能应对单集群容量不足的问题(单个redis-cluster集群有节点和容量上限)
- 使用内建或者自定义的插件监控和控制客户端的访问(热key、大key、ip黑白名单、速率控制、key命名空间、数据加解密等)
- 使用丰富的监控功能控制系统的运行
- 等等