DockerCompose搭建Redis集群

Docker学习笔记

DockerCompose搭建Redis集群

本次之前使用Docker单节点集群,这次使用dockercompose来搭建

环境

  • 192.168.62.128
  • 192.168.62.129

搭建

1、创建目录

分别在 192.168.62.128 和 192.168.62.129两台机器上执行以下操作。

# 创建目录
mkdir -p /data/redis-cluster
# 切换至指定目录
cd /data/redis-cluster
# 编写 redis-cluster.tmp
vim redis-cluster.tmpl

2、编写Redis配置文件

128服务器是内容为:

port ${index}
bind 0.0.0.0
requirepass 密码
masterauth 密码
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.62.128
cluster-announce-port ${index}
cluster-announce-bus-port 1${index}

129服务器是内容为:

port ${index}
bind 0.0.0.0
requirepass 密码
masterauth 密码
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.62.0.${index}
cluster-announce-port ${index}
cluster-announce-bus-port 1${index}

参数解释

  • port:节点端口;
  • bind: 可连接redis的主机
  • requirepass:添加访问认证;
  • masterauth:如果主节点开启了访问认证,从节点访问主节点需要认证;
  • protected-mode:保护模式,默认值yes。开启保护模式以后,需配置 bind ip 或者设置访问密码;关闭保护模式,外部网络可以直接访问;
    daemonize:是否以守护线程的方式启动(后台启动),默认no;
  • appendonly:是否开启 AOF 持久化模式,默认no;
  • cluster-enabled:是否开启集群模式,默认no;
  • cluster-config-file:集群节点信息文件;
  • cluster-config-timeout:集群节点连接超时时间;
  • cluster-announce-ip:集群节点ip,填写宿主机IP;
  • cluster-announce-port:集群节点映射端口;
  • cluster-announce-bus-port:集群节点总线端口;

然后128服务器的redis-cluster 目录下执行脚本,如果执行报错就一行一行的复制。

[root@localhost redis-cluster]# for index in `seq 1 6`; do \
 mkdir -p 700${index}/conf \
 && index=${index} envsubst <redis-cluster.tmpl> 700${index}/conf/redis.conf \
 && mkdir -p 700${index}/data; \
 done

然后129服务器的redis-cluster 目录下执行脚本

[root@localhost redis-cluster]# for index in `seq 4 6`; do \
 mkdir -p 700${index}/conf \
 && index=${index} envsubst <redis-cluster.tmpl> 700${index}/conf/redis.conf \
 && mkdir -p 700${index}/data; \
 done

俩节点执行后的文件目录为:

[root@localhost redis-cluster]# tree
.
├── 6371
│   ├── conf
│   │   └── redis.conf
│   └── data
├── 6372
│   ├── conf
│   │   └── redis.conf
│   └── data
├── 6373
│   ├── conf
│   │   └── redis.conf
│   └── data
└── redis-cluster.tmpl

[root@localhost redis-cluster]# tree
.
├── 6374
│   ├── conf
│   │   └── redis.conf
│   └── data
├── 6375
│   ├── conf
│   │   └── redis.conf
│   └── data
├── 6376
│   ├── conf
│   │   └── redis.conf
│   └── data
└── redis-cluster.tmpl

3、编写 Docker Compose 模板文件

在128服务器的/data/redis-cluster目录下编写docker-compose.yml文件

version: "3.8"

services:
  redis-6371: # 服务名称
    image: redis:5.0.14 # 创建容器时所需的镜像
    container_name: redis-6371 # 容器名称
    restart: always # 容器总是重新启动
    network_mode: "host" # host 网络模式
    ports:
      - "6371:6371"
    volumes: # 数据卷,目录挂载
      - /data/redis-cluster/6371/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /data/redis-cluster/6371/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf # 覆盖容器启动后默认执行的命令

  redis-6372:
    image: redis:5.0.14
    container_name: redis-6372
    network_mode: "host"
    restart: always
    ports:
      - "6372:6372"
    volumes:
      - /data/redis-cluster/6372/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /data/redis-cluster/6372/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf

  redis-6373:
    image: redis:5.0.14
    container_name: redis-6373
    network_mode: "host"
    restart: always
    ports:
      - "6373:6373"
    volumes:
      - /data/redis-cluster/6373/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /data/redis-cluster/6373/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf

在129服务器的/data/redis-cluster目录下编写docker-compose.yml文件

version: "3.8"
services:
  redis-6374: 
    image: redis:5.0.14 #镜像 & tag
    container_name: redis-6374  # 容器名称
    restart: always 
    network_mode: "host" # host 网络模式
    ports:
      - "6374:6374"
    volumes: # 数据卷,目录挂载
      - /data/redis-cluster/6374/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /data/redis-cluster/6374/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf # 容器启动后默认执行的命令

  redis-6375:
    image: redis:5.0.14
    container_name: redis-6375
    restart: always 
    network_mode: "host"
    ports:
      - "6375:6375"
    volumes:
      - /data/redis-cluster/6375/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /data/redis-cluster/6375/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf

  redis-6376:
    image: redis:5.0.14
    container_name: redis-6376
    restart: always 
    network_mode: "host"
    ports:
      - "6376:6376"
    volumes:
      - /data/redis-cluster/6376/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - /data/redis-cluster/6376/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf

运行docker-compose

docker-compose  up -d

4、创建集群

进入随便进入一个docker容器

docker exec -it redis-6371 bash

/usr/local/bin目录下执行集群创建命令

redis-cli -a uids#@123 --cluster create 192.168.62.128:6371 192.168.62.128:6372 192.168.62.128:6373 192.168.62.129:6374 192.168.62.129:6375 192.168.62.129:6376 --cluster-replicas 1

集群搭建成功

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.62.129:6376 to 192.168.62.128:6371
Adding replica 192.168.62.128:6373 to 192.168.62.129:6374
Adding replica 192.168.62.129:6375 to 192.168.62.128:6372
M: 4aba693babbbb4929bc1ecfd12dd711eca44797d 192.168.62.128:6371
   slots:[0-5460] (5461 slots) master
M: 8276ac3823558df1e1ddc7dd94da8319ab6bb2e9 192.168.62.128:6372
   slots:[10923-16383] (5461 slots) master
S: ba9c2e3cd8472d5bdd48b431d5767b3b656560d2 192.168.62.128:6373
   replicates 15a48a647493d96185e296fdb86bc4ceb86b5cbe
M: 15a48a647493d96185e296fdb86bc4ceb86b5cbe 192.168.62.129:6374
   slots:[5461-10922] (5462 slots) master
S: b8087dea14dd6e75fb654644c86ee35c0dd9b5e4 192.168.62.129:6375
   replicates 8276ac3823558df1e1ddc7dd94da8319ab6bb2e9
S: bf2d90aa4516b0247d74f31be41bc5a9f44b6174 192.168.62.129:6376
   replicates 4aba693babbbb4929bc1ecfd12dd711eca44797d
Can I set the above configuration? (type 'yes' to accept): yes
>>> 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 192.168.62.128:6371)
M: 4aba693babbbb4929bc1ecfd12dd711eca44797d 192.168.62.128:6371
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: b8087dea14dd6e75fb654644c86ee35c0dd9b5e4 192.168.62.129:6375
   slots: (0 slots) slave
   replicates 8276ac3823558df1e1ddc7dd94da8319ab6bb2e9
M: 15a48a647493d96185e296fdb86bc4ceb86b5cbe 192.168.62.129:6374
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 8276ac3823558df1e1ddc7dd94da8319ab6bb2e9 192.168.62.128:6372
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: ba9c2e3cd8472d5bdd48b431d5767b3b656560d2 192.168.62.128:6373
   slots: (0 slots) slave
   replicates 15a48a647493d96185e296fdb86bc4ceb86b5cbe
S: bf2d90aa4516b0247d74f31be41bc5a9f44b6174 192.168.62.129:6376
   slots: (0 slots) slave
   replicates 4aba693babbbb4929bc1ecfd12dd711eca44797d
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
LICENSED UNDER CC BY-NC-SA 4.0
Comment