惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Vercel News
Vercel News
F
Fortinet All Blogs
月光博客
月光博客
G
Google Developers Blog
博客园 - Franky
GbyAI
GbyAI
The Cloudflare Blog
I
InfoQ
雷峰网
雷峰网
WordPress大学
WordPress大学
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
T
The Blog of Author Tim Ferriss
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 聂微东
小众软件
小众软件
腾讯CDC
B
Blog
量子位
V
V2EX
S
SegmentFault 最新的问题
Google DeepMind News
Google DeepMind News

Mobility

从薅 token 到管 skill:我的 pks 工具落地实践 把笔记、微信读书、知乎装进 Obsidian:我基于llm-wiki知识中枢搭建实录 免费AI视频生成器:我如何用零成本做出带旁白字幕的多场景AI视频 Agnes免费模型真能白嫖视频?我改造了ViMax来试试 教你薅token(二):构建agent无关的skills管理工作流 教你薅token:构建agent无关的AI工作流 用 AI Agent 完成 Hexo 主题迁移:从 Next 到 Butterfly 的全自动化实践 Vercel封禁163邮箱后,我是怎么恢复博客的 用LLM管理安全开发规范:一次llm-wiki实践 Vaadin框架教程:Java工程师的前端开发秘籍 hexo多语言方案总结及最佳实践 知乎增强工具-评论时间精确到秒 怎么理解数据库的四个隔离级别 kubernetes是什么-实用向教程 怎么更科学的用知乎摸鱼 读书笔记《系统之美》,如何面对现实中的复杂问题 分布式系统设计中的通用方法 高并发解决方案很难吗?轻松聊清楚高并发设计 SSP,DSP,RTB,ADX都是什么? 讲讲互联网广告的概念与发展 从redolog,undolog到隔离级别,刨根问底,讲清楚事务和ACID java项目低学习成本使用kubernetes的实践经验 剧变中的2021-一个中年工程师的年终总结 kubernetes环境下做金丝雀发布的一种思路 prometheus教程: 一篇文章讲懂prometheus 实现一个简单的java版本高性能获取ip地址所属国家工具 iterm2配置ssh书签, 实现记住密码和自动登录 怎样做一个好的技术分享 云原生究竟是什么 读书笔记 稻盛和夫《干法》-思考应该怎样去工作 review的个人价值
通过实际操作理解redis cluster原理
流沙 · 2017-04-14 · via Mobility

Redis 集群是redis官方提供的一种集群方案,从3.0开始提供稳定版,应用也已经比较广泛,也经受住了时间考验,个人感觉完全可以取代codis,tweemproxy等集群方案。

cluster是使用数据分片的形式实现的,一个 Redis cluster集群包含 16384 个哈希槽, 任意一个key都可以通过 CRC16(key) % 16384 这个公式计算出应当属于哪个槽。每个槽应当落在哪个节点上,也是事先定好。这样,进行任一操作时,首先会根据key计算出对应的节点,然后操作相应的节点就可以了。

所以说,其实cluster跟单点相比,只是多了一个给key计算sharding值的过程,并没有增加多少复杂度,完全可以放心使用。

在这样的设计下,一些对节点的操作也很方便,操作过程中对client端也不会有影响。
1. 增加节点:将原有节点的某些slot转移到新节点上
2. 删除节点: 将节点上的槽转移到其他节点上以后,移除空节点
3. 节点故障:落到故障节点上的操作会失败,而集群其他部分可以正常访问,这样就不会出现一致性哈希方案的“雪崩”问题。单点的故障也可以通过配置slave解决,节点故障时可以由对应的slave顶替
4. 节点重启: 正常重启即可,节点会自动读之前的配置然后加入集群中。

安装操作流程

然后,我们可以实际安装一次,由于只是测试,装个两三个节点就可以,而如果是生产使用的话,至少需要3个master节点,也推荐同时至少有3个slave节点才能使用。

安装redis

到redis官网(https://redis.io/download)上下载最新的stable版本。

以3.2.8为例,下载完以后执行以下命令

1
2
3
$ tar xzf redis-3.2.8.tar.gz
$ cd redis-3.2.8
$ make

然后解压缩,make就可以了.

redis配置与启动

make之后会在redis的src目录下多出几个命令,包括redis-server, redis-cli等,可以把他们拷到/usr/local/bin下,这样就可以在任意路径下执行。也可以自己指到src目录下进行操作。

启动之前需要先修改一下配置,redis的根目录下有一个redis.conf文件,可以直接改它,也可以拷到别的路径下进行修改。

主要就是把cluster模式打开,然后配一下cluster配置文件。

1
2
cluster-enabled yes
cluster-config-file nodes.conf

其他的配置,port,bind,protect-mode之类的,可以根据需求改一下,不改也没关系。如果是想在一台机器上启动多个实例的话,需要给每个实例一个配置文件, port, cluster-config-file这些配置也需要区分一下。

然后执行以下命令,分别指定不同的配置文件启动。

1
2
redis-server redis-6379.conf &
redis-server redis-6380.conf &

开启cluster

需要的节点都启动以后,就可以开始配置cluster了。推荐的办法是使用官方提供的redis-trib.rb工具包,这个具体操作可以参考官方文档。我们在这里试一下手动操作,这样其实可以加深对cluster原理的理解。

首先通过redis-cli命令进入任意一个redis实例中,然后一次对其他几个节点执行meet命令。

1
Cluster meet xxx:6380

然后执行cluster nodes命令就可以看到节点被加入到集群中了。

这之后还有一步是分配slot, 可以使用cluster setslot命令,不过由于slot比较多,分配起来很麻烦。还有另外一种方式是修改nodes.conf这个配置文件。

Nodes.conf这个配置包含了cluster相关的几乎所有信息,一般情况下无需自己去操作,redis会自动生成,可以打开看一下,里边每个节点都对应一行,一行是类似这种格式:

1
8301106a1a0b7472650f22503abea23024df17fb 127.0.0.1:6379 myself,master - 0 0 1 connected

然后slot的分配情况是加在最后

1
8301106a1a0b7472650f22503abea23024df17fb 127.0.0.1:6379 myself,master - 0 0 1 connected 0-8000

需要注意的是,全部16384(0-16383)个slot都要分配出去,不能留空;集群中每个节点都对应一个Nodes.conf文件,每个文件里的slot配置要一致。

改完以后重启所有节点,在redis-cli中执行cluster info 命令,可以看到一些关键信息

1
2
3
4
5
6
7
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:2
cluster_size:1

所有slot已经分配出去,Cluster stat也变成了ok. 这样一个cluster就算搭建完毕了。

原文地址:https://lichuanyang.top/posts/9329/