1
1
## 面试题
2
- redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?
2
+ Redis 集群模式的工作原理能说一下么?在集群模式下,Redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?
3
3
4
4
## 面试官心理分析
5
5
6
- 在前几年,redis 如果要搞几个节点,每个节点存储一部分的数据,得** 借助一些中间件** 来实现,比如说有 ` codis ` ,或者 ` twemproxy ` ,都有。有一些 redis 中间件,你读写 redis 中间件,redis 中间件负责将你的数据分布式存储在多台机器上的 redis 实例中。
6
+ 在前几年,Redis 如果要搞几个节点,每个节点存储一部分的数据,得** 借助一些中间件** 来实现,比如说有 ` codis ` ,或者 ` twemproxy ` ,都有。有一些 Redis 中间件,你读写 Redis 中间件,Redis 中间件负责将你的数据分布式存储在多台机器上的 Redis 实例中。
7
7
8
- 这两年,redis 不断在发展,redis 也不断有新的版本,现在的 redis 集群模式,可以做到在多台机器上,部署多个 redis 实例,每个实例存储一部分的数据,同时每个 redis 主实例可以挂 redis 从实例,自动确保说,如果 redis 主实例挂了,会自动切换到 redis 从实例上来。
8
+ 这两年,Redis 不断在发展,Redis 也不断有新的版本,现在的 Redis 集群模式,可以做到在多台机器上,部署多个 Redis 实例,每个实例存储一部分的数据,同时每个 Redis 主实例可以挂 Redis 从实例,自动确保说,如果 Redis 主实例挂了,会自动切换到 Redis 从实例上来。
9
9
10
- 现在 redis 的新版本,大家都是用 redis cluster 的,也就是 redis 原生支持的 redis 集群模式,那么面试官肯定会就 redis cluster 对你来个几连炮。要是你没用过 redis cluster,正常,以前很多人用 codis 之类的客户端来支持集群,但是起码你得研究一下 redis cluster 吧。
10
+ 现在 Redis 的新版本,大家都是用 Redis cluster 的,也就是 Redis 原生支持的 Redis 集群模式,那么面试官肯定会就 Redis cluster 对你来个几连炮。要是你没用过 Redis cluster,正常,以前很多人用 codis 之类的客户端来支持集群,但是起码你得研究一下 Redis cluster 吧。
11
11
12
- 如果你的数据量很少,主要是承载高并发高性能的场景,比如你的缓存一般就几个 G,单机就足够了,可以使用 replication,一个 master 多个 slaves,要几个 slave 跟你要求的读吞吐量有关,然后自己搭建一个 sentinel 集群去保证 redis 主从架构的高可用性。
12
+ 如果你的数据量很少,主要是承载高并发高性能的场景,比如你的缓存一般就几个 G,单机就足够了,可以使用 replication,一个 master 多个 slaves,要几个 slave 跟你要求的读吞吐量有关,然后自己搭建一个 sentinel 集群去保证 Redis 主从架构的高可用性。
13
13
14
- redis cluster,主要是针对** 海量数据+高并发+高可用** 的场景。redis cluster 支撑 N 个 redis master node,每个 master node 都可以挂载多个 slave node。这样整个 redis 就可以横向扩容了。如果你要支撑更大数据量的缓存,那就横向扩容更多的 master 节点,每个 master 节点就能存放更多的数据了。
14
+ Redis cluster,主要是针对** 海量数据+高并发+高可用** 的场景。Redis cluster 支撑 N 个 Redis master node,每个 master node 都可以挂载多个 slave node。这样整个 Redis 就可以横向扩容了。如果你要支撑更大数据量的缓存,那就横向扩容更多的 master 节点,每个 master 节点就能存放更多的数据了。
15
15
16
16
## 面试题剖析
17
17
18
- ### redis cluster 介绍
18
+ ### Redis cluster 介绍
19
19
20
20
* 自动将数据进行分片,每个 master 上放一部分数据
21
21
* 提供内置的高可用支持,部分 master 不可用时,还是可以继续工作的
22
22
23
- 在 redis cluster 架构下,每个 redis 要放开两个端口号,比如一个是 6379,另外一个就是 加1w 的端口号,比如 16379。
23
+ 在 Redis cluster 架构下,每个 Redis 要放开两个端口号,比如一个是 6379,另外一个就是 加1w 的端口号,比如 16379。
24
24
25
25
16379 端口号是用来进行节点间通信的,也就是 cluster bus 的东西,cluster bus 的通信,用来进行故障检测、配置更新、故障转移授权。cluster bus 用了另外一种二进制的协议, ` gossip ` 协议,用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间。
26
26
27
27
### 节点间的内部通信机制
28
28
29
29
#### 基本通信原理
30
- 集群元数据的维护有两种方式:集中式、Gossip 协议。redis cluster 节点间采用 gossip 协议进行通信。
30
+ 集群元数据的维护有两种方式:集中式、Gossip 协议。Redis cluster 节点间采用 gossip 协议进行通信。
31
31
32
32
** 集中式** 是将集群元数据(节点信息、故障等等)几种存储在某个节点上。集中式元数据集中存储的一个典型代表,就是大数据领域的 ` storm ` 。它是分布式的大数据实时计算引擎,是集中式的元数据存储的结构,底层基于 zookeeper(分布式协调的中间件)对所有元数据进行存储维护。
33
33
34
34
![ zookeeper-centralized-storage] ( ./images/zookeeper-centralized-storage.png )
35
35
36
- redis 维护集群元数据采用另一个方式, ` gossip ` 协议,所有节点都持有一份元数据,不同的节点如果出现了元数据的变更,就不断将元数据发送给其它的节点,让其它节点也进行元数据的变更。
36
+ Redis 维护集群元数据采用另一个方式, ` gossip ` 协议,所有节点都持有一份元数据,不同的节点如果出现了元数据的变更,就不断将元数据发送给其它的节点,让其它节点也进行元数据的变更。
37
37
38
- ![ redis -gossip] ( ./images/redis-gossip.png )
38
+ ![ Redis -gossip] ( ./images/redis-gossip.png )
39
39
40
40
** 集中式** 的** 好处** 在于,元数据的读取和更新,时效性非常好,一旦元数据出现了变更,就立即更新到集中式的存储中,其它节点读取的时候就可以感知到;** 不好** 在于,所有的元数据的更新压力全部集中在一个地方,可能会导致元数据的存储有压力。
41
41
@@ -52,7 +52,7 @@ gossip 协议包含多种消息,包含 `ping` , `pong` , `meet` , `fail` 等
52
52
* meet:某个节点发送 meet 给新加入的节点,让新节点加入集群中,然后新节点就会开始与其它节点进行通信。
53
53
54
54
``` bash
55
- redis -trib.rb add-node
55
+ Redis -trib.rb add-node
56
56
```
57
57
58
58
其实内部就是发送了一个 gossip meet 消息给新加入的节点,通知那个节点去加入我们的集群。
@@ -73,7 +73,7 @@ ping 时要携带一些元数据,如果很频繁,可能会加重网络负担
73
73
74
74
* hash 算法(大量缓存重建)
75
75
* 一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡)
76
- * redis cluster 的 hash slot 算法
76
+ * Redis cluster 的 hash slot 算法
77
77
78
78
#### hash 算法
79
79
@@ -93,19 +93,19 @@ ping 时要携带一些元数据,如果很频繁,可能会加重网络负担
93
93
94
94
![ consistent-hashing-algorithm] ( ./images/consistent-hashing-algorithm.png )
95
95
96
- #### redis cluster 的 hash slot 算法
96
+ #### Redis cluster 的 hash slot 算法
97
97
98
- redis cluster 有固定的 ` 16384 ` 个 hash slot,对每个 ` key ` 计算 ` CRC16 ` 值,然后对 ` 16384 ` 取模,可以获取 key 对应的 hash slot。
98
+ Redis cluster 有固定的 ` 16384 ` 个 hash slot,对每个 ` key ` 计算 ` CRC16 ` 值,然后对 ` 16384 ` 取模,可以获取 key 对应的 hash slot。
99
99
100
- redis cluster 中每个 master 都会持有部分 slot,比如有 3 个 master,那么可能每个 master 持有 5000 多个 hash slot。hash slot 让 node 的增加和移除很简单,增加一个 master,就将其他 master 的 hash slot 移动部分过去,减少一个 master,就将它的 hash slot 移动到其他 master 上去。移动 hash slot 的成本是非常低的。客户端的 api,可以对指定的数据,让他们走同一个 hash slot,通过 ` hash tag ` 来实现。
100
+ Redis cluster 中每个 master 都会持有部分 slot,比如有 3 个 master,那么可能每个 master 持有 5000 多个 hash slot。hash slot 让 node 的增加和移除很简单,增加一个 master,就将其他 master 的 hash slot 移动部分过去,减少一个 master,就将它的 hash slot 移动到其他 master 上去。移动 hash slot 的成本是非常低的。客户端的 api,可以对指定的数据,让他们走同一个 hash slot,通过 ` hash tag ` 来实现。
101
101
102
102
任何一台机器宕机,另外两个节点,不影响的。因为 key 找的是 hash slot,不是机器。
103
103
104
104
![ hash-slot] ( ./images/hash-slot.png )
105
105
106
- ### redis cluster 的高可用与主备切换原理
106
+ ### Redis cluster 的高可用与主备切换原理
107
107
108
- redis cluster 的高可用的原理,几乎跟哨兵是类似的。
108
+ Redis cluster 的高可用的原理,几乎跟哨兵是类似的。
109
109
110
110
#### 判断节点宕机
111
111
@@ -131,4 +131,4 @@ redis cluster 的高可用的原理,几乎跟哨兵是类似的。
131
131
132
132
#### 与哨兵比较
133
133
134
- 整个流程跟哨兵相比,非常类似,所以说,redis cluster 功能强大,直接集成了 replication 和 sentinel 的功能。
134
+ 整个流程跟哨兵相比,非常类似,所以说,Redis cluster 功能强大,直接集成了 replication 和 sentinel 的功能。
0 commit comments