[博学谷学习记录]超强总结,用心分享|架构 Redis高可用之Redis Cluster(集群)

文章内容是学习过程中的知识总结,如有纰漏,欢迎指正

文章目录

前言

一、 Cluster概念

二、故障转移

三、集群分片策略

四、Redis 集群的数据分片

五、搭建Redis Cluster

总结


前言

主从 + 哨兵 问题分析

(1)在主从 + 哨兵模式中,仍然只有一个Master节点。当并发写请求较大时,哨兵模式并不能缓解写压力

(2) 在Redis Sentinel模式中,每个节点需要保存全量数据,冗余比较多


以下是本篇文章正文内容

一、 Cluster概念

从3.0版本之后,官方推出了Redis Cluster,它的主要用途是实现数据分片(Data Sharding),不过同样可以实现HA(高可用),是官方当前推荐的方案。

 

1.Redis-Cluster采用无中心结构

2.只有当集群中的大多数节点同时fail整个集群才fail。

3.整个集群有16384个slot,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。读取一个key时也是相同的算法。

4.当主节点fail时从节点会升级为主节点,fail的主节点online之后自动变成了从节点

二、故障转移

Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移。

三、集群分片策略

Redis-cluster分片策略,是用来解决key存储位置的

常见的数据分布的方式:顺序分布、哈希分布、节点取余哈希、一致性哈希..

 

四、Redis 集群的数据分片

Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念.

预设虚拟槽,每个槽就相当于一个数字,有一定范围

Redis Cluster中预设虚拟槽的范围为0到16383

 

步骤:

1.把16384槽按照节点数量进行平均分配,由节点进行管理

2.对每个key按照CRC16规则进行hash运算

3.把hash结果对16383进行取余

4.把余数发送给Redis节点

5.节点接收到数据,验证是否在自己管理的槽编号的范围

  • 如果在自己管理的槽编号范围内,则把数据保存到数据槽中,然后返回执行结果
  • 如果在自己管理的槽编号范围外,则会把数据发送给正确的节点,由正确的节点来把数据保存在对应的槽中

需要注意的是:Redis Cluster的节点之间会共享消息,每个节点都会知道是哪个节点负责哪个范围内的数据槽

虚拟槽分布方式中,由于每个节点管理一部分数据槽,数据保存到数据槽中。当节点扩容或者缩容时,对数据槽进行重新分配迁移即可,数据不会丢失。

五、搭建Redis Cluster

步骤分析:

  • 启动节点:将节点以集群方式启动,此时节点是独立的。
  • 节点握手:将独立的节点连成网络。
  • 槽指派:将16384个槽位分配给主节点,以达到分片保存数据库键值对的效果。
  • 主从复制:为从节点指定主节点。

步骤实现

启动节点

(1)新建目录,并拷贝出6个节点的配置文件

mkdir redis-cluster
mkdir 900{1,2,3,4,5,6}

 (2)将redis.conf重命名为redis-cluster.conf,依次拷贝到每个900X目录内,并修改每个900X目录下的redis-cluster.conf配置文件:

以集群方式启动
# cluster-enabled yes     将前面的 # 去掉

集群节点nodes信息配置文件(是自动生成的) 
# cluster-config-file nodes-6379.conf  
修改为  
cluster-config-file "/usr/local/redis/cluster/nodes-9001.conf" # 对应各个端口

(3)启动6个Redis实例

 查看进程:

节点握手&槽指派&主从复制 

redis5.0使用redis-cli作为创建集群的命令,使用c语言实现,不再使用ruby语言。

1)有了实例后,搭建集群非常简单,使用redis-cli一行命令即可

#replicas表示副本数,如果指定1则表示1个从库做备用
redis-cli --cluster create 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003 --cluster-replicas 1

参数解释: –cluster-replicas 1:表示希望为集群中的每个主节点创建一个从节点(一主一从)。 –cluster-replicas 2:表示希望为集群中的每个主节点创建两个从节点(一主二从)。

2)备注:如果节点上有数据,可能会有错误提示:

[ERR] Node 127.0.0.1:9004 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

删除dump.rdb,nodes.conf,登录redis-cli,flushdb即可

3)如果没问题,将收到集群创建成功的消息:

>>> 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 127.0.0.1:9001)
M: a085dd0366e08d4c03093ea24351ce4e12fcb69f 127.0.0.1:9001
   slots:[0-5460] (5461 slots) master
