Docker安装部署Redis集群

news2024/11/15 7:06:21

目录

概述

一、创建文件和目录

1.1 创建需要挂载的文件和目录

1.2 同步操作

二、随机从节点模式

2.1 创建master节点的redis容器

2.2 在同一台机器上创建另外2个节点

2.3 其他2台机器同步操作 

2.4 配置主从集群

2.4.1 进入任意一个 Redis 实例

2.4.2 配置集群

2.4.3 查看集群节点信息

三、自定义从节点模式

3.1 删除所有Redis容器

3.2 删除data目录下的文件

3.3 创建Redis容器

3.4 创建三个主节点

3.4.1 进入容器

3.4.2 创建集群

3.5 添加从节点

3.6 查看集群信息

3.6.1 进入容器连接redis

3.6.2 查看集群信息


概述

本篇文章介绍一下通过Docker安装部署Redis集群。

基于CentOS8、yum源安装,集群采用3主6从的模式。从节点我们介绍两种方式,一种是随机的从节点,一种是指定从节点的方式。

如果是3主6从的模式的集群,也就是在3台服务器上,分别部署1个主节点和2个从节点。如果我们是指定从节点的话,我们的一个集群中的从节点不能和主节点在一台服务器上,这样可以避免一台主机宕机导致的集群整体宕掉后数据丢失问题。虽然可以重启机器,Redis集群做持久化进行回复,但是还是会导致短暂的不可用的情况。因为创建好Redis集群之后,每个Redis的key的对应的哈希槽其实是已经固定到每一个主节点上了,如果这个集群的主节点和从节点在一台机器上,那就会导致,这一部分哈希槽所对应的整个集群不可用。

所以,我们要将这类部署方式的从节点放置到另外2台机器上。

我们这里有三个主机,我们称之为redis01、redis02、redis03。

redis01放一个主节点,2个从节点分别放到redis02、redis03。

redis02放一个主节点,2个从节点分别放到redis03、redis01。

redis03放一个主节点,2个从节点分别放到redis01、redis02。

这样的话,即使一台主机宕掉,最终影响的也只是3个集群中对应的一个节点,因为我们每个集群是1主2从,那么如果宕掉的是从节点,不影响原来集群;如果是主节点,那么它还有2个从节点,从节点进行选举会有一个从节点晋升为主节点。

我们最后将要创建9台Redis实例,自定义Redis集群实例的要求如下:

主节点从节点
第一个集群192.168.222.100:6380192.168.222.103:6381
192.168.222.104:6382
第二个集群192.168.222.103:6380192.168.222.104:6381
192.168.222.100:6382
第三个集群192.168.222.104:6380192.168.222.100:6381
192.168.222.103:6382

一、创建文件和目录

创建单个Redis可以参考我的另外一篇文章:

Docker以标准方式安装部署Redis

1.1 创建需要挂载的文件和目录

在redis01主机上我们创建需要的文件和目录

mkdir -p /usr/local/redis-cluster/master-6380/{data,conf}
vim /usr/local/redis-cluster/master-6380/conf/redis.conf

在redis.conf文件中输入内容:

appendonly yes

appendfilename "appendonly.aof"

master-6380这个节点操作完毕,我们还需要在 slave-6381和slave-6382节点上创建:

mkdir -p /usr/local/redis-cluster/slave-6381/{data,conf}
vim /usr/local/redis-clusterslave-6381/conf/redis.conf


mkdir -p /usr/local/redis-cluster/slave-6382/{data,conf}
vim /usr/local/redis-clusterslave-6382/conf/redis.conf

1.2 同步操作

我们可以重复1.1的操作,也可以通过scp命令方式将目录和文件上传到另外的两台主机。关于scp命令,可以参考我的另一篇文章:

Linux命令:scp

scp -r /usr/local/redis-cluster/master-6380 /root@k8s-master01:/usr/local/redis-cluster/master-6380/

注意:

我这里的主机名并非是redis01、redis02、redis03,请注意。 

