使用Docker快速搭建一套三主三从Redis集群用于开发、测试

文章目录

    • 一 基本概念
    • 二 部署流程
      • 2.1 准备配置文件
      • 2.2 启动6个 Docker 容器
      • 2.3 集群搭建
    • 三 总结
      • 四 参考资料

一 基本概念

Redis集群是一种通过将多个Redis节点连接在一起以实现高可用性、数据分片和负载均衡的技术。它允许Redis在不同节点上同时提供服务,提高整体性能和可靠性。根据搭建的方式和集群的特性,Redis集群主要有三种模式:主从复制模式(Master-Slave)、哨兵模式(Sentinel)和Cluster模式。Cluster模式是Redis的一种高级集群模式,它通过数据分片和分布式存储实现了负载均衡和高可用性。在Cluster模式下,Redis将所有的键值对数据分散在多个节点上。每个节点负责一部分数据,称为槽位。通过对数据的分片,Cluster模式可以突破单节点的内存限制,实现更大规模的数据存储。Redis Cluster将数据分为16384个槽位,每个节点负责管理一部分槽位。当客户端向Redis Cluster发送请求时,Cluster会根据键的哈希值将请求路由到相应的节点。具体来说,Redis Cluster使用CRC16算法计算键的哈希值,然后对16384取模,得到槽位编号。

二 部署流程

2.1 准备配置文件

准备6个配置文件,在当前工作目录创建conf目录,将配置文件放置于conf目录下面。配置文件具体内容如下(IP为搭建主机的本机IP):
第一个配置文件redis-01.conf:

bind 172.31.164.149
port 6001
cluster-enabled yes
cluster-config-file nodes-6001.conf
cluster-node-timeout 5000
appendonly yes
masterauth C*x#1a2b # Master 节点密码
requirepass C*x#1a2b # 集群密码

第二个配置文件redis-02.conf:

bind 172.31.164.149
port 6002
cluster-enabled yes
cluster-config-file nodes-6002.conf
cluster-node-timeout 5000
appendonly yes
masterauth C*x#1a2b
requirepass C*x#1a2b

第三个配置文件redis-03.conf:

bind 172.31.164.149
port 6003
cluster-enabled yes
cluster-config-file nodes-6003.conf
cluster-node-timeout 5000
appendonly yes
masterauth C*x#1a2b
requirepass C*x#1a2b

第四个配置文件redis-04.conf:

bind 172.31.164.149
port 6004
cluster-enabled yes
cluster-config-file nodes-6004.conf
cluster-node-timeout 5000
appendonly yes
masterauth C*x#1a2b
requirepass C*x#1a2b

第五个配置文件redis-05.conf:

bind 172.31.164.149
port 6005
cluster-enabled yes
cluster-config-file nodes-6005.conf
cluster-node-timeout 5000
appendonly yes
masterauth C*x#1a2b
requirepass C*x#1a2b

第六个配置文件redis-06.conf:

bind 172.31.164.149
port 6006
cluster-enabled yes
cluster-config-file nodes-6006.conf
cluster-node-timeout 5000
appendonly yes
masterauth C*x#1a2b
requirepass C*x#1a2b

2.2 启动6个 Docker 容器

docker run -d --restart always --name redis-01 -v ${PWD}/conf/redis-01.conf:/etc/redis-01.conf --net host redis:5.0.8 redis-server /etc/redis-01.conf
docker run -d --restart always --name redis-02 -v ${PWD}/conf/redis-02.conf:/etc/redis-02.conf --net host redis:5.0.8 redis-server /etc/redis-02.conf
docker run -d --restart always --name redis-03 -v ${PWD}/conf/redis-03.conf:/etc/redis-03.conf --net host redis:5.0.8 redis-server /etc/redis-03.conf
docker run -d --restart always --name redis-04 -v ${PWD}/conf/redis-04.conf:/etc/redis-04.conf --net host redis:5.0.8 redis-server /etc/redis-04.conf
docker run -d --restart always --name redis-05 -v ${PWD}/conf/redis-05.conf:/etc/redis-05.conf --net host redis:5.0.8 redis-server /etc/redis-05.conf
docker run -d --restart always --name redis-06 -v ${PWD}/conf/redis-06.conf:/etc/redis-06.conf --net host redis:5.0.8 redis-server /etc/redis-06.conf

2.3 集群搭建

进入其中一个节点:

docker exec -it redis-01 bash

输入以下命令,IP为搭建主机的本地IP:

