redis09 集群(cluster)

思维草图

为什么要使用集群

  • 单台redis内存容量的限制
  • 单台redis并发写量太大有性能瓶颈

redis集群认识

redis集群是对redis的水平扩容,即启动N个redis节点,将整个数据分布存储在这个N个节点中,每个节点存储总数据的1/N

如下图:由3台master和3台slave组成的redis集群,每台master承接客户端三分之一请求和写入的数据,当master挂掉后,slave会自动替代master,做到高可用。

配置示例

在一台机器上,用不同的端口进行服务模拟

创建测试目录 redis-cluster,并将默认的redis.conf移动到该目录下

创建master1的配置文件:redis-6379.conf

include /Users/lihui/Documents/dev-tool/redis-cluster/redis.conf
daemonize yes
bind 127.0.0.1
dir /Users/lihui/Documents/dev-tool/redis-cluster/
port 6379
dbfilename dump_6379.rdb
pidfile /Users/lihui/Documents/dev-tool/redis-cluster/var/run/redis_6379.pid
logfile "./6379.log"
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6379.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 15000

创建master2的配置文件:redis-6380.conf

include /Users/lihui/Documents/dev-tool/redis-cluster/redis.conf
daemonize yes
bind 127.0.0.1
dir /Users/lihui/Documents/dev-tool/redis-cluster/
port 6380
dbfilename dump_6380.rdb
pidfile /Users/lihui/Documents/dev-tool/redis-cluster/var/run/redis_6380.pid
logfile "./6380.log"
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6380.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 15000

创建master3的配置文件:redis-6381.conf

include /Users/lihui/Documents/dev-tool/redis-cluster/redis.conf
daemonize yes
bind 127.0.0.1
dir /Users/lihui/Documents/dev-tool/redis-cluster/
port 6381
dbfilename dump_6381.rdb
pidfile /Users/lihui/Documents/dev-tool/redis-cluster/var/run/redis_6381.pid
logfile "./6381.log"
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6381.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 15000

创建slave1的配置文件:redis-6389.conf

include /Users/lihui/Documents/dev-tool/redis-cluster/redis.conf
daemonize yes
bind 127.0.0.1
dir /Users/lihui/Documents/dev-tool/redis-cluster/
port 6389
dbfilename dump_6389.rdb
pidfile /Users/lihui/Documents/dev-tool/redis-cluster/var/run/redis_6389.pid
logfile "./6389.log"
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6389.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 15000

创建slave2的配置文件:redis-6390.conf

include /Users/lihui/Documents/dev-tool/redis-cluster/redis.conf
daemonize yes
bind 127.0.0.1
dir /Users/lihui/Documents/dev-tool/redis-cluster/
port 6390
dbfilename dump_6390.rdb
pidfile /Users/lihui/Documents/dev-tool/redis-cluster/var/run/redis_6390.pid
logfile "./6390.log"
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6390.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 15000

创建slave3的配置文件:redis-6391.conf

include /Users/lihui/Documents/dev-tool/redis-cluster/redis.conf
daemonize yes
bind 127.0.0.1
dir /Users/lihui/Documents/dev-tool/redis-cluster/
port 6391
dbfilename dump_6391.rdb
pidfile /Users/lihui/Documents/dev-tool/redis-cluster/var/run/redis_6391.pid
logfile "./6391.log"
# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6391.conf
# 设置节点失联时间,超过该时间(毫秒),集群自动进行主从切换
cluster-node-timeout 15000

 启动六个redis服务

redis-server /Users/lihui/Documents/dev-tool/redis-cluster/redis-6379.conf
redis-server /Users/lihui/Documents/dev-tool/redis-cluster/redis-6380.conf
redis-server /Users/lihui/Documents/dev-tool/redis-cluster/redis-6381.conf
redis-server /Users/lihui/Documents/dev-tool/redis-cluster/redis-6389.conf
redis-server /Users/lihui/Documents/dev-tool/redis-cluster/redis-6390.conf
redis-server /Users/lihui/Documents/dev-tool/redis-cluster/redis-6391.conf

启动之后

确保每一个node文件生成成功

将6个节点合成一个集群

redis-cli --cluster create --cluster-replicas 1
127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381
127.0.0.1:6389 127.0.0.1:6390 127.0.0.1:6391

注意

  • 合体的命令后面会跟上所有节点的ip:port列表,多个之间用空格隔开,注意ip不要写 127.0.0.1,要写真实ip (我看别的帖子上是这样写的,我自己用127好像可以,但是别学我)
  • --cluster-replicas 1:表示采用最简单的方式配置集群,即每个master配1个slave,6个节点就形成了3主3从

连接集群节点,查看集群信息:cluster nodes

使用 redis-cli -c 命令连接集群中6个节点中任何一个节点都可以,注意和之前的连接参数有点不同 redis-cli 命令后面多了一个 -c 参数,表示采用集群的方式连接,连上以后,然后使用 cluster nodes 可以查看集群节点信息,如下 

集群中的每个节点都会生成一个ID, 这个ID信息会被写到node-xxxx.conf文件中,节点的ip和端口可能会发生变化,但是节点的ID是不会变的,其他节点可以通过其他节点的ID来认识各个节点。

验证集群数据的读写操作

在 6379 上操作的,但是请求被转发到了6380这个节点去处理了。这里报错是因为之前配置没有写密码。