然后接着将整个目录下的data和conf目录都复制到其他2个主机的对应节点上:

scp -r /usr/local/redis-cluster/master-6380 /root@k8s-master01:/usr/local/redis-cluster/slave-6381/

scp -r /usr/local/redis-cluster/master-6380 /root@k8s-master01:/usr/local/redis-cluster/slave-6382/

复制到另一个节点上要执行三个操作:

scp -r /usr/local/redis-cluster/master-6380 /root@k8s-node01:/usr/local/redis-cluster/master-6380/

scp -r /usr/local/redis-cluster/master-6380 /root@k8s-node01:/usr/local/redis-cluster/slave-6381/

scp -r /usr/local/redis-cluster/master-6380 /root@k8s-node01:/usr/local/redis-cluster/slave-6382/

注意:

每输入一个命令都要输入对应的远程主机的密码。

二、随机从节点模式

2.1 创建master节点的redis容器

docker run --name redis-6380 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/master-6380/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/master-6380/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6380.conf --port 6380

2.2 在同一台机器上创建另外2个节点

docker run --name redis-6381 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/slave-6381/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/slave-6381/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6381.conf --port 6381
docker run --name redis-6382 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/slave-6382/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/slave-6382/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6382.conf --port 6382

最终的集群节点配置文件:redis-6382.conf会在对应的data目录下生成,不管是宿主机还是容器内都有。

2.3 其他2台机器同步操作 

在另外2台机器上分别执行上面的命令。

# master节点
docker run --name redis-6380 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/master-6380/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/master-6380/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6380.conf --port 6380



# slave节点
docker run --name redis-6381 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/slave-6381/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/slave-6381/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6381.conf --port 6381



# slave节点
docker run --name redis-6382 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/slave-6382/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/slave-6382/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6382.conf --port 6382

 这个时候我们虽然说有master节点和slave节点,但是实际上它们都还不是,这只是我们最终要的结果而已。因为我们还没有进行集群的主从配置。

2.4 配置主从集群

2.4.1 进入任意一个 Redis 实例

docker exec -it redis-6380 bash

我们这里选择了redis01的redis-6380节点。

2.4.2 配置集群

redis-cli --cluster create 192.168.222.100:6380 192.168.222.103:6380 192.168.222.104:6380 192.168.222.100:6381 192.168.222.103:6381 192.168.222.104:6381 192.168.222.100:6382 192.168.222.103:6382 192.168.222.104:6382  --cluster-replicas 2

 中间会弹出一句话:

Can I set the above configuration? (type 'yes' to accept):

 这句话的意思是:是否可以设置以上的配置,我们输入yes即可。

至此,集群已经搭建好了。

2.4.3 查看集群节点信息

我们输入一下命令进行连接:

redis-cli -h 192.168.222.100 -p 6380

查看集群节点信息:

cluster nodes

从上图可以看到,我们直接使用redis-cli命令是无法连接的。因为我们没有配置redis的ip绑定。那么我们可以指定具体的redis实例的ip和端口进行连接。

 集群信息中也看到了3主3从的集群信息。

由此我们可以得出结论:

redis-cli --cluster create创建的Redis集群前面几个ip:端口,必然是主节点的;

后面的从节点隶属于哪个主节点是随机分配的。

 创建集群的命令中的参数:

--cluster-replicas 2

  • 代表着1个主节点对应2个从节点(3个主节点,3*2=6个从节点)
  • 如果是1:1的关系,此时就应该是1
  • 如果没有从节点(从节点后面再添加),此时就是0。

上面我们连接Redis实例的时候,并未使用集群模式,导致我们设置key的时候会报错的:

那这该怎么办呢?

我们只需要在连接Redis实例的时候采用集群模式即可,即加上-c参数即可:

redis-cli -c -h 192.168.222.100 -p 6380

三、自定义从节点模式

上面我们也看到了,从节点是随机分配的。可是如果我们想让从节点按照我们的要求进行分配,又该如何操作呢?

3.1 删除所有Redis容器

