Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >网易开源的camellia-redis-proxy的浅尝

网易开源的camellia-redis-proxy的浅尝

原创
作者头像
保持热爱奔赴山海
修改于 2024-09-12 06:10:34
修改于 2024-09-12 06:10:34
4490
举报
文章被收录于专栏:数据库相关数据库相关

项目地址:https://github.com/netease-im/camellia

camellia-redis-proxy 是网易云信开发的服务器基础组件。功能很强大,具体功能和特性可以参见上面的github链接。

这里只是简单演示下它的几种常用用法:

配置和启动

代码语言:txt
AI代码解释
复制
下载解压到/root/目录下

切换到配置文件所在的目录
$ cd ~/camellia-redis-proxy-1.2.29/BOOT-INF/classes

下面是加载了多个插件的配置文件(这里演示使用的是单节点的redis)

$ cat application.yml | egrep -v '^#|^$' 整理后的内容如下:

代码语言:txt
AI代码解释
复制
server:
  port: 6380
spring:
  application:
    name: camellia-redis-proxy-server
camellia-redis-proxy:
  console-port: 16379
  password: pass123
  proxy-protocol-enable: true
  monitor-enable: true  #monitor enable/disable configure
  monitor-interval-seconds: 60 #monitor data refresh interval seconds
  netty:
    reader-idle-time-seconds: 600
    writer-idle-time-seconds: 0
    all-idle-time-seconds: 0
  plugins: #plugin list
    - monitorPlugin
    - bigKeyPlugin
    - hotKeyPlugin
    - hotKeyCachePlugin
    - troubleTrickKeysPlugin
    - commandDisablePlugin
    - ipCheckerPlugin
  transpond:
    type: local #local、remote、custom
    local:
      type: simple #simple、complex
      resource: redis://@127.0.0.1:6379

$ cat camellia-redis-proxy.properties

代码语言:txt
AI代码解释
复制
#you can dynamic enable/disable
monitor.enable=true

#you can dynamic update plugin list
proxy.plugin.list=monitorPlugin,hotKeyCachePlugin,hotKeyPlugin,bigKeyPlugin,commandDisablePlugin,troubleTrickKeysPlugin

#########################################################

command.task.queue.capacity=32768

#########################################################
#开关
hot.key.monitor.enable=true
#热key监控LRU计数器的容量,一般不需要配置
hot.key.monitor.cache.max.capacity=100000
#热key监控统计的时间窗口,默认1000ms
hot.key.monitor.counter.check.millis=1000
#热key监控统计在时间窗口内超过多少阈值,判定为热key,默认500
hot.key.monitor.counter.check.threshold=1
#单个周期内最多上报多少个热key,默认32(取top)
hot.key.monitor.max.hot.key.count=32

##监控数据默认通过/monitor进行对外暴露(默认60s刷新一次数据),如果需要实时推送,可以设置callback(实现HotKeyMonitorCallback接口即可)
###默认的callback不做任何处理
hot.key.monitor.callback.className=com.netease.nim.camellia.redis.proxy.plugin.hotkey.DummyHotKeyMonitorCallback

#########################################################
#开关
big.key.monitor.enable=true

#阈值
##默认2M
big.key.monitor.string.threshold=2097152
##默认5000
big.key.monitor.hash.threshold=5000
big.key.monitor.set.threshold=5000
big.key.monitor.zset.threshold=5000
big.key.monitor.list.threshold=5000

##监控数据默认通过/monitor进行对外暴露(默认60s刷新一次数据),如果需要实时推送,可以设置callback(实现BigKeyMonitorCallback接口即可)
###默认的callback不做任何处理
big.key.monitor.callback.className=com.netease.nim.camellia.redis.proxy.plugin.bigkey.DummyBigKeyMonitorCallback

#########################################################

#哪些key需要热key缓存功能,默认实现是PrefixMatchHotKeyCacheKeyChecker,可以基于key的前缀去配置,你可以自定义实现(实现HotKeyCacheKeyChecker接口即可)
hot.key.cache.key.checker.className=com.netease.nim.camellia.redis.proxy.plugin.hotkeycache.PrefixMatchHotKeyCacheKeyChecker

