docker搭建redis集群

docker-compose是以多容器的方式启动,非常适合用来启动集群

一、环境准备

云环境:CentOS 7.6 64位

二、安装docker-compose

#需要先安装企业版linux附加包(epel)
yum -y install epel-release
#安装pip
yum -y install python-pip
#安装docker-compose
pip install docker-compose

三、创建docker-compose.yml

以docker-compose启动时会从当前路径找docker-compose.yml或者docker-compose.yaml

从docker官网上找一份docker-compose.yml ,传送门----------------------------------------https://docs.docker.com/compose/compose-file/

docker-compose启动单机redis

接下来先用docker-compose尝试启动单点redis,下面是docker-compose配置文件

#docker-compose版本
version: "3.8"
services:
# service实例名
redis:
#容器服务名
container_name: redis-0
#基础镜像
image: redis
#端口映射
#第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000
ports:
- 6379:6379
- 16379:16379
#映射宿主机的数据卷 配置数据目录和配置文件目录 HOST:CONTAINER
volumes:
- /usr/docker/redis/data:/data
- /usr/docker/redis/redis.conf:/etc/redis/redis.conf
# 设置服务默认的启动程序
entrypoint:
- redis-server
- /etc/redis/redis.conf

同时需要配置redis.conf ,配置以及配置项的修改请移步上一篇博文------从零开始学习docker之在docker中搭建redis(单机)

配置好之后只需要在docker-compose.yml所在目录执行

docker-compose up -d

启动成功,连接redis与验证同样移步上一篇博文

docker-compose启动redis集群

docker-compose.yml

#https://docs.docker.com/compose/compose-file/
#version
version: "3.8"
services:
# 节点1
redis-1:
#容器服务名
container_name: redis-1
#基础镜像
image: redis
#端口映射
#第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000
ports:
- 6381:6381
- 16381:16381
#映射宿主机的数据卷 配置数据目录和配置文件目录 HOST:CONTAINER
volumes:
- /usr/docker/redis-cluster/redis-6381/data:/data
- /usr/docker/redis-cluster/redis-6381/redis.conf:/etc/redis/redis.conf
# 设置服务默认的启动程序
entrypoint:
- redis-server
- /etc/redis/redis.conf # 节点2
redis-2:
#容器服务名
container_name: redis-2
#基础镜像
image: redis
#端口映射
#第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000
ports:
- 6382:6382
- 16382:16382
#映射宿主机的数据卷 配置目录
volumes:
- /usr/docker/redis-cluster/redis-6382/data:/redis/data
- /usr/docker/redis-cluster/redis-6382/redis.conf:/etc/redis/redis.conf
# 设置服务默认的启动程序
entrypoint:
- redis-server
- /etc/redis/redis.conf
# 节点3
redis-3:
#容器服务名
container_name: redis-3
#基础镜像
image: redis
#端口映射
#第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000
ports:
- 6383:6383
- 16383:16383
#映射宿主机的数据卷 配置目录
volumes:
- /usr/docker/redis-cluster/redis-6383/data:/data
- /usr/docker/redis-cluster/redis-6383/redis.conf:/etc/redis/redis.conf
# 设置服务默认的启动程序
entrypoint:
- redis-server
- /etc/redis/redis.conf
# 节点4
redis-4:
#容器服务名
container_name: redis-4
#基础镜像
image: redis
#端口映射
#第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000
ports:
- 6384:6384
- 16384:16384
#映射宿主机的数据卷 配置目录
volumes:
- /usr/docker/redis-cluster/redis-6384/data:/redis/data
- /usr/docker/redis-cluster/redis-6384/redis.conf:/etc/redis/redis.conf
# 设置服务默认的启动程序
entrypoint:
- redis-server
- /etc/redis/redis.conf
# 节点5
redis-5:
#容器服务名
container_name: redis-5
#基础镜像
image: redis
#端口映射
#第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000
ports:
- 6385:6385
- 16385:16385
#映射宿主机的数据卷 配置目录
volumes:
- /usr/docker/redis-cluster/redis-6385/data:/redis/data
- /usr/docker/redis-cluster/redis-6385/redis.conf:/etc/redis/redis.conf
# 设置服务默认的启动程序
entrypoint:
- redis-server
- /etc/redis/redis.conf
# 节点6
redis-6:
#容器服务名
container_name: redis-6
#基础镜像
image: redis
#端口映射
#第一个端口是客户端通信端口 第二个端口为集群总线端口 用于失败检测以及故障转移、选举等 偏移量总是10000
ports:
- 6386:6386
- 16386:16386
#映射宿主机的数据卷 配置目录
volumes:
- /usr/docker/redis-cluster/redis-6386/data:/redis/data
- /usr/docker/redis-cluster/redis-6386/redis.conf:/etc/redis/redis.conf
# 设置服务默认的启动程序
entrypoint:
- redis-server
- /etc/redis/redis.conf