M: 843d8da882f78d3cb09b1eb837140aefba309e06 127.0.0.1:9002
   slots:[5461-10922] (5462 slots) master
M: 043d39422d93ef5c7c69e1c6cfb1557f655b5d72 127.0.0.1:9003
   slots:[10923-16383] (5461 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

集群验证

用redis-cli在服务器上set多个值,比如code,分别在不同的实例上,分片成功!

1)cluster命令验证

#使用redis-cli登录任意节点,使用cluster nodes可以查看集群信息
127.0.0.1:9001> cluster nodes
39c613372129fe80fe93b6fb3070f9562c315a59 127.0.0.1:9001@18082 master - 0 1615193645000 2 connected 5461-10922
725c09c568cb4010afe84d5cb4672fff5a248879 127.0.0.1:9002@18083 master - 0 1615193645976 3 connected 10923-16383
9fad54e90628814c1b2a5b57c2ad22b92f0f7b05 127.0.0.1:9003@18081 myself,master - 0 1615193644000 1 connected 0-5460

2)使用key值和数据验证

#注意,redis-cli参数:
# -c : 自动重定向到对应节点获取信息,如果不加,只会返回重定向信息,不会得到值

#不加 -c
[root@ src]# redis-cli -p 9001
127.0.0.1:9001> set a a
(error) MOVED 15495 127.0.0.1:9003

#加上 -c
[root@ src]# redis-cli -p 9001 -c
127.0.0.1:9001> set a a
-> Redirected to slot [15495] located at 127.0.0.1:9003    #自动跳到9003
OK
127.0.0.1:9003> get a    #可以成功get到a的值
"a"

扩容

1)按上面方式,新起一个redis , 9004端口

#第一个参数是新节点的地址,第二个参数是任意一个已经存在的节点的IP和端口
redis-cli --cluster add-node 127.0.0.1:9004 127.0.0.1:9001

2)使用redis-cli登录任意节点,使用cluster nodes查看新集群信息

127.0.0.1:9001> cluster nodes
#注意!新加进来的这个18084是空的,没有分配片段
eb49056da71858d58801f0f28b3d4a7b354956bc 127.0.0.1:9004@18084 master - 0 1602665893207 0 connected
16a3f8a4be9863e8c57d1bf5b3906444c1fe2578 127.0.0.1:9003@18082 master - 0 1602665891204 2 connected 5461-10922
214e4ca7ece0ceb08ad2566d84ff655fb4447e19 127.0.0.1:9002@18083 master - 0 1602665892000 3 connected 10923-16383
864c3f763ab7264ef0db8765997be0acf428cd60 127.0.0.1:9001@18081 myself,master - 0 1602665890000 1 connected 0-5460

3)重新分片

redis-cli --cluster reshard 127.0.0.1:9001

redis-cli --cluster reshard 127.0.0.1:9001  --cluster-from 
10ac7df576168e7f6ec86b20b249e02b1fc13a25,43284b05c5a359b28507b49c29a49637f1f6312b,02a79c59682b7c05f13d41e46e814fc792fa2c50 --cluster-to 07e3416aba80cfb8a8ef81d27228559e5a9d6415 --cluster-slots 1024
#根据提示一步步进行,再次查看node分片,可以了!
127.0.0.1:8081> cluster nodes
eb49056da71858d58801f0f28b3d4a7b354956bc 127.0.0.1:9004@18084 master - 0 1602666306047 4 connected 0-332 5461-5794 10923-11255
16a3f8a4be9863e8c57d1bf5b3906444c1fe2578 127.0.0.1:9003@18082 master - 0 1602666305045 2 connected 5795-10922
214e4ca7ece0ceb08ad2566d84ff655fb4447e19 127.0.0.1:9002@18083 master - 0 1602666305000 3 connected 11256-16383
864c3f763ab7264ef0db8765997be0acf428cd60 127.0.0.1:9001@18081 myself,master - 0 1602666303000 1 connected 333-5460

4)平衡哈希槽

为了保证redis哈希槽的在每一个节点的均衡,需要对哈希槽进行均衡

redis-cli --cluster rebalance 127.0.0.1:9001

总结

  • 1.Redis-Cluster采用无中心结构
  • 2.只有当集群中的大多数节点同时fail整个集群才fail。
  • 3.整个集群有16384个slot,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。读取一个key时也是相同的算法。
  • 4.当主节点fail时从节点会升级为主节点,fail的主节点online之后自动变成了从节点
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值