为了构建一个集群,我们首先要让 redis 启用集群模式

一个简单的配置文件如下redis.conf

# redis.conf file
port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

因为是在单机上演示,所以我们得修改 port 防止冲突

比如我们要创建3主5副的集群,那么这八个 redis 实例启动的时候就应该用不同的端口(7000,7001...7007),这样能防止冲突。

.
├── 7000
│ └── redis.conf
├── 7001
│ └── redis.conf
├── 7002
│ └── redis.conf
├── 7003
│ └── redis.conf
├── 7004
│ └── redis.conf
├── 7005
│ └── redis.conf
├── 7006
│ └── redis.conf
├── 7007
│ └── redis.conf

./7000/redis.conf 中的 port 设置成7000,依此类推./7007/redis.conf中的 port 应该设置成7007

往事俱备,只需运行redis-server ./redis.conf命令即可,当然你需要到依次启动八个 redis server

for i in `seq 7000 7007`;
do
exec redis-server ./${i}/redis.conf &
done redis-cli --cluster create\
127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003\
127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 127.0.0.1:7007\
--cluster-replicas 1

这样整个集群就搭建好了,你可以选择运行在 port 7000-7007中的任意一个 servr 登录,然后去执行一些你喜欢的命令验证一下[狗头]

使用Docker-Compose构建集群

现在让我们来明确一下流程,首先我们需要启动八个 redis server 实例,然后运行 redis-cli --cluster create 命令创建集群,这意味着我们需要创建一个 docker network 使得集群成员能够互相通讯

创建一个 network 也很简单

networks:
redis-network:
name: redis-network
## 使用网桥
driver: bridge
ipam:
driver: default
## 指定网段,需要注意不能与已有的 docker network 相冲突
config:
- subnet: 172.18.0.0/24

还记得之前命令行是如何启动集群的吗?最后需要运行命令redis-cli --cluster create ,整个集群才算成功创建,那在 yml 文件中该怎么写呢?

我们可以借助 depends_on来告诉 docker 当前的 service 依赖其他的 service

具体的细节请看完整的yml文件

## redis.conf
port 6379
cluster-enabled yes
cluster-config-file nodes-redis.conf
cluster-node-timeout 5000
appendonly yes
appendfilename "appendonly-redis.aof"
version: "3.7"

networks:
redis-network:
name: redis-network
driver: bridge
ipam:
driver: default
config:
- subnet: 172.18.0.0/24 services:
redis-cluster:
image: redis:6-alpine
command: 'redis-cli --cluster create
172.18.0.11:6379 172.18.0.12:6379 172.18.0.13:6379 172.18.0.14:6379
172.18.0.15:6379 172.18.0.16:6379 172.18.0.17:6379 172.18.0.18:6379
--cluster-yes --cluster-replicas 1'
networks:
- redis-network
depends_on:
- redis1
- redis2
- redis3
- redis4
- redis5
- redis6
- redis7
- redis8 redis1:
image: redis:6-alpine
container_name: redis1
command: redis-server /usr/local/etc/redis/redis.conf
networks:
redis-network:
ipv4_address: 172.18.0.11
expose:
- 6379
volumes:
- $PWD/docker-data/redis1:/data
- $PWD/docker-config/redis.conf:/usr/local/etc/redis/redis.conf redis2:
image: redis:6-alpine
container_name: redis2
command: redis-server /usr/local/etc/redis/redis.conf
networks:
redis-network:
ipv4_address: 172.18.0.12
expose:
- 6379
volumes:
- $PWD/docker-data/redis2:/data
- $PWD/docker-config/redis.conf:/usr/local/etc/redis/redis.conf redis3:
image: redis:6-alpine
container_name: redis3
command: redis-server /usr/local/etc/redis/redis.conf
networks:
redis-network:
ipv4_address: 172.18.0.13
expose:
- 6379
volumes:
- $PWD/docker-data/redis3:/data
- $PWD/docker-config/redis.conf:/usr/local/etc/redis/redis.conf redis4:
image: redis:6-alpine
container_name: redis4
command: redis-server /usr/local/etc/redis/redis.conf
networks:
redis-network:
ipv4_address: 172.18.0.14
expose:
- 6379
volumes:
- $PWD/docker-data/redis4:/data
- $PWD/docker-config/redis.conf:/usr/local/etc/redis/redis.conf redis5:
image: redis:6-alpine
container_name: redis5
command: redis-server /usr/local/etc/redis/redis.conf
networks:
redis-network:
ipv4_address: 172.18.0.15
expose:
- 6379
volumes:
- $PWD/docker-data/redis5:/data
- $PWD/docker-config/redis.conf:/usr/local/etc/redis/redis.conf redis6:
image: redis:6-alpine
container_name: redis6
command: redis-server /usr/local/etc/redis/redis.conf
networks:
redis-network:
ipv4_address: 172.18.0.16
expose:
- 6379
volumes:
- $PWD/docker-data/redis6:/data
- $PWD/docker-config/redis.conf:/usr/local/etc/redis/redis.conf redis7:
image: redis:6-alpine
container_name: redis7
command: redis-server /usr/local/etc/redis/redis.conf
networks:
redis-network:
ipv4_address: 172.18.0.17
expose:
- 6379
volumes:
- $PWD/docker-data/redis7:/data
- $PWD/docker-config/redis.conf:/usr/local/etc/redis/redis.conf redis8:
image: redis:6-alpine
container_name: redis8
command: redis-server /usr/local/etc/redis/redis.conf
networks:
redis-network:
ipv4_address: 172.18.0.18
expose:
- 6379
volumes:
- $PWD/docker-data/redis8:/data
- $PWD/docker-config/redis.conf:/usr/local/etc/redis/redis.conf

