【2023】Redis cluster集群模式搭建

目录

  • 1.cluster集群介绍
  • 2.搭建cluster集群
    • 2.1.架构图
    • 2.2.搭建集群
      • 2.2.1.创建所需配置文件
      • 2.2.2.创建集群所需容器
      • 2.2.3.创建集群:master1节点连接其他节点
      • 2.2.4.配置从节点,完成三主三从
  • 3.在cluster集群内读写数据

1.cluster集群介绍

Redis Cluster是Redis提供的一种分布式方案,可以将数据分散到多个节点上进行存储和处理,提高数据的可用性和性能。Redis Cluster采用哈希槽的方式来分片数据,将整个数据集分为16384个哈希槽,每个节点负责一部分哈希槽的数据存储和处理,节点之间通过gossip协议进行信息交换和数据同步,从而实现高可用和负载均衡。

Redis Cluster支持自动节点发现和故障转移,当节点出现故障或者添加新节点时,集群会自动进行重新分片和数据迁移,保证数据的一致性和可用性。同时,Redis Cluster还提供了一些监控和管理工具,方便管理人员进行集群的管理和维护。

优点:

  • 高性能,高可用,可扩展的分布式解决方案

2.搭建cluster集群

2.1.架构图

在这里插入图片描述

2.2.搭建集群

2.2.1.创建所需配置文件

  • /data/redis/redisConf目录下创建创建节点所需要的配置文件

master1,文件名:clusterMaster1.conf

port 6379
dir "/redisConfig"
logfile "clusterMaster1.log"
cluster-enabled yes
cluster-config-file nodes-6379.conf

以上配置:

第一行:指定端口
第二、三行:指定日志路径和文件名
第四行:开启cluster集群模式并加入集群
第五行:cluster集群相关的配置文件,该文件会自动生成

master2,文件名:clusterMaster2.conf

port 6380
dir "/redisConfig"
logfile "clusterMaster2.log"
cluster-enabled yes
cluster-config-file nodes-6380.conf

master3,文件名:clusterMaster3.conf

port 6381
dir "/redisConfig"
logfile "clusterMaster3.log"
cluster-enabled yes
cluster-config-file nodes-6381.conf

slave1,文件名:clusterSlave1.conf

port 16379
dir "/redisConfig"
logfile "clusterSlave1.log"
cluster-enabled yes
cluster-config-file nodes-16379.conf

slave2,文件名:clusterSlave2.conf

port 16380
dir "/redisConfig"
logfile "clusterSlave2.log"
cluster-enabled yes
cluster-config-file nodes-16380.conf

slave3,文件名:clusterSlave3.conf

port 16381
dir "/redisConfig"
logfile "clusterSlave3.log"
cluster-enabled yes
cluster-config-file nodes-16381.conf

2.2.2.创建集群所需容器

  • 容器master1-3,slave1-3创建命令
docker run -itd --name redisMaster1 -v /data/redis/redisConf:/redisConfig:rw -p 6379:6379 redis:6.0 redis-server /redisConfig/clusterMaster1.conf
docker run -itd --name redisMaster2 -v /data/redis/redisConf:/redisConfig:rw -p 6380:6380 redis:6.0 redis-server /redisConfig/clusterMaster2.conf
docker run -itd --name redisMaster3 -v /data/redis/redisConf:/redisConfig:rw -p 6381:6381 redis:6.0 redis-server /redisConfig/clusterMaster3.conf
docker run -itd --name redisSlave1 -v /data/redis/redisConf:/redisConfig:rw -p 16379:16379 redis:6.0 redis-server /redisConfig/clusterSlave1.conf
docker run -itd --name redisSlave2 -v /data/redis/redisConf:/redisConfig:rw -p 16380:16380 redis:6.0 redis-server /redisConfig/clusterSlave2.conf
docker run -itd --name redisSlave3 -v /data/redis/redisConf:/redisConfig:rw -p 16381:16381 redis:6.0 redis-server /redisConfig/clusterSlave3.conf
  • 打开master1节点的nodes文件,可以看到如下信息
[root@localhost redisConf]# cat nodes-6379.conf 
57adbc5123224d7510712906e7fb853b179ca88b :0@0 myself,master - 0 0 0 connected
vars currentEpoch 0 lastVoteEpoch 0