#使用PrefixMatchHotKeyCacheKeyChecker时的前缀配置方法,如果要配置所有key都启用热key缓存功能,设置空字符串即可,默认所有key都不生效
hot.key.cache.key.prefix=["dao_c", "kkk"]

##热key缓存相关的配置
#热key缓存功能的开关,默认true
hot.key.cache.enable=true
#用于判断是否是热key的LRU计数器的容量
hot.key.cache.counter.capacity=100000
#用于判断是否是热key的LRU计数器的时间窗口,默认1000ms
hot.key.cache.counter.check.millis=1000
#判定为热key的阈值,默认100
hot.key.cache.check.threshold=100
#是否缓存null的value,默认true
hot.key.cache.null=true
#热key缓存的时长,默认10s,过期一半的时候会穿透一个GET请求到后端
hot.key.cache.expire.millis=10000
#最多多少个缓存的热key,默认1000
hot.key.cache.max.capacity=1000


##监控数据默认通过/monitor进行对外暴露(默认60s刷新一次数据),如果需要实时推送,可以设置callback(实现HotKeyCacheStatsCallback接口即可)
###默认的callback不做任何处理
hot.key.cache.stats.callback.className=com.netease.nim.camellia.redis.proxy.plugin.hotkeycache.DummyHotKeyCacheStatsCallback
#热key缓存命中情况实时推送的间隔,默认10s
hot.key.cache.stats.callback.interval.seconds=10



#########################################################
#慢查询监控的阈值,默认2000ms
slow.command.threshold.millis=2000
##慢查询监控数据默认通过/monitor进行对外暴露(默认60s刷新一次数据),如果需要实时推送,可以设置callback(实现SlowCommandMonitorCallback接口即可)
slow.command.monitor.callback.className=com.netease.nim.camellia.redis.proxy.plugin.monitor.DummySlowCommandMonitorCallback

#其他监控数据(如请求数、rt等,统一通过/monitor接口对外暴露)
#特别的,对于rt的监控,有一个子开关,默认开启,如果关闭,则只统计tps,不统计rt
command.spend.time.monitor.enable=true

#########################################################

#配置
#表示:针对key1和key2的ZREVRANGEBYSCORE方法,针对key3和key4的GET方法,会被拦截(直接返回错误信息)
trouble.trick.keys=ZREVRANGEBYSCORE:["key1","key2"];GET:["key3","key4"]
# default.trouble.trick.keys=ZRANGE:["key1","key2"];SMEMBERS:["key3","key4"]
#配置(租户级别)
#表示:bid=2/bgroup=default路由配置下,针对key1和key2的ZRANGE方法,针对key3和key4的SMEMBERS方法,会被拦截(直接返回错误信息)
#2.default.trouble.trick.keys=ZRANGE:["key1","key2"];SMEMBERS:["key3","key4"]

#########################################################

#被屏蔽的命令列表(忽略大小写)
disabled.commands=EVAL,KEYS

#########################################################

#黑名单示例(支持ip,也支持网段,逗号分隔):
ip.check.mode=1
ip.black.list=192.168.3.12

#白名单示例(支持ip,也支持网段,逗号分隔):
#ip.check.mode=2
#ip.white.list=2.2.2.2,5.5.5.5,3.3.3.0/24,6.6.0.0/16

#########################################################

# 是否关闭空闲连接
reader.idle.client.connection.force.close.enable=false

#########################################################

启动

代码语言:txt
AI代码解释
复制
$ cd /root/camellia-redis-proxy-1.2.29
$ sh start.sh 

```
2024-09-10 14:27:51,544 INFO  main  c.n.n.c.r.p.h.CamelliaRedisProxyHttpServer:38 - CamelliaRedisProxyServer with http disabled, skip start
2024-09-10 14:27:51,544 INFO  main  c.n.n.c.r.p.n.CamelliaRedisProxyServer:178 - CamelliaRedisProxyServer start at port: 6380
2024-09-10 14:27:51,551 INFO  main  c.n.n.c.r.p.n.CamelliaRedisProxyServer:207 - CamelliaRedisProxyServer start success, version = 1.2.29
2024-09-10 14:27:51,553 INFO  main  c.n.n.c.h.c.CamelliaHttpConsoleServer:34 - console service init, uri.set = [/status, /reload, /prometheus, /info, /metrics, /custom, /shutdownUpstreamClient, /monitor, /offline, /online, /detect, /check]
2024-09-10 14:27:51,555 INFO  main  c.n.n.c.h.c.CamelliaHttpConsoleServer:55 - Console Server start listen at port 16379
2024-09-10 14:27:51,641 INFO  main  o.s.j.e.a.AnnotationMBeanExporter:433 - Registering beans for JMX exposure on startup
2024-09-10 14:27:51,652 INFO  main  c.n.n.c.r.p.b.Application:59 - Started Application in 1.784 seconds (JVM running for 2.418)
```

