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

推荐阅读更多精彩内容