生产环境下的 redis 集群一般是如何部署的?

2020-03-19 03:08:16 +08:00
 black11black
如题,java 人均百万并发系列问题,大家不要吐槽。

一个好奇是 redis 节点默认单线程,不能急用多核心,那么如何部署才能榨干性能。

我觉得应该按数据量大小分两种情况讨论,印象中 redis 的读写瓶颈在千万级左右。

对于小于千万级数据量的需求,应该是 sentinel 就可以搞定的,不需要扩展至多台机器。一个问题是如果为了高可用性部署了 sentinel 集群,由于完全的镜像数据库,会导致实际可用内存变成 1/n

而 cluster 又不能跟 setinel 结合,所以扩展到多台物理机器的情况下每台机器也占不满吧。

菜鸡的小小疑问,大家勿喷
6805 次点击
所在节点    Java
21 条回复
nvkou
2020-03-19 03:09:52 +08:00
你觉得 cpu 吃不满?那同一台机器再部署计算密集型业务就是了啊
brucewzp
2020-03-19 08:25:09 +08:00
cachecloud
scriptB0y
2020-03-19 09:36:57 +08:00
cluster 没有必要用 sentinel 了,cluster 自身就带 fail over 功能。

7 台机器,可以三台为 master,4 台为 replica。这样 7 台机器中可以随便挂掉任意两台。(必须是依次挂掉,不能同时挂)

可以看下这个教程: https://redis.io/topics/cluster-tutorial
zunceng
2020-03-19 10:06:39 +08:00
用 k8s 啊 基础服务和业务用同一个集群
guyeu
2020-03-19 10:09:47 +08:00
分库。。
sagaxu
2020-03-19 10:14:06 +08:00
单实例读写没有千万吧,十万级
fancy111
2020-03-19 10:22:36 +08:00
啥的读写瓶颈千万级啊,单机就几万。另外我没见过有几个公司达到百万并发的。
你用哨兵不就是几台机器?
cluster 又不能跟 setinel 结合? excuse me?
vus520
2020-03-19 11:28:46 +08:00
单实例十万级,网络就数万级。要多核心,那就多实例。
threegrandfather
2020-03-19 12:16:22 +08:00
twemproxy+redis master+redis slave,twemproxy 和 redis master 按照 2:1 比例购买机器。单实例机器 2c12g,twemproxy 机器可以小一点。twemproxy 前面顶一个内网 lb。
单实例 redis 不要超过 12G。
zhoudaiyu
2020-03-19 12:43:50 +08:00
@scriptB0y 看到 redis 大佬了!请问 sentinel 可不可以看作缩水(低配)版的 cluster ?
black11black
2020-03-19 14:14:14 +08:00
@sagaxu 数据量千万级,不是并发千万级
jonathan001
2020-03-19 15:23:30 +08:00
@zunceng 你不怕互相影响么?
zunceng
2020-03-19 16:13:35 +08:00
@jonathan001 和业务集群规模一起扩 感觉还好呀 可能量还小吧
saytesnake
2020-03-19 16:28:54 +08:00
直接原生 cluster,轻松简单无烦恼,sentinel 可用可不用。
huntcool001
2020-03-19 16:47:49 +08:00
现在一般不用 sentinel, 直接 cluster 就行了.
scriptB0y
2020-03-19 20:47:33 +08:00
@zhoudaiyu 不是的,这两个是不同的东西。

sentinel 做的事情基本上就是 master 挂了之后帮你提升 replica 为 master,跟你雇了个人盯着 master,出问题的时候执行切换的效果一样,所以它叫做 “sentinel”。本质上这还是一个 Redis 在工作,一个 Redis 在 backup。3 个 sentinel 节点在监工(为了节省资源可以和应用部署在一起,sentinel 基本不需要什么资源)。

cluster 是完全另一个东西,它把 key 分散在多个 redis 实例上,这样就可以水平扩展了,这些实例本身会自己处理好 replica,failover。看起来 cluster 也能 failover,但是 cluster 是有限制的。1 ) cluster 不支持多个 key 的操作,比如 zinterstore,除非这些 key 存在于同一个实例上。这点想想就明白了,在多台 redis 上是无法保证都成功的。2 ) 只支持 1 个 db,db 0,select 是无效的。

然而最大的问题是 3 )客户端必须以 cluster 的协议与 redis 沟通,因为客户端需要处理路由。

可以看下 python 的客户端 https://redis-py-cluster.readthedocs.io/en/master/limitations-and-differences.html

虽然有一些方案可以用代理的方式屏蔽 cluster 的处理

redis 官方也出的 proxy: https://github.com/RedisLabs/redis-cluster-proxy

pingcap 以前出品的 codis: https://github.com/CodisLabs/codis

其实从单机迁移到 cluster 也是成本很大的,我之前看过一个公司的迁移经验分享,但是找不到链接了。。。

所以场景还是不一样,水平扩展就用 clsuter,如果只需要 fail over 那就用 sentinel 模式。有很多公司也有不错的 proxy 方案
zhoudaiyu
2020-03-19 20:55:24 +08:00
@scriptB0y 受益匪浅,终于明白这两个的区别了,大佬对 Redis 研究颇深啊,请问有没有好的博客或是网站介绍 redis 的 sentinel 和 cluster 啊
Aresxue
2020-03-19 23:25:50 +08:00
担心机器性能利用不充分就上虚拟化比如 docker, 就不用过度关注于资源调度的问题了
daimaosix
2020-03-20 00:06:26 +08:00
我们用的 docker
d0m2o08
2020-03-20 08:41:46 +08:00
一切纠结资源调度的问题,都可以用 k8s 解决
---- 周树人

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/654087

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX