基于Docker的Redis集群简单搭建

环境:Docker + ( Redis:5.0.5 * 3 )

1、拉取镜像

docker pull redis:5.0.5

2、创建Redis容器

创建三个 redis 容器:

  • redis-node1:6379
  • redis-node2:6380
  • redis-node3:6381
docker create --name redis-node1 -v /data/redis-data/node1:/data -p 6379:6379 redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-1.confdocker create --name redis-node2 -v /data/redis-data/node2:/data -p 6380:6380 redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-2.confdocker create --name redis-node3 -v /data/redis-data/node3:/data -p 6381:6379 redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-3.conf

3、启动并组建集群

启动容器

首先通过命令docker start来启动3个Redis容器:

执行完运行命令后检查一下容器的启动情况:

如果出现上图情况,Exited (1) 3 seconds ago,可以通过 docker logs 查看:

如上提示的是权限问题,我们尝试修改一下权限:

chmod -R 777 /data

启动成功后如下图所示:

组建集群

查看3个Redis在Docker中分配的ip结点信息:

docker inspect redis-node1 -> 172.17.0.4 
docker inspect redis-node2 -> 172.17.0.3 
docker inspect redis-node3 -> 172.17.0.2

接下来进入某一个容器进行组建集群:

# 这里以进入 node1 为例
docker exec -it redis-node1 /bin/bash# 接着执行组建集群命令
redis-cli --cluster create 172.17.0.2:6379 172.17.0.3:6379 172.17.0.4:6379 -- cluster-replicas 0

ok,此时集群搭建完了,我们接下来测试一下。

测试集群

使用 redis-cli -c 命令连接到集群结点,然后 set 值,set 值之后会自动重定向到 0.2 ip地址,然后通过 get 获取一下,获取成功证明集群有效。

4、存在的问题

按照如上的步骤,虽然集群搭建成功了,但其实还是有点问题的,由于集群结点中的 ip地址 是docket内部分配的,如:172.17.0.2 等,如果使用 redis集群 的项目跟集群不在一台服务器上,那么项目是没法使用集群的,因为是访问不通的。

一种解决方案是让Docker使用 host模式 的网络连接类型,Docker在使用host模式下创建的容器是没有自己独立的网络命名空间的,是跟物理机共享一个网络空间,进而可以共享物理机的所有端口与IP,这样就可以让公共网络直接访问容器了,尽管这种方式有安全隐患,但目前来说还没找到其他可行性模式。

就存在的问题我们重新采用 host模式,重新创建一下容器:

1、停止已运行的容器
docker stop redis-node1 redis-node2 redis-node3
2、删除之前创建的容器
docker rm redis-node1 redis-node2 redis-node3
3、重新基于host模式创建
docker create --name redis-node1 --net host -v /data/redis-data/node1:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-1.conf --port 6379docker create --name redis-node2 --net host -v /data/redis-data/node2:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-2.conf --port 6380docker create --name redis-node3 --net host -v /data/redis-data/node3:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-3.conf --port 6381

跟之前创建命令不同,一是指定了 --net 网络类型为 host,二是这种情况下就不需要端口映射了,比如 -p 6379:6379,因为此时需要对外共享容器端口服务,所以只需要指定对外暴露的端口 -p 6379-p 6380 等。

4、启动容器并组建集群
# 启动命令
docker start redis-node1 redis-node2 redis-node3# 进入某一个容器
docker exec -it redis-node1 /bin/bash# 组建集群,10.211.55.4为当前物理机的ip地址
redis-cli --cluster create 10.211.55.4:6379 10.211.55.4:6380 10.211.55.4:6381 --cluster-replicas 0

5、查看集群信息
root@CentOS7:/data# redis-cli
127.0.0.1:6379> cluster nodes
72c291c32815194b64d1f6d0fdf771f5cc04e14a 10.211.55.4:6380@16380 master - 0 1590905997358 2 connected 5461-10922
6a595b67bbff15c94e5874c2d2cd556d6a6a6c17 10.211.55.4:6381@16381 master - 0 1590905998362 3 connected 10923-16383
4e3dbdc8f835dcbc38291c88f08165ee51d53d3d 10.211.55.4:6379@16379 myself,master - 0 1590905997000 1 connected 0-5460
127.0.0.1:6379>
6、测试集群

使用 redis-cli -c 连接到集群上,set一个值,然后从其他节点再获取值查看是否成功:

root@CentOS7:/data# redis-cli -c
127.0.0.1:6379> set wxiaowei 123
-> Redirected to slot [7515] located at 10.211.55.4:6380
OK
10.211.55.4:6380> get wxiaowei
"123"

至此,本次基于Docker的Redis集群单副本模式算是搭建好了,文中3个redis都是用的主节点,关于多副本、主从架构高可用在后文补充。

推荐阅读:

Docker安装Redis

SpringBoot如何切换Redis默认库

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

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

相关文章

[js] ajax如何接收后台传来的图片?

[js] ajax如何接收后台传来的图片? 1.设置responseType为 Blob,2.将Blob保存为文件个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

Python 全栈开发十 socket网络编程

一、客户端(client)服务端(sever)架构 在计算机中有很多常见的C/S架构,例如我们的浏览器是客户端、而百度网站和其他的网站就是服务端;视频软件是客户端,提供视频的腾讯、优酷、爱奇艺就是服务端…

[js] js源代码压缩都有哪些方法?它们的压缩原理分别是什么

[js] js源代码压缩都有哪些方法?它们的压缩原理分别是什么 方法 1.在线工具 2.webpack原理 1.删除注释 2.变量名方法名字符精减个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与…

基于Docker方式实现Elasticsearch集群

