GVKun编程网logo

基于 docker-compose 搭建 redis 集群(docker搭建redis-cluster集群)

8

本篇文章给大家谈谈基于docker-compose搭建redis集群,以及docker搭建redis-cluster集群的知识点,同时本文还将给你拓展dockercomposeredis部署、Dock

本篇文章给大家谈谈基于 docker-compose 搭建 redis 集群,以及docker搭建redis-cluster集群的知识点,同时本文还将给你拓展docker compose redis 部署、Docker Compose 单机部署Redis+Sentinel 集群、Docker Compose 搭建 Redis Cluster 集群环境、Docker Compose 搭建 Redis 集群等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

基于 docker-compose 搭建 redis 集群(docker搭建redis-cluster集群)

基于 docker-compose 搭建 redis 集群(docker搭建redis-cluster集群)

目录

  • 一、简介
  • 二、部署步骤
    • 2.1 集群配置
    • 2.2 编写 redis.conf
    • 2.3 编写 docker-compose.yml 文件
    • 2.4 启动容器
    • 2.5 查看容器启动状态
    • 2.6 开启集群
  • 三、测试
    • 3.1 查看节点属性
    • 3.2 插入一个值
  • 四、添加密码
    • 4.1 编辑 redis.conf 文件
    • 4.2 编辑 docker-compose.yml 文件
    • 4.3 连接集群
  • 参考链接

一、简介

部署环境:

组件 版本 备注
docker 19.03.6 build 369ce74a3c
docker-compose 1.27.4 build 40524192
ubuntu 18.04 server 版 X86_64
redis 6.0.4

二、部署步骤

2.1 集群配置

  • 3 主 + 3 从

由于仅用于测试,故我这里只用 1 台服务器进行模拟。

  • redis 列表
redis IP+port 备注
redis1 192.168.1.4:6379
redis2 192.168.1.4:6380
redis3 192.168.1.4:6381
redis4 192.168.1.4:6382
redis5 192.168.1.4:6383
redis6 192.168.1.4:6384

2.2 编写 redis.conf

server_1 上创建一个目录用于存放 redis 集群部署文件。这里我放的路径为 /root/redis-cluster

# 创建/root/redis-cluster目录
mkdir -p /root/redis-cluster

/root/redis-cluster 目录下创建 redis-1,redis2,redis-3,redis-4,redis-5,redis-6 文件夹

# 创建redis-1~redis-6文件夹
mkdir /root/redis-cluster/redis-1 \
/root/redis-cluster/redis-2 \
/root/redis-cluster/redis-3 \
/root/redis-cluster/redis-4 \
/root/redis-cluster/redis-5 \
/root/redis-cluster/redis-6

在每个 redis-* 文件夹下创建 redis.conf 文件,并写入如下内容:

cluster-enabled yes # 开启集群
cluster-config-file nodes.conf # 集群配置文件
cluster-node-timeout 5000 # 集群节点多少时间未响应视为该节点丢失
appendonly yes
port 6379 # redis监听端口

注意:port 值不能都为 6379,根据上面 redis 列表设置的端口号,依次给 redis-1 ~ redis-6 设置 6379~6384 端口号

2.3 编写 docker-compose.yml 文件

这里直接使用 daocloud 提供的 redis 镜像地址 daocloud.io/library/redis:6.0.4

/root/redis-cluster 文件夹下创建 docker-compose.yml 文件。

docker-compose.yml 文件内容如下:

