笔记大纲

  • 1.主从复制
  • 1.1 一主一从
  • 1.2 一主多从
  • 1.3 树状架构
  • 1.4 复制流程
  • 1.5 全量复制和部分复制
  • 1.6 心跳
  • 2.哨兵 Sentinel
  • 2.1 主观下线
  • 2.2 客观下线
  • 2.3 故障转移
  • 3.集群 Cluster
  • 3.1 数据分布理论
  • 3.1.1 节点取模分区
  • 3.1.2 一致性hash
  • 3.1.3 槽分区
  • 3.2 节点通信
  • 3.2.1 Gossip协议


1.主从复制

Redis的主从架构分为三类:

1.1 一主一从

shiro redis 架构图 redis架构有几种方式_java

1.2 一主多从

shiro redis 架构图 redis架构有几种方式_redis_02

1.3 树状架构

shiro redis 架构图 redis架构有几种方式_java_03

1.4 复制流程

1.从节点执行slaveof成为master的从节点开始,保存master节点地址信息。
2.从节点后台线程发现master,与之建立连接。
3.权限校验。
4.数据同步(全量、部分)
5.命令的持续复制,master将写命令复制到从节点。

1.5 全量复制和部分复制

- 全量复制:初次复制的场景。
           1. 从节点发送psync命令给master,发送复制的请求。
           1. master节点判断是否是全量复制,通过复制偏移量判断。
           1. master执行bgsave报错RDB文件,master发送RDB给从节点。
           1. 从节点保存RDB文件。在此期间,master仍然继续接受写命令到缓冲区。
           1. 从节点加载RDB文件后,主节点发送缓冲区指令给从节点。
     - 部分复制:主从复制中因外部原因导致数据丢失场景。

1.6 心跳

主从建立复制关系后,他们之间维持着心跳。master节点默认每隔10s对从节点发起ping心跳命令。从节点默认每隔1s上报自己当前的复制偏移量给master。

2.哨兵 Sentinel

主从架构一旦出现master故障就需要人工处理,redis提出了哨兵的概念来解决这个问题。哨兵不对外提供读写功能,它是监控主从节点的状态,一旦发生主节点故障从而进行选票选出新的master并通知客户端。

shiro redis 架构图 redis架构有几种方式_redis_04

2.1 主观下线

每一个哨兵会有三个定时任务对主节点、从节点、哨兵发送心跳检测,如果这些节点超过阈值没有回复,这个哨兵就会对没有响应的节点做失败判定。这就是主观下线,主观下线有误判的可能。

2.2 客观下线

当主观下线的节点是master时,这个哨兵就会发送命令访问其它哨兵对这个master节点的判断如何,当超过指定个数的哨兵都认为master是有故障的,那么就认为这个master有故障,这就是客观下线。

2.3 故障转移

1.在从节点列表中选出一个节点作为新的master:首先过滤不健康的从节点,然后判断有没有优先级较高的从节点,判断复制偏移量最大的从节点,从中选出。
2.哨兵leader给新选出来的master发送slaveof no one命令,让其成为master。
3.哨兵leader给其它从节点发送命令,让这些从节点成为新master的从节点。

3.集群 Cluster

在Redis3.0版本正式推出Redis Cluster可以达到分布式高可用、负载均衡等作用。

3.1 数据分布理论

3.1.1 节点取模分区

通过缓存数据的特点,使用hash取模的算法决定数据落在哪一个节点。这种方式的好处就是简单快捷。缺点就是没法做动态的扩缩容,会导致数据的迁移等问题。

3.1.2 一致性hash

将系统中每一个节点分布到一个hash环上,读写数据时通过key计算hash值然后顺时针找到大于该hash值的节点。这种方式的好处就是在扩缩容的时候只会影响相邻的节点不会导致全节点的数据迁移问题。
虚拟一致性hash,在一致性hash算法之上,可以加入虚拟节点的概念来优化数据平衡的问题,将每一个真实的节点虚拟化为多个虚拟节点,将虚拟节点随机映射到环上。虚拟节点越多理论上负载就越均衡。

3.1.3 槽分区

Redis使用了槽的概念,它将所有数据映射到一个固定范围的整数集合中,每一个数叫槽,这个槽的范围时大于节点数的。RedisCluster槽的范围最大是16384个。每一个节点负责一部分的槽。例如,集群中有5个节点,每个节点平均复制则三千多个槽。
之所以是16384个槽,是因为集群中每一个节点都会互相通信,如果槽设置过多就会造成通信心跳包的大小过大浪费资源,而一般集群不会有这么多节点,多了就会网络阻塞。Redis内部槽是通过一个bitmap位图形式来保存。

3.2 节点通信

Redis采用Gossip流言协议进行节点元数据的传播,传播过程:
1.集群中每个节点都会开一个端口用于收发元数据信息。
2.每个节点在一定周期内通过一定规则选择几个节点发送心跳命令。
3.接收到心跳消息后,节点会立刻应答。

3.2.1 Gossip协议

Gossip协议的工作原理就是节点之间彼此不断的通信交换数据,一段时间后所有节点就会达到数据的一致性,类似于流言蜚语一样的传播方式。
Gossip协议分为ping消息、pong消息、meet消息、fail消息等。

- ping:最频繁的消息,用于检测节点是否正常在线。
        - pong:接收到ping、meet消息时作为应答。
        - meet:通知新节点的加入消息。
        - fail:有节点下线时的消息。