上篇文章聊到了redis的哨兵机制,哨兵的作用是保证主从节点宕机或者故障的时候可以可以进行自愈,选举合适的master并且告知client。这个机制也就保证了redis集群的可用性。但是这次我们又遇到了新问题,那就是主从复制架构的情况下redis 的内存不够用了该怎么办。有人说那就不断的阔各个机器的内存,按照常理我们都知道一个人的力量是有限的。
当一个节点的内存过大,那么我们在进行同步的时候会通过RDB文件进行同步,而生成rdb文件是通过fork一个子进程进行的(下篇文章我们仔细聊下这个过程),在进行fork操作且在生成rdb文件的时候会阻塞主进程,导致redis 的性能就很慢。
所以我们得想办法,可以不再单台机器上扩容,而达到目的。那这个方案就是切片集群。
就是多个集群/节点 组成的集群,存储数据的方式是分区存储,在这里为什么叫分区存储呢,就是说不通的节点/集群之间是不进行通信往来的,他们只需要存储客户端让存储的数据,也就是说他们存储的数据是不冗余的。
客户端会存储各种各样的数据,那怎么去将这个数据进行合理的分配到各个节点呢,其实这个我们应该想到一个知识点,那就是Java中的Hash表,他是如何存储的呢,在有限的hash slot 进行存储key,那就是通过key的hash值取模。然后会映射到对应的hash slot 如果有重复会进行新增加链表。那何尝和我们切片集群的场景不一致呢。每一个slot可以对应一个redis主从集群/redis节点。但是对与Java的hash表来讲它是可以进行一直扩容的。所以某些场景还是不符合的。所以我们得进行改进算法。
上面大概讲了下思路,接下啦看看redis cluster的官方方案:
这个时候由于你手里的redis机器资源大小不太一样,所以你想让他存储的数据量不一样,这个时候你就可以进行手动分配这个slot。
我们通过上面的补助将数据存储到你了对应的一个redis节点/集群上,那么我们查询的时候如何拿呢?