Docker搭建redis-cluster集群

1. 前期准备

1.1 拉redis镜像

docker search redis
docker pull redis

1. 2 创建网卡

docker network create myredis --subnet 172.28.0.0/16#查看创建的网卡
docker network inspect myredis

在这里插入图片描述

docker network rm myredis #删除网卡命令 多个中间 空格隔开
docker network --help #显示可带参数等

1.3 Redis配置脚本

for port in $(seq 6379 6384); \
do \
mkdir -p ~/redis/node-${port}/conf
touch ~/redis/node-${port}/conf/redis.conf
cat << EOF > ~/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.28.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

命令解释:

  • port:节点端口;
  • requirepass:设置密码,访问时需要验证
  • protected-mode:保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访- 问密码;关闭保护模式,外部网络可以直接访问;
  • daemonize:是否以守护线程的方式启动(后台启动),默认 no;
  • appendonly:是否开启 AOF 持久化模式,默认 no;
  • cluster-enabled:是否开启集群模式,默认 no;
  • cluster-config-file:集群节点信息文件;
  • cluster-node-timeout:集群节点连接超时时间;
  • cluster-announce-ip:集群节点 IP
     注意: 如果你想要你的redis集群可以供外网访问,这里直接填 服务器的IP 地址即可,如若为了安全,只是在服务器内部进行访问,这里还需要做一些修改。
  • cluster-announce-port:集群节点映射端口,用于客户端连接到节点
  • cluster-announce-bus-port:集群节点总线端口,用于节点之间进行通信

EOF(End of File)用法
<<EOF #开始
… #输入内容
EOF #结束

举例说明:
cat << EOF > 1.txt #向文件1.txt输入覆盖内容(也可以:cat > 1.txt <<EOF)
123
456
678
EOF

执行完毕后的目录结构:
在这里插入图片描述

2. 创建redis集群

2.1 批量式启动redis容器

