Redis 集群这事儿,实际上就像是在一家大公司的架构里搞分布式事务。
那会儿咱们当作单集群就是一支队伍,结局一扩容,指挥系统就乱套了。目前大家更习惯搞集群,把不同的兵分组,各自负责一块地盘,遇到大事儿再集合一下。 Redis 的集群核心逻辑,实际上就是分片(Sharding)。想象一下,你有一个庞大的仓库,里面全是货(数据),没人亲自跑,那赶明儿如何发货?你只能派几个快递员,每人负责一局部仓库。但在内存里,它们还是得知道彼此的位置,不然新来的快递员也不知道该往哪儿塞货。
故此 Redis 集群靠的是“分片键”和“共享内存”。当某个分片需求新增数据时,它会先看看这个数据跟哪个键相关,然后找对应的分片去入库,最终其他分片再统一拉取这些数据,再统一还到主键上。
这就好比大家各司其职,最终结局都汇总到了一起,既不用哪位多干活,也没人偷懒。 不过,这里有个关键点,就是数据是写进内存里的,不是硬盘上。
要是集群里某个分片挂了,那它手里的数据就瞬间丢了。毕竟 Redis 是用内存做运算的,硬盘更多是用来存配置要么写日志那种。
故此一旦某个节点倒下了,就得赶紧把数据迁移那会儿,要么砍掉那个节点。平时状态是 `split-branched`(分裂分支),这时候数据就在某个节点上,其他节点说是没看到,但实际上数据都在。一旦某个节点挂掉,其他节点就会主动把自己手里的数据去重映那会儿,重新把自己当主节点,再去找新的主节点。
这个过程得快,不然你的业务就中断了。 大量人认定集群就是好办的 N 个节点,哪位当主,哪位当从,这理解偏差挺大。Redis 的集群实际上是一个主从复制的变种,并且是有选举的。全集群只有一个主节点,其他节点都是从节点。主节点负责写数据,从节点负责读数据,平时读数据不经过主节点,省事儿。但难题是,哪位当主节点?这得靠选举。好办来说,哪位当主,就得比别人快。 这就引出了 HTTP 重连和主从切换的机制。在集群里,一般会有多个主节点。当主节点挂了,其他从节点会检测到主节点挂了,然后自己就顶上去了,成为新的主节点。
这时候,其他从节点会把自己刚刚写的数据,重新写一次给新的主节点。
这个过程可能需求点工夫,出于得把数据重新传输。
不过这时候,原来的主节点不是彻底挂了,它只是处于“主从切换”的状态,数据还在它手里,只是身份变了。 还有一点挺关键,就是你写数据的时候,会不会影响别人。出于主从切换是异步的,你写的东西可能还没同步到所有从节点,这时候别人操作了,数据还没预备好,就可能会读到旧数据。
故此有时候不建议在写数据的时候再主从切换。
另外,主节点挂了,读数据的时候,从节点就得重新从主节点拉取数据,这时候读取的速度可能就不如平时那流畅了,就连会比主节点挂了还慢。 数据同步的方面,Redis 集群一般会有主从复制。从节点会定期同步主节点的数据,这叫异步复制。
要是主节点挂了,从节点就得把数据补上,这叫同步复制。别看异步复制好办点,但不够实时,同步复制快但开销大。为了兼顾性能和可用性,Redis 集群本身赞成双活配置。
这时候所有节点都是主,数据都在内存里,读写都挺快,但需求做微服务化的操作,比如分库分表,把数据分散在多个节点上,避免一个大库扛不住。 再说说数据保险。Redis 集群的数据都是存内存里的,要是节点挂了,数据就没了。
要是集群挂了,那数据全没了。
故此 Redis 的集群架构务必保证高可用性。平时有些数据可能只存有从节点上,比如刚刚同步过来的数据,这时候要是节点挂了,数据就丢了。
故此要么保证集群一辈子不挂,要么保证数据有备份机制。 最终总结一下,Redis 集群的核心就是分片、主从复制、数据同步、主从切换和高可用。分片解决的是数据分布难题,主从复制解决的是数据一致性,主从切换解决的是可用性。通过这些机制,Redis 集群能在高并发下保持数据不丢失、读写不中断。自然,这也不是完美的,毕竟内存是有上限的,节点多了,数据量大了,运维也更有挑战了。但只要把原理搞懂,配置得当,Redis 集群依然能支撑起庞大的业务需求。