当前位置: 首页 > news >正文

实战使用 Docker Compose 搭建 Redis Cluster 集群

文章目录

    • 前言
    • 技术积累
      • Docker Compose简介
      • Redis Cluster简介
      • Redis Cluster 解决的问题
    • 实战演示
      • 部署环境
      • 创建目录
      • 编写Redis配置文件
      • 编写Docker-Compose.yml
      • 执行yml文件,启动容器
      • 查看容器状态
      • 创建集群
      • 验证集群
      • 集群数据验证
    • 总结

前言

随着互联网技术的发展,数据存储和访问的速度要求越来越高。Redis作为一个高性能的键值数据库,广泛应用于各种场景中。为了提高系统的可用性和扩展性,Redis Cluster应运而生。本文将介绍如何使用Docker Compose搭建一个Redis Cluster集群,各位大大敬请鉴赏。

在这里插入图片描述

技术积累

Docker Compose简介

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过一个YAML文件,可以轻松地配置应用程序的服务、网络和卷等资源,并一键启动整个应用环境。

Redis Cluster简介

Redis Cluster是Redis官方提供的分布式解决方案,支持数据自动分片、节点间通信、故障转移等功能。Redis Cluster通过哈希槽(hash slot)的方式管理数据,共有16384个哈希槽,每个键根据CRC16算法分配到相应的槽中。

  • 虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。比如:Redis Cluster槽的范围是0 ~ 16383。槽是集群内数据管理和迁移的基本单位。
  • Redis Cluster采用虚拟槽分区,所有的键根据哈希函数映射到0 ~ 16383,计算公式:slot = CRC16(key)&16383。每一个节点负责维护一部分槽以及槽所映射的键值数据。

Redis Cluster 解决的问题

  • 存储空间不足‌:Redis Cluster通过将数据分散存储在多个节点上,提供了横向扩展的能力,从而解决了单实例Redis存储空间不足的问题‌12。
  • 高可用性‌:Redis Cluster通过数据分片和节点冗余,提高了系统的可用性和容错能力。即使部分节点发生故障,系统仍然可以正常运行,保证了服务的连续性‌13。
  • 并发性能问题‌:虽然Redis单实例可以处理高并发请求,但随着并发量的增加,单实例的性能会达到瓶颈。Redis Cluster通过分布式架构,允许更多的节点参与处理请求,从而提高了整体的并发处理能力‌

实战演示

部署环境

Redis Cluster三主三从(官方推荐最小集群数量)
Redis主节点1(6379)
Redis主节点2(6380)
Redis主节点3(6381)
Redis从节点1(6382)
Redis从节点2(6383)
Redis从节点3(6384)

创建目录

在这里插入图片描述

编写Redis配置文件

  • redis.conf
# 节点配置
# 绑定的主机地址
bind 0.0.0.0
# 禁用保护模式,以便允许集群节点之间的通信
protected-mode no
# 启用守护进程后,Redis会把pid写到一个pidfile中,在/var/run/redis.pid
daemonize no
# 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid
# 指定Redis监听端口,默认端口为6379
# 如果指定0端口,表示Redis不监听TCP连接
port 6379
# 当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 0
# 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
# debug (很多信息, 对开发/测试比较有用)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel verbose
# 日志记录方式,默认为标准输出,如果配置为redis为守护进程方式运行,而这里又配置为标准输出,则日志将会发送给/dev/null
logfile redis.log################################ SNAPSHOTTING  #################################
# RDB存储配置
# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
# Save the DB on disk:
#
#   save <seconds> <changes>
#
#   Will save the DB if both the given number of seconds and the given
#   number of write operations against the DB occurred.
#
#   满足以下条件将会同步数据:
#   900秒(15分钟)内有1个更改
#   300秒(5分钟)内有10个更改
#   60秒内有10000个更改
#   Note: 可以把所有“save”行注释掉,这样就取消同步操作了
save 900 1
save 300 10
save 60 10000
# 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
# 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
# 指定本地数据库存放目录,文件名由上一个dbfilename配置项指定
dir /data################################ REDIS CLUSTER  ###############################
# 开启集群
cluster-enabled yes
# 存储集群节点信息
cluster-config-file nodes.conf
# 超时设置    
cluster-node-timeout 5000            
################################# REPLICATION #################################
# 设置密码
masterauth 123456789################################## SECURITY ###################################
# 设置密码
requirepass 123456789############################## APPEND ONLY MODE ###############################
# 开启aof配置
appendonly yes
# 指定更新日志条件,共有3个可选值:
# no:表示等操作系统进行数据缓存同步到磁盘(快)
# always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
# everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
# 指定更新日志文件名,默认为appendonly.aof
appendfilename "appendonly.aof"