version: ''3.1''
services:
  # redis1配置
  redis1:
    image: daocloud.io/library/redis:6.0.4
    container_name: redis-1
    restart: always
    network_mode: "host"
    volumes:
      - ./redis-1/redis.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
  # redis2配置
  redis2:
    image: daocloud.io/library/redis:6.0.4
    container_name: redis-2
    restart: always
    network_mode: "host"
    volumes:
      - ./redis-2/redis.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
  # redis3配置
  redis3:
    image: daocloud.io/library/redis:6.0.4
    container_name: redis-3
    restart: always
    network_mode: "host"
    volumes:
      - ./redis-3/redis.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
  # redis4配置
  redis4:
    image: daocloud.io/library/redis:6.0.4
    container_name: redis-4
    restart: always
    network_mode: "host"
    volumes:
      - ./redis-4/redis.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
  # redis5配置
  redis5:
    image: daocloud.io/library/redis:6.0.4
    container_name: redis-5
    restart: always
    network_mode: "host"
    volumes:
      - ./redis-5/redis.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
  # redis6配置
  redis6:
    image: daocloud.io/library/redis:6.0.4
    container_name: redis-6
    restart: always
    network_mode: "host"
    volumes:
      - ./redis-6/redis.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]

2.4 启动容器

/root/redis-cluster 文件夹下,执行如下命令,启动 redis 容器。

docker-compose up -d

2.5 查看容器启动状态

输入如下命令查看容器启动状态

docker ps

如果显示如图所示,即为启动成功。最主要查看容器的 STATUS 属性,有 Up *** 即为容器已经启动多长时间。

docker ps

2.6 开启集群

随便找一个容器进入,这里我选择 redis-1 进入。

docker exec -it redis-1 bash

在进入容器后,输入如下命令开启集群

redis-cli --cluster create 192.168.1.4:6379 \
 192.168.1.4:6380 \
192.168.1.4:6381 \
192.168.1.4:6382 \
192.168.1.4:6383 \
192.168.1.4:6384 \
 --cluster-replicas 1

会出现如下图所示:

在这里插入图片描述
此时输入 yes 即可

出现下图即为成功。

在这里插入图片描述

三、测试

使用 redis-cli 命令,连接集群中任意节点。(随便找一台能 ping 通集群所在 IP 的电脑,这里我用的本机进行测试)

3.1 查看节点属性

  • 连接节点
redis-cli -c -h 192.168.1.4 -p 6379
  • 查看集群状态
192.168.1.4:6379> cluster info

显示如下图所示即为集群状态健康

在这里插入图片描述

  • 查看节点信息
192.168.1.4:6379> cluster nodes

显示如图所示

在这里插入图片描述
注意看图中的 slave,master,myself 等关键字。

关键字 说明
slave 该节点为备份节点
master 该节点为主节点
myself 该节点为当前连接的节点

3.2 插入一个值

  • 插入一个值
192.168.1.4:6379> set test ''hello world''

在这里插入图片描述
注意:这里根据切片自动切换到了该数据分片所在的节点上,所以下面可以看到连接的节点变为了 192.168.1.4:6380

  • 获取该值
192.168.1.4:6380> get test

在这里插入图片描述
这里因为就是在该数据所在分片上进行的查询,所以连接节点没有改变。

四、添加密码

4.1 编辑 redis.conf 文件

redis.conf 文件添加如下配置。这里设置密码为 123456

masterauth 123456
requirepass 123456

4.2 编辑 docker-compose.yml 文件

docker-compose.yml 中每个容器添加如下配置:

environment:
  - REDISCLI_AUTH=123456

4.3 连接集群

在使用 redis-cli 连接集群的时候,不能像连接单点 redis 那样连接之后再使用 auth 命令进行认证了。此时需要在连接命令中指定密码。

redis-cli -c -h 192.168.1.4 -p 6379 -a 123456

添加 -a 参数,即可完成认证。

参考链接

  • docker 搭建 redis3.2 官方集群
  • redis 集群简介
  • 基于 Docker 的 Redis 集群搭建
  • 官方集群文档

docker compose redis 部署

docker compose redis 部署

【直播预告】程序员逆袭 CEO 分几步?

version: ''3''
services:
  redis:
    image: redis:5.0.4
    container_name: test_redis
    volumes:
      - ./datadir:/data
      - ./conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ./logs:/logs
    ports:
      - 6379:6379

Docker Compose 单机部署Redis+Sentinel 集群

Docker Compose 单机部署Redis+Sentinel 集群

