docker安装redis7-分片集群

news2024/12/25 14:06:38

说明

系统:CentOS7.9

redis:7.0.5

因资源有限所有节点部署在一台宿主机上,总共启动6个redis实例,实例对应端口分别从6380-6385,文章中给的有执行脚本,方便配置redis和操作redis实例

下载镜像

docker  pull redis:7.0.5

配置redis.conf文件

创建脚本

vim redis-config.sh

增加配置内容

脚本主要做了以下事情

1.创建redis的挂载目录,6个redis实例的挂载路径统一用端口作区分。脚本中的挂载路径主要有2个:

/root/data/redis-cluster/<port>/data:redis数据的挂载位置

/root/data/redis-cluster/<port>/conf:redis配置文件的挂载位置

2.给对应的配置文件写入配置内容

配置内容:

#!/bin/bash
ports=(6380 6381 6382 6383 6384 6385)
mount_path=/root/data/redis-cluster

# 创建挂载目录
for port in ${ports[@]}
do
  # 创建挂载目录
  mkdir -p ${mount_path}/${port}/data
  mkdir -p ${mount_path}/${port}/conf
  settings="
# 修改这部分,使redis可以外部访问,正式环境不建议设置为0.0.0.0 \n
bind 0.0.0.0 \n
# 保护模式,默认yes,如果不需要保护模式可以设置为no \n
protected-mode no \n
# 端口号,默认即可 \n
port ${port} \n
# 日志文件存放位置\n
logfile /data/redis.log\n
pidfile /data/redis-${port}.pid \n
# 用守护线程的方式启动,关闭 \n
daemonize no \n
# 数据存放目录 \n
dir /data \n
# 密码 \n
requirepass 123123 \n
masterauth 123123 \n
# 开启AOF方式持久化 默认是no \n
appendonly yes \n
# 持久化数据文件存放的文件夹名称,不能带/ \n
appenddirname "aof" \n

# 开启集群模式 \n
cluster-enabled yes \n
# 集群总线端口默认是(port+10000) \n
cluster-port 1${port} \n
# 集群配置文件路径\n
cluster-config-file node-${port}.conf\n
cluster-node-timeout 5000 \n

tcp-backlog 511\n
  "
  echo -e $settings > ${mount_path}/${port}/conf/redis.conf
done

echo "write redis configuration success !"

# 查看挂载路径
for port in ${ports[@]}
do
  ls -l ${mount_path}/${port}
  ls -l ${mount_path}/${port}/conf
done

赋予可执行权限

chmod +x redis-config.sh

执行脚本

./redis-config.sh

启动容器

创建脚本文件

vim redis-cluster.sh

脚本内容 

#!/bin/bash
if [ ! "$1" ];then
  echo "input params is null ..."
  exit 1
fi

# 集群所有端口
arr=(6380 6381 6382 6383 6384 6385)
mount_path=/root/data/redis-cluster
case $1 in

"start")
  echo "==================== start redis-cluster ===================="
  for port in ${arr[@]}
  do 
    result=$(docker run --privileged=true \
-v ${mount_path}/${port}/data:/data \
-v ${mount_path}/${port}/conf:/usr/local/etc/redis \
--name redis-${port} \
--restart=always \
--net=host \
-d redis:7.0.5 \
redis-server /usr/local/etc/redis/redis.conf)
    echo "redis-${port} start success, id=${result}"
  done
  ;;
"stop")
  echo "==================== stop redis-cluster ===================="
  for port in ${arr[@]}
  do
    docker stop redis-${port}
  done
  ;;
"rm")  
  echo "==================== remove redis-cluster ===================="
  for port in ${arr[@]}
  do
    docker rm -f redis-$port
  done
  ;;
"restart")
  echo "==================== restart redis-cluster ===================="
  for port in ${arr[@]}
  do
    docker restart redis-$port
  done
  ;;
"log")
  if [ ! "$2" ];then
    echo "port is null ..."
    exit 1
  fi
  tail -1000f ${mount_path}/$2/data/redis.log
  exit 0
esac

# 查看容器信息
echo "==================== redis-cluster info ===================="
docker ps -a

赋予可执行权限

chmod +x redis-cluster

执行脚本

sh redis-cluster.sh

创建主从关系

命令中的ip地址需要更换为自己的真实ip,该命令在6个redis实例其中一台上执行即可

docker exec -it redis-6380 redis-cli \
-a 123123 --cluster create --cluster-replicas 1 \
192.168.66.115:6380 192.168.66.115:6381 \
192.168.66.115:6382 192.168.66.115:6383 \
192.168.66.115:6384 192.168.66.115:6385

 验证部署成果