内容为该容器为主节点,只连接了自身,没有其他节点

  • 通过docker inspect查看得知,容器IP分别为172.17.0.2-7

2.2.3.创建集群:master1节点连接其他节点

  • 进入到master1节点容器,连接其他节点
[root@localhost ~]# docker exec -it redisMaster1 /bin/bash
root@a6ee8fb2d3f5:/data# redis-cli -p 6379 cluster meet 172.17.0.3 6380
OK
root@a6ee8fb2d3f5:/data# redis-cli -p 6379 cluster meet 172.17.0.4 6381
OK
root@a6ee8fb2d3f5:/data# redis-cli -p 6379 cluster meet 172.17.0.5 16379
OK
root@a6ee8fb2d3f5:/data# redis-cli -p 6379 cluster meet 172.17.0.6 16380
OK
root@a6ee8fb2d3f5:/data# redis-cli -p 6379 cluster meet 172.17.0.7 16381
OK
  • 连接master1服务器,查看集群状态
root@a6ee8fb2d3f5:/data# redis-cli
127.0.0.1:6379> cluster info
cluster_state:fail
cluster_known_nodes:6
  • 为三个主节点分配哈希槽

为master1注入哈希槽

root@a6ee8fb2d3f5:/redisConfig# for i in $(seq 0 5460);do /usr/local/bin/redis-cli -h 172.17.0.2 -p 6379 CLUSTER ADDSLOTS $i;done

为master2注入哈希槽(进入容器内部执行)

for i in $(seq 5461 10922);do /usr/local/bin/redis-cli -h 172.17.0.3 -p 6380 CLUSTER ADDSLOTS $i;done

为master3注入哈希槽(进入容器内部执行)

for i in $(seq 10923 16383);do /usr/local/bin/redis-cli -h 172.17.0.4 -p 6381 CLUSTER ADDSLOTS $i;done
  • 回到master1容器内部查看集群状态
root@a6ee8fb2d3f5:/data# redis-cli
127.0.0.1:6379> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6

可以看到集群运行正常,16384个哈希槽也分配完成

2.2.4.配置从节点,完成三主三从

  • 在master1容器内查看各节点id
127.0.0.1:6379> CLUSTER nodes
9357e7ff8892533ea056a52bef836f811d57b27a 172.17.0.7:16381@26381 master - 0 1686132119000 5 connected
28d44b6219bb1b29e032c7ed1d89f5fc4b1331db 172.17.0.6:16380@26380 master - 0 1686132121109 4 connected
930cdb19e676169c4c1bc155408efa6876236fae 172.17.0.5:16379@26379 master - 0 1686132122117 3 connected
57adbc5123224d7510712906e7fb853b179ca88b 172.17.0.2:6379@16379 myself,master - 0 1686132119000 1 connected 0-5460
86b66441b357d59c68660eb09f3d9bb20ea99346 172.17.0.4:6381@16381 master - 0 1686132120000 2 connected 10923-16383
f4e9388ae47aff89a9512e39c88eea4a5ecfa4b0 172.17.0.3:6380@16380 master - 0 1686132121000 0 connected 5461-10922

知道id后就可以进行主从关系配置

  • 进入到slave1容器内部,进行配置
[root@localhost ~]# docker exec -it redisSlave1 /bin/bash
root@1f8209b74008:/data# redis-cli -p 16379
127.0.0.1:16379> cluster replicate 57adbc5123224d7510712906e7fb853b179ca88b
OK
  • 进入到slave2容器内部,进行配置
[root@localhost ~]# docker exec -it redisSlave2 /bin/bash
root@90692280afb4:/data# redis-cli -p 16380
127.0.0.1:16380> cluster replicate f4e9388ae47aff89a9512e39c88eea4a5ecfa4b0
OK
  • 进入到slave3容器内部,进行配置
[root@localhost ~]# docker exec -it redisSlave3 /bin/bash
root@2906e497f3d4:/data# redis-cli -p 16381
127.0.0.1:16381> cluster replicate 86b66441b357d59c68660eb09f3d9bb20ea99346
OK
  • 查看集群状态
