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)

相关推荐

  • 哪些水果含维生素c,含有维生素C的食物有什么

    技术哪些水果含维生素c,含有维生素C的食物有什么含维生素C的食物很多哪些水果含维生素c,好多水果蔬菜都有。水果比如苹果,梨,荔枝,橘子,葡萄等,蔬菜比如辣椒,白菜,茄子,番茄。好多好多,只要丰富点,换着吃,每天摄入量足够

    生活 2021年10月27日
  • element-plus 原生开发 日期国际化语言

    技术element-plus 原生开发 日期国际化语言 element-plus 原生开发 日期国际化语言官网提供国际化语言解决办法:https://element-plus.org/zh-CN/gui

    礼包 2021年11月10日
  • 图书馆英语怎么写,怎样写图书馆的规则,英语)

    技术图书馆英语怎么写,怎样写图书馆的规则,英语)图书馆的规则.英语图书馆英语怎么写:1) Be quiet all time.2) Keep your voice low when you talk to others.

    生活 2021年10月21日
  • 调表不调账,财务)

    技术调表不调账,财务) 调表不调账(财务)账里的数字一定要在报表中有所体现,报表中的数字却不一定要跟账完全一致,听起来不可思议,其实是有道理的,主要原因是两者的功能不完全一样。
    财务报表是编制给管理层和

    礼包 2021年12月6日
  • dickics,马丁靴品牌十大排名榜是怎样的

    技术dickics,马丁靴品牌十大排名榜是怎样的马丁靴品牌十大排名榜如下(名次不分先后)dickics: 1、Dr.Martens Dr.Martens的马丁靴,马丁靴鼻祖品牌,国内马丁靴名字的由来者,一般说马丁靴指的就

    2021年10月27日
  • 名字的意义,大家来说说自己名字的含义

    技术名字的意义,大家来说说自己名字的含义先说我头条号的名字名字的意义:树德汉硕,这是我父子名合到一起的名字。我姓口天吴,父叫树德,我叫汉硕。树汉是排辈字,我祖排辈上下排辈是:……超瑞世毓树汉裕厚发宗光……,我儿是裕字辈。

    生活 2021年10月29日