docker exec -it redis-6380 redis-cli -p 6380 -a 123123

 info replication

 cluster info(集群信息)

 cluster nodes(集群节点信息)

 添加数据

set name test1

set数据后报错了,原因是因为集群模式下,每个主节点都有自己的插槽范围,每个key经过计算得出的值如果不在当前节点就会报错,解决方法如下,重新进入容器加上-c参数,防止路由失效

-p: 指定端口,

-a:连接实例的密码,也可以进入实例后使用auth <your password>验证

-c:自动重定向

docker exec -it redis-6380 redis-cli -p 6380 -a 123123 -c

 结束语

整个集群部署在了同一台宿主机上面,使用不同的端口进行区分,如果大家在部署过程中遇到问题欢迎私信或者评论。 

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

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

相关文章

JVM的元空间了解吗?

笔者近期在面试的时候被问到了这个问题&#xff0c;元空间也是Java8当时的一大重大革新&#xff0c;之前暑期实习求职的时候有专门看过&#xff0c;但是近期秋招的时候JVM相关的内容确实有点生疏了&#xff0c;故在此进行回顾。 结构 首先&#xff0c;我们应了解JVM的堆结构&a…

c++——引用(语法、引用特性、常引用、函数返回值引用和指针与引用的不同点)

c中的引用 一、引用 1、引用的概念&#xff1a;给变量取别名。 形式&#xff1a;原类型名& 别名 引用实体旧名&#xff1b; 2、特性&#xff1a; ①引用定义时必须初始化 ②引用一旦初始化之后就不能再改变引用的指向 ③不能引用NULL ④&再等号的左边为引用&…

FPGA原理与结构——ROM IP的使用与测试

一、前言 本文介绍Block Memory Generator v8.4 IP核 实现ROM&#xff0c;在学习一个IP核的使用之前&#xff0c;首先需要对于IP核的具体参数和原理有一个基本的了解&#xff0c;具体可以参考&#xff1a; FPGA原理与结构——块RAM&#xff08;Block RAM,BRAM&#xff09;http…

04_18内存反碎片技术,什么时候适合进行内存碎片整理

前言 内存碎片分为内部碎片和外部碎片&#xff0c;内部碎片指内存页里面的碎片&#xff0c;外部碎片指空闲的内存页分散&#xff0c;很难找到一组物理地址连续的空间内存页&#xff0c;无法满足超过一页的内存分配请求。 虚拟可移动区域 可移动区域&#xff08;ZONE_MOVABLE…

