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}

# 添加访问认证 
requirepass 1234

#如果主节点开启了访问认证,从节点访问主节点需要认证;
masterauth 1234

# 关闭保护模式
protected-mode no

# 开启集群
cluster-enabled yes

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

# 超时
cluster-node-timeout 15000

# 集群节点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

注意:

  • 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.10
    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.10
    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.10
    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.10
    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.10
    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.10
    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 -a 1234 --cluster create ip:6061 ip:6062 ip:6063 ip:6064 ip:6065 ip:6066 --cluster-replicas 1

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

出现选择提示信息,输入 yes,结果如下所示:

image.png

  • 至此一个高可用的 Redis Cluster 集群搭建完成,如下图所示,该集群中包含 6 个 Redis 节点,3 主 3 从。三个主节点会分配槽,处理客户端的命令请求,而从节点可用在主节点故障后,顶替主节点。

image.png

验证集群

  • 在容器内输入指令redis-cli -c -a 1234 -h 127.0.0.1 -p 6061

  • 查看集群信息和节点信息

# 查看集群信息
cluster info
# 查看集群结点信息
cluster nodes
  • 源文件:
127.0.0.1:6061> 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到

集群写入数据简单测试

  • 随便登录一个集群节点
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

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

后记

至此使用多机环境基于 Docker Compose 搭建 Redis Cluster 就到这里。虽然整体搭建过程感觉比起之前并没有简化太多。但是,如果我们想要停止并删除 Redis Cluster 集群环境,之前的方式就需要一个个去操作,而 Docker Compose 只需要一个 docker-compose down 命令的操作即可。

enjoy~

文章参考:参考1参考2

Q.E.D.


所以,看不到光,算是不幸吗?需要光才是真正的不幸吧。