redis-cli -a 'C*x#1a2b' --cluster create 172.31.164.149:6001 172.31.164.149:6002 172.31.164.149:6003 172.31.164.149:6004 172.31.164.149:6005 172.31.164.149:6006 --cluster-replicas 1

待通信完成后,查看集群信息。显示内容如下则搭建成功:

172.31.164.149:6001> 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
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:308
cluster_stats_messages_pong_sent:313
cluster_stats_messages_sent:621
cluster_stats_messages_ping_received:313
cluster_stats_messages_pong_received:308
cluster_stats_messages_received:621

查看集群节点信息:

172.31.164.149:6001> cluster nodes
2c3e75ba9ba690330fe12f644dee245536ae03c8 172.31.164.149:6005@16005 slave a917ef7525101f73e5b72b49ec4158a613c02bbc 0 1702455066301 5 connected
a917ef7525101f73e5b72b49ec4158a613c02bbc 172.31.164.149:6002@16002 master - 0 1702455066502 2 connected 5461-10922
a0238143b17860ae51a80096a0a7418f3f30d964 172.31.164.149:6001@16001 myself,master - 0 1702455066000 1 connected 0-5460
99902aacf4a2d697d000d123d16663ce0fe84428 172.31.164.149:6004@16004 slave a0238143b17860ae51a80096a0a7418f3f30d964 0 1702455067304 4 connected
05c3ff9b8316e22a2dd241642fac37f9a291fb8f 172.31.164.149:6003@16003 master - 0 1702455066101 3 connected 10923-16383
589515d5cc3c9ee9458daf7b719a6e6ee3f3b405 172.31.164.149:6006@16006 slave 05c3ff9b8316e22a2dd241642fac37f9a291fb8f 0 1702455066000 6 connected

三 总结

1、目前使用容器部署Docker仅能使用host这种网络模式,其他模式暂未实验成功,如果有了解的小伙伴欢迎赐教;
2、使用host网络模式部署集群是因为Redis除了节点暴露端口之外,还有需要开放一个集群总线端口,官网说明:Every Redis Cluster node requires two open TCP connections: a Redis TCP port used to serve clients, e.g., 6379, and second port known as the cluster bus port. By default, the cluster bus port is set by adding 10000 to the data port (e.g., 16379); however, you can override this in the cluster-port configuration;
3、需要注意的是:本文使用一台主机部署6个节点的集群,仅用于开发、测试环境,一般不用于生产环境。如需在多台主机部署集群,请根据实际情况对IP和端口进行规划,但需确保各主机之间能够正常通信。

四 参考资料

1、Scale with Redis Cluster

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

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

相关文章

智能优化算法应用:基于白鲸算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于白鲸算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于白鲸算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.白鲸算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

实践干货 | CodeWave如何支持多人协作开发应用

在传统软件开发领域里,要完成具备一定复杂程度的软件,通常都会由一个研发团队协作开发。软件复杂度越大,研发团队的规模也就越大。 为了让研发团队能够高效的进行协同开发,业务引入了优秀的代码版本管理工具,比如传统软…

C语言union联合体(共用体)