A 题国际旅游网络的大数据分析-详细解析与代码答案(2023 年全国高校数据统计与调查分析挑战赛

请你们进行数据统计与调查分析&#xff0c;使用附件中的数据&#xff0c;回答下列问题&#xff1a; ⚫ 问题 1: 请进行分类汇总统计&#xff0c;计算不同国家 1995 年至 2020 年累计旅游总人数&#xff0c;从哪个国家旅游出发的人数最多&#xff0c;哪个国家旅游到达的人数最多…

【JavaEE】面向切面编程AOP是什么-Spring AOP框架的基本使用

【JavaEE】Spring AOP&#xff08;1&#xff09; 文章目录 【JavaEE】Spring AOP&#xff08;1&#xff09;1. Spring AOP 是什么1.1 AOP 与 Spring AOP1.2 没有AOP的世界是怎样的1.3 AOP是什么 2. Spring AOP 框架的学习2.1 AOP的组成2.1.1 Aspect 切面2.1.2 Pointcut 切点2.1…

微人事 部门管理 模块 (十五)

部门管理的树展示和搜索 数据展示页是个树&#xff0c;我们一次性把数据加载出来也可以通过点一次id加载查询出来出来子部门&#xff0c;我们用一次拿到说有json数据加载出来 数据不多可以用递归&#xff0c;数据很多就用懒加载的方式 由于子部门比较深就不适合&#xff0c;权…

# 59. python的类与对象-更新

[目录] 文章目录 59. python的类与对象-更新1.面向对象编程2.什么是类3.什么是对象4.如何描述对象5.对象的属性和方法6.Python中的类7.type()函数查看数据类型8.类在Python中的应用9.总结 【正文】 59. python的类与对象-更新 1.面向对象编程 本节内容特别抽象&#xff0c;初…

Web3和去中心化:互联网的下一个演化阶段

文章目录 Web3和去中心化的定义Web3&#xff1a;去中心化&#xff1a; 为什么Web3和去中心化如此重要&#xff1f;数据隐私和安全&#xff1a;去中心化的创新&#xff1a;去除中间商&#xff1a; Web3和去中心化的应用领域去中心化金融&#xff08;DeFi&#xff09;&#xff1a…

wustojc2003求整数均值

#include <stdio.h> int main() {int a,b,c,d;double A;scanf("%d%d%d%d",&a,&b,&c,&d);A(double)((abcd)/4.0);//强转成doubleprintf("Sum %d\n",abcd);printf("Average %.2lf",A);return 0;}

C++笔记之基类指针动态地指向某一个子类情况列举

C笔记之基类指针动态地指向某一个子类情况列举 code review! 文章目录 C笔记之基类指针动态地指向某一个子类情况列举1.基本的多态示例2.基类中的成员函数可以设置为纯虚函数3.将基本示例修改为使用智能指针并在堆上实例化子类4.父类指针指向基类后&#xff0c;可以去调用只有…

【JUC系列-01】深入理解JMM内存模型的底层实现原理

一&#xff0c;深入理解JMM内存模型 1&#xff0c;什么是可见性 在谈jmm的内存模型之前&#xff0c;先了解一下并发并发编程的三大特性&#xff0c;分别是&#xff1a;可见性&#xff0c;原子性&#xff0c;有序性。可见性指的就是当一个线程修改某个变量的值之后&#xff0c…

shell脚本之sed

sed sed 即 Stream EDitor&#xff0c;和 vi 不同&#xff0c;sed是行编辑器 基本用法 sed [选项] 自身脚本用法 [支持输入标准输入管道] 常用选项&#xff1a;-n 不输出模式空间内容到屏幕&#xff0c;即不自动打印-e 多点编辑-f FILE 从指定文件中读取编辑脚本-r, -E 使用…

【TypeScript】内置对象

JavaScript 中很多内置对象&#xff0c;可以直接在 TypeScript 中当做定义好了的类型。 ECMAScript 的内置对象 Boolean、Number、String、RegExp、Date、Error、XMLHttpRequest 等 let num: Number new Number(1) let date: Date new Date() let reg: RegExp new RegExp(…

WTF Langchain极简入门: 03. 数据连接

加载文档 langchain提供多种文档加载器&#xff0c;支持多种格式、来源的文件。可以从本地存储系统加载文件&#xff0c;也可以从网上加载远端文件。想了解LangChain所支持的所有文档加载器&#xff0c;请参考Document Loaders。 在本系列课程中&#xff0c;我们将使用最基本…

Docker 搭建 LNMP + Wordpress(详细步骤)

目录 一、项目模拟 1. 项目环境 2. 服务器环境 3.任务需求 二、Linux 系统基础镜像 三、Nginx 1. 建立工作目录 2. 编写 Dockerfile 脚本 3. 准备 nginx.conf 配置文件 4. 生成镜像 5. 创建自定义网络 6. 启动镜像容器 7. 验证 nginx 四、Mysql 1.…

快速学习GO语言总结

备注&#xff1a;本博客将自己初步学习GO的总结进行分享&#xff0c;希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力&#xff0c;如有错误请留言指正&#xff0c;谢谢&#xff01; 一、初步了解Go语言 &#xff08;一&#xff09;Go语言诞生的主要问题和目标…

shell脚本——expect脚本免交互

目录 一.Here Document 1.1.定义 1.2.多行重定向 二.expect实现免交互 2.1.基础免交互改密码 2.2.expect定义 2.3.expect基本命令 2.4.expect实现免交互ssh主机 一.Here Document 1.1.定义 使用I/O重定向的方式将命令列表提供给交互式程序&#xff0c;是标准输 入的一…

uniapp开发小程序,上传图片和视频功能

1.需求&#xff1a; 可以上传图片和视频&#xff0c;并且都可以删除&#xff0c;图片可以预览。 2.效果图 3.代码&#xff1a; <template><!-- 上传start --><view style"display: flex; flex-wrap: wrap;"><view class"update-file&quo…

FPGA解析串口指令控制spi flash完成连续写、读、擦除数据

前言 最近在收拾抽屉时找到一个某宝的spi flash模块&#xff0c;如下图所示&#xff0c;我就想用能不能串口来读写flash&#xff0c;大致过程就是&#xff0c;串口向fpga发送一条指令&#xff0c;fpga解析出指令控制flah&#xff0c;这个指令协议目前就是&#xff1a; 55 AA …