Docker Compose怎么搭建 Redis Cluster集群环境

技术Docker Compose怎么搭建 Redis Cluster集群环境Docker Compose怎么搭建 Redis Cluster集群环境,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方

我相信许多没有经验的人对Docker Compose如何构建一个Redis集群环境无能为力。为此,本文总结了问题产生的原因及解决方法。通过这篇文章,希望你能解决这个问题。

让我们使用Docker Compose再次构建它。主要目的是让大家感受到Docker作曲带来的便利。

根据Redis官网提示:https://redis.io/topics/cluster-tutorial,为了让Docker兼容Redis集群,需要使用Docker的主机网络模式。

创建容器时,主机网络模式需要由参数- net host或-networkhost指定。主机网络模式允许容器共享宿主机网络栈和容器使用主机的IP和端口,而不是虚拟化它们自己的网卡和配置它们自己的IP。

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

Docker  Compose怎么搭建 Redis  Cluster集群环境

环境

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

192.168.10.10

192.168.10.11

每台机器使用的基础架构环境如下:

CentOS 7.8.2003

Docker版本19.03.12

Docker  Compose怎么搭建 Redis  Cluster集群环境

搭建

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

下载Redis镜像(其实这个步骤可以省略,因为创建容器时如果本地镜像不存在,就会被远程拉取);

写Redis配置文件;

编写Docker编写模板文件;

并启动所有服务容器;

创建Redis集群集群。

00-1010

编写 Redis 配置文件

分别在192.168.10.10和192.168.10.11机器上执行以下操作。

#创建目录

mkdir-p/usr/local/docker-redis/redis-cluster

#切换到指定的目录

CD/usr/local/docker-redis/redis-cluster/

#编写redis-cluster.tmpl文件

Virdis-cluster . tmpl

创建目录及文件

192 . 168 . 10 . 10机器的redis-cluster.tmpl文件内容如下:

port${PORT}

required pass 1234

masterauth1234

受保护-modeno

daemonizeno

附录是

成簇染料

cluster-config-filenodes.conf

群集节点超时15000

集群-公告-ip192.168.10.10

集群通告端口${PORT}

集群-公告-总线-端口1 $ {port} 192.168.10.11机器的redis-cluster.tmpl文件内容如下:

port${PORT}

required pass 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

Docker Compose怎么搭建 Redis Cluster集群环境

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

Docker Compose怎么搭建 Redis Cluster集群环境

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

============================== 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

Docker Compose怎么搭建 Redis Cluster集群环境

Docker Compose怎么搭建 Redis Cluster集群环境

创建 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,结果如下所示:

Docker Compose怎么搭建 Redis Cluster集群环境

  集群创建成功如下:

Docker Compose怎么搭建 Redis Cluster集群环境

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

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 Compose怎么搭建 Redis Cluster集群环境

查看集群状态

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

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

检查集群状态

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

Docker Compose怎么搭建 Redis Cluster集群环境

查看集群信息和节点信息

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

Docker Compose怎么搭建 Redis Cluster集群环境

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

Docker Compose怎么搭建 Redis Cluster集群环境

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

  • 首先进入容器并连接至集群某个节点;

  • 然后执行第一个 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 节点并获取该值会怎么样?没错,不需要重定向节点,因为数据就在该节点,所以直接读取返回。

Docker Compose怎么搭建 Redis Cluster集群环境

客户端连接

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

Docker Compose怎么搭建 Redis Cluster集群环境

Docker Compose怎么搭建 Redis Cluster集群环境

看完上述内容,你们掌握Docker Compose怎么搭建 Redis Cluster集群环境的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/142174.html

(0)

相关推荐

  • 怎么利用Outlook来创建基于电子邮件的持久化后门

    技术怎么利用Outlook来创建基于电子邮件的持久化后门本篇内容主要讲解“怎么利用Outlook来创建基于电子邮件的持久化后门”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎

    攻略 2021年10月22日
  • R语言如何使用RcppEigen进行矩阵运算

    技术R语言如何使用RcppEigen进行矩阵运算这篇文章主要介绍了R语言如何使用RcppEigen进行矩阵运算,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下

    攻略 2021年11月6日
  • 樱花几月开的最旺盛,樱花是几月开花到几月谢呢

    技术樱花几月开的最旺盛,樱花是几月开花到几月谢呢樱花的花期一般在3-4月樱花几月开的最旺盛,受气候条件影响,会略有波动,一般在四月初最为繁盛,花期不长,一般10-15天。 樱花(学名:Cerasus sp.):是蔷薇科樱

    生活 2021年11月1日
  • django认证类配置实现方法是什么

    技术django认证类配置实现方法是什么这篇文章主要介绍“django认证类配置实现方法是什么”,在日常操作中,相信很多人在django认证类配置实现方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法

    攻略 2021年11月10日
  • 命令行中scp命令怎么用

    技术命令行中scp命令怎么用这篇文章将为大家详细讲解有关命令行中scp命令怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 scp 全称为secure copy,它能够对文

    攻略 2021年11月20日
  • qt的tcp通信编程(qt串口通信代码)

    技术QT5实现UDP通信的示例代码怎么写QT5实现UDP通信的示例代码怎么写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言该例程经过实际

    攻略 2021年12月15日