编写Docker-Compose.yml

version: '3.8'services:redis-master1:image: redis:6-alpinecontainer_name: redis-master1environment:- "TZ=Asia/Shanghai"ports:- "6379:6379"- "16379:16379"volumes:- ./redis.conf:/usr/local/etc/redis/redis.conf- ./redis-master1/data:/datacommand: - "redis-server" - "/usr/local/etc/redis/redis.conf"- "--cluster-announce-ip 172.16.8.212" # 服务器IP- "--cluster-announce-port 6379" # 服务器通讯IP- "--cluster-announce-bus-port 16379" #服务器集群通信IPnetworks:- redis-clusterredis-master2:image: redis:6-alpinecontainer_name: redis-master2environment:- "TZ=Asia/Shanghai"ports:- "6380:6379"- "16380:16379"volumes:- ./redis.conf:/usr/local/etc/redis/redis.conf- ./redis-master2/data:/datacommand:- "redis-server" - "/usr/local/etc/redis/redis.conf"- "--cluster-announce-ip 172.16.8.212"- "--cluster-announce-port 6380"- "--cluster-announce-bus-port 16380"networks:- redis-clusterredis-master3:image: redis:6-alpinecontainer_name: redis-master3environment:- "TZ=Asia/Shanghai"ports:- "6381:6379"- "16381:16379"volumes:- ./redis.conf:/usr/local/etc/redis/redis.conf- ./redis-master3/data:/datacommand:- "redis-server" - "/usr/local/etc/redis/redis.conf"- "--cluster-announce-ip 172.16.8.212"- "--cluster-announce-port 6381"- "--cluster-announce-bus-port 16381"networks:- redis-clusterredis-slave1:image: redis:6-alpinecontainer_name: redis-slave1environment:- "TZ=Asia/Shanghai"ports:- "6382:6379"- "16382:16379"volumes:- ./redis.conf:/usr/local/etc/redis/redis.conf- ./redis-slave1/data:/datacommand:- "redis-server" - "/usr/local/etc/redis/redis.conf"- "--cluster-announce-ip 172.16.8.212"- "--cluster-announce-port 6382"- "--cluster-announce-bus-port 16382"networks:- redis-cluster         redis-slave2:image: redis:6-alpinecontainer_name: redis-slave2environment:- "TZ=Asia/Shanghai"ports:- "6383:6379"- "16383:16379"volumes:- ./redis.conf:/usr/local/etc/redis/redis.conf- ./redis-slave2/data:/datacommand:- "redis-server" - "/usr/local/etc/redis/redis.conf"- "--cluster-announce-ip 172.16.8.212"- "--cluster-announce-port 6383"- "--cluster-announce-bus-port 16383"networks:- redis-clusterredis-slave3:image: redis:6-alpinecontainer_name: redis-slave3environment:- "TZ=Asia/Shanghai"ports:- "6384:6379"- "16384:16379"volumes:- ./redis.conf:/usr/local/etc/redis/redis.conf- ./redis-slave3/data:/datacommand:- "redis-server" - "/usr/local/etc/redis/redis.conf"- "--cluster-announce-ip 172.16.8.212"- "--cluster-announce-port 6384"- "--cluster-announce-bus-port 16384"networks:- redis-clusternetworks:redis-cluster:driver: bridge

执行yml文件,启动容器

docker-compose -f docker-compose.yaml up -d

在这里插入图片描述

查看容器状态

docker ps -a

在这里插入图片描述

可以看到所有容器都已经成功启动了

创建集群