可以看到,自带了[/status, /reload, /prometheus, /info, /metrics, /custom, /shutdownUpstreamClient, /monitor, /offline, /online, /detect, /check] 这些http控制接口。
每次改动camellia-redis-proxy.properties ,只要执行 curl -s 127.0.0.1:16379/reload 接口即可生效。

插件演示

bigKeyPlugin

代码语言:txt
AI代码解释
复制
​	启动压测: redis-benchmark -n 1000000 -r 10000 -c 200 -t get -q -p 6380 -a pass123

	稍等片刻,就可以在控制台看到类似下面的日志(我这里是把hotkey的阈值改小了,不然不容易得到信息):
	2024-09-10 15:11:37,450 INFO  camellia-callback-8-1  c.r.p.stats:102 - ====hot.key.stats====
	2024-09-10 15:11:37,450 INFO  camellia-callback-8-1  c.r.p.stats:105 - bid=default,bgroup=default,key=key:000000001848,times=3,max=10,avg=7.666666666666667,checkMillis=1000,checkThreshold=1
	2024-09-10 15:11:37,450 INFO  camellia-callback-8-1  c.r.p.stats:105 - bid=default,bgroup=default,key=key:000000001968,times=1,max=9,avg=9.0,checkMillis=1000,checkThreshold=1
	2024-09-10 15:11:37,450 INFO  camellia-callback-8-1  c.r.p.stats:105 - bid=default,bgroup=default,key=key:000000000999,times=1,max=12,avg=12.0,checkMillis=1000,checkThreshold=1
	2024-09-10 15:11:37,454 INFO  camellia-callback-8-1  c.r.p.stats:105 - bid=default,bgroup=default,key=key:000000001967,times=2,max=9,avg=8.0,checkMillis=1000,checkThreshold=1
	2024-09-10 15:11:37,478 INFO  camellia-callback-8-1  c.r.p.stats:105 - bid=default,bgroup=default,key=key:000000003529,times=1,max=15,avg=15.0,checkMillis=1000,checkThreshold=1
	2024-09-10 15:11:37,478 INFO  camellia-callback-8-1  c.r.p.stats:105 - bid=default,bgroup=default,key=key:000000001908,times=1,max=9,avg=9.0,checkMillis=1000,checkThreshold=1
	2024-09-10 15:11:37,478 INFO  camellia-callback-8-1  c.r.p.stats:109 - ====hot.key.cache.stats====
	2024-09-10 15:11:37,478 INFO  camellia-callback-8-1  c.r.p.stats:117 - ====slow.command.stats====
	2024-09-10 15:11:37,478 INFO  camellia-callback-8-1  c.r.p.stats:125 - ====upstream.fail.stats====
	2024-09-10 15:11:37,478 INFO  camellia-callback-8-1  c.r.p.stats:132 - ====kv.cache.stats====
	2024-09-10 15:11:37,478 INFO  camellia-callback-8-1  c.r.p.stats:141 - ====kv.executor.stats====
	2024-09-10 15:11:37,478 INFO  camellia-callback-8-1  c.r.p.stats:147 - ====kv.gc.stats====
	2024-09-10 15:11:37,478 INFO  camellia-callback-8-1  c.r.p.stats:153 - ====kv.write.buffer.stats====
	2024-09-10 15:11:37,478 INFO  camellia-callback-8-1  c.r.p.stats:161 - ====kv.storage.stats====
	2024-09-10 15:11:37,478 INFO  camellia-callback-8-1  c.r.p.stats:171 - <<<<<<<END<<<<<<<

troubleTrickKeysPlugin

