Redis Cluster 介绍
创建时间:
字数:1.4k
Redis 的高可用策略包括持久化,复制,哨兵和集群,本文讲解redis的集群。主从复制+哨兵的架构适合数据量比较小的场景,数据量受到master节点的约束,但如果是海量数据,就要考虑多master+多slave的架构,Redis提供的Cluster就是应用在这样的需要灵活扩展集群容量的场景下。
Redis Cluster 介绍
Redis Cluster 是Redis提供的一个分布式存储方案,它可以自动将数据进行分片,每个master放一部分数据,实现海量存储,它提供了高可用机制,不需要手动配置复制、哨兵就可以实现故障转移,配置更新。 Redis Cluster 模式下,每个Redis会开放两个端口,比如一个是6379,一个是16379,前者用来对外提供服务,后者用于节点间通信,完成故障发现和转移。
数据分布算法介绍
原始的 hash 算法
这种算法是根据节点数量对key
取模,然后存到相应的节点,这种算法很不可取,因为一旦有一个节点的故障了,大部分数据就要重新取模写入缓存,这是不能接受的。
一致性 hash
- 想象有一个圆环,计算每个节点的hash值后放置到圆环上
- 当有一个
key
要存储的时候,就计算key
的hash值并放置在圆环上,然后顺时针去找到距离最近的节点存储
- 当某一个节点宕机的时候,这个节点上的请求就会转移到下一个节点。
这样的算法优点是只有宕机节点中的数据会受到影响,缺点是容易造成单节点瓶颈。
虚拟节点:
针对普通一致性哈希算法的缺点,引入了虚拟节点,其含义如图所示,对每个节点都做了均匀的分布,这个每个区间的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" 转载请保留原文链接及作者。