clipboard

clipboard

卸载旧版本docker uninstall old version

sudo yum remove docker \

                  docker-client \

                  docker-client-latest \

                  docker-common \

                  docker-latest \

                  docker-latest-logrotate \

                  docker-logrotate \

                  docker-engine

安装repo install docker repo

sudo yum install -y yum-utils \

  device-mapper-persistent-data \

  lvm2

sudo yum-config-manager \

--add-repo \

    https://download.docker.com/linux/centos/docker-ce.repo

安装社区版本install Docker Engine-Community

sudo yum install -y docker-ce docker-ce-cli containerd.io --skip-broken

设置服务启动和测试镜像

sudo systemctl start docker

sudo systemctl enable docker

sudo docker run hello-world

clipboard

安装git和下载代码

sudo yum install -y git

git clone https://github.com/AliyunContainerService/redis-cluster

cd redis-cluster

检查docker compose文件

cat docker-compose.yml

master:

image: redis:3

slave:

image: redis:3

command: redis-server --slaveof redis-master 6379

links:

- master:redis-master

sentinel:

build: sentinel

environment:

- SENTINEL_DOWN_AFTER=5000

- SENTINEL_FAIlovER=5000

links:

- master:redis-master

- slave

在模板中定义了下面一系列服务

  • master: Redis master
  • slave: Redis slave
  • sentinel: Redis Sentinel

cat sentinel.conf

# Example sentinel.conf can be downloaded from http://download.redis.io/redis-stable/sentinel.conf

port 26379

dir /tmp

sentinel monitor mymaster redis-master 6379 $SENTINEL_QUORUM

sentinel down-after-milliseconds mymaster $SENTINEL_DOWN_AFTER

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster $SENTINEL_FAIlovER

并以sentinel模式启动容器。其配置文件如下,其中包含了sentinel对名为"mymaster"的集群的监控配置

注意:

  • slave和sentinel容器初始化配置的Redis master节点主机名为"redis-master",这里我们利用了Docker容器连接的别名机制来连接master和sentinel/slave容器实例
  • 由于我们会部署3个Sentinel,我们把sentinel的"quorum"设置为2,只有两个sentinel同意故障切换,才会真正切换相应的redis master节点。

sudo yum install -y docker-compose

sudo docker-compose up -d

容我上个厕所

。。。。。。。。。。。

clipboard

厕所回来都好了

docker ps

clipboard

怎么只有2个哨兵,扩展到3个

docker-compose scale sentinel=3

clipboard

顺大便扩容2个slave redis

docker-compose scale slave=2

clipboard

看下目前跑的内容

docker ps|sort -k2

clipboard

改一个测试redis宕机的脚本

vi test.sh

MASTER_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' rediscluster_master_1)

SLAVE_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' rediscluster_slave_1)

SENTINEL_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' rediscluster_sentinel_1)

echo Redis master: $MASTER_IP

echo Redis Slave: $SLAVE_IP

echo ------------------------------------------------

echo Initial status of sentinel

echo ------------------------------------------------

docker exec rediscluster_sentinel_1 redis-cli -p 26379 info Sentinel

echo Current master is

docker exec rediscluster_sentinel_1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster

echo ------------------------------------------------

echo Stop redis master

docker pause rediscluster_master_1

echo Wait for 10 seconds

sleep 10

echo Current infomation of sentinel

docker exec rediscluster_sentinel_1 redis-cli -p 26379 info Sentinel

echo Current master is

docker exec rediscluster_sentinel_1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster

echo ------------------------------------------------

echo Restart Redis master

docker unpause rediscluster_master_1

sleep 5

echo Current infomation of sentinel

docker exec rediscluster_sentinel_1 redis-cli -p 26379 info Sentinel

echo Current master is

docker exec rediscluster_sentinel_1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster

./test.sh

发现redis master 进行了切换

clipboard

但是一台主机的3个redis和3个sentinel 不能算高可用,需要将redis和sentinel部署到不同区域的多个主机中