代码语言:txt
AI代码解释
复制
	127.0.0.1:6380> get key1
	(nil)
	127.0.0.1:6380> set key1 sss
	OK
	127.0.0.1:6380> get key1
	"sss"
	127.0.0.1:6380> get key3
	(error) ERR trouble trick key fast fail

commandDisablePlugin

代码语言:txt
AI代码解释
复制
	127.0.0.1:6380> eval a
	(error) ERR command 'eval' is disabled in proxy
	127.0.0.1:6380> keys *
	(error) ERR command 'keys' is disabled in proxy

commandDisablePlugin

代码语言:txt
AI代码解释
复制
	127.0.0.1:6380> eval a
	(error) ERR command 'eval' is disabled in proxy
	127.0.0.1:6380> keys *
	(error) ERR command 'keys' is disabled in proxy

ipCheckerPlugin

代码语言:txt
AI代码解释
复制
	[root@xxxx]~# redis-cli -p 6380 -a pass123 -h 192.168.3.14
	Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
	AUTH failed: ip forbidden

其它插件

代码语言:txt
AI代码解释
复制
用于控制客户端的请求tps
	https://github.com/netease-im/camellia/blob/master/docs/camellia-redis-proxy/plugin/rate-limit.md
	
支持动态设置限流阈值
	https://github.com/netease-im/camellia/blob/master/docs/camellia-redis-proxy/plugin/dynamic-rate-limit.md

将查询结果缓存
	https://github.com/netease-im/camellia/blob/master/docs/camellia-redis-proxy/plugin/hot-key-cache.md

IP黑名单
	https://github.com/netease-im/camellia/blob/master/docs/camellia-redis-proxy/plugin/ip-checker.md

监控

https://github.com/netease-im/camellia/blob/master/docs/camellia-redis-proxy/prometheus/prometheus-grafana.md

官方的压测报告

https://github.com/netease-im/camellia/blob/master/docs/camellia-redis-proxy/performance/performance.md

redis-shake数据迁移注意事项

