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

速通Docker === 快速部署Redis主从集群

目录

镜像仓库介绍

持久化你的数据库

连接到其他容器

创建自定义网络

部署主节点

部署从节点

验证部署

总结


在现代应用架构中,Redis作为一个高性能的内存数据库,被广泛应用于缓存、会话存储、实时分析等多个领域。为了提高Redis的可用性和数据的可靠性,通常会采用主从复制的方式构建Redis集群。下面将介绍如何使用Bitnami提供的Docker镜像快速部署一个Redis主从同步集群,并实现读写分离。

镜像仓库介绍

Bitnami提供的Redis Docker镜像预配置了多种环境变量,使得部署和配置变得非常简单。此外,该镜像还包含了必要的安全补丁和性能优化,适合生产环境使用。

Bitnami Redis镜像的Docker Hub地址为: https://hub.docker.com/r/bitnami/redis 你可以直接从这个地址拉取镜像,或者在Docker命令中指定该地址来部署Redis实例。

持久化你的数据库

如果删除容器,所有数据都将丢失,下次运行镜像时,数据库将重新初始化。为了避免数据丢失,您应该安装一个在删除容器后仍能保留的卷。

为了持久化,您应该在路径上挂载一个目录/bitnami。如果挂载的目录为空,它将在第一次运行时被初始化。

docker run \-e ALLOW_EMPTY_PASSWORD=yes \-v /path/to/redis-persistence:/bitnami/redis/data \bitnami/redis:latest

环境变量

ALLOW_EMPTY_PASSWORD允许无密码访问
REDIS_REPLICATION_MODERedis 复制模式(值:master、slave)nil
REDIS_PASSWORDRedis 的密码nil
REDIS_MASTER_HOSTRedis 主主机(由从属服务器使用)
REDIS_MASTER_PORT_NUMBERRedis 主服务器主机端口(由从服务器使用)6379
REDIS_MASTER_PASSWORDRedis 主节点密码nil
REDIS_DEFAULT_PORT_NUMBER(6379)Redis 端口号(构建时)6379
连接到其他容器

使用Docker 容器网络⁠,您的应用程序容器可以轻松访问在容器内运行的 Redis(R) 服务器。

连接到同一网络的容器可以使用容器名称作为主机名相互通信。

在这个例子中,我们将创建一个 Redis(R) 客户端实例,它将连接到与客户端在同一个 docker 网络上运行的服务器实例。

步骤 1:创建网络

docker network create app-tier --driver bridge

第 2 步:启动 Redis(R) 服务器实例

使用命令--network app-tier的参数docker run将 Redis(R) 容器附加到app-tier网络。 

docker run -d --name redis-server \-e ALLOW_EMPTY_PASSWORD=yes \--network app-tier \bitnami/redis:latest

步骤 3:启动您的 Redis(R) 客户端实例

最后我们创建一个新的容器实例来启动Redis(R)客户端并连接到上一步创建的服务器:

  1. 创建一个临时的 Redis 客户端容器。

  2. 将容器连接到名为 app-tier 的 Docker 网络。

  3. 在容器启动后,运行 redis-cli 并连接到网络中名为 redis-server 的 Redis 服务器。

  4. 容器运行结束后,自动清理容器实例。

docker run -it --rm \--network app-tier \bitnami/redis:latest redis-cli -h redis-server

创建自定义网络

为了模拟生产环境,我们首先创建一个自定义的Docker网络:

docker network create mynet

部署主节点

接下来,我们部署Redis的主节点。这里我们使用了Bitnami提供的Redis镜像,它预设了很多环境变量,使得配置变得相对简单。

docker run -d -p 6379:6379 \-v /opt/redis/redis01:/bitnami/redis/data \-e REDIS_REPLICATION_MODE=master \-e REDIS_PASSWORD=123456\--network mynet --name redis01 \bitnami/redis

由于映射的文件可能没有操作权限,我们需要给目录授予权限:


Can't open or create append-only dir appendonlydir: Permission denied

