Redis集群模式
mhr18 2025-08-05 19:38 8 浏览 0 评论
介绍
sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。
1、集群模式概述
1.1、什么是集群模式
Redis 的哨兵和主从模式基本已经可以实现高可用和读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,浪费内存空间,所以在redis上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,也就是说Redis 节点上存储不同的内容。
1.2、集群模式特点
多个redis节点网络互联,数据共享
所有的节点都是一主一从(也可以是一主多从),其中从节点不提供服务,仅作为备用
不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
支持在线增加、删除节点
客户端可以连接任何一个主节点进行读写
1.3、集群工作方式
数据存取工作方式
在 Redis 的每一个节点上,都有这么两个东西,一个是插槽(slot),一个是cluster。
插槽的取值范围是:0-16383。cluster,可以理解为是一个集群管理的插件。
当我们的存取 Key的时候,Redis 会根据算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
集群工作方式
为了保证高可用,redis集群模式引入了主从模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。
那么如何发现主节点宕机?当其它主节点ping一个主节点C时,如果半数以上的主节点与C通信超时,那么认为主节点C宕机了。如果主节点C和它的从节点C1都宕机了,那么该集群就无法再提供服务了。
2、集群模式的搭建-上
2.1、搭建前的准备
集群搭建:至少要三个master
第一步:创建一个文件夹redis-cluster,然后在其下面分别创建6个文件夹如下:
[root@localhost redis]# mkdir redis-cluster
[root@localhost redis]# cd redis-cluster/
[root@localhost redis-cluster]# mkdir 7001
[root@localhost redis-cluster]# mkdir 7002
[root@localhost redis-cluster]# mkdir 7003
[root@localhost redis-cluster]# mkdir 7004
[root@localhost redis-cluster]# mkdir 7005
[root@localhost redis-cluster]# mkdir 7006
第二步:把之前的redis.conf配置文件分别copy到700*下
[root@localhost redis]# cp redis.conf ./redis-cluster/7001/redis.conf
[root@localhost redis]# cp redis.conf ./redis-cluster/7002/redis.conf
[root@localhost redis]# cp redis.conf ./redis-cluster/7003/redis.conf
[root@localhost redis]# cp redis.conf ./redis-cluster/7004/redis.conf
[root@localhost redis]# cp redis.conf ./redis-cluster/7005/redis.conf
[root@localhost redis]# cp redis.conf ./redis-cluster/7006/redis.conf
第三步:由于redis集群需要使用ruby命令,所以我们需要安装ruby
yum install ruby
yum install rubygems
gem install redis #(安装redis和ruby的接口)
2.2、修改集群配置
[root@localhost redis]# vim
./redis-cluster/7001/redis.conf
#需要修改的配置
daemonize yes
port 700* #(分别对每个机器的端口号进行设置)
bind 192.168.1.171 #(必须要绑定当前机器的ip,不然会无限悲剧下去哇..深坑勿入!!!)
dir
/usr/local/redis-cluster/700*/ #(指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据,深坑勿入!!!)
appendonly yes
cluster-enabled yes #(启动集群模式,开始玩耍)
cluster-config-file nodes700*.conf#(这里700x最好和port对应上)
cluster-node-timeout 5000 #redis节点宕机被发现的时间
注意:
每个文件要修改端口号,bind的ip,数据存放的dir,并且nodes文件都需要进行修改!
2.3、启动redis服务
[root@localhost redis]# ./src/redis-server ./redis-cluster/7001/redis.conf
[root@localhost redis]# ./src/redis-server ./redis-cluster/7002/redis.conf
[root@localhost redis]# ./src/redis-server ./redis-cluster/7003/redis.conf
[root@localhost redis]# ./src/redis-server ./redis-cluster/7004/redis.conf
[root@localhost redis]# ./src/redis-server ./redis-cluster/7005/redis.conf
[root@localhost redis]# ./src/redis-server ./redis-cluster/7006/redis.conf
3、集群模式的搭建-下
3.1、创建集群
执行redis-cli --cluster create命令
[root@localhost redis]# ./src/redis-cli --cluster create 192.168.1.121:7001 192.168.1.121:7002 192.168.1.121:7003 192.168.1.121:7004 192.168.1.121:7005 192.168.1.121:7006 --cluster-replicas 1
说明:
create
表示创建一个redis集群。
--cluster-replicas 1
表示为集群中的每一个主节点指定一个从节点,即一比一的复制。
3.2、查看redis服务状态
[root@localhost redis]# ps -ef|grep redis
3.3、进入一个节点
[root@localhost redis]# ./src/redis-cli -c -h 192.168.1.121 -p 7001
192.168.1.121:7001> info cluster
# Cluster
cluster_enabled:1 #节点是否为cluster模式 。1是0否
3.4、测试操作
[root@localhost redis]# ./src/redis-cli -c -h 192.168.1.121 -p 7005
192.168.1.121:7005> set b fdfsfsd
-> Redirected to slot [3300] located at 192.168.1.121:7001
OK
192.168.1.121:7001> get b
"fdfsfsd"
192.168.1.121:7001> set c fdsfdfdsfds
-> Redirected to slot [7365] located at 192.168.1.121:7002
OK
192.168.1.121:7002> get c
"fdsfdfdsfds"
192.168.1.121:7002> set x fdsfdsfsdf
-> Redirected to slot [16287] located at 192.168.1.121:7003
OK
192.168.1.121:7003> keys *
1) "x"
2) "a"
192.168.1.121:7003> get b
-> Redirected to slot [3300] located at 192.168.1.121:7001
"fdfsfsd"
192.168.1.121:7001> keys *
1) "b"
192.168.1.121:7001> set d fdsfdsfsd
-> Redirected to slot [11298] located at 192.168.1.121:7003
OK
192.168.1.121:7003> get d
"fdsfdsfsd"
192.168.1.121:7003> set x zhangsan
OK
192.168.1.121:7003> get x
"zhangsan"
4、集群操作-上
4.1、主从切换
查看节点信息
[root@localhost redis]# ./src/redis-cli -c -h 192.168.1.121 -p 7001
192.168.1.121:7001> cluster nodes #查看集群中的节点
停掉7003,在查看节点信息
[root@localhost redis]# ps -ef|grep redis
root 31370 1 0 21:04 ? 00:00:05 ./src/redis-server 192.168.1.121:7001 [cluster]
root 31375 1 0 21:04 ? 00:00:05 ./src/redis-server 192.168.1.121:7002 [cluster]
root 31380 1 0 21:04 ? 00:00:05 ./src/redis-server 192.168.1.121:7003 [cluster]
root 31385 1 0 21:05 ? 00:00:05 ./src/redis-server 192.168.1.121:7004 [cluster]
root 31394 1 0 21:05 ? 00:00:05 ./src/redis-server 192.168.1.121:7005 [cluster]
root 31399 1 0 21:05 ? 00:00:05 ./src/redis-server 192.168.1.121:7006 [cluster]
root 32361 2769 0 22:39 pts/0 00:00:00 grep --color=auto redis
[root@localhost redis]# kill -s 9 31380
[root@localhost redis]# ./src/redis-cli -c -h 192.168.1.121 -p 7005
192.168.1.121:7005> cluster nodes
启动7003,查看节点信息
[root@localhost redis]# ./src/redis-server ./redis-cluster/7003/redis.conf
[root@localhost redis]# ./src/redis-cli -c -h 192.168.1.121 -p 7005
192.168.1.121:7005> cluster nodes
4.2、从节点操作
4.2.1、前期准备
准备一个新的Redis,7007
[root@localhost redis]# cd redis-cluster/
[root@localhost redis-cluster]# ls
7001 7002 7003 7004 7005 7006
[root@localhost redis-cluster]# mkdir 7007
[root@localhost redis-cluster]# cp ./7006/redis.conf ./7007/redis.conf
[root@localhost redis-cluster]# cd ..
[root@localhost redis]# vim ./redis-cluster/7007/redis.conf
[root@localhost redis]# ./src/redis-server ./redis-cluster/7007/redis.conf
4.2.2、增加从节点
[root@localhost redis]# ./src/redis-cli --cluster add-node 192.168.1.121:7007 192.168.1.121:7004 --cluster-slave
查看节点信息
[root@localhost redis]# ./src/redis-cli -c -h 192.168.1.121 -p 7005
192.168.1.121:7005> cluster nodes
4.2.3、删除从节点
删除7007节点
[root@localhost redis]# ./src/redis-cli --cluster del-node 192.168.1.121:7007 99d2ceb080ef0d701546dea0901d4784a201fc06
>>> Removing node 99d2ceb080ef0d701546dea0901d4784a201fc06 from cluster 192.168.1.121:7007
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
查看节点信息
[root@localhost redis]# ./src/redis-cli -c -h 192.168.1.121 -p 7005
192.168.1.121:7005> cluster nodes
5、集群操作-中
5.1、主节点操作
5.1.1、添加主节点
将7007设置为7006的主节点
保证7007服务是启动的
[root@localhost redis]# ./src/redis-cli --cluster add-node 192.168.1.121:7007 192.168.1.121:7006
查看节点信息,未分配槽位不能存储数据
[root@localhost redis]# ./src/redis-cli -c -h 192.168.1.121 -p 7005
192.168.1.121:7005> cluster nodes
重新分配槽位
[root@localhost redis]# ./src/redis-cli --cluster reshard 192.168.1.121:7007
查看节点信息
[root@localhost redis]# ./src/redis-cli -c -h 192.168.1.121 -p 7005
192.168.1.121:7005> cluster nodes
5.1.2、给主节点加从节点
准备一个新的Redis,7008
[root@localhost redis]# cd redis-cluster/
[root@localhost redis-cluster]# ls
7001 7002 7003 7004 7005 7006 7007
[root@localhost redis-cluster]# mkdir 7008
[root@localhost redis-cluster]# cp ./7007/redis.conf ./7008/redis.conf
[root@localhost redis-cluster]# vim ./7008/redis.conf
[root@localhost redis-cluster]# cd ..
[root@localhost redis]# ./src/redis-server ./redis-cluster/7008/redis.conf
为7007添加从节点7008
[root@localhost redis]# ./src/redis-cli --cluster add-node 192.168.1.121:7008 192.168.1.121:7007 --cluster-slave
查看节点信息
[root@localhost redis]# ./src/redis-cli -c -h 192.168.1.121 -p 7005
192.168.1.121:7005> cluster nodes
6、集群操作-下
6.1、主节点操作
6.1.1、删除主节点
删除从节点
[root@localhost redis]# ./src/redis-cli --cluster del-node 192.168.1.121:7008 8e52c94dafa72df26b1eddf94363a4780bed9339
>>> Removing node 8e52c94dafa72df26b1eddf94363a4780bed9339 from cluster 192.168.1.121:7008
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
移动数据将7007移动到7001节点
[root@localhost redis]# ./src/redis-cli --cluster reshard 192.168.1.121:7007
查看节点信息
[root@localhost redis]# ./src/redis-cli -c -h 192.168.1.121 -p 7005
192.168.1.121:7005> cluster nodes
删除主节点
[root@localhost redis]# ./src/redis-cli --cluster del-node 192.168.1.121:7007 d7a3e48cd142dce6566023fce21e31669e9fa3d5
>>> Removing node d7a3e48cd142dce6566023fce21e31669e9fa3d5 from cluster 192.168.1.121:7007
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
查看节点信息
[root@localhost redis]# ./src/redis-cli -c -h 192.168.1.121 -p 7005
192.168.1.121:7005> cluster nodes
相关推荐
- 订单超时自动取消业务的 N 种实现方案,从原理到落地全解析
-
在分布式系统架构中,订单超时自动取消机制是保障业务一致性的关键组件。某电商平台曾因超时处理机制缺陷导致日均3000+订单库存锁定异常,直接损失超50万元/天。本文将从技术原理、实现细节、...
- 使用Spring Boot 3开发时,如何选择合适的分布式技术?
-
作为互联网大厂的后端开发人员,当你满怀期待地用上SpringBoot3,准备在项目中大显身手时,却发现一个棘手的问题摆在面前:面对众多分布式技术,究竟该如何选择,才能让SpringBoot...
- 数据库内存爆满怎么办?99%的程序员都踩过这个坑!
-
你的数据库是不是又双叒叕内存爆满了?!服务器监控一片红色警告,老板在群里@所有人,运维同事的电话打爆了手机...这种场景是不是特别熟悉?别慌!作为一个在数据库优化这条路上摸爬滚打了10年的老司机,今天...
- springboot利用Redisson 实现缓存与数据库双写不一致问题
-
使用了Redisson来操作Redis分布式锁,主要功能是从缓存和数据库中获取商品信息,以下是针对并发时更新缓存和数据库带来不一致问题的解决方案1.基于读写锁和删除缓存策略在并发更新场景下,...
- 外贸独立站数据库炸了?对象缓存让你起死回生
-
上周黑五,一个客户眼睁睁看着服务器CPU飙到100%——每次页面加载要查87次数据库。这让我想起2024年Pantheon的测试:Redis缓存能把WooCommerce查询速度提升20倍。跨境电商最...
- 手把手教你在 Spring Boot3 里纯编码实现自定义分布式锁
-
为什么要自己实现分布式锁?你是不是早就受够了引入各种第三方依赖时的繁琐?尤其是分布式锁这块,每次集成Redisson或者Zookeeper,都得额外维护一堆配置,有时候还会因为版本兼容问题头疼半...
- 如何设计一个支持百万级实时数据推送的WebSocket集群架构?
-
面试解答:要设计一个支持百万级实时数据推送的WebSocket集群架构,需从**连接管理、负载均衡、水平扩展、容灾恢复**四个维度切入:连接层设计-**长连接优化**:采用Netty或Und...
- Redis数据结构总结——面试最常问到的知识点
-
Redis作为主流的nosql存储,面试时经常会问到。其主要场景是用作缓存,分布式锁,分布式session,消息队列,发布订阅等等。其存储结构主要有String,List,Set,Hash,Sort...
- skynet服务的缺陷 lua死循环
-
服务端高级架构—云风的skynet这边有一个关于云风skynet的视频推荐给大家观看点击就可以观看了!skynet是一套多人在线游戏的轻量级服务端框架,使用C+Lua开发。skynet的显著优点是,...
- 七年Java开发的一路辛酸史:分享面试京东、阿里、美团后的心得
-
前言我觉得有一个能够找一份大厂的offer的想法,这是很正常的,这并不是我们的饭后谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司...
- mysql mogodb es redis数据库之间的区别
-
1.MySQL应用场景概念:关系型数据库,基于关系模型,使用表和行存储数据。优点:支持ACID事务,数据具有很高的一致性和完整性。缺点:垂直扩展能力有限,需要分库分表等方式扩展。对于复杂的查询和大量的...
- redis,memcached,nginx网络组件
-
1.理解阻塞io,非阻塞io,同步io,异步io的区别2.理解BIO和AIO的区别io多路复用只负责io检测,不负责io操作阻塞io中的write,能写多少是多少,只要写成功就返回,譬如准备写500字...
- SpringBoot+Vue+Redis实现验证码功能
-
一个小时只允许发三次验证码。一次验证码有效期二分钟。SpringBoot整合Redis...
- AWS MemoryDB 可观测最佳实践
-
AWSMemoryDB介绍AmazonMemoryDB是一种完全托管的、内存中数据存储服务,专为需要极低延迟和高吞吐量的应用程序而设计。它与Redis和Memcached相似,但具有更...
- 从0构建大型AI推荐系统:实时化引擎从工具到生态的演进
-
在AI浪潮席卷各行各业的今天,推荐系统正从幕后走向前台,成为用户体验的核心驱动力。本文将带你深入探索一个大型AI推荐系统从零起步的全过程,揭示实时化引擎如何从单一工具演进为复杂生态的关键路径。无论你是...
你 发表评论:
欢迎- 一周热门
-
-
Redis客户端 Jedis 与 Lettuce
-
高并发架构系列:Redis并发竞争key的解决方案详解
-
redis如何防止并发(redis如何防止高并发)
-
Java SE Development Kit 8u441下载地址【windows版本】
-
开源推荐:如何实现的一个高性能 Redis 服务器
-
redis安装与调优部署文档(WinServer)
-
Redis 入门 - 安装最全讲解(Windows、Linux、Docker)
-
一文带你了解 Redis 的发布与订阅的底层原理
-
Redis如何应对并发访问(redis控制并发量)
-
Oracle如何创建用户,表空间(oracle19c创建表空间用户)
-
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle主从同步 (56)
- oracle 乐观锁 (53)
- redis 命令 (83)
- php redis (97)
- redis 存储 (67)
- redis 锁 (74)
- 启动 redis (73)
- redis 时间 (60)
- redis 删除 (69)
- redis内存 (64)
- redis并发 (53)
- redis 主从 (71)
- redis同步 (53)
- redis结构 (53)
- redis 订阅 (54)
- redis 登录 (62)
- redis 面试 (58)
- redis问题 (54)
- 阿里 redis (67)
- redis的缓存 (57)
- lua redis (59)
- redis 连接池 (64)