使用Docker容器搭建redis集群(多台机器部署)

搭建Redis集群之前需知:

1.Docker 容器启动redis必须设置network为host模式,[redis官方文档有说明](https://redis.io/topics/cluster-tutorial);

2.redis集群至少需要6个节点(3个master,3个slave);

3.redis主从节点是算法分配的,无需指定,所以我们的服务名称都叫redis-master;

- 这里我们使用最方便的搭建方式,使用docker-compose来搭建,对docker-compose不了解的朋友可以先行了解一下,[docker-compose学习地址](https://www.runoob.com/docker/docker-compose.html)。

- 在搭建Redis集群之前,我们需要修改下Redis的配置文件redis.conf,[redis.conf文件官方下载地址。](https://github.com/antirez/redis/blob/5.0/redis.conf)

- 1.将redis.conf复制6份,分别命名为nodes-6391.conf,nodes-6392.conf....

- 2.修改配置文件中的属性,主要是修改了一些集群配置和运行端口,端口号需要按需修改为6391~6396:

```

# 开启集群功能

cluster-enabled yes

# 设置运行端口

port 6391

# 设置节点超时时间,单位毫秒

cluster-node-timeout 15000

# 集群内部配置文件

cluster-config-file "nodes-6391.conf"

```

- 然后我们需要编写docker-compose.yml文件用于编排6个Redis容器,具体属性的作用可以参考下面的注释。

- 为了体现集群的可用性,我们在两台服务器上部署6个redis节点,1台服务器部署3个节点。

---

- ++服务器1 docker-compose.yml 编排++

```

version: "3"

services:

  redis-master1:

    image: redis:latest # 基础镜像

    container_name: redis-master1 # 容器名称

    working_dir: /config # 切换工作目录

    environment: # 环境变量

      - PORT=6391 # 会使用config/nodes-${PORT}.conf这个配置文件

    stdin_open: true # 标准输入打开

    tty: true # 后台运行不退出

    restart: always #服务器启动时会自动重启

    network_mode: host # 使用host模式

    privileged: true # 拥有容器内命令执行的权限

    volumes:

      - ./config:/config # 将同级目录下的config目录映射到容器/config目录

    entrypoint: # 设置服务默认的启动程序

      - /bin/bash

      - redis.sh

  redis-master2:

    image: redis:latest

    working_dir: /config

    container_name: redis-master2

    environment:

      - PORT=6392

    stdin_open: true

    network_mode: host

    tty: true

    privileged: true

    volumes:

      - ./config:/config

    entrypoint:

      - /bin/bash

      - redis.sh

  redis-master3:

    image: redis:latest

    container_name: redis-master3

    working_dir: /config

    environment:

      - PORT=6393

    stdin_open: true

    network_mode: host

    tty: true

    privileged: true

    volumes:

      - ./config:/config

    entrypoint:

      - /bin/bash

      - redis.sh



```

---

- ++服务器2 docker-compose.yml 编排++

```

version: "3"

services:

  redis-master1:

    image: redis:latest # 基础镜像

    container_name: redis-master1 # 容器名称

    working_dir: /config # 切换工作目录

    environment: # 环境变量

      - PORT=6395 # 会使用config/nodes-${PORT}.conf这个配置文件

    stdin_open: true # 标准输入打开

    tty: true # 后台运行不退出

    restart: always #服务器启动时会自动重启

    network_mode: host # 使用host模式

    privileged: true # 拥有容器内命令执行的权限

    volumes:

      - ./config:/config #配置文件目录映射到宿主机

    entrypoint: # 设置服务默认的启动程序

      - /bin/bash

      - redis.sh

  redis-master2:

    image: redis:latest

    working_dir: /config

    container_name: redis-master2

    environment:

      - PORT=6396

    stdin_open: true

    network_mode: host

    tty: true

    privileged: true

    volumes:

      - ./config:/config # 将同级目录下的config目录映射到/config

    entrypoint:

      - /bin/bash

      - redis.sh


  redis-master3:

    image: redis:latest

    working_dir: /config

    container_name: redis-master3

    environment:

      - PORT=6394

    stdin_open: true

    network_mode: host

    tty: true

    privileged: true

    volumes:

      - ./config:/config

    entrypoint:

      - /bin/bash

      - redis.sh 

```

- 从docker-compose.yml和redis配置文件中我们可以看到,我们的Redis容器分别运行在两台机器的6391~6396这6个端口之上,同时还以redis.sh脚本作为该容器的启动脚本。

- redis.sh脚本的作用是根据environment环境变量中的PORT属性,以指定配置文件来启动Redis容器,shell脚本如下:

```

redis-server  /config/nodes-${PORT}.conf

```

- 将编排好的配置文件分别上传到服务器(10.10.1.114,10.10.1.49)的redis-cluster目录中

```

[runner_tts@cloud-nlp redis-cluster]$ tree

.

├── config

│   ├── nodes-6391.conf

│   ├── nodes-6392.conf

│   ├── nodes-6393.conf

│   ├── nodes-6394.conf

│   └── redis.sh

└── docker-compose.yml

```

- 使用docker-compose命令启动容器,并查看日志。

```

docker-compose up -d;docker-compose logs -f

```

- 如果成功启动,输出如下信息:

```

[runner@cloud-49 redis-cluster]$ docker-compose up -d;docker-compose logs -f

Creating redis-master2 ... done

Creating redis-master3 ... done

Creating redis-master1 ... done

Attaching to redis-master1, redis-master3, redis-master2

```

- 两台服务器成功启动后,进入一个Redis容器中,初始化容器Redis集群。

```

# 进入Redis容器

docker exec -it redis-master1 /bin/bash

# 初始化Redis集群命令

redis-cli --cluster create \

10.10.1.114:6391 10.10.1.114:6392 10.10.1.114:6393 \

10.10.1.49:6394 10.10.1.49:6395 10.10.1.49:6396 \

--cluster-replicas 1

```

- 集群创建过程中会让你确认配置,输入yes确认即可。

```

[runner_tts@cloud-nlp redis-cluster]$ docker exec -it redis-master1 bash

root@cloud-nlp:/config# redis-cli --cluster create \

> 10.10.1.114:6391 10.10.1.114:6392 10.10.1.114:6393 \

> 10.10.1.49:6394 10.10.1.49:6395 10.10.1.49:6396 \

> --cluster-replicas 1

>>> Performing hash slots allocation on 6 nodes...

Master[0] -> Slots 0 - 5460

Master[1] -> Slots 5461 - 10922

Master[2] -> Slots 10923 - 16383

Adding replica 10.10.1.49:6396 to 10.10.1.114:6391

Adding replica 10.10.1.114:6393 to 10.10.1.49:6394

Adding replica 10.10.1.49:6395 to 10.10.1.114:6392

M: 9764989e0a38ba063e3740a933cb2c41ef20827a 10.10.1.114:6391

  slots:[0-5460] (5461 slots) master

M: 653cdb539e3a75f14a8dd4fc375236f5c8233fdc 10.10.1.114:6392

  slots:[10923-16383] (5461 slots) master

S: c3d6364b03d848ac567cec713659c9304ea568e7 10.10.1.114:6393

  replicates 059e3f7863e3af09af2ca086e4bbd05052116ce2

M: 059e3f7863e3af09af2ca086e4bbd05052116ce2 10.10.1.49:6394

  slots:[5461-10922] (5462 slots) master

S: 15495af93cf501266d33bc304f33681e87fb6564 10.10.1.49:6395

  replicates 653cdb539e3a75f14a8dd4fc375236f5c8233fdc

S: 7e37c6e43407e0ef2fc6fdd7a72552cca38bd55c 10.10.1.49:6396

  replicates 9764989e0a38ba063e3740a933cb2c41ef20827a

Can I set the above configuration? (type 'yes' to accept): yes

```

- Redis集群创建成功后会输出如下信息。

```

>>> 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 10.10.1.114:6391)

M: 9764989e0a38ba063e3740a933cb2c41ef20827a 10.10.1.114:6391

  slots:[0-5460] (5461 slots) master

  1 additional replica(s)

M: 653cdb539e3a75f14a8dd4fc375236f5c8233fdc 10.10.1.114:6392

  slots:[10923-16383] (5461 slots) master

  1 additional replica(s)

S: 15495af93cf501266d33bc304f33681e87fb6564 10.10.1.49:6395

  slots: (0 slots) slave

  replicates 653cdb539e3a75f14a8dd4fc375236f5c8233fdc

S: c3d6364b03d848ac567cec713659c9304ea568e7 10.10.1.114:6393

  slots: (0 slots) slave

  replicates 059e3f7863e3af09af2ca086e4bbd05052116ce2

S: 7e37c6e43407e0ef2fc6fdd7a72552cca38bd55c 10.10.1.49:6396

  slots: (0 slots) slave

  replicates 9764989e0a38ba063e3740a933cb2c41ef20827a

M: 059e3f7863e3af09af2ca086e4bbd05052116ce2 10.10.1.49:6394

  slots:[5461-10922] (5462 slots) master

  1 additional replica(s)

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

```

- 我们可以看到:

```

10.10.1.114:6391,10.10.1.114:6392,10.10.1.49:6394 三个node为master

10.10.1.49:6395,10.10.1.114:6393,10.10.1.49:6396 三个node为slave

```

- 创建成功后我们可以使用redis-cli命令连接到其中一个Redis服务;

```

# 集群模式启动

redis-cli -c  -p 6391

```

- 通过cluster nodes命令可以查看节点信息。

```

127.0.0.1:6391> cluster nodes

653cdb539e3a75f14a8dd4fc375236f5c8233fdc 10.10.1.114:6392@16392 master - 0 1586934357415 2 connected 10923-16383

15495af93cf501266d33bc304f33681e87fb6564 10.10.1.49:6395@16395 slave 653cdb539e3a75f14a8dd4fc375236f5c8233fdc 0 1586934356412 5 connected

c3d6364b03d848ac567cec713659c9304ea568e7 10.10.1.114:6393@16393 master - 0 1586934355410 7 connected 5461-10922

7e37c6e43407e0ef2fc6fdd7a72552cca38bd55c 10.10.1.49:6396@16396 slave 9764989e0a38ba063e3740a933cb2c41ef20827a 0 1586934354908 6 connected

059e3f7863e3af09af2ca086e4bbd05052116ce2 10.10.1.49:6394@16394 slave c3d6364b03d848ac567cec713659c9304ea568e7 0 1586934355108 7 connected

9764989e0a38ba063e3740a933cb2c41ef20827a 10.10.1.114:6391@16391 myself,master - 0 1586934355000 1 connected 0-5460

```

- 通过cluster info命令可以查看集群状态信息。

```

127.0.0.1:6391> cluster info

cluster_state:ok

cluster_slots_assigned:16384

cluster_slots_ok:16384

cluster_slots_pfail:0

cluster_slots_fail:0

cluster_known_nodes:6

cluster_size:3

cluster_current_epoch:7

cluster_my_epoch:1

cluster_stats_messages_ping_sent:2919

cluster_stats_messages_pong_sent:54

cluster_stats_messages_fail_sent:3

cluster_stats_messages_sent:2976

cluster_stats_messages_ping_received:54

cluster_stats_messages_pong_received:33

cluster_stats_messages_fail_received:1

cluster_stats_messages_received:88

```

- 到此,Redis集群搭建完成。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,941评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,397评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,345评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,851评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,868评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,688评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,414评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,319评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,775评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,945评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,096评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,789评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,437评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,993评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,107评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,308评论 3 372
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,037评论 2 355

推荐阅读更多精彩内容