Redis集群-Docker

Redis集群是Redis分布式解决方案,解决了单机中心化的问题

一、理论基础

主要包括2部分:节点主从、哈希Slot(槽)

节点主从:

1、master可由有多个slaver,slaver可以有自己的slaver,主从关系手动指定,当master下线后slaver会自动升为master;

2、读写分离,master负责写以及数据同步给slaver,slaver负责读,slaver扩容提高读效率;

3、slaver获取master数据后压入磁盘,再load进内存,client端从内存中读取数据,当增加一个slaver,会主动通知master,master将全量数据发送给slaver,数据量大将影响性能;

优点:读写分离,增加slaver提交读的并发能力;

缺点:master写是瓶颈;


hash slot


1、对象保存前先进行CRC16哈希到指定slot(节点);

2、每个节点分配一个slot段,slot不能缺失也不能重复;

3、node之间相互监听,一旦有node退出或加入,会按照slot为单位做数据迁移;

优点:每个node互相监听,高并发数据写入、读出,任务繁重;

优点:将写操作分摊到了多个节点,提高写并发,扩容简单;

节点主从 && 哈希slot


1、主从和hash相互弥补优缺点;

2、先hash分逻辑节点,每个节点内部主从;

3、扩展并发读添加slaver,扩展并发写添加master;


二、集群搭建

集群操作:

//集群(cluster) 

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 槽中的键。



1、安装redis镜像

yimaoqian@yimaoqian  ~  docker pull redis

2、修改配置文件

下载redishttp://download.redis.io/releases/,解压后得到redis.conf,添加或修改如下配置:

bind 0.0.0.0

daemonize no

requirepass 123456

masterauth 123456

cluster-enabled yes

cluster-config-file nodes-6379.conf

cluster-node-timeout 15000

3、运行redis集群

使用6个redis节点,3主3从

docker run --privileged=true --name redis1 --net redis-net -p 6001:6379 -v $PWD/6001/conf/redis.conf:/data/config/redis.conf -v $PWD/6001/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes

docker run --privileged=true --name redis2 --net redis-net -p 6002:6379 -v $PWD/6002/conf/redis.conf:/data/config/redis.conf -v $PWD/6002/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes

docker run --privileged=true --name redis3 --net redis-net -p 6003:6379 -v $PWD/6003/conf/redis.conf:/data/config/redis.conf -v $PWD/6003/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes

docker run --privileged=true --name redis4 --net redis-net -p 6004:6379 -v $PWD/6004/conf/redis.conf:/data/config/redis.conf -v $PWD/6004/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes

docker run --privileged=true --name redis5 --net redis-net -p 6005:6379 -v $PWD/6005/conf/redis.conf:/data/config/redis.conf -v $PWD/6005/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes

docker run --privileged=true --name redis6 --net redis-net -p 6006:6379 -v $PWD/6006/conf/redis.conf:/data/config/redis.conf -v $PWD/6006/data:/data -d redis:latest redis-server /data/config/redis.conf --appendonly yes

4、查看容器状态

yimaoqian@yimaoqian  ~  docker ps

CONTAINER ID        IMAGE                COMMAND                  CREATED            STATUS                PORTS                              NAMES

264773dfc76a        redis:latest        "docker-entrypoint.s…"  3 hours ago        Up 3 hours            0.0.0.0:6006->6379/tcp              redis6

cf017727c5e1        redis:latest        "docker-entrypoint.s…"  3 hours ago        Up 3 hours            0.0.0.0:6005->6379/tcp              redis5

ab6041e6e5c2        redis:latest        "docker-entrypoint.s…"  3 hours ago        Up 3 hours            0.0.0.0:6004->6379/tcp              redis4

8faeccf80150        redis:latest        "docker-entrypoint.s…"  3 hours ago        Up 3 hours            0.0.0.0:6003->6379/tcp              redis3

bdb2a392c8c9        redis:latest        "docker-entrypoint.s…"  3 hours ago        Up 3 hours            0.0.0.0:6002->6379/tcp              redis2

a986b0a1a4d8        redis:latest        "docker-entrypoint.s…"  3 hours ago        Up 37 minutes          0.0.0.0:6001->6379/tcp              redis1

5、运行redis集群容器

查看容器IP:

yimaoqian@yimaoqian  ~/wutong/specialGroup/redis  docker inspect redis1 redis2 redis3 redis4 redis5 redis6|grep IPA

            "SecondaryIPAddresses": null,

            "IPAddress": "",

                    "IPAMConfig": null,

                    "IPAddress": "172.20.0.2",

            "SecondaryIPAddresses": null,

            "IPAddress": "",

                    "IPAMConfig": null,

                    "IPAddress": "172.20.0.3",

            "SecondaryIPAddresses": null,

            "IPAddress": "",

                    "IPAMConfig": null,

                    "IPAddress": "172.20.0.4",

            "SecondaryIPAddresses": null,

            "IPAddress": "",

                    "IPAMConfig": null,

                    "IPAddress": "172.20.0.5",

            "SecondaryIPAddresses": null,

            "IPAddress": "",

                    "IPAMConfig": null,

                    "IPAddress": "172.20.0.6",

            "SecondaryIPAddresses": null,

            "IPAddress": "",

                    "IPAMConfig": null,

                    "IPAddress": "172.20.0.7",