文本环境:Docker (Elasticsearch6.8.5 * 3) 1、拉取Elasticsearch docker pull elasticsearch6.8.52、创建es挂载目录 创建3个文件夹用于存放es挂载地址:es01、es02、es03 [rootCentOS7 ~]# mkdir /es-cluster [rootCentOS7 ~]# cd /es-cluster/ [ro…

[js] 不用 + eval Function 实现加法

[js] 不用 eval Function 实现加法 // 使用位运算符实现 function add (a, b) {if (a 0 || b 0) {return a || b;}while (b ! 0) {let i b;b (a & b) << 1;a a ^ i;}return a; };个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&…

基于Docker搭建Gitlab代码存储

关于Docker搭建Gitlab&#xff0c;在19年时就已经在博客发过文章了&#xff0c;今天重新回顾一下。 1、拉取镜像 docker pull gitlab/gitlab-ce默认拉取最新版本&#xff1a; 2、创建Gitlab配置 创建GitLab 的配置 (etc) 、 日志 (log) 、数据 (data) 放到容器之外&#xff…

Java Web开发技术教程入门-JavaBean组件与Servlet

补更&#xff1a;阅战阅勇第7/8/9Days笔记昨天我们了解了JDBC技术的一些日常操作&#xff0c;对于数据库而言&#xff0c;不仅仅的只有“增&#xff0c;删&#xff0c;改&#xff0c;查”。博主觉得最重要的是SQL语句的优化&#xff0c;一个“完美”的SQL语句可以大大减少程序的…

[js] 写一个 document.querySelector 的逆方法

[js] 写一个 document.querySelector 的逆方法 document.queryNode function(node){if(node.id){return # node.id;}if(node.className){return . node.id;}return node.nodeName; };个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但…

读书笔记--Android Gradle权威指南(上)

本篇文章已授权微信公众号 dasu_Android&#xff08;大苏&#xff09;独家发布 最近看了一本书《Android Gradle 权威指南》&#xff0c;对于 Gradle 理解又更深了&#xff0c;但不想过段时间就又忘光了&#xff0c;所以打算写一篇读书笔记&#xff0c;将书中一些我个人觉得蛮有…

[js] 如何判断对象是否属于某个类?

[js] 如何判断对象是否属于某个类&#xff1f; obj.proto class.prototype 可以递归去找obj instanceof class个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

基于Docker搭建私有镜像仓库

通常我们在docker中拉取的镜像都是在docker hub在线存储库中获取的&#xff0c;这个在线存储库里的docker镜像可以由任何用户发布和使用&#xff0c;显然这在某些场景下是不适用的&#xff0c;比如某些互金的隐私项目&#xff0c;或者是公司完全处于内网状态不能访问外网&#…

[js] 说说你对js沙箱的理解,它有什么应用场景?

[js] 说说你对js沙箱的理解&#xff0c;它有什么应用场景&#xff1f; 在微前端有用到js沙箱&#xff0c;例如qiankun框架&#xff0c;主应用的js运行和子任务的js运行不会相互影响&#xff0c;是使用es6的proxy来实现的个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后…

volatile理解了吗?

到这里大家感觉自己对volatile理解了吗&#xff1f; 如果理解了&#xff0c;大家考虑这么一个问题&#xff1a;ReentrantLock&#xff08;或者其它基于AQS实现的锁&#xff09;是如何保证代码段中变量&#xff08;变量主要是指共享变量&#xff0c;存在竞争问题的变量&…

Linux|CentOS下配置Maven环境

1、下载maven包 wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz如果提示 wget: 未找到命令&#xff0c;请尝试如下指令安装 wget yum -y install wget2、解压下载的maven压缩吧 tar -xzvf apache-maven-3.3.…

[js] 纯函数和函数式编程有什么关系?

[js] 纯函数和函数式编程有什么关系&#xff1f; 函数式编程是一种编程思想&#xff0c;纯函数是这种思想的基本要实现函数式编程&#xff0c;我们所封装的方法应该是抽象的&#xff0c;应该是和外部状态无关系的&#xff0c;也就需要是纯函数的&#xff0c;这样才能保证抽象的…

PHP 超级全局变量

PHP 超级全局变量列表: $GLOBALS $_SERVER $_REQUEST $_POST $_GET $_FILES $_ENV $_COOKIE $_SESSION 转载于:https://www.cnblogs.com/alexguoyihao/p/9086857.html

[js] 为什么要用纯函数?

[js] 为什么要用纯函数&#xff1f; 在此之前要先了解什么是纯函数&#xff0c;简单来说纯函数的定义有两个&#xff1a; 1.返回的结果只依赖于传入的参数。 2.执行过程中不产生副作用。 在这里就需要了解到什么是副作用 1.改变了外部变量或者对象属性 2.触发任何外部进程 3.发…

CentOS中安装Docker步骤

1、安装仓库所需要的软件包 yum install -y yum-utils device-mapper-persistent-data lvm22、设置yum加速源 yum-config-manager --add-repo http://mirrors.aliyun.com/repo/Centos-7.repo3、安装docker-ce yum install docker-ce docker-ce-cli containerd.io4、启动dock…

LeetCode 22. 括号生成(Generate Parentheses)

题目描述 给出 n 代表生成括号的对数&#xff0c;请你写出一个函数&#xff0c;使其能够生成所有可能的并且有效的括号组合。 例如&#xff0c;给出 n 3&#xff0c;生成结果为&#xff1a; ["((()))","(()())","(())()","()(())",&qu…

[js] 使用js实现一个图片剪裁的功能

[js] 使用js实现一个图片剪裁的功能 /** * 裁切图片* param imgUrl 原始图片路径* param x,y,width,height 从点[x, y]开始&#xff0c;将宽度width,高度height的区域裁切下来* tips&#xff1a;需要运行于服务器环境下切图片为同域*/ function clipImage(imgUrl, x, y, width…