为什么要用 Redis 集群
Redis 集群是 Redis 提供的分布式数据库方案,集群通过分片(sharding)来进行数据提供,并提供复制和故障转移功能。
学习记录以下几点:
- 节点
- 槽指派
- 命令执行
- 重新分片
- 转向
- 故障转移
- 消息
首先先看如何以集群模式启动Redis
1.复制三份配置 redis.conf,修改端口号 port 和 node.conf
|
|
记住三份文件要在不同文件夹下(例如/7001/redis.conf、/7002/redis.conf···)
node.conf 虽然此配置的名字叫”集群配置文件”,但是此配置文件不能人工编辑,它是集群节点自动维护的文件,主要用于记录集群中有哪些节点、他们的状态以及一些持久化参数等,方便在重启时恢复这些状态。通常是在收到请求之后这个文件就会被更新。
配置文件结构:
|
|
2.依次通过redis-server根据具体配置启动
如果遇到以下错误:
请确认node.conf文件名是否修改正确
我是以前台方式启动的,所以能看到打印以下打印信息:
此时表示 redis 已经以集群模式启动了
节点
一个Redis集群通常有多个节点(Node)组成,在刚开始的时候,每个节点都是互相独立的,它们都处于一个只包含自己的集群当中,要组件一个真正可工作的集群,我们必须将各个独立的节点连接起来,构成一个包含多个节点的集群。
|
|
测试,用三个独立的节点(本地打开7000、7001、7002三个端口)
开始节点之间的连接:
通过 CLUSTER NODES 可以看出,现在集群中包含了三个节点。
集群数据结构
clusterNode结构保存了一个节点的当前状态,比如节点的创建时间节点的名字、节点当前的配置纪元节点的IP地址和端口号等等。
结构如下定义:
|
|
每个节点都保存着一个clusterState结构,这个结构在当前节点描述集群当前所处的状态,例如集群是在线还是下线,集群包含多少个节点,集群当前的配置纪元等。
|
|
槽指派
Redis 集群通过分片的方式来保存数据库中的键值对:集群的整个数据库被分为 16384 个槽(slot),数据库中的每个键都属于这 16384 个槽的其中一个,集群中的每个节点可以处理 0 个或最多 16384 个槽。
当数据库中的 16384 全部槽都有节点在处理时,表示集群处于上线状态;否则,处于下线状态。
通过CLUSTER_INFO进行集群状态查看
|
|
使用 redis-trib.rb 创建集群并分配槽
在节点中通过 CLUSTER ADDSLOTS
大雾!!!一个一个将槽位打出来不现实,所以使用redis-trib.rb帮助我们进行简单集群配置,但redis-trib.rb是由ruby语言编写的所以需要安装ruby环境。
发现绕来绕去,REDIS的集群安装还需要RUBY环境和使用gem安装redis接口。
给大伙一个安装传送门
注意:
Mac 通过 Homebrew 没有 src 目录,gem install redis后找不到redis-trib.rb,被折磨很久后,直接去GITHUB下载这个文件
|
|
踩坑:之前通过 CLUSTER MEET,让各个节点进行握手,所以使用 redis-trib.rb 会报下面这个错误
|
|
解决方法:
在每个节点查询nodes编号后,使用 CLUSTER FOTGET 命令
|
|
查看槽分派情况
使用 CLUSTER SLOTS 查询
从上图可以看出,每个节点负责处理自己对应的槽。
一个节点除了会将自己负责处理的槽记录在 clusterNode 结构的 slots 属性和 numslot s属性之外,还会将自己的 slots 数组通过消息发送给集群中的其他节点,以此来告知其他节点自己目前负责处理哪些槽。