docker exec -it redis-master1  redis-cli -h 127.0.0.1 -p 6379 -a 123456789 --cluster create 172.16.8.212:6379 172.16.8.212:6380 172.16.8.212:6381 172.16.8.212:6382 172.16.8.212:6383 172.16.8.212:6384 --cluster-replicas 1 --cluster-yes
D:\A-senfel\docker-data\redis\redis-cluster>docker exec -it redis-master1  redis-cli -h 127.0.0.1 -p 6379 -a 123456789 --cluster create 172.16.8.212:6379 172.16.8.212:6380 172.16.8.212:6381 172.16.8.212:6382 172.16.8.212:6383 172.16.8.212:6384 --cluster-replicas 1 --cluster-yes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.16.8.212:6383 to 172.16.8.212:6379
Adding replica 172.16.8.212:6384 to 172.16.8.212:6380
Adding replica 172.16.8.212:6382 to 172.16.8.212:6381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 148094fae3cb4ebefed6aa3591d4612d7f68057d 172.16.8.212:6379slots:[0-5460] (5461 slots) master
M: 380b3a38c654a5594612064b5a6e62af0eabd908 172.16.8.212:6380slots:[5461-10922] (5462 slots) master
M: aef9586773da0d70b556d01345daeebd94c5d4b1 172.16.8.212:6381slots:[10923-16383] (5461 slots) master
S: 9b7093f4270c9f385ea44935b4eb53c2a5565807 172.16.8.212:6382replicates aef9586773da0d70b556d01345daeebd94c5d4b1
S: 399b05fed734674e4d6971cfe3e3f3f0e1033585 172.16.8.212:6383replicates 148094fae3cb4ebefed6aa3591d4612d7f68057d
S: 44cb445c5403cb8ef3c237223021ce5752dc1d1e 172.16.8.212:6384replicates 380b3a38c654a5594612064b5a6e62af0eabd908
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
..
>>> Performing Cluster Check (using node 172.16.8.212:6379)
M: 148094fae3cb4ebefed6aa3591d4612d7f68057d 172.16.8.212:6379slots:[0-5460] (5461 slots) master1 additional replica(s)
M: 380b3a38c654a5594612064b5a6e62af0eabd908 172.16.8.212:6380slots:[5461-10922] (5462 slots) master1 additional replica(s)
M: aef9586773da0d70b556d01345daeebd94c5d4b1 172.16.8.212:6381slots:[10923-16383] (5461 slots) master1 additional replica(s)
S: 9b7093f4270c9f385ea44935b4eb53c2a5565807 172.16.8.212:6382slots: (0 slots) slavereplicates aef9586773da0d70b556d01345daeebd94c5d4b1
S: 399b05fed734674e4d6971cfe3e3f3f0e1033585 172.16.8.212:6383slots: (0 slots) slavereplicates 148094fae3cb4ebefed6aa3591d4612d7f68057d
S: 44cb445c5403cb8ef3c237223021ce5752dc1d1e 172.16.8.212:6384slots: (0 slots) slavereplicates 380b3a38c654a5594612064b5a6e62af0eabd908
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

如上所示,我们已经加入集群

验证集群

info replication 查看Redis节点信息
cluster nodes 查看集群节点信息

docker exec -it redis-master1 redis-cli -h 127.0.0.1 -p 6379 -a 123456789 cluster nodes
D:\A-senfel\docker-data\redis\redis-cluster>docker exec -it redis-master1 redis-cli -h 127.0.0.1 -p 6379 -a 123456789 cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
380b3a38c654a5594612064b5a6e62af0eabd908 172.16.8.212:6380@16380 master - 0 1750842509599 2 connected 5461-10922
aef9586773da0d70b556d01345daeebd94c5d4b1 172.16.8.212:6381@16381 master - 0 1750842509599 3 connected 10923-16383
9b7093f4270c9f385ea44935b4eb53c2a5565807 172.16.8.212:6382@16382 slave aef9586773da0d70b556d01345daeebd94c5d4b1 0 1750842509000 3 connected
399b05fed734674e4d6971cfe3e3f3f0e1033585 172.16.8.212:6383@16383 slave 148094fae3cb4ebefed6aa3591d4612d7f68057d 0 1750842509904 1 connected
148094fae3cb4ebefed6aa3591d4612d7f68057d 172.16.8.212:6379@16379 myself,master - 0 1750842509000 1 connected 0-5460
44cb445c5403cb8ef3c237223021ce5752dc1d1e 172.16.8.212:6384@16384 slave 380b3a38c654a5594612064b5a6e62af0eabd908 0 1750842509000 2 connected

