使用 Docker Compose 部署 Redis Cluster 集群,轻松搭建高可用分布式缓存

news2024/9/22 21:35:54

Redis Cluster(Redis 集群)是 Redis 分布式解决方案的一部分,它旨在提供高可用性、高性能和横向扩展的功能。Redis Cluster 能够将多个 Redis 节点组合成一个分布式集群,实现数据分片和负载均衡,从而确保在大规模应用场景下的稳定性和可靠性。我们这篇文章了将为大家介绍如何使用 docker-compose 搭建 redis 集群。

Redis Cluster 介绍

  • Redis Cluster 介绍将数据划分为多个槽(slot),默认情况下共有 16384 个槽。每个 Redis 节点负责处理其中的一部分槽。当客户端请求访问某个键时,Redis Cluster 会根据键的哈希值决定它应该位于哪个槽,并将请求转发到负责该槽的 Redis 节点上。

  • 在 Redis Cluster 中,每个槽都可以有多个副本,通常有一个主节点和一个或多个从节点。主节点负责处理客户端请求,并将数据同步到从节点上。这样,即使主节点出现故障,系统仍然可以继续工作,从节点可以接管主节点的工作,并保持数据的一致性。Redis Cluster 提供了自动分片和数据复制的机制,无需手动管理数据分片和节点复制。

  • Redis Cluster 使用 Gossip 协议进行节点间的通信,节点之间互相交换信息以保持集群的状态一致性。通过 Gossip 协议,Redis 节点可以动态发现新的节点加入或者节点离开集群,从而实现集群的自动伸缩和高可用性。

  • Redis Cluster 具有良好的扩展性。当数据量增加或请求量增大时,可以简单地增加新的 Redis 节点,并让集群自动重新分片和重新分配槽。这种横向扩展方式能够无缝地增加集群的容量和性能,而无需停机或对现有节点进行复杂的迁移操作。

  • Redis Cluster 具有很强的容错性。即使有部分节点宕机,只要主节点的数量仍然满足半数以上,集群仍然可以继续工作。当集群检测到主节点不可用时,会自动将从节点提升为主节点,确保服务的连续性和可用性。

docker-compose

创建一个 redis-cluster 的文件夹,在其中在创建一个 redis6479 的一个文件夹,在 redis6479 中创建 docker-compose.yml 文件,文件如下:

version: '3.3'
services:
  redis6479:
    network_mode: 'host'
    image: redis
    container_name: redis6479
    restart: always
    logging:
      driver: 'json-file'
      options:
        max-size: '5g'
    volumes:
      - ./data:/data
      - ./redis.conf:/usr/local/etc/redis/redis.conf
      - ./logs:/logs
    command: redis-server /usr/local/etc/redis/redis.conf

我们在这network用的是host模式,redis节点之间通信直接用宿主机的ip即可
我们在这还有一个关于日志的配置

    logging:
      driver: 'json-file'
      options:
        max-size: '5g'

我们的从节点一直会检测主节点的状态,一直输出日志,所以我们在这配置下日志的大小,不然我们的服务器很快就会被日志文件占用很多的磁盘

在 redis6479 下创建 redis.conf 文件

创建脚本部署其他节点

在redis-cluster 下创建脚本 build.sh

#!/bin/bash
cd /home/xiuji/docker/redis-cluster;
cp -r redis6479 redis6579;
sed -i "s/6479/6579/g" /home/xiuji/docker/redis-cluster/redis6579/docker-compose.yml;
sed -i "s/6479/6579/g" /home/xiuji/docker/redis-cluster/redis6579/redis.conf;
cd /home/xiuji/docker/redis-cluster/redis6579;
sudo rm -rf data;
sudo rm -rf logs;
docker-compose up -d;


cd /home/xiuji/docker/redis-cluster;
cp -r redis6479 redis6679;
sed -i "s/6479/6679/g" /home/xiuji/docker/redis-cluster/redis6679/docker-compose.yml;
sed -i "s/6479/6679/g" /home/xiuji/docker/redis-cluster/redis6679/redis.conf;
cd /home/xiuji/docker/redis-cluster/redis6679;
sudo rm -rf data;
sudo rm -rf logs;
docker-compose up -d;

cd /home/xiuji/docker/redis-cluster;
cp -r redis6479 redis6779;
sed -i "s/6479/6779/g" /home/xiuji/docker/redis-cluster/redis6779/docker-compose.yml;
sed -i "s/6479/6779/g" /home/xiuji/docker/redis-cluster/redis6779/redis.conf;
cd /home/xiuji/docker/redis-cluster/redis6779;
sudo rm -rf data;
sudo rm -rf logs;
docker-compose up -d;