# 查看日志docker logs 21d23a19897c
# 进入目录
cd /opt/redis/
# 列出当前目录的文件和目录的详细信息
ll
# drwxr-xr-x 2 root root 4096 Jan 21 21:59 redis01 
  1. drwxr-xr-x

    • d:表示这是一个目录(Directory)。

    • rwx:表示所有者(Owner)的权限,可以读(r)、写(w)和执行(x)。

    • r-x:表示所属用户组(Group)的权限,可以读(r)和执行(x),但不能写(w)。

    • r-x:表示其他用户(Others)的权限,同样可以读(r)和执行(x),但不能写(w)

  2. 2 root root

    • 2 表示该目录的链接数(这里不重要)。

    • 第一个root表示目录的所有者是root用户。

    • 第二个root表示目录所属的用户组是root组。

  3. 4096  表示该目录的大小,单位是字节。

  4. Jan 21 21:59 表示目录的最后修改时间,这里是1月21日21点59分。

  5. redis01 这是目录的名字,叫redis01

总结:这是一个名为redis01的目录,属于root用户和root组,权限设置为所有者可以读写执行,其他用户只能读和执行。

 chmod -R 777  /opt/redis

修改后所有人可读可写可执行

drwxrwxrwx 2 root root 4096 Jan 21 21:59 redis01 

然后重启实例:

docker restart redis01

部署从节点

 同样,我们需要给从节点映射的目录赋予操作权限:

# 创建文件
mkdir -p /opt/redis/redis02
# 写入权限 所有人 可读 可写 可执行
chmod -R 777  /opt/redis

在主节点运行之后,我们可以部署从节点。从节点会同步主节点的数据,并提供读操作。

docker run -d -p 6380:6379 \-v /opt/redis/redis02:/bitnami/redis/data \-e REDIS_REPLICATION_MODE=slave \-e REDIS_MASTER_HOST=redis01 \-e REDIS_MASTER_PORT_NUMBER=6379 \-e REDIS_MASTER_PASSWORD=123456\-e REDIS_PASSWORD=123456\--network mynet --name redis02 \bitnami/redis

 

验证部署

连接成功后,我们可以往主节点添加一个key,然后刷新从节点,检查是否已自动同步主节点的数据。

连接两个Redis服务 

往主节点添加一个key 
SET runoobkey redis


 

刷新从节点,已自动同步主节点数据

总结

通过以上步骤,我们成功使用Docker部署了一个Redis主从同步集群,并实现了读写分离。这种部署方式不仅简化了配置过程,还提高了数据的可靠性和系统的可用性。在未来的生产环境中,我们可以根据需要添加更多的从节点,以进一步提高系统的扩展性和稳定性。

http://www.lryc.cn/news/524701.html

相关文章:

  • 论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(一)
  • stm32使用MDK5.35时遇到*** TOOLS.INI: TOOLCHAIN NOT INSTALLED
  • 在Ubuntu上安装RabbitMQ教程
  • 【算法】集合List和队列
  • uniapps使用HTML5的io模块拷贝文件目录
  • css‘s hover VS mobile
  • 工业制造离不开的BOM
  • HTML中的`<!DOCTYPE html>`是什么意思?
  • C语言之斗地主游戏
  • 【玩转全栈】----Django制作部门管理页面
  • Unreal Engine 5 C++ Advanced Action RPG 十章笔记
  • 学习ASP.NET Core的身份认证(基于JwtBearer的身份认证9)
  • 缓存之美:万文详解 Caffeine 实现原理(上)
  • Spark/Kafka
  • 深入浅出:Go语言中的Unicode与字符编码详解
  • 什么是SSL及SSL的工作流程
  • .Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)
  • AD7606, 逐次逼近型ADC以及一次被GPT坑了的过程.
  • 抬手、放手识别算法
  • 深度学习篇---AnacondaLabelImg
  • 探索云原生可观测性:技术与团队协作的深度结合
  • 解决 Django 5.1 中的 TemplateSyntaxError 错误
  • 基于SSM的自助购药小程序设计与实现(LW+源码+讲解)
  • 04JavaWeb——Maven-SpringBootWeb入门
  • 场馆预定平台高并发时间段预定实现V2
  • 如何利用边缘节点服务打造极致用户体验?
  • C语言之小型成绩管理系统
  • ASP.NET Core 中基于 Cookie 的身份鉴权实现
  • 为什么要学习C++?
  • freecad1.0的编译