127.0.0.1:16381> cluster nodes
930cdb19e676169c4c1bc155408efa6876236fae 172.17.0.5:16379@26379 slave 57adbc5123224d7510712906e7fb853b179ca88b 0 1686132676594 1 connected
86b66441b357d59c68660eb09f3d9bb20ea99346 172.17.0.4:6381@16381 master - 0 1686132678000 2 connected 10923-16383
f4e9388ae47aff89a9512e39c88eea4a5ecfa4b0 172.17.0.3:6380@16380 master - 0 1686132676000 0 connected 5461-10922
28d44b6219bb1b29e032c7ed1d89f5fc4b1331db 172.17.0.6:16380@26380 slave f4e9388ae47aff89a9512e39c88eea4a5ecfa4b0 0 1686132678611 0 connected
57adbc5123224d7510712906e7fb853b179ca88b 172.17.0.2:6379@16379 master - 0 1686132677601 1 connected 0-5460
9357e7ff8892533ea056a52bef836f811d57b27a 172.17.0.7:16381@26381 myself,slave 86b66441b357d59c68660eb09f3d9bb20ea99346 0 1686132675000 2 connected

至此集群内三主三从的工作已完成

3.在cluster集群内读写数据

  • 在当前的slave3容器创建数据测试
127.0.0.1:16381> set name 'zhangsan'
(error) MOVED 5798 172.17.0.3:6380

报错,内容是这个键应该放在172.17.0.3:6380的5798哈希槽内

  • +c参数进行正常写入
root@2906e497f3d4:/data# redis-cli -p 16381 -c
127.0.0.1:16381> set name 'zhangsan'
-> Redirected to slot [5798] located at 172.17.0.3:6380
OK
  • 这个时候在172.17.0.3节点上可以查看到数据
[root@localhost ~]# docker exec -it redisMaster2 /bin/bash
root@aa2cb23a71c1:/data# redis-cli -p 6380
127.0.0.1:6380> get name
"zhangsan"

如果当该节点故障无法使用,该键回设置到其他节点上,实现故障自动恢复的效果。

本节内容到此为止,内容总结自基于docker的redis入门与实战

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[C++]异常笔记

我不怕练过一万种腿法的对手,就怕将一种腿法 练一万次的对手。 什么是C的异常 在C中,异常处理通常使用try-catch块来实现。try块用于包含可能会抛出异常的代码,而catch块用于捕获并处理异常。当异常被抛出时,程序会跳过try块中未执行…

【ABAP】数据类型(二)「预定义数据类型」

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言A…

一文读懂 Mysql MVCC

💕💕 推荐:体系化学习Java(Java面试专题) 文章目录 1、什么是 MVCC2、什么是当前读、快照读3、MVCC 具体解决什么问题4、MVCC 的实现原理4.1、4个隐式字段4.2、undo 日志4.3、Read View 5、使用 MVCC 时,需…

【分布式系统与一致性协议】

分布式系统与一致性协议 CAP原理APCPCA总结BASE理论 一致性拜占庭将军问题 分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。 分布式系统的设计目标一般包含如下: 可用性:可用性是分…

JavaSE-04【方法】

文章目录 JavaSE-04【方法】第一章 方法1.1 方法定义的格式详解1.2 方法定义的三要素1.3 方法调用的流程图解1.4 方法定义的有无参数1.5 方法定义的有无返回值 第二章 方法调用方式以及注意事项2.1 方法调用的注意事项2.2 调用方法的三种形式 JavaSE-04【方法】 第一章 方法 …

【华为OD机试真题2023B卷 JAVAJS】评论转换输出

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 评论转换输出 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 在一个博客网站上,每篇博客都有评论。每一条评论都是一个非空英文字母字符串。 评论具有树状结构,除了根评论外,每个评论都有一个父评论。 当评论保…

再看const成员函数

文章目录 再看函数重载const成员函数保安(const)能保护所有人(类成员)吗?mutable修饰类成员 const/非const成员函数的复用 关于函数重载实际上我理解不是很深入,直接导致const成员函数这块出大问题&#xf…

chatgpt赋能python:Python如何升序输出?从入门到实践!

Python如何升序输出?从入门到实践! 作为一门高级编程语言,Python是目前应用广泛且最为流行的一门语言之一。它逐渐成为开发者的首选语言,因为它易学易用,可读性强,支持多种编程范式,提供了强大…

【MySQL 数据库】9、存储过程

目录 一、存储过程是什么二、存储过程的基本语法三、MySQL 中的变量(1) 系统变量(2) 用户自定义变量(3) 局部变量 四、if 判断五、参数传递和返回值六、case 语句七、while 循环八、repeat 循环九、loop 循环十、游标十一、条件处理程序 一、存储过程是什么 🌱 存储…

