Linux使用docker搭建Redis主从复制


1. 安装 Docker

Docker安装

2. 创建 Docker 网络

为 Redis 容器创建一个自定义网络,使它们能够相互通信。

[root@icoolkj docker]# docker network create redis-net

3. 启动 Redis 主服务器容器并设置端口

启动 Redis 主服务器容器,并将 Redis 的默认端口(6379)映射到主机上的另一个端口(例如 8001)。你可以通过以下命令来实现:

[root@icoolkj docker]# docker run -d --name redis-master --network redis-net --hostname redis-master -p 8001:6379 redis

在这个命令中:

  • -d 表示以后台模式运行容器。
  • --name redis-master 为容器命名为 redis-master
  • --network redis-net 将容器连接到 redis-net 网络。
  • --hostname redis-master 设置容器的主机名。
  • -p 8001:6379 将主机的 8001 端口映射到容器的 6379 端口。

4. 获取主服务器的 IP 地址

获取 Redis 主服务器容器的 IP 地址,这个地址将在配置从服务器时使用。

[root@icoolkj docker]# docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-master
172.19.0.2

 5. 启动 Redis 从服务器

启动 Redis 从服务器容器,并将其配置为连接到主服务器。假设主服务器的 IP 地址是 172.19.0.2(替换为你实际的 IP 地址),从服务器的 Redis 端口可以保持默认的 6379。

[root@icoolkj docker]# docker run -d --name redis-slave1 --network redis-net --hostname redis-slave1 -p 8002:6379 redis redis-server --replicaof 172.19.0.2 6379
[root@icoolkj docker]# docker run -d --name redis-slave2 --network redis-net --hostname redis-slave2 -p 8003:6379 redis redis-server --replicaof 172.19.0.2 6379

6. 验证主从复制

进入 Redis 从服务器容器,并验证主从复制是否成功。

验证第一个从服务器

 在 Redis CLI 中运行以下命令:

[root@icoolkj docker]# docker exec -it redis-slave1 redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
......

你应该看到类似以下的输出,其中包含 role:slave,并且指定了主服务器的 IP 地址和端口。

验证第二个从服务器

[root@icoolkj docker]# docker exec -it redis-slave2 redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
......

 你也应该看到类似的输出,表明其作为从服务器运行,并正确指向主服务器。

7. 测试主从复制

在 Redis 主服务器上设置一些键值对,然后检查从服务器是否同步了这些数据。

在主服务器上设置键值对

[root@icoolkj docker]# docker exec -it redis-master redis-cli
127.0.0.1:6379> set key1 "hello, redis"
OK
127.0.0.1:6379> get key1
"hello, redis"
127.0.0.1:6379> 

在从服务器上验证键值对

 [root@icoolkj docker]# docker exec -it redis-slave1 redis-cli
127.0.0.1:6379> get key1
"hello, redis"
127.0.0.1:6379> exit
[root@icoolkj docker]# docker exec -it redis-slave2 redis-cli
127.0.0.1:6379> get key1
"hello, redis"
127.0.0.1:6379> 

 你应该在两个从服务器上看到 key1的值为 hello, redis,这表明主从复制配置成功。

====================================================================

使用 docker-compose.yml 配置 Redis 主从复制

使用 Docker 容器运行 Redis 时,如果没有正确配置数据持久化,容器挂掉后数据确实有丢失的风险。为了避免这种情况,可以将 Redis 数据存储在宿主机的文件系统上,而不是容器内部。这可以通过 Docker 的卷(volumes)来实现。使用 docker-compose.yml 配置 Redis 主从复制,并将数据和日志持久化到本地,可以按照以下步骤进行。我们将创建一个主服务器和两个从服务器,并将它们的数据和日志持久化到宿主机。

目录结构

首先,在宿主机上创建用于存储数据和日志的目录结构:

[root@icoolkj docker]# mkdir -p /data/docker/redis/master/data

[root@icoolkj docker]# mkdir -p /data/docker/redis/slave1/data

[root@icoolkj docker]# mkdir -p /data/docker/redis/slave2/data

[root@icoolkj docker]# mkdir -p /data/docker/redis/master/logs

[root@icoolkj docker]# mkdir -p /data/docker/redis/slave1/logs

[root@icoolkj docker]# mkdir -p /data/docker/redis/slave2/logs

## 确保 Redis 进程有权访问和写入这些目录。你可以使用以下命令更改目录权限:

[root@icoolkj docker]# chmod -R 777 /data/docker/redis/

docker-compose.yml 配置

接下来,创建一个 docker-compose.yml 文件,并添加以下内容:

version: '3.3'

services:
  redis-master:
    image: redis:latest
    container_name: redis-master
    ports:
      - "8001:6379"
    volumes:
      - /data/docker/redis/master/data:/data
      - /data/docker/redis/master/logs:/logs
    command: ["redis-server", "--appendonly", "yes", "--logfile", "/logs/redis-master.log"]

  redis-slave1:
    image: redis:latest
    container_name: redis-slave1
    depends_on:
      - redis-master
    ports:
      - "8002:6379"
    volumes:
      - /data/docker/redis/slave1/data:/data
      - /data/docker/redis/slave1/logs:/logs
    command: ["redis-server", "--replicaof", "redis-master", "6379", "--appendonly", "yes", "--logfile", "/logs/redis-slave1.log"]

  redis-slave2:
    image: redis:latest
    container_name: redis-slave2
    depends_on:
      - redis-master
    ports:
      - "8003:6379"
    volumes:
      - /data/docker/redis/slave2/data:/data
      - /data/docker/redis/slave2/logs:/logs
    command: ["redis-server", "--replicaof", "redis-master", "6379", "--appendonly", "yes", "--logfile", "/logs/redis-slave2.log"]

说明

  • redis-master 服务使用最新的 Redis 镜像,端口映射到宿主机的 8001 端口,并将数据和日志目录挂载到宿主机的目录。
  • redis-slave1redis-slave2 服务依赖于 redis-master,它们将连接到 redis-master 并配置为从服务器。端口分别映射到宿主机的 8002 和 8003 端口,同样将数据和日志目录挂载到宿主机。
  • 使用 --appendonly yes 确保 AOF 日志持久化,并使用 --logfile 参数指定日志文件的位置。
  • REDIS_REPLICAOF 环境变量用于配置从服务器指向主服务器。

启动服务

运行以下命令启动 Redis 主从复制集群:

[root@icoolkj docker]# docker-compose up -d
Starting redis-master ... done
Starting redis-slave1 ... done
Starting redis-slave2 ... done
[root@icoolkj docker]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS          PORTS                    NAMES
2c5b783d60d7   redis:latest   "docker-entrypoint.s…"   4 minutes ago   Up 13 seconds   0.0.0.0:8003->6379/tcp   redis-slave2
7eb822078912   redis:latest   "docker-entrypoint.s…"   4 minutes ago   Up 13 seconds   0.0.0.0:8002->6379/tcp   redis-slave1
024c6e0d13ae   redis:latest   "docker-entrypoint.s…"   4 minutes ago   Up 13 seconds   0.0.0.0:8001->6379/tcp   redis-master

验证配置,测试写入和读取,同上;

总结

通过以上配置,你可以在 Docker 中实现 Redis 的主从复制,并将数据和日志持久化到宿主机。这种方式可以确保即使 Docker 容器挂掉,数据和日志也不会丢失。

 

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值