https://github.com/netease-im/camellia/blob/master/docs/camellia-redis-proxy/other/redis-shake.md

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis数据倾斜与JD开源hotkey源码分析揭秘
本文介绍了Redis数据倾斜的相关概念,并讲解了Redis数据倾斜的原因以及应对方案,对热点问题进行了深入探讨;其次从client端、worker端、dashboard端全方位讲解了热key问题的解决方案,详细解析了JD开源项目hotkey,读者可以从本文中学到相关的方法论及其对应的落地方案。
京东技术
2023/01/05
1.1K0
Redis数据倾斜与JD开源hotkey源码分析揭秘
4.Redis基础运维之哨兵和集群安装配置
描述: 哨兵模式是主从的升级版,因为主从的出现故障后,不会自动恢复,需要人为干预,这就很蛋疼啊。在主从的基础上,实现哨兵模式就是为了监控主从的运行状况,对主从的健壮进行监控,就好像哨兵一样,只要有异常就发出警告,对异常状况进行处理。
全栈工程师修炼指南
2022/09/28
1.2K0
4.Redis基础运维之哨兵和集群安装配置
docker 实现redis集群搭建
摘要:接触docker以来,似乎养成了一种习惯,安装什么应用软件都想往docker方向做,今天就想来尝试下使用docker搭建redis集群。
老梁
2019/09/10
1.3K0
docker 实现redis集群搭建
9个提升逼格的redis命令
keys 我把这个命令放在第一位,是因为笔者曾经做过的项目,以及一些朋友的项目,都因为使用keys这个命令,导致出现性能毛刺。这个命令的时间复杂度是O(N),而且redis又是单线程执行,在执行keys时即使是时间复杂度只有O(1)例如SET或者GET这种简单命令也会堵塞,从而导致这个时间点性能抖动,甚至可能出现timeout。 强烈建议生产环境屏蔽keys命令(后面会介绍如何屏蔽)。 scan 既然keys命令不允许使用,那么有什么代替方案呢?有!那就是scan命令。如果把keys命令比作类似sele
java进阶架构师
2018/12/19
5410
02 . Redis哨兵
如图所示,Redis的 **主从复制模式** 和Sentinel **高可用架构** 的示意图:
iginkgo18
2020/09/27
8470
02 . Redis哨兵
SpringBoot2.x整合Redis数据库
1、Redis是当下最流行的用于实现缓存机制的NoSQL数据库,其主要通过key-value存储,支持高并发访问。在实际工作中,Redis结合SpringData技术后可以方便地实现序列化对象的存储。SpringBoot很好地支持了Redis,可以在项目中使用SpringData进行Redis数据操作。
别先生
2020/11/26
2.7K0
SpringBoot2.x整合Redis数据库
Redis和Sentinel的安装部署和配置
为了提升数据检索的效率,有时候我们会在数据库前加一层缓存,Redis就是常见的一种缓存组件,他的全称是REmote DIctionary Server,是一个由Salvatore Sanfilippo写的key-value存储系统,而且是可以跨平台的非关系型数据库。
bisal
2021/03/20
1.2K0
Codis搭建详细攻略
ECS:测试实例3台32C128GB规格 REDIS:Redis 4.0—128G集群版16节点
mingjie
2022/05/12
9000
Codis搭建详细攻略
Codis安装部署全架构
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务。
三杯水Plus
2018/11/14
1.1K0
深入理解Redis Cluster
Redis Cluster采用虚拟槽分区,所有的key根据哈希函数映射到0~16383槽内,计算公式:
星哥玩云
2022/08/18
3740
Redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比
redis作为一种高效的缓存框架,使用是非常广泛的,在数据存储上,在运行时其将数据存储在内存中,以实现数据的高效读写,并且根据定制的持久化规则不同,其会不定期的将数据持久化到硬盘中。另外相较于其他的NoSql数据库,redis提供了非常丰富的数据结构,如dict,sds,linkedlist,ziplist,set,quicklist,geometry。在这些存储结构的基础上,redis为用户提供了非常丰富的操作选择,如通过zskiplist来达到对某种类型的数据的排序目的,而排序在数据库中是一个非常耗时的操作。
JavaQ
2019/05/31
1.1K0
Redis的三种集群方式
redis有三种集群方式:主从复制,哨兵模式(Sentinel)和集群(Redis Cluster)。
王先森sec
2023/04/24
4.6K0
Redis的三种集群方式
Redis搭建主从
Redis高可用,一般都是一主二从三哨兵。 假如当主master挂掉了,哨兵就会选举一个leader出来,这样就变成了一主一从三哨兵了。
HaC
2020/12/30
5130
Redis搭建主从
Redis – 11、集群(Cluster)
单台redis容量限制,如何进行扩容?继续加内存、加硬件么? 单台redis并发写量太大有性能瓶颈,如何解决? redis3.0中提供了集群可以解决这些问题。
全栈程序员站长
2022/11/18
7410
Redis – 11、集群(Cluster)
Redis5.x集群搭建
每个配置文件在原来的redis.conf的配置基础上更改以下配置,这里以9001为例。
jwangkun
2021/12/23
7400
Redis5.x集群搭建
Redis学习笔记
    (*)前身:Memcached     (*)区别:支持持久化,RDB、AOF                 支持丰富的数据类型
曼路
2018/10/18
6000
Redis哨兵模式与分区详细分析
Redis-Sentinel是redis官方推荐的高可用性解决方案, 当用redis作master-slave的高可用时,如果master本身宕机,redis本身或者客户端都没有实现主从切换的功能。
chengcheng222e
2021/11/04
9580
Redis-5.0.5集群部署
环境介绍 系统:CentOS7.6 采用三主三从方式 主机 ip地址 端口 redis-1 10.110.10.3 6379、6380、6381 redis-2 10.110.10.4 6382、6383、6384 1.创建安装目录 mkdir -p /usr/local/redis 2.安装依赖包 yum -y install ruby ruby-devel rubygems rpm-build tcl gcc 3.解压源码包 tar zxvf redis-5.0.5.tar.gz cd red
染指流年
2023/03/13
4010
Redis主从与哨兵
redis-6379.conf为master配置文件,redis-6380.conf和redis-6381.conf为slave配置文件。
Se7en258
2021/05/18
4260
Redis主从与哨兵
Redis集群环境搭建
一个Redis集群至少需要6个节点才能保证组成完整高可用的集群。想要开启集群只需要设置以下两个参数就行:
Java学习录
2019/05/10
5630
相关推荐
Redis数据倾斜与JD开源hotkey源码分析揭秘
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档