cd /home/xiuji/docker/redis-cluster;
cp -r redis6479 redis6879;
sed -i "s/6479/6879/g" /home/xiuji/docker/redis-cluster/redis6879/docker-compose.yml;
sed -i "s/6479/6879/g" /home/xiuji/docker/redis-cluster/redis6879/redis.conf;
cd /home/xiuji/docker/redis-cluster/redis6879;
sudo rm -rf data;
sudo rm -rf logs;
docker-compose up -d;

cd /home/xiuji/docker/redis-cluster;
cp -r redis6479 redis6979;
sed -i "s/6479/6979/g" /home/xiuji/docker/redis-cluster/redis6979/docker-compose.yml;
sed -i "s/6479/6979/g" /home/xiuji/docker/redis-cluster/redis6979/redis.conf;
cd /home/xiuji/docker/redis-cluster/redis6979;
sudo rm -rf data;
sudo rm -rf logs;
docker-compose up -d;

创建好之后给脚本可执行权限,我者直接简单粗暴

chmod -R 777 build.sh

执行脚本

./build.sh

执行成功后我们可以看到多了5个文件夹

_20230801225338.png

查看容器

docker ps -a | grep ‘redis’

_20230801225458.png

可以看到,我们的6个节点已经全部启动了

创建集群

rediscluster默认最少三个主节点,我们在这启动了6个节点,我们创建一个3主3从的集群

在服务器上执行集群创建命令

redis-cli --cluster create 192.168.10.108:6479 192.168.10.108:6579 192.168.10.108:6679 192.168.10.108:6779 192.168.10.108:6879 192.168.10.108:6979 --cluster-replicas 1 -a ‘xj2022’

–cluster-replicas 1:每个主节点下的从节点的数量

-a ‘xj2022’ redis有密码(所有redis设置相同的密码),如果没有密码,则不需要这个参数

执行完之后会出现如下页面

_20230801230123.png

这块了可能会比较久

创建完成之后我们就可以使用如下命令连接到rediscluster 集群了

redis-cli -c -h 192.168.10.108 -p 6479 -a ‘xj2021’ --raw

查看集群状态

cluster nodes

cluster info

测试读写是否正常

set xj ‘修己’

get xj

到此,我们3主3从的cluster集群已经部署完成了

总结

通过 Docker Compose,我们可以快速搭建 Redis 集群,实现高可用性和高性能的分布式缓存。这种部署方式不仅方便,而且易于扩展。希望本文对您理解如何使用 Docker Compose 部署 Redis 集群有所帮助。如果您对 Redis 集群的更多功能和高级配置感兴趣,可以深入研究 Redis 官方文档。https://redis.io/

谢谢阅读!如果您有任何问题或建议,欢迎在评论区留言。

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

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

相关文章

Nacos 下载安装教程

文章目录 事先准备下载并启动 Nacos设置 Nacos 开机自启动开放 Linux 外部访问权限访问 Nacos 管理界面附录 笔者的运行环境: 安装成功过的 Nacos: Nacos 2.2.3 安装成功过的 Java: Java 17.0.7 安装成功过的 Linux: RedHat Ent…

学习Node.js的基础知识和核心概念(全面)

Node.js,这个神奇的技术,融合了前端与后端的力量,让JavaScript在服务器端发挥了异乎寻常的魔力。本文将通过代码和文字解释,全面介绍Node.js的特点,从异步非阻塞I/O到强大的模块系统,再到丰富的包管理和事件…

计算机软件著作权登记申请表-模板

计算机软件著作权登记申请表 软件基本信息 软件全称 Xxxxx软件 软件简称(如无则不填) 分类号 说明:在附件图1-计算机软件分类代码表中提供的分类编号选择填写 计算机软件分类代码(单选) 30104 计算机软件适用的国民经济代…

C++学习day--17 二级指针、数组指针、指针数组

1、二级指针 二级指针的定义: 二级指针也是一个普通的指针变量,只是它里面保存的值是另外一个一级指针的地址 int guizi1 888; int *guizi2 &guizi1; //1 级指针,保存 guizi1 的地址 int **liujian &guizi2; //2 级指针&a…

操作系统使用免密登录

服务器免密登录 背景 在工作中使用密码登录有时候会出现这样或者那样的不方便,一是密码要输入,如果明文输入则不安全,二则一旦修改密码要重新分发到有权限的小伙伴 场景 在之前的工作中有很多场景需要免密等登录,使用免密带来…

Lvs missing port问题实例

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 LVS相关文章链接: LVS 流程 SVS 流程 LVS extract net方法

QMLDay2:圆角按钮,关联键盘左右键,鼠标点击。状态切换控制。

