为什么要做Redis集群?
1.高可用。避免出现单点故障的问题
2.处理高并发读写,提高redis处理的效率
3.处理大量数据
Redis的集群可以分为三种
1.主从同步
主从同步可以用来实现读写分离的功能。即一个节点发生了写操作,像其他节点进行同步,前者是主节点,后者是从节点。
其好处是在于
1.数据存在多个节点中,方便备份
2.且读写分离,有利于提高读的效率
缺点则是
1.不能分担写的压力
2.主从之间不能自动切换,需要我们手动操作
3.存储得不到扩容,数据总量就是主节点的容量
2.哨兵
哨兵是建立在主从同步之上而来的。
哨兵就是单独的进程,用来监控所有主节点和从节点,当主节点放生异常时,可以选举一个从节点将其升级为主节点,保证了服务的高可用。
一般我们在使用中会用多个哨兵进行监控,当其中某个哨兵给主节点发送ping命令失败,会将其设置为主观下线,并告知其他的哨兵,其他的哨兵也去发起ping命令,如果超过半数的哨兵都确认处理主观下线状态,这个时候就会把主节点置为客观下线。并推举出一个领头哨兵,由领头哨兵选出一个从节点并将其升级为主节点,并且也是由领头哨兵对故障的节点进行故障恢复。
哨兵的优点:
1.由于是基于主从,主从的优点都由
2.可以自动进行主从的切换,提高了效率,保证了高可用。
缺点:
只是解决了主从自动切换的问题,同样拥有主从模式的另外两个缺点。
3.Cluster
主从和哨兵的问题在于,主节点和从节点存放的都是同样的数据,比较浪费内存,为了解决这个问题,cluster的每个主节点存放的都是不同的数据,并且之间相互关联,访问某个主节点就能拿到所有节点中的数据。
cluster采用的是16384个哈希槽存储,每一个主节点负责一段哈希槽,在存放数据的时候redis会用key进行CRC16计算得到散列值,再与16384进行取模,来确定放置在哪一个主节点中。
为了保证服务的高可用,cluster同样集成了主从和哨兵的功能
主节点可以拥有多个从节点,主节点做数据存取,从节点做数据备份。
主节点与主节点之间,像哨兵一样,也会相互发送ping命令,如果半数的主节点均认为某个节点属于下线,那么就会将其对应的子节点升级为主节点。
为什么是16384个哈希槽?
事实上,CRC16算法最大可以产生 65535 个哈希槽,之所以用16384个是因为redis节点每秒会发送心跳包,将槽放在心跳包中,让其他节点知道集群信息。16384个哈希槽大小16k,用bitmap压缩后就是2k,而如果是65535的话大小就是65k,压缩后也有8k。在我们主节点不超过1000的情况下,使用16384个完全够用,65535就太大了,浪费带宽。