在这里插入图片描述

一、环境主备

准备三台机器,在每台机器上,计划安装一个Redis主节点和一个Redis从节点。

机器IPRedis节点节点端口
192.168.9.60redis-master/redis-slave6379/6380
192.168.9.61redis-master/redis-slave6379/6380
192.168.9.62redis-master/redis-slave6379/6380

二、文件准备

1、创建Redis节点目录
分别在192.168.9.60、192.168.9.61、192.168.9.62机器上,创建一个bash脚本文件将以下内容复制到文件中,然后运行脚本文件,创建Redis主从节点文件目录

#!/bin/bash

for dir in redis-master/data redis-slave/data; do
  mkdir -p "/data/redis-cluster/$dir";
done

2、创建节点配置文件redis.conf

分别在192.168.9.60、192.168.9.61、192.168.9.62机器上的/data/redis-cluster/redis-master/与/data/redis-cluster/redis-slave/目录下,创建一个redis.conf文件,文件内容包括以下属性

port 6379 #指定 Redis 服务器监听的端口号,这是客户端与 Redis 服务器进行通信的端口。
save 900 1 #在给定时间间隔内有多少次写操作时,Redis 将执行自动的快照(生成 RDB 文件)。
save 300 10
save 60 10000
dbfilename dump.rdb #指定生成的 RDB 文件的名称。
dir /data #指定持久化文件的存储目录。
appendonly yes #启用 AOF(Append-Only File)持久化模式。
appendfilename "appendonly.aof" #指定 AOF 文件的名称。
appendfsync everysec #控制 AOF 缓冲区的内容何时同步到硬盘。这里的选项 everysec 表示每秒同步一次
cluster-enabled yes #启用 Redis 集群功能。
cluster-config-file nodes.conf #指定保存集群拓扑信息的配置文件名。
cluster-node-timeout 5000 #设置节点间通信的超时时间,单位为毫秒。
requirepass <password>
masterauth <password>
cluster-announce-ip 192.168.9.60 # 本机ip

可以创建一个bash脚本文件将以下内容复制到文件中,然后运行脚本文件

#!/bin/bash

for dir in redis-master redis-slave; do
 if [ "$dir" == "redis-master" ]; then
    port=6379
  elif [ "$dir" == "redis-slave" ]; then
    port=6380
  fi
echo "port $port
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /data
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
requirepass <password>
masterauth <password>
cluster-announce-ip 192.168.9.60" > /data/redis-cluster/$dir/redis.conf;
done

运行完成后,在/data/redis-cluster/redis-master/以及/data/redis-cluster/redis-slave/生成一个data目录和一个redis.conf文件

三、编写 docker-compose.yml 编排文件

nfs的目录在三台机器上的配置不同,需要修改
注意:需要将集群总线端口开放出来,若通讯端口为6379,那么集群总线端口16379一定要打开
我这是使用的 nfs 存储的数据,配置里面的 nfs_host_ip 需要替换为你自己的 nfs server的ip
可参考博客:https://blog.51cto.com/u_16175450/7974774 进行配置

分别在三台机器的/data/redis-cluster/目录下,创建docker-compose.yml文件,内容如下:

version: '3.1'

services:
  redis-master:
    image: redis:5.0.8
    container_name: redis-master
    restart: always
    ports:
      - "6379:6379"
      - "16379:16379"
    environment:
      - TZ=Asia/Shanghai
    volumes:
    - volume-master:/data
    - /data/redis-cluster/redis-master/redis.conf:/usr/local/etc/redis/redis.conf
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 16G
        reservations:
          cpus: '2'
          memory: 8G
    command: ["redis-server","/usr/local/etc/redis/redis.conf"]

  redis-slave:
    image: redis:5.0.8
    container_name: redis-slave
    restart: always
    ports:
      - "6380:6380"
      - "16380:16380"
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - volume-slave:/data
      - /data/redis-cluster/redis-slave/redis.conf:/usr/local/etc/redis/redis.conf
    deploy:
      resources:
        limits:
          cpus: '4'
          memory: 16G
        reservations:
          cpus: '2'
          memory: 8G
    command: [ "redis-server","/usr/local/etc/redis/redis.conf" ]
volumes:
  volume-master:
    driver_opts:
      type: nfs
      o: addr=nfs_host_ip,nolock,soft,rw
      device: ":/data/nfs/redis/cluster-0/data"
  volume-slave:
    driver_opts:
      type: nfs
      o: addr=nfs_host_ip,nolock,soft,rw
      device: ":/data/nfs/redis/cluster-1/data"

执行启动命令,分别启动三台机器上的redis主从容器

# 启动命令
docker-compose -f docker-compose.yml up -d

# 重启命令
docker-compose -f docker-compose.yml restart

# 停止命令
docker-compose -f docker-compose.yml stop

# 删除容器命令
docker-compose -f docker-compose.yml rm

四、执行指令组建redis集群

1、任意一台机器上,执行以下指令,进入到docker容器当中

# redis-master对应的是docker ps -a查看到的容器名redis-master
docker exec -it redis-master /bin/bash

2、创建集群

# 如果有密码,需要带上 --a <your_password>
redis-cli -a <password> --cluster create 192.168.9.60:6379 192.168.9.60:6380 192.168.9.61:6379 192.168.9.61:6380 192.168.9.62:6379 192.168.9.62:6380 --cluster-replicas 1

执行完成后,打印日志如下
在这里插入图片描述

执行指令后,会出现提示“ Can I set the above configuration? (type 'yes' to accept): ”,这里输入yes,回车。出现以下情况话,就是已经成功创建redis集群了
在这里插入图片描述

若此时一直处于 Waiting for the cluster to join 的状态,可以检查下是否有放开集群通信端口
在这里插入图片描述
参考资料:https://www.cnblogs.com/libruce/p/17800432.html

可以通过以下指令进入到redis客户端,查看集群情况

redis-cli -a <password> -c -h 192.168.9.60 -p 6379

然后,执行指令cluster info查看集群状况,显示cluster_state:ok则表示集群已经正常创建
在这里插入图片描述

参考资料

https://cloud.tencent.com.cn/developer/article/2375596

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