docker stop redis-6380 redis-6381 redis-6382

docker rm redis-6380 redis-6381 redis-6382

 三个集群的机器都执行以上命令。

3.2 删除data目录下的文件

rm -rf /usr/local/redis-cluster/master-6380/data/*
rm -rf /usr/local/redis-cluster/slave-6381/data/*
rm -rf /usr/local/redis-cluster/slave-6382/data/*

三个集群的机器都执行以上命令。

3.3 创建Redis容器

# master节点
docker run --name redis-6380 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/master-6380/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/master-6380/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6380.conf --port 6380



# slave节点
docker run --name redis-6381 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/slave-6381/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/slave-6381/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6381.conf --port 6381



# slave节点
docker run --name redis-6382 -d --net host --restart=always --privileged=true \
-v /usr/local/redis-cluster/slave-6382/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/redis-cluster/slave-6382/data:/data \
redis:latest --cluster-enabled yes --cluster-config-file redis-6382.conf --port 6382

分别在三台机器上执行。

3.4 创建三个主节点

3.4.1 进入容器

找一个将要创建主节点的机器进入容器

docker exec -it redis-6380 bash

3.4.2 创建集群

创建三台都是主节点的集群

redis-cli --cluster create 192.168.222.100:6380 192.168.222.103:6380 192.168.222.104:6380 --cluster-replicas 0

如果报错:

[ERR] Node 192.168.222.100:6380 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

 

 那就删除100:6380上所有Redis容器,同时删除data目录下的文件,重新创建三台Redis容器,然后再执行3.4.2的创建集群命令即可。

3.5 添加从节点

redis-cli --cluster add-node 192.168.222.103:6381 192.168.222.100:6380 --cluster-slave --cluster-master-id 8a80f0c04d4e64cc0b93442bbe3d9ea98cfc143f
redis-cli --cluster add-node 192.168.222.104:6382 192.168.222.100:6380 --cluster-slave --cluster-master-id 8a80f0c04d4e64cc0b93442bbe3d9ea98cfc143f

redis-cli --cluster add-node 192.168.222.104:6381 192.168.222.103:6380 --cluster-slave --cluster-master-id b207b38198cfdec7c39ea911cc979f6ad6da4921
redis-cli --cluster add-node 192.168.222.100:6382 192.168.222.103:6380 --cluster-slave --cluster-master-id b207b38198cfdec7c39ea911cc979f6ad6da4921

redis-cli --cluster add-node 192.168.222.100:6381 192.168.222.104:6380 --cluster-slave --cluster-master-id e97d76cab8f2bb064c7a8fbb05ea370e8da9a1a3
redis-cli --cluster add-node 192.168.222.103:6382 192.168.222.104:6380 --cluster-slave --cluster-master-id e97d76cab8f2bb064c7a8fbb05ea370e8da9a1a3
  1. 8a80f0c04d4e64cc0b93442bbe3d9ea98cfc143f是100:6380主节点的id
  2. b207b38198cfdec7c39ea911cc979f6ad6da4921是103:6380的主节点的id
  3. e97d76cab8f2bb064c7a8fbb05ea370e8da9a1a3是104:6380的主节点的id

上面的命令是将指定的Redis实例6381和6382指定给6380的集群主节点。

3.6 查看集群信息

3.6.1 进入容器连接redis

# 进入Redis容器
docker exec -it redis-6380 bash

# 连接Redis
redis-cli -c -h 192.168.222.100 -p 6380

3.6.2 查看集群信息

cluster nodes

e97d76cab8f2bb064c7a8fbb05ea370e8da9a1a3 192.168.222.104:6380@16380 master - 0 1670165527000 3 connected 10923-16383
1d30cce460a4003d993ebc4b07843326c6433726 192.168.222.104:6381@16381 slave b207b38198cfdec7c39ea911cc979f6ad6da4921 0 1670165529000 2 connected
94b84b5ec5b055a5352588b3837e00052aaaea81 192.168.222.104:6382@16382 slave e97d76cab8f2bb064c7a8fbb05ea370e8da9a1a3 0 1670165526000 3 connected
b207b38198cfdec7c39ea911cc979f6ad6da4921 192.168.222.103:6380@16380 master - 0 1670165527000 2 connected 5461-10922
8a80f0c04d4e64cc0b93442bbe3d9ea98cfc143f 192.168.222.100:6380@16380 myself,master - 0 1670165529000 1 connected 0-5460
8e2b5329688fec6ee8bac26458ef0f0c9b93ce2a 192.168.222.100:6381@16381 slave e97d76cab8f2bb064c7a8fbb05ea370e8da9a1a3 0 1670165529000 3 connected
7a68beb5ba8a7efaeff9894c9589486a0ba357cc 192.168.222.100:6382@16382 slave b207b38198cfdec7c39ea911cc979f6ad6da4921 0 1670165529525 2 connected
f29bd4b1ee68edb6904686f2af93d0a30cd894b8 192.168.222.103:6382@16382 slave e97d76cab8f2bb064c7a8fbb05ea370e8da9a1a3 0 1670165530535 3 connected
b26b32e21baf0582ab5f16cca7a93d2359bdd031 192.168.222.103:6381@16381 slave 8a80f0c04d4e64cc0b93442bbe3d9ea98cfc143f 0 1670165528000 1 connected

 

可以看到这个基本是符合我们指定的主从关系的,除了100:6380的从节点有错误。这个是因为我们再执行创建集群之前误操作了一个命令。其实我们的命令是成功的。

最终的关系如下:

主节点从节点
第一个集群192.168.222.100:6380192.168.222.103:6381
192.168.222.104:6382
第二个集群192.168.222.103:6380192.168.222.104:6381
192.168.222.100:6382
第三个集群192.168.222.104:6380192.168.222.100:6381
192.168.222.103:6382

至此,我们创建通过Docker创建Redis集群的两种模式已经都成功了。

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

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

相关文章

《未来简史:从智人到智神》笔记一——人类的新议题

目录 一、人类的旧议题演变 二、人类的新议题 1、长生不死 2、追求幸福快乐 3、努力把自己升级为神 三、研究历史的意义——不是为了重复过去,而是为了摆脱过去并从中获得解放 四、生命的意义 1、主观体验有两个基本特征 2、生命的意义? 一、人类…

C语言第十三课:初阶指针

目录 前言: 一、指针是什么: 1.那么指针到底是什么呢? 2.内存中的数据存储原理: 3.数据存储与指针使用实例: 4.存储编址原理: 二、指针和指针类型: 1.决定了指针的步长: 2.决定了…

【VSCode + Anaconda】VSCode [WinError 126]找不到指定模块

【VSCode Anaconda】VSCode [WinError 126]找不到指定模块问题解决一解决二问题 在 Anaconda Prompt 中的 python 环境测试,可以使用 import torch 命令 现在在 VSCode 中测试,发现相关异常 图中,已经选择了相应的 conda 环境的 python.exe…

分片集群中的分片集合

分片集群中的分片集合 MongoDB 中 分片集群有专门推荐的模式,例如 分片集合 它是一种基于分片键的逻辑对文档进行分组,分片键的选择对分片是非常重要的,分片键一旦确定,MongoDB 对数据的分片对应用是透明的 mongodb 分片中&#…

MySQL高级语句(三)

一、正则表达式(REGEXP) 1、正则表达式匹配符 字符解释举列^匹配文本的开始字符’ ^aa ’ 匹配以 aa 开头的字符串$匹配文本的结束字符’ aa$ ’ 匹配以aa结尾的字符串.匹配任何单个字符’ a.b 匹配任何a和b之间有一个字符的字符串*匹配零个或多个在它…

数据结构—树、有序二叉树

文章目录树的概述树的分类二叉树的遍历有序二叉树代码通过链表方式构建有序二叉树通过递归方式实现有序二叉树递归遍历有序二叉树中序遍历:先序遍历:后序遍历:删除节点1、删除叶子节点删除叶子节点总结图示2、删除只有一个子树的节点删除只有…

毕业设计-基于深度学习火灾烟雾检测识别系统-yolo

前言 📅大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

Spring循环依赖源码解析(深度理解)

文章目录前言本章目标一、什么是循环依赖?1、那么循环依赖是个问题吗?2、但是在Spring中循环依赖就是一个问题了,为什么?二、Bean的生命周期2.1、在Spring中,Bean是如何生成的?2.2、那么这个注入过程是怎样…

GitLab CI/CD系列教程(一)

来自:GitLab CI/CD系列教程(一):Docker安装GitLab_哔哩哔哩_bilibili 1. 创建虚拟机并连接Xterm 创建一个4G内存的虚拟机,否则很容易启动不了,报502 虚拟机的创建看这篇: VMware16的安装及VM…

基于java+ssm+vue+mysql的网上书店

项目介绍 本网上系统是针对目前网上的实际需求,从实际工作出发,对过去的网上系统存在的问题进行分析,结合计算机系统的结构、概念、模型、原理、方法,在计算机各种优势的情况下,采用目前最流行的B/S结构和java中流行的…

从0开始搭建vue2管理后台基础模板

网站主要完成:侧边菜单栏、页面标签卡、内容栏 源代码gitee地址:https://gitee.com/zhao_liangliang1997/navigation-bar 一、起步 1、创建vue项目 vue create 项目名2、引入element 3、其他安装 1、首先需要安装如下 cnpm install vuex cnpm install…

DockerCompose安装、使用 及 微服务部署实操

1 什么是DockerCompose DockerCompose是基于Compose文件帮助我们快速的部署分布式应用。 解决容器需手动一个个创建和运行的问题! DockerCompose本质上也是一个文本文件,其通过指令定义集群中的每个容器如何运行。我们可以将其看做是将多个docker run…

Ansible 自动化运维工具的使用

目录 一、Ansible简介 二、Ansible 的安装和使用 1.下载 2.使用 三、Ansible命令和模块 1.命令格式 2.命令行模块 (1)command 模块 (2)shell 模块 (3)cron 模块 (4)user …

多线程 3

多线程 3 : 文章目录1.线程安全2. 产生线程安全的原因3. synchronized - 加锁操作4.可重入5.死锁问题6. volatile 关键字7.wait 和 notify1.线程安全 为啥会出现线程安全 ?   罪魁祸首,还是多线程的抢占式执行, 正因为抢占式执行&#xff0c…

Java项目:SSM场地预订管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台,前台为普通用户登录,后台为管理员登录; 用户角色包含以下功能: 按分类查看场…

【车载开发系列】UDS诊断---通信控制($0x28)

【车载开发系列】UDS诊断—通信控制($0x28) UDS诊断---通信控制($0x28)【车载开发系列】UDS诊断---通信控制($0x28)一.概念定义二.实现原理三.应用场景四.子功能五.报文格式1)请求报文2&#xf…

自动导入指定文件夹内的文献到 Endnote 中

简介 最近正着手写一篇综述文章,来整体把握下自己研究领域的历史、方法、最新进展与趋势。由于需要对相关文献进行搜集、阅读和分类。庄小编使用 EndNote 来进行管理文献。 在使用较长时间后,整理了几个超级好用的小技巧。比如:自动导入指定…

pikachu靶场-upload-速通

upload-速通client checkMIME typegetimagesizeclient check 最简单的,先上传一张含有一句话木马的图片,抓包修改图片后缀为php,放包发送就行 访问并确认该上传文件是否以php形式解析 蚁剑直连: MIME type 后端php检查上传文…

基于MSER的高速公路交通标志提取matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 自然场景下的文本检测是自然场景图像信息提取的基础,在车牌识别、实时翻译、图像检索等领域具有广泛的应用价值及研究意义。基于连通区域的方法是自然场景文本检测中最为常见的方法,其中最大稳定…

[附源码]Python计算机毕业设计SSM街舞公司管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…