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

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

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

项目地址: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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
完备的 AI 学习路线,最详细的中英文资源整理
数学是学不完的,也没有几个人能像博士一样扎实地学好数学基础,入门人工智能领域,其实只需要掌握必要的基础知识就好。AI的数学基础最主要是高等数学、线性代数、概率论与数理统计三门课程,这三门课程是本科必修的。这里整理了一个简易的数学入门文章:
机器之心
2019/05/13
1.2K0
完备的 AI 学习路线,最详细的中英文资源整理
这是一份超全机器学习&amp;深度学习资源清单(105个AI站点),请收藏!
howie6879在Github上维护了一个机器学习网站导航以及资源的目录,包含了新闻资讯、课程、比赛、项目、文档等导航链接,主流的都涵盖到,是深度学习从业者不错的一个导航,欢迎使用!
昱良
2018/12/17
1.1K0
机器学习、深度学习、算法工程师等 AI 相关岗位面试需要知识
本资源整理了机器学习、深度学习、算法工程师等 AI 相关岗位面试需要知识点,常见代码实战(分为 C/C++和 python 版本)、常见问题,简历模板、比赛/竞赛相关的资源,分享给需要的朋友。
代码医生工作室
2019/11/12
3.2K0
【NLP】NLP爱好者学习资源推荐汇总
导读:本文旨在整理汇总一些NLPer的学习资源,包括书籍、在线课程、博客等。本文中涉及的原始失效链接均已剔除或替换,博客部分均整理为近期仍在更新的博客,欢迎文末留言区交流补充。
黄博的机器学习圈子
2021/04/16
2.5K0
【NLP】NLP爱好者学习资源推荐汇总
知识体系、算法题、教程、面经,这是一份超赞的AI资源列表
照例先放上 GitHub 地址:https://github.com/Awesome-Interview/Awesome-Interview#LeetCode,大家可以点开链接直达技术面经详细内容。
AI科技大本营
2019/07/25
1.1K0
知识体系、算法题、教程、面经,这是一份超赞的AI资源列表
算法工程师常见面试问题及相关资料汇总
https://github.com/lcylmhlcy/Awesome-algorithm-interview
小白学视觉
2019/10/10
3.4K1
算法工程师常见面试问题及相关资料汇总
资源 |​ 史上最全机器学习笔记
本文由LCatro整理 机器学习 机器学习算法原理 https://github.com/wepe/MachineLearning 机器学习实战原书内容与批注 https://github.com/apachecn/MachineLearning 机器学习的Python 实现 https://github.com/lawlite19/MachineLearning_Python#1-%E4%BB%A3%E4%BB%B7%E5%87%BD%E6%95%B0 机器学习算法集锦 https://zhuanla
AI科技大本营
2018/04/27
1.1K1
资源 |​ 史上最全机器学习笔记
布客·ApacheCN 编程/后端/大数据/人工智能学习资源 2020.11
公告 我们始终与所有创作者站在一起,为创作自由而战。我们还会提供一切必要的技术支持。 我们全力支持科研开源(DOCX)计划。希望大家了解这个倡议,把这个倡议与自己的兴趣点结合,做点力所能及的事情。 我们的部分文档已备份到 PYPI、NPM 和 Docker,详情请查看各个文档 README 中的“下载”一节。 ApacheCN 项目的最终目标:五年内备份并翻译 Github 上的所有教程(其实快被我们啃完了,剩下的不多了)。 警告各位培训班:对 ApacheCN 宣传文章的举报,也将视为对 ApacheCN
ApacheCN_飞龙
2020/11/12
5860
如何用3个月零基础入门机器学习?
来源 | 微调的知乎专栏 ▌0. 背景 写这篇文章的初衷是大部分私信我的朋友都想了解如何入门/转行机器学习,搭上人工智能这列二十一世纪的快车。再加上这个问题每隔一阵子就会在知乎时间线上出现一次,因此
用户1737318
2018/06/05
9290
超全整理深度学习相关学习资料,提供系统化的深度学习路径
最近刷到某乎,看到有小伙伴提问到 「"深度学习如何入门,有哪些学习资料?"」。看到这里,笔者想整理下一些翻山越岭,爬坑超车的经验,帮助刚入门深度学习的小伙伴。如果有想了解机器学习入门方法的朋友,可以看我之前写的机器学习入门方法和资料合集。
提莫在线发育
2020/04/17
5900
超全整理深度学习相关学习资料,提供系统化的深度学习路径
我的机器学习入门清单及路线!
知乎:https://www.zhihu.com/people/huangzhe
Datawhale
2022/04/08
6400
我的机器学习入门清单及路线!
原创 | 吐血推荐,B站最强学习资源汇总(数据科学,机器学习,python)
经过这几个月的居家隔离,想必大多数同学都开始习惯通过线上的方式开展学习了,在线教育领域也因此迎来了一波爆发,竞争异常激烈,既有知名平台如MOOC、学堂在线、网易云课堂等,也有不少初创新星。但要说最受年轻人欢迎的学习资源网站,应该非B站莫属。该平台资源之丰富不用多说,并且全程无广告,很多网友都表示自己通过B站学会了很多技能,比如Python、数据库、Photoshop、英语考级、日语考级等。总之,一个B站就足够解决绝大多数问题。下面,我们整理一波B站上关于数据科学、人工智能领域的学习资料和值得关注的up主,欢迎大家收藏转发哦~
数据派THU
2020/04/16
2.3K0
原创 | 吐血推荐,B站最强学习资源汇总(数据科学,机器学习,python)
【资源】吴恩达 AI 完整课程资源超级大汇总!
吴恩达(Andrew Ng),毫无疑问,是全球人工智能(AI)领域的大 IP!随着近些年来 AI 越来越火的大趋势下,吴恩达一直致力于普及、宣传、推广 AI 教育,包括最前沿、最火爆的 AI 基础课程、深度学习课程等等。惠及全球超过 500w 的人工智能爱好者。
yuquanle
2020/02/26
2.2K0
这是一篇关于如何成为一名AI算法工程师的长文
今天被这篇文章刷屏了,转载这个篇文章最主要的原因:文章写的很棒,我觉着应该分享给大家,让大家在学习的道路上少走点弯路,其次今天晚上看到一个号主给读者传输了错误的机器学习的观点,所以拿这篇文章给大家扫扫盲。
PM小王
2019/07/02
1.7K0
这是一篇关于如何成为一名AI算法工程师的长文
【干货荟萃】机器学习&深度学习知识资料大全集(一)(论文/教程/代码/书籍/数据/课程等)
点击上方“专知”关注获取更多AI知识! 【导读】转载来自ty4z2008(GItHub)整理的机器学习&深度学习知识资料大全荟萃,包含各种论文、代码、视频、书籍、文章、数据等等。是学习机器学习和深度学习的必备品! ty4z2008前言:希望转载的朋友,你可以不用联系我.但是一定要保留原文链接,因为这个项目还在继续也在不定期更新.希望看到文章的朋友能够学到更多.此外:某些资料在中国访问需要梯子. 《Brief History of Machine Learning》 http://www.erogol.com
WZEARW
2018/04/09
3.1K0
普通程序员,几个月如何成功转型AI?
IT派 - {技术青年圈} 持续关注互联网、大数据、人工智能领域 动辄50万的毕业生年薪,动辄100万起步价的海归AI高级人才,普通员到底应不应该转型AI工程师,普通程序员到底应该如何转型AI工程师? 以下,精选了三个特别典型的普通程序员成功转型AI的案例,也是知乎上点赞量相当高的案例: 第一案例为普通程序员,经过六个月从接触机器学习到颇有心得的切身体会。 第二个案例为只懂 ACM 竞赛相关算法的普通程序员,误打误撞接触到了数据挖掘,之后开始系统地了解机器学习相关的知识,如今已经基本走上了数据科学家之路的
IT派
2018/03/28
1.6K0
普通程序员,几个月如何成功转型AI?
AI 学习路线图详细教程
人工智能(AI)是当今最热门的技术领域之一,涉及深度学习、自然语言处理、计算机视觉等多个方向。对于想要入门 AI 的学习者来说,制定一个清晰的学习路线图可以事半功倍。本文将从 数学基础、编程基础、机器学习、深度学习、AI 应用 等方面,详细讲解如何系统地学习 AI。
IT蜗壳-Tango
2025/03/19
9560
GitHub万星的中文机器学习资源:路线图、视频、电子书、学习建议全在这
本文为你推荐名叫AI Learning的GitHub资源,汇集了30多名贡献者的集体智慧。
数据派THU
2019/05/15
4970
GitHub万星的中文机器学习资源:路线图、视频、电子书、学习建议全在这
最全知乎专栏合集:编程、python、爬虫、数据分析、挖掘、ML、NLP、DL...
上一篇文章《爬取11088个知乎专栏,打破发现壁垒》 里提到,知乎官方没有搜素专栏的功能,于是我通过爬取几十万用户个人主页所专注的专栏从而获取到11088个知乎专栏。
古柳_DesertsX
2018/08/21
2.7K0
最全知乎专栏合集:编程、python、爬虫、数据分析、挖掘、ML、NLP、DL...
资源 | 深度学习入门和学习书籍
最近很多新入门的同学问我到底怎么入门,今天先给大家推荐一些有用的书籍和简单的入门。希望可以给有需要的朋友一些帮助,谢谢! 最近新出一本学习书籍,是我们学校焦李成老师的新作——《深度学习、优化与识别》
计算机视觉研究院
2018/04/17
1.2K0
推荐阅读
相关推荐
完备的 AI 学习路线,最详细的中英文资源整理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档