QMLDay2 test1 作用: 圆角按钮,关联键盘左右键,鼠标点击。状态切换控制。 代码: import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15Window {width: 640height: 480visible: truecolor: "wh…

H.265/HEVC 速率控制

文章目录 速率控制视频编码速率控制速率控制的基本原理缓冲机制速率控制技术 H.265/HEVC 速率控制1. 目标比特分配2. 量化参数确定 速率控制 目前实际的视频编码率失真优化过程包括两部分:速率控制部分将视频序列分成编码单元,考虑编码单元的相关性通过…

C#,数值计算——t-分布(Student distribution)的计算方法与源程序

在概率论和统计学中,学生t-分布(Students t-distribution)经常应用在对呈正态分布的总体的均值进行估计。它是对两个样本均值差异进行显著性测试的学生t测定的基础。t检定改进了Z检定(en:Z-test),不论样本数…

【PyQt实现复现框CheckBox】

PyQt实现复现框CheckBox 1 安装环境2 CtrlN,新建Main Window窗口,保存为checkBox.ui文件3 CheckBox的三种状态4 实现通用复选框的选中状态设置用户权限功能 1 安装环境 1)Python环境安装PyQt5、PyQt-sip、PyQt5Designer、PyQt5-tools 2&…

【搜索】BFS中的最短路模型

算法提高课笔记 目录 单源最短路迷宫问题题意思路代码 武士风度的牛题意思路代码 抓住那头牛题意思路代码 多源最短路矩阵距离题意思路代码 双端队列BFS电路维修题意思路代码(加了注释) BFS可以解决边权为1的最短路问题,下面是相关例题 单源…

Mybatis 知识点

Mybatis 知识点 1.1 Mybatis 简介 1.1.1 什么是 Mybatis Mybatis 是一款优秀的持久层框架支持定制化 SQL、存储过程及高级映射Mybatis 几乎避免了所有的 JDBC 代码和手动设置参数以及获取结果集MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO…

PyTorch深度学习实战(8)——批归一化

PyTorch深度学习实战(8)——批归一化 0. 前言1. 批归一化原理2. 批归一化优势3. 批归一化对模型训练的影响3.1 未使用批归一化,且输入值较小3.2 使用批归一化,且输入值较小3.3 使用批归一化,且输入值较大 小结系列链接…

Redis—环境搭建

Redis—环境搭建 🔎Centos 安装 Redis5创建符号链接修改配置文件启动 Redis停止 Redis 🔎Centos 安装 Redis5 Centos8 安装 Redis5 yum install -y redisCentos7 安装 Redis5 Centos7 中 yum 源提供的 Redis 版本是 Redis3(有点老), 因此先安装 scl 源 …

算法综合篇专题二:滑动窗口

“在混沌想法中&#xff0c;最不可理喻念头。” 1、长度最小的子数组 (1) 题目解析 (2) 算法原理 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int n nums.size();int sum 0;int len INT_MAX;for(int left0,r…

mysql进阶-用户的创建_修改_删除

1. 使用mysql单次查询 [rootVM-4-6-centos /]# mysql -h localhost -P 3306 -p mytest -e "select * from book1"; Enter password: ------------------------------------------- | id | category_id | book_name | num | ----------------------------…

数据结构 | 基本数据结构——队列

目录 一、何谓队列 二、队列抽象数据类型 三、用Python实现队列 四、模拟&#xff1a;传土豆 五、模拟&#xff1a;打印任务 5.1 主要模拟步骤 5.2 Python实现 一、何谓队列 队列是有序集合&#xff0c;添加操作发生在“尾部”&#xff0c;移除操作则发生在“头部”。新…

【Javascript】基础知识

文章目录 01 变量的声明02 数据类型字符串型boolean类型undefined null类型symbol类型超大整数 bigint数组类型普通对象 01 变量的声明 02 数据类型 复习: 声明 ​ 声明变量关键词 ​ let ​ const ​ 变量名 >变量命名规范 ​ 英文 数字 _ $不要以数字开头 ​ 见名知意 ​…

深度学习之tensorboard可视化工具

(1)什么是tensorboard tensorboard是TensorFlow 的一个可视化工具包&#xff0c;提供机器学习实验所需的可视化和工具&#xff0c;该工具的功能如下&#xff1a; 跟踪和可视化指标&#xff0c;例如损失和精度可视化模型图&#xff08;操作和层&#xff09;查看权重、偏差或其…

【Java多线程学习4】volatile关键字及其作用

说说对于volatile关键字的理解&#xff0c;及的作用 概述 1、我们知道要想线程安全&#xff0c;就需要保证三大特性&#xff1a;原子性&#xff0c;有序性&#xff0c;可见性。 2、被volatile关键字修饰的变量&#xff0c;可以保证其可见性和有序性&#xff0c;但是volatile…