for port in $(seq 6379 6384); \
do \docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \--privileged=true -v /home/redis/node-${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \--privileged=true -v /home/redis/node-${port}/data:/data \--restart always --name redis-${port} --net myredis \--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf
done# 查看是否启动成功
docker ps -a

去掉参数部分:

docker run -d redis redis-server /usr/local/etc/redis/redis.conf
#redis-server [options] [config file]:加载指定的配置文件

命令解释:

  • -d:后台运行,容器启动完成后打印容器
  • –privileged:是否让docker 应用容器 获取宿主机root权限(特殊权限-)
  • –sysctl参数来设置系统参数,通过这些参数来调整系统性能
  • -restart always:在容器退出时总是重启容器
  • –net myredis :使用我们创建的虚拟网卡
  • –name redis-${port}: 将容器命名为 redis-${port}

2.2 创建 redis cluster集群

进入容器

> docker exec -it redis-6379 /bin/sh

进入容器后,在容器中创建集群

> redis-cli --cluster create 172.28.0.11:6379 172.28.0.12:6380 172.28.0.13:6381 172.28.0.14:6382 172.28.0.15:6383 --cluster-replicas 1
  • redis-cli: Redis 命令行工具。
  • –cluster create: 创建 Redis 集群。
  • {ip}:{port}: 指定 Redis 节点地址和端口。
    –cluster-replicas 1: 指定每个 Redis 节点的副本数量。

2.3 验证redis集群

# 启动redis服务器
> redis-server#连接到redis服务器
> redis-cli -h <host> -p <port># 启动redis集群客户端(-c表示集群)host也可不添加
/data# redis-cli -p[host]-c# 查看集群信息
172.28.0.1:6379> cluster info# 集群创建好之后,11,12,13为主节点,其余为从节点
172.28.0.1:6379> cluster nodes

在这里插入图片描述

验证 Redis 集群:

#缓存数据
172.28.0.1:6379> set name Stephen-> Redirected to slot [5798] located at 172.28.0.12:6379
OK
#获取数据
172.28.0.1:6379> get name-> Redirected to slot [5798] located at 172.28.0.16:6379
"stephen"

停止容器:

docker stop redis-6379

当主节点断开之后,会自动将从节点切换为主节点,比如这里将16切换为了主节点

2.4 批量停止容器

 for port in $(seq 6379 6384); do docker stop redis-${port}done

2.5 批量删除容器

 for port in $(seq 6379 6384); do docker rm redis-${port}done

3. 集群扩容

集群结构:
在这里插入图片描述

启动一个新的redis容器,并将其添加到myredis网络中:

docker run -d --name redis-6385 -p 6385:6385 --net myredis redis redis-server /usr/local/etc/redis/redis.conf

添加新节点到集群:

#1. 添加从节点 add-node --slave [新加入节点] [集群中任意节点]
redis-cli cluster add-node 172.28.0.1:6385 172.28.0.1:6379# 2.为确定的master节点添加主节点 add-node --slave --master-id master节点id [新加入节点] [集群任意节点]
redis-cli cluster  add-node 172.28.0.1:6386 172.28.0.1:6379 --cluster-slave 
--cluster-master-id3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 

参数说明:
add-node: 后面的分别跟着新加入的slave和slave对应的master
cluster-slave:表示加入的是slave节点
–cluster-master-id:表示slave对应的master的node ID
redis-cli命令需要再redis容器中执行

哈希槽分配:
新的节点该节点还未分配 slots(哈希槽),所以暂时无法存储数据

redis-cli --cluster reshard 172.28.0.1:6379 --cluster-from fbc63acf974997e37a35b5ca1c71cc002ae1bb40,
fa92c840b4a77463fb27b2b8183f144321a73f86 --cluster-to 41eb57d0685f71aabef57908aef54189b22573b9 
--cluster-slots 2000

参数说明:
–cluster-from:表示slot目前所在的节点的node ID,多个ID用逗号分隔
–cluster-to:表示需要新分配节点的node ID
–cluster-slots:分配的slot数量

4. 集群缩容

移除从节点:

# el-node:删除节点,后面跟着slave节点的 ip:port 和node ID
redis-cli --cluster del-node 172.28.0.1:6386 7d6948bb8b6a5ff49f26aef2ebdb400bc3dc7062

迁移主节点哈希槽:
 删除主节点6395,就没那么容易了。必须先将节点7上的哈希槽移动到其他主节点上,才可以删除它。需要迁出主节点的哈希槽。
 我们需要将7007节点的哈希槽迁移到7001,7002,7003节点上,仍然用上面用过的redis-cli --cluster reshard ...语法,迁移计划:500个slots给6379,700个slots给6380,剩余800个给6381 命令如下:

# 将172.28.0.1:6385节点所在集群中41eb57d0685f71aabef57908aef54189b22573b9 节点的500个哈希槽迁移给 # fbc63acf974997e37a35b5ca1c71cc002ae1bb40节点,不回显需要迁移的slot,直接迁移。
# 第一次迁移500到8379
redis-cli --cluster reshard 172.28.0.1:6385 --cluster-from 41eb57d0685f71aabef57908aef54189b22573b9 --cluster-to fbc63acf974997e37a35b5ca1c71cc002ae1bb40 --cluster-slots 500 --cluster-yes# 第二次迁移700到6380
redis-cli --cluster reshard 172.28.0.1:6385 --cluster-from 41eb57d0685f71aabef57908aef54189b22573b9 --cluster-to fa92c840b4a77463fb27b2b8183f144321a73f86 --cluster-slots 700 --cluster-yes# 第三次迁移800到6391
redis-cli --cluster reshard 172.28.0.1:6385 --cluster-from 41eb57d0685f71aabef57908aef54189b22573b9 --cluster-to 05e9c301a25041ca780f369974764636513e8767 --cluster-slots 800 --cluster-yes

删除主节点:

redis-cli --cluster del-node 172.28.0.1:6385:7007 41eb57d0685f71aabef57908aef54189b22573b9

4. 参考文章:

Docker 搭建 Redis Cluster集群 每一步都带有操作图、命令!!!
Docker搭建Redis Cluster集群及扩容和收容 _

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

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

相关文章

Python中的Paramiko与FTP文件夹及文件检测技巧

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; Python代码的魅力与实用价值 在当今数字化时代&#xff0c;编程已成为一种不可或缺的技能。Python作为一种简洁、易读且功能强大的编程语言&#xff0c;受到了全球开发者的喜爱。它不仅适用于初学者入门&#xff0c…

配置 jDK 和 Android环境

目录 一、配置jDK 1. 安装 JDK 2. JDK 环境配置 3. JDK的配置验证 二、配置 Android环境 1、下载 2、SDK配置 3、配置Android环境 一、配置jDK 1. 安装 JDK 安装链接&#xff1a;Java Downloads | Oracle 我安装的是 .zip &#xff0c;直接在指定的文件夹下解压就好。…

上位机快速开发框架

右上角向下按钮 -> 后台配置 系统菜单 角色管理 分配权限 用户管理 设备配置 通道管理 首页界面设计 设备1配置 带反馈按钮&#xff0c;如&#xff1a;用户按键00105&#xff0c;PLC反馈状态00106 设备2配置 参数说明&#xff1a; TagName_Main&#xff1a;主要信息&#…

2024.06.07【读书笔记】丨生物信息学与功能基因组学(第十二章 全基因组和系统发育树 第二部分)【AI测试版】

目录 地球上生命形式的生物发展史 系统发生树的分子序列基础 生物信息学在系统分类学中的角色 基因组测序计划 讨论 总结 摘要 第二部分详细讨论了地球生命形式的演化历程&#xff0c;系统发生树的分子基础&#xff0c;生物信息学在现代系统分类学中的应用&#xff0c;…

RabbitMQ消息的发布确认机制详解

RabbitMQ发布确认机制确保消息从生产者成功传输到交换机和队列&#xff0c;提高系统可靠性。在Spring Boot项目中&#xff0c;通过配置publisher-confirm-type和publisher-returns&#xff0c;启用发布确认和消息返回机制。配置RabbitTemplate的确认回调和返回回调&#xff0c;…

阿里 Qwen2 模型开源,教你如何将 Qwen2 扩展到百万级上下文

本次开源的 Qwen2 模型包括 5 个尺寸&#xff0c;分别是 0.5B、1.5B、7B、72B、57B&#xff0c;其中 57B 的属于 MoE 模型&#xff08;激活参数 14B&#xff09;&#xff0c;其余为 Dense 模型&#xff0c;本篇文章会快速介绍下各个尺寸模型的情况&#xff0c;然后重点介绍下如…

【TB作品】MSP430G2553单片机,使用595数码管制作的秒表

作品功能 这个项目是一个使用单片机和HC595芯片驱动数码管显示的秒表。秒表可以记录时间&#xff0c;以秒和百分之一秒为单位&#xff0c;并通过按键进行启动和暂停操作。这个简单但功能完整的秒表项目展示了如何使用串行输入/输出移位寄存器HC595和MSP430单片机来驱动数码管显…

20212416 2023-2024-2 《网络与系统攻防技术》实验八实验报告

Web安全实践 1.实验内容2.实验过程2.1 Web前端HTML2.1.1 正常安装、启停Apache2.1.2 编写一个含有表单的HTML2.1.2.1 基础知识2.1.2.2 实践 2.2 Web前端javascipt2.2.1 基础知识2.2.2 实践 2.3 Web后端&#xff1a;MySQL基础2.3.1 正常安装、启动MySQL2.3.2 创建用户、修改密码…

torch.cat 与 torch.concat函数

文章目录 区别torch.cat介绍作用参数使用实例关于参数dim为None的使用 区别 先说结论&#xff1a;没有区别在功能、用法以及作用上&#xff0c;concat函数就是cat函数的别名&#xff08;官方就是这样说的&#xff09;。下面截图为证&#xff1a;   因此接下来就主要是介绍 to…

乐鑫AT固件ESP32-WROOM-32-AT-V3.2.0.0发送MQTT命令连接失败问题分析与解决

模块通过串口助手发送MQTT的所有连接命令都是正常的 配置MQTT: ATMQTTUSERCFG0,1,"publisher","bCDEo8NukvSOBfIXUj8","",0,0,"" 连接MQTT: ATMQTTCONN0,"52.195.11.47",1883,1 通过STM32发送ATMQTTUSERCFG命令返回OK,…

在内网中反向代理清华镜像

在内网环境中&#xff0c;服务器经常需要访问外部资源&#xff0c;如开源软件的镜像站。然而&#xff0c;直接访问可能受限于多种因素&#xff0c;如网络策略或地理位置。此时&#xff0c;设置一个反向代理服务器可以极大地方便内网中的服务器访问和更新软件包。本文将介绍如何…

<Python><PyQt5>基于python使用PyQt5编写UI时,如何在单独的文件里构建菜单项然后调用?

前言 本文纯作为记录&#xff0c;但如果恰好有相同需要的朋友&#xff0c;也可以看看。本文实现的是&#xff0c;使用PyQt5时&#xff0c;如果需要添加menu项&#xff0c;但不想把所有元素都写在一个主程序文件中&#xff0c;部件太多的话&#xff0c;程序臃肿&#xff0c;因此…

[NOVATEK] NT96580行车记录仪功能学习笔记

一、u-Boot升级灯 运行u-Boot程序时LED灯闪烁,找到运行过程中一直在运行的函数在里面进行LED引脚电平的翻转 宏定义 Z:\SunFan\AHD580\pip\na51055_PIP\BSP\u-boot\include\configs\nvt-na51055-evb.h Z:\SunFan\AHD580\pip\na51055_PIP\BSP\u-boot\drivers\mtd\nvt_flash_…

MATLAB format

在MATLAB中&#xff0c;format 是一个函数&#xff0c;用于控制命令窗口中数值的显示格式。这个函数可以设置数值的精度、显示的位数等。以下是一些常用的 format 命令&#xff1a; format long&#xff1a;以默认的长格式显示数值&#xff0c;通常显示15位有效数字。format s…

什么是专业神秘顾客公司?(深圳神秘顾客公司)

专业神秘顾客公司是指那些拥有经过严格培训的专业“神秘顾客”&#xff0c;并为客户提供神秘顾客调查业务的公司。以下是关于专业神秘顾客公司的详细介绍&#xff1a; 一、定义与业务 专业神秘顾客公司&#xff0c;通常称为Mystery Shopper Company&#xff0c;其核心业务是为…

【Linux】深入解析动静态库:原理、制作、使用与动态链接机制

文章目录 前言&#xff1a;1. 什么是动静态库2. 动静态库的制作和使用3. 动态库的查找问题4. 理解动态库的加载4.1. 站在系统的角度理解4.2. 编址、可执行程序4.3. 动态库动态链接和加载问题 总结&#xff1a; 前言&#xff1a; 在软件开发中&#xff0c;动静态库是两种重要的…

11.盛水最多的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示例 1&a…

Python基础总结之functools.partial

Python基础总结之functools.partial 在日常编程中&#xff0c;我们经常会遇到这样的情况&#xff1a;需要调用一个函数&#xff0c;但希望它的某些参数被预先设置好&#xff0c;而不是每次调用时都手动传递这些参数。Python 的 functools.partial 提供了一种优雅的方式来实现这…

编写程序提示用户输入一个数目(例如:100)、年利率(例如:5)以及月份数(例如:6),然后显示给定月份后账户上的钱数。

(财务应用程序:复利值)假设你每月向银行账户存 100美元&#xff0c;年利率为5%&#xff0c;那么每 月利率是 0.05/12-0.00417。 第一个月之后&#xff0c;账户上的值就变成:100*(10.00417)100.417 第二个月之后&#xff0c;账户上的值就变成(100100.417)*(10.00417)-201.252 第…

Switch刷机:安装Android系统和Linux系统

文章目录 Switch刷机解锁SwitchSwitchroot重要提示 安装Android系统安装Linux系统&#xff08;Ubuntu&#xff09;安装Lakka系统安装多系统&#xff08;和大气层系统、官方原生系统并存&#xff09; Switch刷机 解锁Switch 刷机的前提是要解锁bootloader&#xff0c;早期的NS…