集群模式的redis.conf除了要改单机的几个配置外(端口、本地访问保护) 还需要修改集群配置。

#把这一行的#注掉 表示支持集群
cluster-enabled yes
#集群配置文件(启动时自动生成)
cluster-config-file nodes_xxx.conf

我这里的话没有配置网络,启动的时候会为这些容器统一创建一个名字为redis-cluster_default的网络。同时也可以自定义网络。

配置好之后通过docker-compose up -d执行

6个节点能启动成功了 这个时候随便进入一个节点开启集群模式

redis-cli --cluster create 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386 --cluster-replicas 1

可以看到开启集群模式后默认分配了主从服务器 选yes接受该配置

这时候主从服务器都加入到集群中去了 到这里集群就已经搭建好了

四、验证redis集群

首先进入其中某一个节点

redis-cli -c -h 127.0.0.1 -p 6381

连接到redis之后可以通过cluster-nodes显示集群节点分布情况

可以看到三主三从

redis6381节点 set值之后根据hash环分布 数据落在6382节点上

五、相关代码及配置文件

传送门----------------------------------https://github.com/DreamsChaser/docker

六、问题汇总

问题1

ERROR: for redis-master-1  Cannot start service redis-master-1: OCI runtime create failed: container_linux.go:349: 
starting container process caused "exec: \"redis-server /etc/redis/redis.conf\": stat redis-server /etc/redis/redis.conf: no such file or directory": unknown

这种情况会好多种原因 可能是因为配置文件映射路径有问题导致

我这出现的情况是因为我在写 容器启动的命令entrypoint时没有按照yml的文件格式导致不识别所致

问题2

Node 127.0.0.1:6381 is not configured as a cluster node

未开启集群模式,需要在redis.conf里开启,具体见上面redis.conf配置