slots(槽) 

  • Redis集群内部划分了16384个slots(插槽),合并的时候,会将每个slots映射到一个master上面。
  • 数据库中的每个key都属于16384个slots中的其中1个,当通过key读写数据的时候,redis需要先根据 key计算出key对应的slots,然后根据slots和master的映射关系找到对应的redis节点,key对应的数据就在这个节点上面。
  • 集群中使用公式 CRC16(key)%16384 计算key属于哪个槽

故障恢复

如果主节点下线,从节点是否能够提升为主节点?

要等15秒,从节点就会自动变成主节点,如果后续之前的主节点恢复,和之前的主从复制一样,也是挂在新节点下,成为从节点。

SpringBoot整合redis集群

引入对应的maven

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置redis cluster信息

# 集群节点(host:port),多个之间用逗号隔开
spring.redis.cluster.nodes=ip:port,ip:port,ip:port,ip:port,ip:port,ip:port
# 连接超时时间(毫秒)
spring.redis.timeout=60000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/512396.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Chain-of-thought prompting(链式思考提示)

1.大模型“涌现”的思维链 最近 AI 大厂的开发人员和高校的 NLP 研究人员&#xff0c;都在琢磨&#xff0c;怎么让大模型“涌现”。 所谓“涌现”&#xff0c;在大模型领域指的是当模型突破某个规模时&#xff0c;性能显著提升&#xff0c;表现出让人惊艳、意想不到的能力。比如…

vue点击按钮同时下载多个文件

点击下载按钮根据需要的id调接口拿到返回需要下载的文件 再看返回的数据结构 数组中一个对象&#xff0c;就是一个文件&#xff0c;多个对象就是多个文件 下载函数 // 下载tableDownload(row) {getuploadInventoryDownload({ sysBatch: row.sysBatch, fileName: row.fileName…

针对conan install下载source失败问题解决

ps:下面操作是Linux系统&#xff0c;针对win操作系统也适合 问题现象 在运行conan install时&#xff0c;本地没有对应的库的缓存&#xff0c;conan会自动从conan center下载&#xff0c;可能会出现以下情况&#xff0c;重试多次&#xff0c;仍然是报错。 libssh2/1.11.0: C…

[项目设计] 从零实现的高并发内存池(三)

&#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[高并发内存池] ❤️ 前置学习专栏&#xff1a;[Linux学习] ⏰ 我们仍在旅途 ​ 目录 4.CentralCache实现 4.1 CentralCache整体架构 4.2 围绕Span的相关设计…

有名信号量、网络协议模型、UDP编程发送端

我要成为嵌入式高手之3月5日Linux高编第十五天&#xff01;&#xff01; ______________________________________________________ 学习笔记 有名信号量 1、创建semget #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget(…

在Vue中根据Url下载地址生成二维码展示在界面上

最近来了一个新需求&#xff0c;就是在网页页面上点击按钮不在是直接下载app安装包&#xff0c;需要支持手机扫码下载app&#xff0c;避免他们需要先从电脑上下载&#xff0c;然后传到微信&#xff0c;然后手机从微信上下载下来&#xff0c;得了&#xff0c;需求就是根据后端传…

TikTok黑屏怎么办?快来试试这5个方法!

当今社交媒体的热潮中&#xff0c;TikTok跨境电商占据了重要的一席之地。然而&#xff0c;频繁的黑屏、app打开没有内容显示却成了许多用户的头疼问题。如果你也正在寻找TikTok黑屏的解决办法&#xff0c;那么本文将为你提供5种可能的解决方案。无论你是在使用TikTok国际版黑屏…

【C++】类和对象终篇

个人主页 &#xff1a; zxctscl 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 友元2.1 友元函数2.2 友元类 3. 内部类4. 匿名对象5. 拷贝对象时的一些编译器优化6. 再次理解类和对象 1. 前言 在上一篇博客中提到了类和对象中的构造函数与stat…

【QT】在窗口中添加按钮

在窗口中添加按钮 创建一个QT程序&#xff0c;首先要做什么&#xff1f; 先创建一个应用程序类创建一个窗口类 在窗口中添加按钮 添加头文件&#xff1a;#include 没有设置按钮标题的函数&#xff0c;是因为它继承了父类&#xff0c;设置标题的函数在父类中。 因为好多子类…

十三、类的继承、访问级别

类的继承与访问控制 类的继承 使用sealed修饰的类&#xff0c;是私有类&#xff0c;不能作为基类使用C#中一个类&#xff0c;只能有一个父类&#xff0c;但是可以实现多个接口子类的访问级别不能超过父类的访问级别 using System; using System.Collections.Generic; using S…

【C语言】【洛谷】P1125笨小猴

一、个人解答 #include<stdio.h> #include<string.h>int prime(int num);int main() {char max a, min z;int maxn0, minn1000;char str[100];int num[26] { 0 };fgets(str, sizeof(str), stdin);str[strcspn(str, "\n")] \0;for (int i 0; str[i]…

CentOS的yum报错except OSError, e:

报错信息 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile base: mirrors.cloud.aliyuncs.comextras: mirrors.cloud.aliyuncs.comupdates: mirrors.cloud.aliyuncs.com File “/usr/libexec/urlgrabber-ext-down”, line 28 except OSError, e: ^…