参考文章
1.主从模式(Master - Slave)
整体概述
一个主节点(Master),多个从节点(Slave),从节点下还可以有从节点
- Master可读可写;
- Slave只读,不断载入rdb文件,与Master保持同步。
Slave与Master保持同步的流程如下:
- Slave向Master发送SYNC指令;
- Master接收到指令,调用folk( )创建子进程,将数据写入到rdb文件中。在此期间的指令会被记录到缓冲区中(注意这里与RDB持久化不同,RDB持久化是不会将指令记录在缓冲区的);
- Slave丢弃旧数据,载入rdb文件;
- Slave在载入rdb文件之后,读取缓冲区指令并将数据写入。
优缺点
-
优点:读写分离,负载均衡;
-
缺点:
– Master如果崩溃,需要等待重启;
– 所有主机存储的数据一致
2.哨兵模式(Sentinel)
哨兵模式是基于主从模式的。
哨兵并不是Redis服务,是一个独立的进程,作用就是监控多个Redis结点的运行情况。
哨兵的作用
- 向监视的所有Redis结点发送指令,监控其运行状态;
- 当检测到Master宕机,所有的哨兵通过选举机制选出一台Slave作为新的Master;
- 选出新的Master之后,通过发布订阅模式通知其他的Slave,更换他们跟随的Master。
优缺点
-
优点:
– 读写分离,负载均衡;
– 当监视的Master挂掉,Sentinel会通过选举机制选出新的Master;
-
缺点:所有节点存储的数据一致。
3.集群模式(Cluster)
将数据分片存储(下图表示数据分成三个分片),解决多台节点存储数据一致的问题。
每个分片内部可以是主从模式或哨兵模式(下图表示一主一从)
集群模式对数据的访问
在集群模式下,每个分片中存储的数据都是不一样的,
但仍然可以访问任意一个节点来尝试获取数据,Redis在判断key不在本节点时,会跳转到这个key对应的结点中去从而完成查询。
举例:数据分为三个分片,存储的key分别是[0, 60), [60, 120),[120, 180),对应的Master分别是Master1、Master2和Master3。
当你希望在Slave1访问key=179的数据,Slave1判断这个key不属于本节点,就会重新计算,并把这次访问的请求发送给正确的节点(Master3)