前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis Cluster模式

Redis Cluster模式

作者头像
用户10384376
发布2023-02-26 13:02:16
5710
发布2023-02-26 13:02:16
举报
文章被收录于专栏:码出code码出code

Cluster(官方推荐)集群

主从模式和哨兵模式数据库都存储了相同的数据,比较浪费内存。而且当数据量增加时,在单个数据库上很难实现在线扩容。Redis Cluster将数据分布存储在不同的节点上,每个节点存储不同的数据。添加节点就能解决扩容问题。

Redis Cluster翻译就是Redis集群,Redis集群提供分布式解决方案,通过分片将数据拆分到不同的节点上,并提供复制和故障转移功能。使用了水平扩展的方法,将数据分发到不同的数据库中。

每个虚线圆都表示一个节点,每个节点都有一个主数据库和多个从数据库。任意两个节点都是相同的(三个节点画图容易误以为是一个环,四个节点容易理解),节点之间都共享数据。

分片集群原理

Redis分片集群,使用了一种类似于一致性哈希的分片技术——哈希槽,每个键都有一个哈希槽的值,Redis 集群有16384个哈希嘈,对键的CRC16取模16384计算出哈希槽,以此决定放置的哈希嘈的位置。

Redis集群中每个节点都负责一部分哈希嘈,比如,集群有三个节点,其中:

  • 节点 A 包含 0 到 5460 号哈希槽
  • 节点 B 包含 5461 到 10922 号哈希槽
  • 节点 C 包含 10923 到 16383 号哈希槽

数据根据哈希嘈分配到不同的数据库中,实现数据的分片。这里添加或者减少一个节点就比较容易了。比如,我想添加一个新的节点D,需要将节点A、B、C一部分数据移动到节点D中。而删除一个节点A,就将原来A节点的数据分发到其它节点上。

Redis集群主从模式

为了保证高可用,Redis Cluster也使用了主从模式。节点(上图虚线圆)宕机了,就无法提供继续数据服务了。当节点引入主从模式后,主服务宕机之后,从服务器升级成主服务。但是如果一个节点的所有主从服务服务都宕机了,该节点就无法提供数据服务了。

集群模式搭建

最小集群必须最少包含三个节点,这里部署使用三个主节点,三个从节点。一共有六个配置文件,端口分别是7001、7002、7003、7004、7005、7006

复制redis.conf配置文件命名redis_7001.conf,修改以下字段:

代码语言:javascript
复制
# 端口
port 7001
# 启用集群模式
cluster-enabled yes
# 保存其他节点的名称、状态等信息,命名和端口保持一致
cluster-config-file nodes_7001.conf
logfile "redis_7001.log"
daemonize yes
protected-mode no 

其他五个文件分别复制redis_7001.conf文件,文件名分别是:

  • redis_7002.conf
  • redis_7003.conf
  • redis_7004.conf
  • redis_7005.conf
  • redis_7006.conf

根据文件名修改修改portcluster-config-filelogfile三个属性,比如redis_7002.conf的配置修改以下字段:

代码语言:javascript
复制
port 7001
cluster-config-file nodes_7002.conf
logfile "redis_7002.log"

其他配置文件也修改成对应文件名的字段。

启动redis节点:

代码语言:javascript
复制
bin/redis-server redis_7001.conf &
bin/redis-server redis_7002.conf &
bin/redis-server redis_7003.conf &
bin/redis-server redis_7004.conf &
bin/redis-server redis_7005.conf &
bin/redis-server redis_7006.conf 

然后查看redis进程:

代码语言:javascript
复制
[root@localhost redis]# ps -ef|grep redis
root     24783     1  0 Nov15 ?        00:07:53 bin/redis-server 0.0.0.0:7001 [cluster]
root     24792     1  0 Nov15 ?        00:07:50 bin/redis-server 0.0.0.0:7002 [cluster]
root     24805     1  0 Nov15 ?        00:07:53 bin/redis-server 0.0.0.0:7003 [cluster]
root     24816     1  0 Nov15 ?        00:07:49 bin/redis-server 0.0.0.0:7004 [cluster]
root     24821     1  0 Nov15 ?        00:07:53 bin/redis-server 0.0.0.0:7005 [cluster]
root     24830     1  0 Nov15 ?        00:07:50 bin/redis-server 0.0.0.0:7006 [cluster]

