redis集群

痴心易碎 提交于 2020-01-14 18:05:30

前言

上篇文章梳理了redis的哨兵,截止到目前redis的原理已经梳理了四篇文章,键的过期策略、持久化、主从复制和redis哨兵,今天接着来梳理redis集群模式,之前我们谈到了主从复制是为了提高并发,哨兵模式是为了高可用,那么redis集群的意义是什么呢?这里我们先不谈redis集群的意义,我们来想象我们自己的业务系统的集群部署。
在这里插入图片描述
如上图所示一个简单的集群部署方式,在单机无法满足我们并发需求时,我们最常见的方式就是将服务集群部署来实现。redis的集群的架构思想其实和我们的服务集群部署是一样的,就我个人理解redis的集群模式有以下两个最直接的优点:

  1. 提高并发
  2. 水平扩充内存

redis集群简介

redis集群和我们的服务集群部署一样,由不同的节点组成一个集群,与我们系统不同的是redis集群不需要我们自己维护负载均衡,而是不同的节点负责不同的槽点,这个槽点可以放大理解为分片,放小看也可以认为是key的集合,假设我们的在一个redis集群里有两台redis服务器组成,那么我们就可以将这两台redis所负责的key进行划分,比如共有1000个key,那么redis-01负责1-500,redis-02负责501-1000,至于一个key到底是属于1-500还是501-1000是通过算法实现的。
在这里插入图片描述

节点握手

搭建redis集群的第一步是节点握手,节点握手的目的是两个单机redis处在同一个集群里,以下命令可以让两个单机redis进行握手

CLUSTER MEET <ip> <port>
槽指派

搭建redis集群的第二步是槽指派,redis集群的数据库被分为了16384个槽,每个节点负责最少0个最多16384个槽,在同一个集群中16384个槽都在处理状态时,集群处于上线状态,否则处于下线状态,也即是说,在集群中的所有负责槽的节点必须全部在线,否则集群处于下线的状态,因为有个槽的负责节点处于下线状态,那么就有key无法处理的风险。以下命令是指定节点负责的槽范围0-5000

CLUSTER ADDSOLTS 0 1 2 3 4 ... 5000

当集群中的所有节点把16384个槽都负责完时,集群上线。

查看key属于哪个槽
CLUSTER KEYSOLT "msg"
2022

如上所示msg这个key的槽点是2022,也就是说msg这个key的读写命令都是由负责槽点2022的redis节点来处理的。

MOVED 错误

当在不负责key槽点的客户端请求key的时候就会出现MOVED错误,假设说我们在负责5001-10000槽点的节点请求msg就会出现如下错误

27.0.0.1:7000> SET msg "happy new year!"
-> Redirected to slot [6257] located at 127.0.0.1:7001
OK
127.0.0.1:7001

这里是集群模式下并不会打印错误,而是直接转向负责该槽点的节点,并向负责该槽点的节点发送命令。

重新分片

重新分片的意思可以理解为重新指派槽,比如节点A的内存居高不下,我们想要再增加一个节点B来分担节点A的内存,一个方法就是节点B负责一部分节点A的槽,假设节点A负责槽10000-15000,现在我们让节点B负责槽10000-12000,那么此时节点A中槽10000-12000的数据都会被迁移到节点B。

ASK错误

当出现重新分片时,节点A的数据迁移至节点B时,客户端向节点A请求已不再节点A的key时会出现ASK错误,如下:

127.0.0.1:7002> GET "love"
-> Redirected to slot [16198] located at 127.0.0.1:7003
"you get the key 'love'"
127.0.0.1:7003

和MOVED错误相同,集群模式下ASK错误也会被隐藏,并且会返回重新负责该槽点的节点,并发送命令。

MOVED错误与ASK错误

MOVED错误是负责该key的槽不在当前节点,这个错误是长期存在的,ASK错误发生在重新分片后的数据迁移过程中,本质是负责该key的槽的当前节点已经不再处理,这个错误是临时的。

故障转移

当某一个主节点下线时就会从他的从节点中选出一个作为主节点,新的主节点将负责原来节点所负责的槽,当然其他从节点也要从新的主节点里复制数据。

总结

到此redis的三种模式及其原理已经介绍完了,现在我们再来回顾以下,主从是为了实现读写分离,可以提高redis的并发,主从的核心是数据复制,复制的实现分为两个步骤实现,一个是同步,一个是命令传播,其中2.8版本以后对同步做了优化,将同步分为了完全同步和部分同步,部分同步的两个核心是复制偏移量和复制缓存积压区;哨兵是为了提高redis的可用性,主要是用来监控redis服务器的,当判定redis服务器客观下线后进行故障转移,本文讲的是集群,集群的目的是提高redis服务器的性能,集群的重点我认为是槽指派。本文关键字

  • MOVED
  • ASK
  • 重新分片

扫码关注个人公众号 精彩不错过

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!