【2023】Redis cluster集群模式搭建

news2024/11/19 23:24:11

目录

  • 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入门与实战

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每个程序员都必须知道的8种通用数据结构

8种常用数据结构 数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作。数据结构在计算机科学和软件工程领域具有广泛而多样的用途。 几乎所有已开发的程序或软件系统都使用数据结构。此外,数据结构属于计算机科学和…

GitOps多环境部署问题及解决方案

大型组织应用GitOps难免会遇到在多环境中部署的问题,本文分析了应用环境分支策略会遇到到问题,介绍了应用文件夹策略解决这些问题的方案。原文:Stop Using Branches for Deploying to Different GitOps Environments[1], How to Model Your G…

STC8比较器功能案例介绍

STC8比较器功能案例介绍 📌相关篇《STC8功能脚切换相关寄存器P_SW1和P_SW2以及MCLKOCR介绍》 📋基于内部参考电压源,使用外部端口P3.7作为比较器正极输入源,比较器结果输出到P3.4 或者P4.1(由P_SW2 中的CMPO_S 进行设定…

Oracle的最高认证并不是OCM,而是......

什么是Oracle数据库的最高认证呢?大家注意,不是Oracle OCM,而是Oracle高可用大师认证,全称叫:Maxium Availability Certified Master,要获得这一张证书,你需要同时有5个认证。 关于博主&#x…

Prompt 用法大全!让 ChatGPT 更智能的六种策略(中)

如果遵循以下六种策略来构建 Prompt 提示词,在和 ChatGPT 对话中我们将获得更好、更符合我们要求的回答。 这些策略,后几种更适合在编程调用 ChatGPT API 时使用,不过也适用直接和 ChatGPT 对话,让它更好的理解我们的意图。 1、写…

8.DIY可视化-拖拽设计1天搞定主流小程序-小程序首页幻灯片显示

小程序首页幻灯片显示 本教程均在第一节中项目启动下操作 小程序首页幻灯片显示前言一、添加组件: 图片轮播公告图文菜单二. 绑定幻灯片数据接口三:首页绑定接口数据:1.绑定字段 四.导出源码,解压后,导入hbulider,运行查看效果1.导出源码:2.解压,导入hbuilder 五.运行查看效果对…

Ae:蒙版插值面板

Ae菜单:窗口/蒙版插值 Mask Interpolation 蒙版插值Mask Interpolation面板可用于自动创建蒙版路径 Mask Path属性的关键帧,从而实现更平滑逼真的路径动画。 至少选择 2 个连续的蒙版路径关键帧后,智能蒙版插值将基于面板上的选项设置创建中间…

Qt5.12.6配置Android Arm开发环境(Linux)

1.安装jdk 2.安装android studio 3.安装sdk 与ndk 设置代理 安装SDK工具 安装SDK Platform 安装QT 选择JDK 1.8安装路径,SDK与NDK路径 如出现Platform SDK或者Platform Build Tools未安装,点击Update Installed 配置成功后可看到ARMv7与AMD-v8a kits Qt Version也可看到ARM…

既然有了HTTP,为什么还要RPC?

文章目录 HTTP和RPC区别RPC(Remote Procedure Call)服务流行的RPC框架 HTTP服务Restful RPC接口和HTTP接口的区别与联系传输协议传输效率性能消耗负载均衡服务治理(下游服务新增,重启,下线时如何不影响上游调用者&…

Java012——Java引用数据类型String的简单学习

回顾Java数据类型 本次要学习的是Java引用数据类型String 一、对String类简单说明 说明:String是Java中的一个类 二、String类的作用 作用:主要用来创建和操作字符串。 三、使用String类 3.1、创建字符串 注意: 1、字符串使用双引号&qu…

基于Springboot+vue+协同过滤+前后端分离+鲜花商城推荐系统(用户,多商户,管理员)+全套视频教程

基于Springbootvue协同过滤前后端分离鲜花商城推荐系统(用户,多商户,管理员)(毕业论文11000字以上,共33页,程序代码,MySQL数据库) 代码下载: 链接:https://pan.baidu.com/s/1mf2rsB_g1DutFEXH0bPCdA 提取码:8888 【运行环境】Idea JDK1.8 Maven MySQL…

【网络原理】TCP/IP协议五层模型

🥊作者:一只爱打拳的程序猿,Java领域新星创作者,CSDN、阿里云社区优质创作者。 🤼专栏收录于:计算机网络原理 本期讲解协议、OSI七层模型、TCP/IP五层模型、网络设备所在的分层、数据的封装和分佣。 目录 …

Linux基础内容(22)—— 信号

Linux基础内容(21)—— 进程消息队列和信号量_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130770830?spm1001.2014.3001.5501 目录 1.定义 1.介绍 2.解释 例子 操作系统信号 实现的大致思路 2.信号的产生方式 …

【C语言】计算含多种运算符的表达式

计算含多种运算符的表达式 引入运算符的优先级算术表达式的运算规则引例例题 引入 诸如下面这些表达式,它的计算过程,计算顺序是怎样的?计算结果为多少? 今天我们就一起来解决一下这个问题吧! 运算符的优先级 解决…

6.数据结构期末复习之查找和排序1

概念 静态查找: 无插入和删除 动态查找: 边插入删除边查找静态和动态查找的实现方式 1.线性表: 静态查 2.树表(二叉排序树)动态查 3.散列表 静态动态都可以查找: 集合中查找满足条件的数据关键码 1.主关键码:可以表标识数据唯一性 2.次关键码: 不能标识查找效率: 比较次数决定的…

八、进程程序替换

文章目录 一、进程程序替换(一)概念(二)为什么程序替换(三)程序替换的原理(四)如何进行程序替换1. execl2. 引入进程创建——子进程执行程序替换,会不会影响父进程呢? &…

PDF 内容替换器软件工具 PDF Replacer Pro Crack

PDF 内容替换器软件工具 批量查找和替换 PDF 中的指定文本 PDF Replacer 是一款 Windows 软件程序,可在 PDF 文件中查找指定的单词或短语文本并替换为新文本,并保持 PDF 布局不变。 Windows 7/Win 8/Win 10 或更高版本(32/64 位) …

devart ADO.NET Data Providers 2023

ADO.NET Data Providers 2023 dotConnect 开发与数据相关的 .NET 应用程序的终极解决方案,具有 ORM 支持的快速灵活综合功能丰富的 ADO.NET 提供程序 ADO.NET 数据提供者 高性能 ADO.NET 数据提供程序 dotConnect 是一个增强的数据连接解决方​​案,它建立在 ADO.N…

为什么齐次线性方程组有非零解的充要条件是D=0

下面是对这两个定理的解释: 定理1:如果是齐次线性方程组(方程个数未知量个数),且系数行列式D不等于0,则只有0解; 定理2:若齐次线性方程组(方程个数未知量个数&#xff…

C语言---形参所导致的段错误

前言 今天刷B站&#xff0c;无意之间看到一个宣称90%人都会错的嵌入式面试题。感兴趣就看了一下。卡了十多分钟才想明白&#xff0c;只是一个小知识点&#xff0c;但还是分享一下。 题目 #include <stdio.h> #include <stdlib.h> #include <string.h>void g…