--cluster-replicas 1 参数表示创建一个主节点同时也创建一个从节点。

创建redis集群:

代码语言:javascript
复制
redis-cli --cluster 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
代码语言:javascript
复制
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
Adding replica 127.0.0.1:7006 to 127.0.0.1:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 9f8616c497aeb89e065c9ed7e260a13a499078eb 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
M: 1064be46f6001390b47308fcb90832cb5eff3256 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
M: c862b3f74904891972debe055edee66d08563f6c 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
S: 51fa3d61cd6075d8a179ec5402c3d6771592d524 127.0.0.1:7004
   replicates c862b3f74904891972debe055edee66d08563f6c
S: f2a18a3fd5f7097888f31cbbc3878f26699ecd09 127.0.0.1:7005
   replicates 9f8616c497aeb89e065c9ed7e260a13a499078eb
S: 004d9acf71c448d93c8b3211f1fd132dd47cd5e9 127.0.0.1:7006
   replicates 1064be46f6001390b47308fcb90832cb5eff3256
Can I set the above configuration? (type 'yes' to accept): 

可以看到启动六个节点,三个主节点 Master,三个从节点 Slave,以及他们之间的主从关系。六个节点,每个节点都生成一个唯一的编码。

输入yes

最后有以下输出,表示集群搭建成功:

代码语言:javascript
复制
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

测试集群

登录客户端需要带上参数-c表示集群环境,否则只能获取单个节点的数据。

先在7001添加数据

代码语言:javascript
复制
bin/redis-cli -p 7001
redis 127.0.0.1:7001> set name jeremy
OK

然后在7002获取数据:

代码语言:javascript
复制
bin/redis-cli -p 7002
redis 127.0.0.1:7002> get name
-> Redirected to slot [5798] located at 127.0.0.1:7001
OK
127.0.0.1:7001> get name
"jeremy"

7002获取数据,redis集群会根据key计算哈希槽的位置,算出数据在7001节点,重定向到7001节点获取数据。

  • 添加新节点

添加一个新节点,一般是添加一个空节点,将其他节点数据移动该节点数据库中。实现数据库的扩容。

代码语言:javascript
复制
bin/redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7001

将新节点地址为第一个参数,集群中随机一个节点地址为第二个参数。上面的命令的表示将新节点127.0.0.1:7006添加到127.0.0.1:7001所在的集群中。

  • 删除节点
代码语言:javascript
复制
bin/redis-cli --cluster del-node 127.0.0.1:7001

集群模式的优缺点

  • 优点
    • 具有高可用,哨兵模式的优点,他都有
    • 数据分片,不重复存储数据,占内存小
    • 容易实现扩容和缩容

总结

  • Cluster模式
    • Redis集群有16384个哈希嘈,对键的CRC16取模16384计算出哈希槽。
    • 集群使用分片,使用节点方式,将哈希槽分布在每个节点上。也就讲数据分布存储上不同的节点上。
    • 为了保证服务的高可用,每个节点都可以搭建主从。
    • 数据库扩容需要添加节点,从新计算哈希嘈,将其他数据库的数据,转移到新节点上。也可以删除节点实现数据库的缩容,删除节点后,该节点的数据也会根据哈希嘈分配到其他节点上。

参考

  • Scaling with Redis Cluster https://redis.io/docs/management/scaling
  • 你了解 Redis 的三种集群模式吗? https://segmentfault.com/a/1190000022808576
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码出code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Cluster(官方推荐)集群
    • 分片集群原理
      • Redis集群主从模式
        • 集群模式搭建
          • 测试集群
            • 集群模式的优缺点
            • 总结
            • 参考
            相关产品与服务
            云数据库 Redis
            腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档