一、定义 联合体(共用体)是一种特殊的自定义的数据类型,它包含一系列的成员变量,这些成员变量共用一块内存空间。 语法: union 标识符 { data_type 标识符1; data_type 标识符2; . . . dat…

linux面试题 Java工程师、C++工程师、iOS工程师、安卓工程师、运维工程师、PHP工程师、安全工程师、2020、golang工程师等面试可用

下列有关const限定符说法错误的是: A. 可以将一个非const对象的地址赋给一个指向const对象的指针B. 可以将一个非const对象的地址赋给一个指向非const对象的指针C. 一个const对象不可以被多次赋值D. 通过const对象指针可以改变全局const对象内容 正确答案&#xff1…

华为OD机试-内存冷热标记(JavaPythonJs)100%通过率

题意 现代计算机系统中通常存在多级的存储设备,针对海量workload的优化的一种思路是将热点内存页优先放到快速存储层级,这就需要对内存页进行冷热标记。 一种典型的方案是基于内存页的访问频次进行标记,如果统计窗口内访问次数大于等于设定闽值,则认为是热内存页,否则是冷…

第18节:Vue3 数组和集合的注意事项

在UniApp中使用Vue3框架时,处理数组和集合需要注意以下几点: 数组和集合的初始化:在Vue3中,可以使用ref()函数来创建一个响应式引用对象,然后使用该引用来初始化数组或集合。例如: import { ref } from vu…

【数组Array】力扣-5 最长回文子串

目录 题目描述 题解labuladong 题目描述 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s "babad" 输出:"bab"…

MySQL:JSON语法说明

一、SELECT JSON_OVERLAPS([5261,5265], [5265,5278,1000]) -- 0不存在 1存在(比较两个数组是否有匹配) 二、SELECT JSON_CONTAINS([1,2,3,4,5,6,7], CAST(4 AS CHAR)) -- key是字符串类型(比较字符串是否在数组中存在) 三、JSON_EXTRACT(eas.question_…

在javaweb项目中resource目录和webapp目录的区别

resource存放的是一些配置文件,这些文件一般都是与java代码相关的配置文件,比如这里的jdbc配置文件,在java中可以使用这个目录下的文件,不用写全路径 webapp存放的是web的资源文件,如jsp,html,css,js文件,在网页请求会…

Golang 链表的创建和读取 小记

文章目录 链表的相关知识链表的创建:模拟方式建立链表的**递归创建** 链表的读取遍历读取递归读取 完整代码 链表的相关知识 链表有时会具有头节点,头节点的指针指向第一个节点的地址,其本身的数据域可以根据自己的选择进行赋值   接下来我将以将int转…

【NSX-T】5. 搭建NSX-T环境 —— NSX架构基础配置

目录 5. 准备 NSX 基础架构5.1 准备工作5.2 创建传输域(1)创建 Overlay 传输域(2)创建 VLAN 传输域 5.3 创建 IP 池5.4 准备 ESXi 主机 参考资料 5. 准备 NSX 基础架构 5.1 准备工作 vCenter 中已存在 DVS。 为 NSX-T 创建两个 …

计算机毕业设计 基于Web的城市旅游网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

css中2D/3D的变化

变换可以改变元素的位置、大小、旋转、倾斜等属性,以创建各种动态效果。 一、常用的2D变换: 平移(translate):使用 translate() 函数来改变元素的位置。可以指定水平和垂直方向的偏移量,如 transform: tra…

【RabbitMQ高可用集群架构】

文章目录 一、保证RabbitMQ服务高可用1.RabbitMQ如何保证消息安全2、搭建普通集群3、搭建镜像集群 RabbitMQ如何保证消息不丢失1、RabbitMQ消息零丢失方案:1》生产者保证消息正确发送到RibbitMQ2》 RabbitMQ消息存盘不丢消息3》 RabbitMQ 主从消息同步时不丢消息4》…

ARM I2C通信

1.概念 I2C总线是PHLIPS公司在八十年代初推出的一种串行的半双工同步总线,主要用于连接整体电路2.IIC总线硬件连接 1.IIC总线支持多主机多从机,但是在实际开发过程中,大多数采用单主机多从机模式 2.挂接到IIC总线上,每个从机设备都…

现代雷达车载应用——第2章 汽车雷达系统原理 2.4节 雷达波形和信号处理

经典著作,值得一读,英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.4 雷达波形和信号处理 对于连续波雷达来说,波形决定了其基本信号处理流程以及一些关键功能。本节将以FMCW波形为例,讨论信号…

EasyRecovery2024苹果电脑mac破解版安装包下载

EasyRecovery是一款操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序,它不会往源驱上写任何东西,也不会对源驱做任何改变。它支持从各种各样的存储介质恢复删除或者丢失的文件,其支持的媒体介质包括:硬盘驱动器、光驱、…

VS Code串口监视插件Serial Monitor

文章目录 初步使用参数设置VS Code插件 初步使用 Serial Monitor,即串行监视器,提供串口和TCP协议的通信监控功能。在插件栏搜索安装之后,按下Ctrl打开终端,终端界面会多出一个串行监视器选项卡,进入之后,…

golang反射(reflect)虽爽,但很贵

标准库 reflect 为 Go 语言提供了运行时动态获取对象的类型和值以及动态创建对象的能力。反射可以帮助抽象和简化代码,提高开发效率。 但是使用反射势必会多出大量的操作指令,导致性能下降 案例 字段赋值方式对比 type Student struct {Name string…

如何使用 Redis 快速实现分布式锁?

本文我们来讨论如何使用 Redis 快速实现分布式锁。 分布式锁有很多种解决方案,前面简单介绍过,Redis 可以通过 set key 方式来实现分布式锁,但实际情况要更加复杂,比如如何确保临界资源的串行执行,如何及时释放&#…