Java反射与注解

文章目录 一、 注解1.简介2. 元注解3. 自定义注解 二、 反射1. 简介2. 理解Class类并获取Class实例3. 类的加载与初始化4. 类加载器ClassLoader5. 获取运行时类的完整结构6. 动态创建对象执行方法7. 反射操作泛型8. 反射操作注解 一、 注解 1.简介 Annotation是JDK5.0开始引入…

第二章 搭建TS环境

搭建 TypeScript 的开发环境。一个舒适、便捷且顺手的开发环境,不仅能大大提高学习效率,也会对我们日常的开发工作有很大帮助。 这一节我们就来介绍 VS Code 下的 TypeScript 环境搭建:插件以及配置项。对于 TS 文件的执行,我们会…

《横向联邦学习中 PCA差分隐私数据发布算法》论文算法原理笔记

论文地址:https://www.arocmag.com/article/01-2022-01-041.html 论文摘要 为了让不同组织在保护本地敏感数据和降维后发布数据隐私的前提下,联合使用 PCA进行降维和数据发布,提出横向联邦 PCA差分隐私数据发布算法。引入随机种子联合协商方…

linuxOPS基础_linux软件包安装

软件包概述 上图是windows下的软件包 Linux下也有很多可以安装的软件,而这些软件的安装包可细分为两种,分别是源码包和二进制包。 Linux下软件的安装方式 ① RPM软件包安装 > 软件名称.rpm ② YUM包管理工具 > yum install 软件名称 -y ③ 源码…

基于QGIS的长株潭城市群边界范围融合实战

背景 在面向区域的研究过程中,比如一些研究区域,如果是具体的行政区划,比如具体的某省或者某市或者县,可以直接从国家官方的地理数据中直接下载就可以。但如果并没有直接的空间数据那怎么办呢?比如之前遇到的一个场景&…

【郭东白架构课 模块二:创造价值】31 |节点六: 如何组织阶段性的价值交付?

你好,我是郭东白。上节课我们讲了为什么要做阶段性的价值交付,以及进入阶段性价值交付环节的准备工作。有了这些学习基础,这节课我们就可以进行阶段性价值交付了。 在交付的过程中,主要有三部分工作:目标分解、定义交…

数据结构——堆(C语言实现)

文章目录 什么是堆堆的实现堆的结构定义堆的初始化接口堆的销毁接口堆的插入数据接口向上调整建堆接口判断堆是否为空堆的删除数据接口向下调整建堆接口获取堆顶数据获取堆的有效数据个数完整实现代码小结 堆排序堆排序的实现 关于建堆和堆排序时间复杂度的分析向下调整建堆向上…

day52|动态规划13-子序列问题

子序列系列问题 300.最长递增子序列 什么是递增子序列: 元素之间可以不连续,但是需要保证他们所在位置是元素在数组中的原始位置。 dp数组dp[i]表示以nums[i]为结尾的最长递增子序列的长度。递归函数:dp[i] max(dp[j]1,dp[j])初始化条件&…

算法刷题-链表-移除链表元素

链表操作中,可以使用原链表来直接进行删除操作,也可以设置一个虚拟头结点再进行删除操作,接下来看一看哪种方式更方便。 203.移除链表元素 力扣题目链接 题意:删除链表中等于给定值 val 的所有节点。 示例 1: 输入&…

Linux下信号量使用总结

目录 1.Linux下信号量简介 2.POSIX信号量 2.1 无名信号量 2.2 有名信号量 3.System V信号量 1.Linux下信号量简介 信号量是解决进程之间的同步与互斥的IPC机制,互斥与同步关系存在的症结在于临界资源。 临界资源是在同一个时刻只容许有限个(一般只有…

【数据结构与算法】03 队列(顺序队列--循环队列--优先级队列--链队列)

一、概念1.1 队列的基本概念1.2 队列的顺序存储结构1.21 顺序队列(静态队列)1.22 循环队列1.23 优先级队列 1.3 队列的链式存储结构 二、C语言实现2.1 顺序存储2.11 顺序队列2.12 循环队列2.13 优先级队列 2.2 链式存储 一、概念 1.1 队列的基本概念 队…