从零开始学习docker之在docker中搭建redis(集群)的更多相关文章

  1. Windows中搭建Redis集群

    从 http://rubyinstaller.org/downloads/ 下载Ruby2.2.5(x64)并安装,安装时勾选添加至路径变量中 命令行中执行gem source -a http://g ...

  2. 这次一定要教会你搭建Redis集群和MySQL主从同步(非Docker)

    前言 一直都想自己动手搭建一个Redis集群和MySQL的主从同步,当然不是依靠Docker的一键部署(虽然现在企业开发用的最多的是这种方式),所以本文就算是一个教程类文章吧,但在动手搭建之前,会先聊 ...

  3. docker搭建redis集群

    一.简介 docker作为一个容器技术,在搭建资源隔离性服务上具有很大的优势,在一台服务器上可以启动多个docker容器,感觉每个在容器里面部署的服务就像是部署在不同的服务器上.此次基于docker以 ...

  4. docker搭建redis集群和Sentinel,实现故障转移

    0.引言 公司开发需要用到redis,虽然有运维自动搭建,还是记录下如何搭建redis集群和Sentinel. 采用的是vagrant虚拟机+docker的方式进行搭建. 搭建思路: 首先是借鉴下其他 ...

  5. VMware 克隆linux后找不到eth0(学习hadoop,所以想快速搭建一个集群)

    发生情况:      由于在学习hadoop,所以想快速搭建一个集群出来.所以直接在windows操作系统上用VMware安装了CentOS操作系统,配置好hadoop开发环境后,采用克隆功能,直接克 ...

  6. linux系统centOS7下搭建redis集群中ruby版本过低问题的解决方法

    问题描述: 在Centos7中,通过yum安装ruby的版本是2.0.0,但是如果有些应用需要高版本的ruby环境,比如2.2,2.3,2.4... 那就有点麻烦了,譬如:我准备使用redis官方给的 ...

  7. Mac 搭建 Redis 集群

    date: 2020-09-24 16:24:00 updated: 2020-09-24 17:30:00 Mac 搭建 Redis 集群 参考文档 摘要 安装docker brew cask in ...

  8. Dubbo入门到精通学习笔记(十五):Redis集群的安装(Redis3+CentOS)、Redis集群的高可用测试(含Jedis客户端的使用)、Redis集群的扩展测试

    文章目录 Redis集群的安装(Redis3+CentOS) 参考文档 Redis 集群介绍.特性.规范等(可看提供的参考文档+视频解说) Redis 集群的安装(Redis3.0.3 + CentO ...

  9. 用C、python手写redis客户端,兼容redis集群 (-MOVED和-ASK),快速搭建redis集群

    想没想过,自己写一个redis客户端,是不是很难呢? 其实,并不是特别难. 首先,要知道redis服务端用的通信协议,建议直接去官网看,博客啥的其实也是从官网摘抄的,或者从其他博客抄的(忽略). 协议 ...

随机推荐

  1. 数组的连接和截取(contact和slice和splice)

    <script> var arr1 = ["a","b","c"]; var arr2 = [1,2,3]; //concat把 ...

  2. Python之利用jieba库做词频统计且制作词云图

    一.环境以及注意事项 1.windows10家庭版 python 3.7.1 2.需要使用到的库 wordcloud(词云),jieba(中文分词库),安装过程不展示 3.注意事项:由于wordclo ...

  3. App 开发中判断 ios 和 andriod 常用方法便于修复在两类机型样式不一样等缺陷

    判断安卓, ios

  4. Cobalt Strike系列教程第七章:提权与横向移动

    Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...

  5. json:格式化数据

    formatData = JSON.Stringfy(data, null, 2)

  6. 博云DevOps 3.0重大升级 | 可用性大幅提升、自研需求管理&自定义工作流上线,满足客户多样化需求

    DevOps能够为企业带来更高的部署频率.更短的交付周期与更快的客户响应速度.标准化.规范化的管理流程,可视化和数字化的研发进度管理和可追溯的版本也为企业带来的了更多的价值.引入DevOps成为企业实 ...

  7. SpringBoot系列(十)优雅的处理统一异常处理与统一结果返回

    SpringBoot系列(十)统一异常处理与统一结果返回 往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列 ...

  8. 基于 HTML WebGL 的会展中心智能监控系统

    前言 随着近几年物联网.万物互联等诸多概念的大行其道,智慧城市的概念也早已经被人们耳熟能详,而作为城市的组成部分,智慧建筑也是重中之重,智慧园区,智慧小区等也如雨后春笋般的相继出现. 智慧建筑是指通过 ...

  9. js 一维数组,转成嵌套数组

    // 情况一: // 数据源var egs = [ {name_1: 'name_1...'}, {name_2: 'name_4...'}, {name_3: 'name_3...'}, {name ...

  10. 0day堆(1)堆的管理策略

    基本概念 堆块:堆区内存的基本单位 包括两个部分:块首,块身 块首:标识这个堆块自身的信息:如大小,是否被占用等 块身:分配给用户使用的数据区 堆表:一般位于堆区的起始位置,用于索引堆区所有堆块的信息 ...