@@ -4,7 +4,7 @@ redis 集群模式的工作原理能说一下么?在集群模式下,redis
4
4
## 面试官心理分析
5
5
在前几年,redis 如果要搞几个节点,每个节点存储一部分的数据,得** 借助一些中间件** 来实现,比如说有 ` codis ` ,或者 ` twemproxy ` ,都有。有一些 redis 中间件,你读写 redis 中间件,redis 中间件负责将你的数据分布式存储在多台机器上的 redis 实例中。
6
6
7
- 这两年,redis 不断在发展,redis 也不断的有新的版本 ,现在的 redis 集群模式,可以做到在多台机器上,部署多个 redis 实例,每个实例存储一部分的数据,同时每个 redis 实例可以挂 redis 从实例,自动确保说,如果 redis 主实例挂了,会自动切换到 redis 从实例顶上来 。
7
+ 这两年,redis 不断在发展,redis 也不断有新的版本 ,现在的 redis 集群模式,可以做到在多台机器上,部署多个 redis 实例,每个实例存储一部分的数据,同时每个 redis 主实例可以挂 redis 从实例,自动确保说,如果 redis 主实例挂了,会自动切换到 redis 从实例上来 。
8
8
9
9
现在 redis 的新版本,大家都是用 redis cluster 的,也就是 redis 原生支持的 redis 集群模式,那么面试官肯定会就 redis cluster 对你来个几连炮。要是你没用过 redis cluster,正常,以前很多人用 codis 之类的客户端来支持集群,但是起码你得研究一下 redis cluster 吧。
10
10
@@ -23,8 +23,9 @@ redis cluster,主要是针对**海量数据+高并发+高可用**的场景。r
23
23
24
24
### 节点间的内部通信机制
25
25
#### 基本通信原理
26
- - redis cluster 节点间采用 gossip 协议进行通信
27
- 集中式是将集群元数据(节点信息、故障等等)几种存储在某个节点上。集中式元数据集中存储的一个典型代表,就是大数据领域的 ` storm ` 。它是分布式的大数据实时计算引擎,是集中式的元数据存储的结构,底层基于 zookeeper(分布式协调的中间件)对所有元数据进行存储维护。
26
+ 集群元数据的维护有两种方式:集中式、Gossip 协议。redis cluster 节点间采用 gossip 协议进行通信。
27
+
28
+ ** 集中式** 是将集群元数据(节点信息、故障等等)几种存储在某个节点上。集中式元数据集中存储的一个典型代表,就是大数据领域的 ` storm ` 。它是分布式的大数据实时计算引擎,是集中式的元数据存储的结构,底层基于 zookeeper(分布式协调的中间件)对所有元数据进行存储维护。
28
29
29
30
![ zookeeper-centralized-storage] ( /images/zookeeper-centralized-storage.png )
30
31
@@ -34,20 +35,21 @@ redis 维护集群元数据采用另一个方式, `gossip` 协议,所有节
34
35
35
36
** 集中式** 的** 好处** 在于,元数据的读取和更新,时效性非常好,一旦元数据出现了变更,就立即更新到集中式的存储中,其它节点读取的时候就可以感知到;** 不好** 在于,所有的元数据的更新压力全部集中在一个地方,可能会导致元数据的存储有压力。
36
37
37
- gossip 好处在于,元数据的更新比较分散,不是集中在一个地方,更新请求会陆陆续续,打到所有节点上去更新 ,降低了压力;不好在于,元数据的更新有延时,可能导致集群中的一些操作会有一些滞后。
38
+ gossip 好处在于,元数据的更新比较分散,不是集中在一个地方,更新请求会陆陆续续打到所有节点上去更新 ,降低了压力;不好在于,元数据的更新有延时,可能导致集群中的一些操作会有一些滞后。
38
39
39
- - 10000 端口
40
- 每个节点都有一个专门用于节点间通信的端口,就是自己提供服务的端口号+10000,比如 7001,那么用于节点间通信的就是 17001 端口。每个节点每隔一段时间都会往另外几个节点发送 ` ping ` 消息,同时其它几个节点接收到 ` ping ` 之后返回 ` pong ` 。
40
+ - 10000 端口:每个节点都有一个专门用于节点间通信的端口,就是自己提供服务的端口号+10000,比如 7001,那么用于节点间通信的就是 17001 端口。每个节点每隔一段时间都会往另外几个节点发送 ` ping ` 消息,同时其它几个节点接收到 ` ping ` 之后返回 ` pong ` 。
41
41
42
- - 交换的信息
43
- 信息包括故障信息,节点的增加和删除,hash slot 信息 等等。
42
+ - 交换的信息:信息包括故障信息,节点的增加和删除,hash slot 信息等等。
44
43
45
44
#### gossip 协议
46
45
gossip 协议包含多种消息,包含 ` ping ` ,` pong ` ,` meet ` ,` fail ` 等等。
46
+
47
47
- meet:某个节点发送 meet 给新加入的节点,让新节点加入集群中,然后新节点就会开始与其它节点进行通信。
48
+
48
49
``` bash
49
50
redis-trib.rb add-node
50
51
```
52
+
51
53
其实内部就是发送了一个 gossip meet 消息给新加入的节点,通知那个节点去加入我们的集群。
52
54
53
55
- ping:每个节点都会频繁给其它节点发送 ping,其中包含自己的状态还有自己维护的集群元数据,互相通过 ping 交换元数据。
@@ -59,7 +61,7 @@ ping 时要携带一些元数据,如果很频繁,可能会加重网络负担
59
61
60
62
每个节点每秒会执行 10 次 ping,每次会选择 5 个最久没有通信的其它节点。当然如果发现某个节点通信延时达到了 ` cluster_node_timeout / 2 ` ,那么立即发送 ping,避免数据交换延时过长,落后的时间太长了。比如说,两个节点之间都 10 分钟没有交换数据了,那么整个集群处于严重的元数据不一致的情况,就会有问题。所以 ` cluster_node_timeout ` 可以调节,如果调得比较大,那么会降低 ping 的频率。
61
63
62
- 每次 ping,会带上自己节点的信息,还有就是带上 1/10 其它节点的信息,发送出去,进行交换。至少包含 ` 3 ` 个其它节点的信息,最多包含` 总结点- 2` 个其它节点的信息。
64
+ 每次 ping,会带上自己节点的信息,还有就是带上 1/10 其它节点的信息,发送出去,进行交换。至少包含 ` 3 ` 个其它节点的信息,最多包含 ` 总节点数减 2` 个其它节点的信息。
63
65
64
66
### 分布式寻址算法
65
67
- hash 算法(大量缓存重建)
@@ -92,7 +94,7 @@ redis cluster 中每个 master 都会持有部分 slot,比如有 3 个 master
92
94
![ hash-slot] ( /images/hash-slot.png )
93
95
94
96
### redis cluster 的高可用与主备切换原理
95
- redis cluster 的高可用的原理,几乎跟哨兵是类似的
97
+ redis cluster 的高可用的原理,几乎跟哨兵是类似的。
96
98
97
99
#### 判断节点宕机
98
100
如果一个节点认为另外一个节点宕机,那么就是 ` pfail ` ,** 主观宕机** 。如果多个节点都认为另外一个节点宕机了,那么就是 ` fail ` ,** 客观宕机** ,跟哨兵的原理几乎一样,sdown,odown。
0 commit comments