众所周知,redis有三种集群模式,主从复制/哨兵模式/分片集群。其中哨兵模式就是用来弥补主从复制的不足的,基于主从复制。
那我们先从主从复制讲起:
主从复制:
从节点给主节点发送一个slaveof的命令,连接到主节点;
然后从节点发送SYNC命令给主节点,主节点接收到该命令之后生成数据快照,并缓存命令;
主服务器发送数据快照,发完之后主服务器发送缓存的写命令,从节点删掉旧有数据,开始加载数据快照,加载完成之后写入主节点发来的缓存的命令,主从同步完成;
注意上面提到了,已经完成了全量复制和增量复制,后面都是增量。
之后,主服务器每执行一次写命令,就会将这个命令发送给所有的从服务器。从服务器在接收到写命令后,会执行这个命令,以确保其数据始终与主服务器的数据保持一致。
好处:
实现读写分离,提高性能。
缺点:
主节点故障的时候不能自动切换从节点为主节点。
还有一个它并不是强一致性的,主从之间有段时间数据不一致。
哨兵模式:
这个就是在主冲复制的基础上加个故障转移!
哨兵模式下,除了主节点和从节点,还有一个或多个哨兵节点(Sentinel)。哨兵节点的主要任务是监控主节点和从节点的运行状态,并在主节点发生故障时,自动将从节点提升为主节点。
在哨兵模式下,哨兵节点会定期检查主节点和从节点的运行状态。如果发现主节点发生故障,哨兵节点会在从节点中选举出一个新的主节点,并通知其他的从节点和哨兵节点。此外,哨兵节点还可以接收客户端的查询请求,返回当前的主节点信息,从而实现客户端的透明切换。
缺点:
哨兵节点需要额外的资源和维护,增加了系统的复杂性;
主节点发生故障后,新的主节点可能会有一段时间的数据不一致,影响数据的准确性
分片集群:
Redis的集群模式是一种分布式的解决方案,它允许多个Redis节点(服务器)协同工作,提供更高的性能和可用性。在这种模式下,数据被分片存储在多个节点上,每个节点负责一部分数据的读写。
整个空间被分为16384个哈希槽,每个节点负责一部分哈希槽,当一个键值需要存储的时候,计算出这个键的哈希值,然后根哈希值值放到对应的槽上。
总结来说:
主从复制最简单,适合对一致性要求不高,数据量不大的场景。
哨兵模式可以保证高可用性,虽然选举出的从节点可能存在不一致,但是高可用。
如果你的应用场景数据量大,需要高性能和高可用性,那么集群模式可能是最好的选择。集群模式可以提供更高的性能,更大的存储容量,以及更好的故障容忍能力。