如上所示,各个节点加入集群,并显示三主三从。

集群数据验证

redis-cli -c 客户端使用集群模式
写入数据到主节点1

docker exec -it redis-master1 redis-cli -c -h 127.0.0.1 -p 6379 -a 123456789 SET name "test_cluster_name"

主节点1读取数据查看是否设置成功

docker exec -it redis-master1 redis-cli -c -h 127.0.0.1 -p 6379 -a 123456789 GET name

主节点2读取数据查看是否设置成功

docker exec -it redis-master2 redis-cli -c -h 127.0.0.1 -p 6379 -a 123456789 GET name

从节点1读取数据,查看是否同步

docker exec -it redis-slave1 redis-cli -c -h 127.0.0.1 -p 6379 -a 123456789 GET name
D:\A-senfel\docker-data\redis\redis-cluster>docker exec -it redis-master1 redis-cli -c -h 127.0.0.1 -p 6379 -a 123456789 SET name "test_cluster_name"
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
OKD:\A-senfel\docker-data\redis\redis-cluster>docker exec -it redis-master1 redis-cli -h 127.0.0.1 -p 6379 -a 123456789 GET name
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
"test_cluster_name"D:\A-senfel\docker-data\redis\redis-cluster>docker exec -it redis-master2 redis-cli -c -h 127.0.0.1 -p 6379 -a 123456789 GET name
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
"test_cluster_name"D:\A-senfel\docker-data\redis\redis-cluster>docker exec -it redis-slave1 redis-cli -c -h 127.0.0.1 -p 6379 -a 123456789 GET name
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
"test_cluster_name"

总结

通过本文的实践,我们成功地使用Docker Compose搭建了一个Redis Cluster集群。这个过程不仅帮助我们理解了Redis Cluster的基本原理,还掌握了如何利用Docker Compose简化多容器应用的部署。其中重要的是Redis Cluster解决了分布式储存和提升高并发性能的瓶颈,大大提升了中间件和应用系统的高可用,简直不要太爽。

相关文章:

  • 台州网站建设咨询nba今日最新消息
  • 魔艺极速建站怎么制作自己的网站
  • 公司起名字大全免费测分1518广东seo
  • 石家庄企业网站建设价格谷歌搜索引擎在线
  • 类似网站的建设老鬼seo
  • 电子商务网站总体规划的内容广东seo排名
  • 盖雅工场 2025 香港 SAP NOW 大会深度解析:AI 重构亚太劳动力管理数字化生态
  • Tauri(2.5.1)+Leptos(0.8.2)开发自用桌面小程序--DeepSeek辅助编程(俄罗斯方块)
  • 自用006
  • 单片机常用通信外设特点及通信方式对比表
  • Spark Streaming 与 Flink 实时数据处理方案对比与选型指南
  • QUdpScoket 组播实现及其中的踩坑点记录
  • 云原生与人工智能的融合:从弹性架构到智能运维的IT新范式
  • 华为云Flexus+DeepSeek征文 | 掌握高效开发:利用华为云ModelArts Studio在VS Code中配置Cline AI编程助手
  • [AI工具]Fish-speech部署教程(环境搭建记录)
  • spring boot项目整合百度翻译
  • 北斗导航 | 卫星载噪比(C/N₀)的定义与解析
  • 什么是PD快充诱骗取电协议,它有哪些特点及应用场景如XSP01A
  • 【HLS】pragma HLS bundle的用法 AXI接口
  • uniapp小程序在线预览
  • 前端流式接口/Socket.IO/WebSocket的区别和选用
  • 高精度RTK定位导航模块软硬件协同设计
  • Redis大规模Key遍历实战:性能与安全的最佳实践
  • 【网站内容安全检测】之3:获取所有外部域名访问后图像
  • 【邀请】点击邀请链接参加阿里云训练营活动,完成学习送礼品+户外折叠凳,一个小时就能完成
  • UI前端与大数据的深度融合:推动产品设计迭代升级