Docker Compose 搭建 Redis Cluster 集群环境

Docker Compose 搭建 Redis Cluster 集群环境

  在前文《Docker 搭建 Redis Cluster 集群环境》中我已经教过大家如何搭建了,本文使用 Docker Compose 再带大家搭建一遍,其目的主要是为了让大家感受 Docker Compose 所带来的便捷之处。

  按照 Redis 官网:https://redis.io/topics/cluster-tutorial 的提示,为了使 Docker 与 Redis Cluster 兼容,您需要使用 Docker 的 host 网络模式。

  host 网络模式需要在创建容器时通过参数 --net host 或者 --network host 指定,host 网络模式可以让容器共享宿主机网络栈,容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。

  关于 Docker 网络模式更多的内容请阅读《Docker 网络模式详解及容器间网络通信》。

  

环境

  

  为了让环境更加真实,本文使用多机环境:

  • 192.168.10.10
  • 192.168.10.11

  

  每台机器所使用的基础设施环境如下:

  • CentOS 7.8.2003
  • Docker version 19.03.12

  

搭建

  

  整体搭建步骤主要分为以下几步:

  • 下载 Redis 镜像(其实这步可以省略,因为创建容器时,如果本地镜像不存在,就会去远程拉取);
  • 编写 Redis 配置文件;
  • 编写 Docker Compose 模板文件;
  • 创建并启动所有服务容器;
  • 创建 Redis Cluster 集群。

  

编写 Redis 配置文件

  

创建目录及文件

  

  分别在 192.168.10.10192.168.10.11 两台机器上执行以下操作。

# 创建目录
mkdir -p /usr/local/docker-redis/redis-cluster
# 切换至指定目录
cd /usr/local/docker-redis/redis-cluster/
# 编写 redis-cluster.tmpl 文件
vi redis-cluster.tmpl

  

编写配置文件

  

  192.168.10.10 机器的 redis-cluster.tmpl 文件内容如下:

port ${PORT}
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.10
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}

  192.168.10.11 机器的 redis-cluster.tmpl 文件内容如下:

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

  每个 Redis 集群节点都需要打开两个 TCP 连接。一个用于为客户端提供服务的正常 Redis TCP 端口,例如 6379。还有一个基于 6379 端口加 10000 的端口,比如 16379。

  第二个端口用于集群总线,这是一个使用二进制协议的节点到节点通信通道。节点使用集群总线进行故障检测、配置更新、故障转移授权等等。客户端永远不要尝试与集群总线端口通信,与正常的 Redis 命令端口通信即可,但是请确保防火墙中的这两个端口都已经打开,否则 Redis 集群节点将无法通信。

  

  在 192.168.10.10 机器的 redis-cluster 目录下执行以下命令:

for port in `seq 6371 6373`; do \
  mkdir -p ${port}/conf \
  && PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
  && mkdir -p ${port}/data;\
done

  在 192.168.10.11 机器的 redis-cluster 目录下执行以下命令:

for port in `seq 6374 6376`; do \
  mkdir -p ${port}/conf \
  && PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
  && mkdir -p ${port}/data;\
done

上面两段 shell for 语句,意思就是循环创建 6371 ~ 6376 相关的目录及文件。

  

  在 192.168.10.10 机器执行查看命令结果如下,如果没有 tree 命令先安装 yum install -y tree

  在 192.168.10.11 机器执行查看命令结果如下。

  

  以下内容为每个节点的配置文件详细信息。

============================== 192.168.10.10 ==============================
[root@localhost redis-cluster]# cat /usr/local/docker-redis/redis-cluster/637{1..3}/conf/redis.conf
port 6371
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.10
cluster-announce-port 6371
cluster-announce-bus-port 16371

port 6372
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.10
cluster-announce-port 6372
cluster-announce-bus-port 16372

port 6373
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.10
cluster-announce-port 6373
cluster-announce-bus-port 16373
============================== 192.168.10.10 ==============================