集群感知:

localhost:6001> CLUSTER MEET 172.20.0.3 6379

OK

localhost:6001> CLUSTER MEET 172.20.0.4 6379

OK

localhost:6001> CLUSTER MEET 172.20.0.5 6379

OK

localhost:6001> CLUSTER MEET 172.20.0.6 6379

OK

localhost:6001> CLUSTER MEET 172.20.0.7 6379

OK

localhost:6001> cluster nodes

a4cfac29113a66a278c37268d2ca49fb62873e93 172.20.0.7:6379@16379 master - 0 1572328475000 5 connected

e3316f5cdc75a7e7ea259c3b9a00dee4dc6afb4c 172.20.0.5:6379@16379 master - 0 1572328476000 3 connected

8a5363c38e406227ffcc89080edd4b84d0d22ba4 172.20.0.2:6379@16379 myself,master - 0 1572328474000 1 connected

a179d778c65c3caeeaca5f095fb4a1380453a07a 172.20.0.4:6379@16379 master - 0 1572328476510 2 connected

fdddf383f8bf53447926e5efb80a7405ec85294d 172.20.0.3:6379@16379 master - 0 1572328474495 0 connected

383bd17b9a8c3a64f664637dd7cdb764a17324b8 172.20.0.6:6379@16379 master - 0 1572328475000 4 connected

分配slot:

查看槽信息

localhost:6001> CLUSTER INFO

cluster_state:fail

cluster_slots_assigned:0 # 被分配槽的个数为0

cluster_slots_ok:0

cluster_slots_pfail:0

cluster_slots_fail:0

cluster_known_nodes:6

cluster_size:0

cluster_current_epoch:5

cluster_my_epoch:2

cluster_stats_messages_ping_sent:260418

cluster_stats_messages_pong_sent:260087

cluster_stats_messages_meet_sent:10

cluster_stats_messages_sent:520515

cluster_stats_messages_ping_received:260086

cluster_stats_messages_pong_received:260328

cluster_stats_messages_meet_received:1

cluster_stats_messages_received:520415

分配槽位:

#!/bin/bash

# node1 localhost:6001  172.20.0.2

n=0

for ((i=n;i<=5461;i++))

do

  /usr/local/bin/redis-cli -h localhost -p 6001 -a 123456  CLUSTER ADDSLOTS $i

done

# node2 localhost:6002    172.20.0.3

n=5462

for ((i=n;i<=10922;i++))

do

  /usr/local/bin/redis-cli -h localhost -p 6002 -a 123456 CLUSTER ADDSLOTS $i

done

# node3 localhost:6003    172.20.0.4

n=10923

for ((i=n;i<=16383;i++))

do

  /usr/local/bin/redis-cli -h localhost -p 6003 -a 123456 CLUSTER ADDSLOTS $i

done

6、高可用

添加从节点:

#!/bin/bash

/usr/local/bin/redis-cli -h localhost -p 6004 -a 123456 CLUSTER REPLICATE 8a5363c38e406227ffcc89080edd4b84d0d22ba4

/usr/local/bin/redis-cli -h localhost -p 6005 -a 123456 CLUSTER REPLICATE fdddf383f8bf53447926e5efb80a7405ec85294d

/usr/local/bin/redis-cli -h localhost -p 6006 -a 123456 CLUSTER REPLICATE a179d778c65c3caeeaca5f095fb4a1380453a07a

1、备用节点不允许分配槽位;

2、在当前节点操作,将当前节点添加为node_id的副本节点;

3、从节点需要运行在cluster模式下,先添加到集群,再做复制;

查看节点信息:3主3从高可用

ocalhost:6004> cluster nodes

a4cfac29113a66a278c37268d2ca49fb62873e93 172.20.0.7:6379@16379 slave a179d778c65c3caeeaca5f095fb4a1380453a07a 0 1572332713422 5 connected

a179d778c65c3caeeaca5f095fb4a1380453a07a 172.20.0.4:6379@16379 master - 0 1572332714428 2 connected 10923-16383

fdddf383f8bf53447926e5efb80a7405ec85294d 172.20.0.3:6379@16379 master - 0 1572332712417 0 connected 5462-10922

383bd17b9a8c3a64f664637dd7cdb764a17324b8 172.20.0.6:6379@16379 slave fdddf383f8bf53447926e5efb80a7405ec85294d 0 1572332713000 4 connected

e3316f5cdc75a7e7ea259c3b9a00dee4dc6afb4c 172.20.0.5:6379@16379 myself,master - 0 1572332712000 6 connected 0-5461

8a5363c38e406227ffcc89080edd4b84d0d22ba4 172.20.0.2:6379@16379 slave e3316f5cdc75a7e7ea259c3b9a00dee4dc6afb4c 0 1572332712000 6 connected

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

推荐阅读更多精彩内容