最后不要忘记了最基本的命令

sudo docker-compose up # 在当前命令下运行,启动集群
sudo docker-compose down # 关闭集群的同时会将 docker-network也一并删除

如何与集群通信

# 登录任意一个节点执行命令即可,集群会根据key的哈希值,将你的命令重定位
sudo docker exec -it redis5 redis-cli -p 6379
set foo bar
sudo docker exec -it redis1 redis-cli -p 6379
get foo
# output bar

参考

reids官网 course

Docker极简入门:使用Docker-Compose 搭建redis集群的更多相关文章

  1. .Net Core in Docker极简入门(下篇)

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 Docker-Compose 代码修改 yml file up & down 镜像仓库 最后 前言 上一篇[. ...

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

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

  3. 从零开始学习docker之在docker中搭建redis(集群)

    docker搭建redis集群 docker-compose是以多容器的方式启动,非常适合用来启动集群 一.环境准备 云环境:CentOS 7.6 64位 二.安装docker-compose #需要 ...

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

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

  5. docker搭建redis集群

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

  6. Mac 搭建 Redis 集群

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

  7. Windows下 搭建redis集群

    Windows下搭建redis集群教程 一,redis集群介绍 Redis cluster(redis集群)是在版本3.0后才支持的架构,和其他集群一样,都是为了解决单台服务器不够用的情况,也防止了主 ...

  8. 基于 twemproxy 搭建 redis 集群

    概述 由于单台redis服务器的内存管理能力有限,使用过大内存redis服务器的性能急剧下降,且服务器发生故障将直接影响大面积业务.为了获取更好的缓存性能及扩展型,我们将需要搭建redis集群来满足需 ...

  9. Windows下搭建Redis集群

    Redis集群: 如果部署到多台电脑,就跟普通的集群一样:因为Redis是单线程处理的,多核CPU也只能使用一个核, 所以部署在同一台电脑上,通过运行多个Redis实例组成集群,然后能提高CPU的利用 ...

随机推荐

  1. Arthas之类操作

    Arthas之类操作 1. classLoader 查询当前JVM中存在的classloader classloader name numberOfInstances loadedCountTotal ...

  2. SpringBoot中的日志使用:

    SpringBoot中的日志使用(一) 一:日志简介: 常用的日志接口 commons-logging/slf4j 日志框架:log4j/logback/log4j2 日志接口屏蔽了日志框架的底层实现 ...

  3. 一个tomcat部署两个springboot服务时启动JMX报错

    一.问题来源 今天在部署开发好的组件的时候,发现无法启动,检查启动日志,报如下错误: 2022-03-17T10:39:41.823+08:00 ERROR vediomanage.vediomana ...

  4. 使用Pycharm IDE工具,使用input()函数出现>?符号

    Python Console  ===  如果你是要Pycharm开发Python项目时,出现使用input函数,提示 >? 符号的时候,那应该是开启了Python Console控制台输出,取 ...

  5. css添加全部省略号的方式

    https://css-tricks.com/line-clampin/ 框架Clamp:https://github.com/josephschmitt/Clamp.js

  6. 关于table表格中点击一个按钮获取该行的某一列的值并将其传到模态框的问题解决

    <tbody> {% for item in all_dataset %} <tr> <td>{{ item.nid }}</td> <td> ...

  7. 面试问题之C++语言:说一说C++中四种cast转换

    C++中四种类型转换是:static_cast.dynamic_cast.const_cast.reinterpret_cast 1.const_cast 常量转换,用于将const变量转为非cons ...

  8. SpringCloudAlibaba 微服务讲解(四)Sentinel--服务容错(二)

    4.7 Sentinel 规则 4.7.1 流控规则 流量控制,其原理是监控应用流量的QPS(每秒查询率)或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的榴莲高峰冲垮,从而保障应用 ...

  9. (stm32f103学习总结)—输入捕获模式

    一.输入捕获介绍 在定时器中断实验章节中我们介绍了通用定时器具有多种功能,输入捕获就是其中一种.STM32F1 除了基本定时器 TIM6 和 TIM7,其他定时器都具有输入捕获功能.输入捕获可以对输入 ...

  10. Linux 0.11源码阅读笔记-文件IO流程

    文件IO流程 用户进程read.write在高速缓冲块上读写数据,高速缓冲块和块设备交换数据. 什么时机将磁盘块数据读到缓冲块? 什么时机将缓冲块数据刷到磁盘块? 函数调用关系 read/write( ...