============================== 192.168.10.11 ==============================
[root@localhost redis-cluster]# cat /usr/local/docker-redis/redis-cluster/637{4..6}/conf/redis.conf
port 6374
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.11
cluster-announce-port 6374
cluster-announce-bus-port 16374

port 6375
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.11
cluster-announce-port 6375
cluster-announce-bus-port 16375

port 6376
requirepass 1234
masterauth 1234
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.10.11
cluster-announce-port 6376
cluster-announce-bus-port 16376
============================== 192.168.10.11 ==============================

  

编写 Docker Compose 模板文件

  

  在 192.168.10.10 机器的 /usr/local/docker-redis 目录下创建 docker-compose.yml 文件并编辑。

# 描述 Compose 文件的版本信息
version: "3.8"

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

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

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

  

  在 192.168.10.11 机器的 /usr/local/docker-redis 目录下创建 docker-compose.yml 文件并编辑。

# 描述 Compose 文件的版本信息
version: "3.8"

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

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

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

  

创建并启动所有服务容器

  

  分别在 192.168.10.10192.168.10.11 机器的 /usr/local/docker-redis 目录下执行以下命令:

docker-compose up -d

  

创建 Redis Cluster 集群

  

  请先确保你的两台机器可以互相通信,然后随便进入一个容器节点,并进入 /usr/local/bin/ 目录:

# 进入容器
docker exec -it redis-6371 bash
# 切换至指定目录
cd /usr/local/bin/

  

  接下来我们就可以通过以下命令实现 Redis Cluster 集群的创建。

redis-cli -a 1234 --cluster create 192.168.10.10:6371 192.168.10.10:6372 192.168.10.10:6373 192.168.10.11:6374 192.168.10.11:6375 192.168.10.11:6376 --cluster-replicas 1

  

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

  集群创建成功如下:

  

  以下内容是创建集群时返回的详细信息,也就是上两幅图中的所有内容。

root@localhost:/usr/local/bin# redis-cli -a 1234 --cluster create 192.168.10.10:6371 192.168.10.10:6372 192.168.10.10:6373 192.168.10.11:6374 192.168.10.11:6375 192.168.10.11:6376 --cluster-replicas 1
Warning: Using a password with ''-a'' or ''-u'' option on the command line interface may not be safe.
>>> 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.10.11:6376 to 192.168.10.10:6371
Adding replica 192.168.10.10:6373 to 192.168.10.11:6374
Adding replica 192.168.10.11:6375 to 192.168.10.10:6372
M: 04444afa3ca66de6af4a182984c79d4d140293d7 192.168.10.10:6371
   slots:[0-5460] (5461 slots) master
M: fb76ada83a70ea8d367f22f8a6436d427f12022c 192.168.10.10:6372
   slots:[10923-16383] (5461 slots) master
S: 20f6913a4b08afe3b4092a4f6c70fddd9506f2fa 192.168.10.10:6373
   replicates c130120ffbd7c4e442ac9fc9870e977dc801cb54
M: c130120ffbd7c4e442ac9fc9870e977dc801cb54 192.168.10.11:6374
   slots:[5461-10922] (5462 slots) master
S: d4d5f7fd94fcd2239e82e481f0529380b288ff51 192.168.10.11:6375
   replicates fb76ada83a70ea8d367f22f8a6436d427f12022c
S: e08b8f629e2dfa474a836910634052d83c77d06a 192.168.10.11:6376
   replicates 04444afa3ca66de6af4a182984c79d4d140293d7
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.10.10:6371)
M: 04444afa3ca66de6af4a182984c79d4d140293d7 192.168.10.10:6371
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 20f6913a4b08afe3b4092a4f6c70fddd9506f2fa 192.168.10.10:6373
   slots: (0 slots) slave
   replicates c130120ffbd7c4e442ac9fc9870e977dc801cb54
S: d4d5f7fd94fcd2239e82e481f0529380b288ff51 192.168.10.11:6375
   slots: (0 slots) slave
   replicates fb76ada83a70ea8d367f22f8a6436d427f12022c
