一、呼唤集群
为什么呼唤?
- 并发量
- 数据量
正确的解决方法:
分布式:简单的认为加机器。
二、 数据分布理论
现在有一个全量的数据,但是一个机器已经不能满足存储这么多数据了。所以现在考虑分区
现在有两种分区方式:顺序分区和哈希分区
2.1 节点取余分区
2.2 一致性哈希分区
2.3 虚拟槽哈希分区
三、Redis Cluster基本架构
Redis Cluster 安装的架构
每个节点都会进行读写。
meet:节点之间是可以相互通信的
节点A发送节点B一个meetB命令,节点B会返回节点A一个PONG
节点A发送节点C一个meetC命令,节点B会返回节点A一个PONG
这个时候节点B会通过对节点A的一个了解,可以找到对应的节点B
然后他们会根据一定的频率相互交换消息,所有节点都可以进行通信,只有能够通信才能知道节点的槽信息。
指派槽:只有对节点进行指派槽,才可以正常使用
现在有3个主节点,A、B和C节点,现在要将16384个槽分配给3个主节点。
对应客户端,只需要根据key来计算其所属的 slot。
复制:每个主节点都有很多从节点,且这里面有很多主节点。且主节点和从节点之间也有复制,如果主节点挂了,那么从节点可以晋升为主节点。内部监控不会依赖于sentinel,而是通过节点之间监控来实现的。
四、 Redis Cluster安装——原生安装
有两种安装方法:
- 原生命令的安装
- 官方工具安装
4.1 理解架构
- 【步骤一】首先配置和开启节点
这个时候这些节点都是相互独立的,还不能够相互通信。如果想要相互通信,就需要meet。
- 【步骤二】meet
cluster-node-timeout 15000
:故障转移的时间(节点超时的时间):15秒
- 【步骤三】分配槽
- 【步骤四】设置主从
我们设置了三主三从。
4.2 原生安装——准备节点
首先要在conf文件夹下,配置redis-7000.conf
下面我们就可以启动节点了。
启动节点成功后,验证一下节点是否启动成功
成功启动之后,我们使用客户端连接redis的cluster。之前启动的时候一直都启动不成功,后来我猜是因为我使用的版本是2.8.1太老了,然后我就又下载了4.0.8版本,然后配置都一样,成功启动了。开森!!!
当设置完了节点之后,我们进入一个客户端,连接端口为7000的服务器,然后set一下,发现报错了,为什么呢?是因为设置完节点之后,还需要设置槽和设置meet。
我们可以使用这两个命令来查看集群的信息。
4.2 原生安装——节点握手 即meet操作
然后我们让7000和7002meet,然后再对7001节点查看,可以看到他和7000和7002都能连接上。因为可以通过7000进行消息传递。
然后通过这个方法让7000和7001、7002、7003、7004、7005都握手之后,他们彼此之间都能知道彼此的存在。
4.3 原生安装——分配槽
因为有很多机器,所以不能一个机器一个机器的分配槽,所以我们在/redis/下面新创建一个文件夹 script,然后在 script文件夹下创建一个脚本 addslots.sh
。在脚本中写分配槽的操作。
4.3 原生安装——分配主从
要cluster replicate 主节点的 id号。
这样主从节点就分配完了,可以看到主从节点的状态。
五、 Redis Cluster安装——Ruby安装
5.1 ruby 环境准备——操作
六、 扩容集群
-
【第一步】首先准备新节点
-
【第二步】加入集群
- 【第三步】偏移槽和迁移数据
每个原来的节点的槽分配一些槽给新进来的节点,上图中就是6379、6380和6381节点槽数据迁移一部分到6385中
将非过期数据和过期数据都置为过期数据,这样会丢失数据。但是在3.2.8已经修改了这个 bug。
- 【第四步】添加从节点
七、收缩集群
7.1 下线迁移槽
就是下线节点的槽迁移到其他节点上。
7.2 忘记节点
八、客户端路由
8.1 moved 重定向
当使用-c之后是告诉他使用集群模式,所以如果插入的数据槽不命中,他会自动转化到对应的槽的节点上,当执行完上述命令行后,会自动跳转到转换的节点上。
这句命令行来查看 hello 可以被分配到哪个槽上。
8.2 ASK重定向
8.2 smart
- 从集群中选一个可运行节点,使用 cluster slots 初始化槽和节点映射
- 将 cluster slots 的结果映射到本地,为每个节点创建 JedisPool
- 准备执行命令
JedisCluster 内部有 key 和 slot 的关系。