docke搭建redis集群(修正版)

chihiro 2020年04月15日 54次浏览

Docker 安装 Redis集群

前言

使用docker-compose和redis官方镜像和第三方redis-trib镜像组建3主3从的redis集群并设置密码。

构建文件结构

#新建文件夹
mkdir -p /mnt/docker/redis
#在redis文件夹下新建docker-compose.yml文件
cd /mnt/docker/redis
touch docker-compose.yml
#新建一个模板文件
touch redis_cluster.tmpl

构件基础配置

  • 输入指令
vim redis_cluster.tmpl
  • 编写redis_cluster.tmpl文件
# redis端口
port ${PORT}

# 关闭保护模式
protected-mode no

# 开启集群
cluster-enabled yes

# 集群节点配置
cluster-config-file nodes.conf

# 超时
cluster-node-timeout 5000

# 集群节点IP host模式为宿主机IP
cluster-announce-ip 127.0.0.1

# 集群节点端口 6061 - 6066
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}

# 开启 appendonly 备份模式
appendonly yes

# 每秒钟备份
appendfsync everysec

# 对aof文件进行压缩时,是否执行同步操作
no-appendfsync-on-rewrite no

# 当目前aof文件大小超过上一次重写时的aof文件大小的100%时会再次进行重写
auto-aof-rewrite-percentage 100

# 重写前AOF文件的大小最小值 默认 64mb
auto-aof-rewrite-min-size 5120mb

# 关闭快照备份
save ""

注意:

  • cluster-announce-ip处的ip请填写自己服务器的ip。
  • cluster-announce-portcluster-announce-bus-port两处的端口配置为集群所需端口配置。如果需要开启外网访问,请保证将此处各个端口可以正常访问。
  • 批量创建配置文件和数据目录,终端运行以下命令:
for port in `seq 6061 6066`; do \
  mkdir -p ./${port}/conf \
  && PORT=${port} envsubst < ./redis_cluster.tmpl > ./${port}/conf/redis.conf \
  && mkdir -p ./${port}/data; \
done

注意:此处的6061-6066为redis连接端口,可更改为自己定义的端口,此端口对应redis_cluster.tmpl文件中的${PORT}端口。

编写docker-compose.yml文件

  • 直接贴出,此处使用的网桥是host。
version: '3'
services:
  node1:
    image: redis:5.0.8
    container_name: redis1
    restart: always
    volumes:
      - ./6061/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./6061/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    network_mode: "host"
  node2:
    image: redis:5.0.8
    container_name: redis2
    restart: always
    volumes:
      - ./6062/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./6062/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    network_mode: "host"
  node3:
    image: redis:5.0.8
    container_name: redis3
    restart: always
    volumes:
      - ./6063/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./6063/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    network_mode: "host"
  node4:
    image: redis:5.0.8
    container_name: redis4
    restart: always
    volumes:
      - ./6064/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./6064/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    network_mode: "host"
  node5:
    image: redis:5.0.8
    container_name: redis5
    restart: always
    volumes:
      - ./6065/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./6065/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    network_mode: "host"
  node6:
    image: redis:5.0.8
    container_name: redis6
    restart: always
    volumes:
      - ./6066/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./6066/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    network_mode: "host"

启动运行

  • 在redis目录下(即docker-compose.yml同级目录)执行
docker-compose up -d
  • 查看容器运行情况
docker-compose ps

连接集群

  • 进入其中一个容器
docker exec -it redis1 bash
  • 集群配置比较简单,只需一条命令
redis-cli --cluster create ip:6061 ip:6062 ip:6063 ip:6064 ip:6065 ip:6066 --cluster-replicas 1

此处ip替换成实际ip地址,中间需要用yes来同意集群方案

验证集群

  • 在容器内输入指令redis-cli -c -p 6061

  • 输入cluster info查看集群信息,集群成功如下所示

127.0.0.1:7000> cluster nodes
06851aa134d50096d82a434eced9194233b5204e 127.0.0.1:6063@16063 slave 8b33f273386c9504ef8bd10b005e24825b3b9596 0 1567671901000 4 connected
a42297b65f7101fc9e4941ef8a0e65080d1b6338 127.0.0.1:6065@16065 slave 0aa20378d14e3ef0859815196cbafa67e1001d0e 0 1567671901581 6 connected
e7b6a35b1e92f94c225c507ea19f7f0318f0d1c3 127.0.0.1:6062@16063 master - 0 1567671902582 3 connected 10923-16383
0aa20378d14e3ef0859815196cbafa67e1001d0e 127.0.0.1:6066@16066 myself,master - 0 1567671901000 1 connected 0-5460
8b33f273386c9504ef8bd10b005e24825b3b9596 127.0.0.1:6061@16061 master - 0 1567671902383 2 connected 5461-10922
fe355eed99100197f43d1216d1de82643dd496a5 127.0.0.1:6064@16064 slave e7b6a35b1e92f94c225c507ea19f7f0318f0d1c3 0 1567671901380 5 connected
  • 再测试一下set和get,另外可以看到,结点会自己切换,并且6061端口set和数据可以在6062端口get到

设置集群密码

QA:设置密码为什么不在上面的步骤,利用模板文件批量创建配置文件的时候就写进去?

无论是在 redis5.x 版本,还是以前的 redis 版本利用 ruby 创建集群的方式,在redis-cli --cluster create创建集群的环节没有密码参数配置,所以我们需要创建完集群再设置密码。

我们用config set方式分别为每一个节点设置相同的密码(不需要重启 redis,且重启后依然有效),在此之前先给所有 redis 配置文件加w权限,不然密码无法保存到文件。

注意当前路径依旧是/mnt/docker/redis,对redis.conf文件进行批量授权。

for port in `seq 6061 6066`; do \
  chmod a+w ./${port}/conf/redis.conf; \
done

redis1节点做示例:

redis-cli -c -p 6061

设置密码:

#设置masterauth
config set masterauth 你的密码
#设置requirepass
config set requirepass 你的密码
#验证密码,以继续操作
auth 你的密码
#回写到文件,使其永久生效
config rewrite
  • 使用docker exec指令进入容器内部看一下masterauth和requirepass是否写入到文件里
docker exec -it redis1 bash
  • cat指令查看
cat /usr/local/etc/redis/redis.conf
  • 可以看到masterauth和requirepass被追加到文件的最后,即使重启密码也还生效。

集群写入数据简单测试

  • 随便登录一个集群节点
redis-cli -c -p 6061 -a 你的密码
  • 写入数据
127.0.0.1:6063> set test 1
-> Redirected to slot [7800] located at 127.0.0.1:6061
OK
127.0.0.1:6061> get test
"1"
127.0.0.1:6061> del test
(integer) 1

可以看到,集群中任意节点写入数据,在其他任意节点都能读到。

后记

至此,redis 集群搭建完成。

enjoy

文章参考:点我去原文