M: fb76ada83a70ea8d367f22f8a6436d427f12022c 192.168.10.10:6372
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: c130120ffbd7c4e442ac9fc9870e977dc801cb54 192.168.10.11:6374
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: e08b8f629e2dfa474a836910634052d83c77d06a 192.168.10.11:6376
   slots: (0 slots) slave
   replicates 04444afa3ca66de6af4a182984c79d4d140293d7
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

  

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

  

查看集群状态

  

  我们先进入容器,然后通过一些集群常用的命令查看一下集群的状态。

# 进入容器
docker exec -it redis-6371 bash
# 切换至指定目录
cd /usr/local/bin/

  

检查集群状态

  

redis-cli -a 1234 --cluster check 192.168.10.11:6375

  

查看集群信息和节点信息

  

# 连接至集群某个节点
redis-cli -c -a 1234 -h 192.168.10.11 -p 6376
# 查看集群信息
cluster info
# 查看集群结点信息
cluster nodes

  

SET/GET

  

  在 6371 节点中执行写入和读取,命令如下:

# 进入容器并连接至集群某个节点
docker exec -it redis-6371 /usr/local/bin/redis-cli -c -a 1234 -h 192.168.10.10 -p 6371
# 写入数据
set name mrhelloworld
set aaa 111
set bbb 222
# 读取数据
get name
get aaa
get bbb

  别着急,让我来解释一下上图中的操作过程:

  • 首先进入容器并连接至集群某个节点;
  • 然后执行第一个 set 命令 set name mrhelloworldname 键根据哈希函数运算以后得到的值为 [5798]。当前集群环境的槽分配情况为:[0-5460] 6371节点[5461-10922] 6374节点[10923-16383] 6372节点,所以该键的存储就被分配到了 6374 节点上;
  • 再来看第二个 set 命令 set aaa,这里大家可能会有一些疑问,为什么看不到 aaa 键根据哈希函数运算以后得到的值?因为刚才重定向至 6374 节点插入了数据,此时如果还有数据插入,正好键根据哈希函数运算以后得到的值也还在该节点的范围内,那么直接插入数据即可;
  • 接着是第三个 set 命令 set bbbbbb 键根据哈希函数运算以后得到的值为 [5287],所以该键的存储就被分配到了 6371 节点上;
  • 然后是读取操作,第四个命令 get namename 键根据哈希函数运算以后得到的值为 [5798],被重定向至 6374 节点读取;
  • 第五个命令 get aaaaaa 键根据哈希函数运算以后得到的值也在 6374 节点,直接读取;
  • 第六个命令 get bbbbbb 键根据哈希函数运算以后得到的值为 [5287],被重定向至 6371 节点读取。

  

  通过以上操作我们得知 name 键的存储被分配到了 6374 节点,如果直接连接 6374 节点并获取该值会怎么样?没错,不需要重定向节点,因为数据就在该节点,所以直接读取返回。

  

客户端连接

  

  最后来一波客户端连接操作,随便哪个节点,看看可否通过外部访问 Redis Cluster 集群。

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

本文采用 知识共享「署名-非商业性使用-禁止演绎 4.0 国际」许可协议

大家可以通过 分类 查看更多关于 Docker 的文章。

  

您的点赞转发是对我最大的支持。

扫码关注 哈喽沃德先生「文档 + 视频」每篇文章都配有专门视频讲解,学习更轻松噢~

Docker Compose 搭建 Redis 集群

Docker Compose 搭建 Redis 集群

下载即可使用:docker-redis-cluster

今天关于基于 docker-compose 搭建 redis 集群docker搭建redis-cluster集群的介绍到此结束,谢谢您的阅读,有关docker compose redis 部署、Docker Compose 单机部署Redis+Sentinel 集群、Docker Compose 搭建 Redis Cluster 集群环境、Docker Compose 搭建 Redis 集群等更多相关知识的信息可以在本站进行查询。

本文标签: