docker-compose 搭建 redis集群

今天,是我在简书上写的第一篇文章,那就是关于搭建 redis 集群的,现在就开始吧

第一步,安装docker 和 docker-compose (自行百度)

第二步,那就是先写一个通用的 redis.conf 配置要点如下:

先去下载,redis.conf 的模板,然后修改里面的配置哟

bind 0.0.0.0 #将绑定ip设置为 0.0.0.0 ,即不绑定ip
appendonly yes #开启持久化
cluster-enabled yes #开启集群
cluster-config-file nodes.conf #集群配置文件(这个在后面搭建的时候,会自动生成,不用管,这样写就对了)
cluster-node-timeout 15000 #节点超时时间

第三步,肯定是建立各种文件夹啦,目录结构如下:

mkdir -p ~/docker/redis/r1/data
然后将上一步的 redis.conf 放到 ~/docker/redis/r1 目录下
cp redis.conf ~/docker/redis/r1
然后复制6个r1 文件夹
cd ~/docker/redis
cp -r r1 r2
cp -r r1 r3
cp -r r1 r4
cp -r r1 r5
cp -r r1 r6

第四步,那就上编写,docker-compose.yml 了,文件内容如下:

version: "3"

services:

  redis1:

    container_name: redis1

    image: redis:5.0.8

  #第一个镜像,使用的不是 alpine 的,为了后面能执行脚本用的

    networks:

      - cluster

    volumes:

      - ./r1/redis.conf:/usr/local/etc/redis/redis.conf

      - ./r1/logs:/usr/local/redis/logs

      - ./r1/data:/data

    command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

    restart: always



  redis2:

    container_name: redis2

    image: redis:5.0.8-alpine

    networks:

      - cluster

    volumes:

      - ./r2/redis.conf:/usr/local/etc/redis/redis.conf

      - ./r2/logs:/usr/local/redis/logs

      - ./r2/data:/data

    command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

    restart: always



  redis3:

    container_name: redis3

    image: redis:5.0.8-alpine

    networks:

      - cluster

    volumes:

      - ./r3/redis.conf:/usr/local/etc/redis/redis.conf

      - ./r3/logs:/usr/local/redis/logs

      - ./r3/data:/data

    command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

    restart: always

  redis4:

    container_name: redis4

    image: redis:5.0.8-alpine

    networks:

      - cluster

    volumes:

      - ./r4/redis.conf:/usr/local/etc/redis/redis.conf

      - ./r4/logs:/usr/local/redis/logs

      - ./r4/data:/data

    command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

    restart: always

  redis5:

    container_name: redis5

    image: redis:5.0.8-alpine

    networks:

      - cluster

    volumes:

      - ./r5/redis.conf:/usr/local/etc/redis/redis.conf

      - ./r5/logs:/usr/local/redis/logs

      - ./r5/data:/data

    command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

    restart: always

  redis6:

    container_name: redis6

    image: redis:5.0.8-alpine

    networks:

      - cluster

    volumes:

      - ./r6/redis.conf:/usr/local/etc/redis/redis.conf

      - ./r6/logs:/usr/local/redis/logs

      - ./r6/data:/data

    command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

    restart: always

networks:

  cluster:

第五步,启动 docker-compose 并获取必要的数据

docker-compose up -d

下面我们需要查看一些网络信息

docker inspect redis_cluster

结果如下:


1.png

把Containers 里面内容的 Name 和 IPv4Address 保存下来,并分配好主从关系,后面要用到

主(Master) 从(Slave)
redis1 172.20.0.3 redis4 172.20.0.7
redis2 172.20.0.4 redis5 172.20.0.2
redis3 172.20.0.6 redis6 172.20.0.5

第六步,开始进行配置 redis 集群了 集群命令见后面哈

进入 redis1 容器

docker exec -it redis1 /bin/bash

然后进入 redis1 的 redis

redis-cli -h redis1

将所有节点 都加入到 集群

cluster meet 172.20.0.3 6379
cluster meet 172.20.0.4 6379
cluster meet 172.20.0.6 6379
cluster meet 172.20.0.7 6379
cluster meet 172.20.0.2 6379
cluster meet 172.20.0.5 6379

现在就可以查看 集群节点了

cluster nodes

2.png

现在,我们要记录 3 个 主 master 的 节点标识

主(Master) 标识
redis1 172.20.0.3 5c663752ece5230bddd54056ffb50f35c24e4a87
redis2 172.20.0.4 d62636b3855838983f3afb4959014abee894acc9
redis3 172.20.0.6 035a203a83c8e91988f484bed86c7a4be6f7988d

好了,到这里,我们就要开始写脚本了
先退出redis 再退出容器
到 r1 的 data 目录,写脚本
第一个脚本,用于分配插槽

vim ~/docker/redis/r1/data/addslots.sh

#!/bin/bash
#将0-5461的槽点配置在redis1 上
n=0
for ((i=n;i<=5461;i++))
do
   /usr/local/bin/redis-cli -h 172.20.0.3 CLUSTER ADDSLOTS $i
done

#将5462-10922的槽点配置在redis2 上
n=5462
for ((i=n;i<=10922;i++))
do
   /usr/local/bin/redis-cli -h 172.20.0.4 CLUSTER ADDSLOTS $i
done

#将10923-16383的槽点配置在redis3 上
n=10923
for ((i=n;i<=16383;i++))
do
   /usr/local/bin/redis-cli -h 172.20.0.6 CLUSTER ADDSLOTS $i
done

第二个脚本,用于添加主从关系

vim ~/docker/redis/r1/data/slaves.sh

# 需要用到 从 redis 到IP 与 主redis 的节点标识
# 主 redis1 从 redis4
/usr/local/bin/redis-cli -h 172.20.0.7 CLUSTER REPLICATE 5c663752ece5230bddd54056ffb50f35c24e4a87
# 主 redis2 从 redis5
/usr/local/bin/redis-cli -h 172.20.0.2 CLUSTER REPLICATE d62636b3855838983f3afb4959014abee894acc9
# 主 redis3 从 redis6
/usr/local/bin/redis-cli -h 172.20.0.5 CLUSTER REPLICATE 035a203a83c8e91988f484bed86c7a4be6f7988d

让我们再次进入,redis1 容器

docker exec -it redis1 /bin/bash

先执行 addslots.sh 再执行 slaves.sh, 如果没有权限执行,可以先给下权限

chmod -R 755 addslots.sh slaves.sh
./addslots.sh
./slaves.sh

然后我们再 进入 redis1 的 redis 查看集群情况

redis-cli -h redis1
cluster info

3.png

cluster nodes

4.png

这个时候,我们已经成功了,我们试试,执行正常的 set 和 get 命令吧
先退出当前 redis ,然后以集群的方式进入

exit
redis-cli -h redis1 -c
set myName "peer"
get myName

5.png

如果不以集群的方式进入 redis 会出现错误

(error) MOVED 5798 172.20.0.4:6379

下面我附上一些关于, 集群的一些命令

CLUSTER INFO 打印集群的信息 
    CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。  
       
    //节点(node) 
    CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。 
    CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。 
    CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。 
    CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。  
       
    //槽(slot) 
    CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。 
    CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。 
    CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。 
    CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。 
    CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。 
    CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。 
    CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。  
       
    //键 (key) 
    CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。 
    CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。 
    CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。

推荐阅读更多精彩内容