Redis Cluster 介绍

Redis 的高可用策略包括持久化,复制,哨兵和集群,本文讲解redis的集群。主从复制+哨兵的架构适合数据量比较小的场景,数据量受到master节点的约束,但如果是海量数据,就要考虑多master+多slave的架构,Redis提供的Cluster就是应用在这样的需要灵活扩展集群容量的场景下。

Redis Cluster 介绍

Redis Cluster 是Redis提供的一个分布式存储方案,它可以自动将数据进行分片,每个master放一部分数据,实现海量存储,它提供了高可用机制,不需要手动配置复制、哨兵就可以实现故障转移,配置更新。 Redis Cluster 模式下,每个Redis会开放两个端口,比如一个是6379,一个是16379,前者用来对外提供服务,后者用于节点间通信,完成故障发现和转移。

数据分布算法介绍

原始的 hash 算法

这种算法是根据节点数量对key取模,然后存到相应的节点,这种算法很不可取,因为一旦有一个节点的故障了,大部分数据就要重新取模写入缓存,这是不能接受的。

一致性 hash

image

  • 想象有一个圆环,计算每个节点的hash值后放置到圆环上
  • 当有一个key要存储的时候,就计算key的hash值并放置在圆环上,然后顺时针去找到距离最近的节点存储
  • 当某一个节点宕机的时候,这个节点上的请求就会转移到下一个节点。

这样的算法优点是只有宕机节点中的数据会受到影响,缺点是容易造成单节点瓶颈。

虚拟节点:
image

针对普通一致性哈希算法的缺点,引入了虚拟节点,其含义如图所示,对每个节点都做了均匀的分布,这个每个区间的key, 就可以均匀的分配到各个节点,这样,当某个节点宕机后,就可以把宕机节点的数据均匀的分布到正常工作的节点

Redis cluster 的 hash solt 算法

redis cluster 有固定的 16384 个 hash slot,当接收到写请求后,会对 key计算CRC16值,然后再对16384取模,这样就可以获取key对应的hash slot。redis cluster 中每个 master 都会持有部分slot,当增加一个master时,就将其他master的hash slot部分移动过去,减少一个master,就将它的hash slot移动到其他master上去。

这样就可以高效的解决节点变化时造成的数据转移开销。

实践演练

配置项说明

配置项 说明
cluster-enabled yes 开启cluster
cluster-config-file 指定一个文件,cluster自动更新集群状态保存在那里,包括集群中其他节点的状态,故障转移
cluster-node-timeout 5000 节点存活超时时长,超时后会被认为宕机并触发主备切换

搭建环境过程

准备节点

cluster 建议最少使用6个节点去搭建环境,其中有三个master和三个salve

这里准备的6个节点的地址为:172.17.0.2 — 172.17.0.7

修改所有节点的配置
1
2
3
4
cluster-enabled yes
cluster-config-file /etc/redis/cluster.conf
cluster-node-timeout 5000
appendonly yes

注意不要配置中不要配置 slave, cluster 会自动管理

启动6个节点
1
redis-server /etc/redis/6379.conf &
查看是否开启 cluster
1
2
3
4
zj@zj-pc:~$ redis-cli -h 172.17.0.2      
172.17.0.2:6379> info cluster
# Cluster
cluster_enabled:1
创建集群

Redis 提供了创建集群的辅助工具 redis-trib.rb,这个工具是ruby编写的且依赖 gem 包 reids,所以先配置ruby环境,并执行 gem install redis

创建集群:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
zj@zj-pc:bin$ redis-trib.rb create --replicas 1 172.17.0.2:6379 172.17.0.3:6379 172.17.0.4:6379 172.17.0.5:6379  172.17.0.6:6379 172.17.0.7:6379
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
172.17.0.2:6379
172.17.0.3:6379
172.17.0.4:6379
Adding replica 172.17.0.6:6379 to 172.17.0.2:6379
Adding replica 172.17.0.7:6379 to 172.17.0.3:6379
Adding replica 172.17.0.5:6379 to 172.17.0.4:6379
M: 2b6e3598a7d0d5610c42a402764a8bd19b2e0b8f 172.17.0.2:6379
slots:0-5460 (5461 slots) master
M: aeb8d6cd17e33b7aa65a0b7c21630aabbcce7da9 172.17.0.3:6379
slots:5461-10922 (5462 slots) master
M: 321427ab1b0c481307468d877faa645949da35f3 172.17.0.4:6379
slots:10923-16383 (5461 slots) master
S: 9adfc49d11550b8acba2cf5c48597849adb29bb6 172.17.0.5:6379
replicates 321427ab1b0c481307468d877faa645949da35f3
S: e55ca5a127cae6a006a400215e559ab66dd94d24 172.17.0.6:6379
replicates 2b6e3598a7d0d5610c42a402764a8bd19b2e0b8f
S: 06244da39a951a856c449fcd5343d86a0c7e2a7e 172.17.0.7:6379
replicates aeb8d6cd17e33b7aa65a0b7c21630aabbcce7da9
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join..
>>> Performing Cluster Check (using node 172.17.0.2:6379)
M: 2b6e3598a7d0d5610c42a402764a8bd19b2e0b8f 172.17.0.2:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 321427ab1b0c481307468d877faa645949da35f3 172.17.0.4:6379
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: aeb8d6cd17e33b7aa65a0b7c21630aabbcce7da9 172.17.0.3:6379
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 9adfc49d11550b8acba2cf5c48597849adb29bb6 172.17.0.5:6379
slots: (0 slots) slave
replicates 321427ab1b0c481307468d877faa645949da35f3
S: e55ca5a127cae6a006a400215e559ab66dd94d24 172.17.0.6:6379
slots: (0 slots) slave
replicates 2b6e3598a7d0d5610c42a402764a8bd19b2e0b8f
S: 06244da39a951a856c449fcd5343d86a0c7e2a7e 172.17.0.7:6379
slots: (0 slots) slave
replicates aeb8d6cd17e33b7aa65a0b7c21630aabbcce7da9
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
常用操作
1
2
3
4
5
6
7
8
# 查看集群信息
redis-trib.rb check <ip:port>
# 添加节点
redis-trib.rb add-node <ip:port> <ip:port>
# 给某个节点转移 hashslot
redis-trib.rb reshard <ip:port>
# 给指定master添加slave
redis-trib.rb add-node --slave --master-id <master-id> <ip:port> <ip:port>

文章标题:Redis Cluster 介绍

文章字数:1.4k

本文作者:Waterandair

发布时间:2018-03-21, 23:38:23

最后更新:2019-12-28, 14:03:59

原始链接:https://waterandair.github.io/2018-03-21-redis-cluster.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

github