使用 Docker 搭建高可用 Redis Cluster 集群

上一篇文章描述了使用 Docker 基于哨兵模式搭建高可用的Redis,这一篇文章则使用Docker搭建Redis集群。

Redis Cluster 简介

Redis 3.0提供的分布式数据库解决方案——Redis Cluster。不仅可以主从复制,还可以像Sentinel那样有故障转移机制。除此之外,集群还有几个独有的特点:去中心化和数据分片。

去中心化:集群没有中心(核心)节点,就不会受到太大的影响,当某个主节点故障而不会影响整个集群的可用性。
分片:集群中的主节点可以水平扩展,使用哈希槽将键值对分配到不同的主节点,分担了单机Redis的压力。

接下来主要介绍如何使用 Docker 搭建Redis Cluster (Redis的版本为5.0

1.创建集群目录,存放各个节点的配置目录(/conf/redis.conf)和数据目录(/data)

for port in 'seq 8081 8089' ; do mkdir -p ./${port}/conf && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf && mkdir -p ./${port}/data; done

2.运行端口为8081~8089的容器

for port in 'seq 8081 8089'; do docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} -v /cluster-docker/${port}/conf/redis.conf:/etc/redis/redis.conf -v /cluster-docker/${port}/data:/data --restart always --name redis-${port} --net redis-net --sysctl net.core.somaxconn=1024 redis:5.0 redis-server /etc/redis/redis.conf; done

docker ps
3.获取各个容器的内外ip

for port in 'seq 8081 8089'; do echo -n "$(docker inspect --format '{{ (index .NetworkSettings.Networks "bridge").IPAddress }}' "redis-${port}")":${port} ' ' ; done

复制打印出来的ip和端口

4.创建集群

随便进入一个redis容器,譬如

docker exec -it redis-8081 /bin/bash

再执行创建集群的命令

redis-cli --cluster create 172.17.0.2:8081 172.17.0.3:8082 172.17.0.4:8083 172.17.0.5:8084 172.17.0.6:8085 172.17.0.7:8086 172.17.0.8:8087 172.17.0.9:8088 172.17.0.10:8089 --cluster-replicas 2

需要特别说明的是 --cluster-replicas 2 这一条命令,表示集群中的每个主节点创建两个从节点。示例的集群为三主六从

搭建集群

显示 Can I set the above configuration? (type 'yes' to accept): 的时候,输入yes

如无意外的话,最后显示 [OK] All 16384 slots covered. 则代表集群创建成功!如果输入yes之后一直显示 Waiting for the cluster to join... 请参考我另外一篇拙作 搭建Redis集群遇到的问题:Waiting for the cluster to join...

成功搭建集群

执行cluster nodes查看主从节点详细信息,如下图:

cluster nodes

输出格式为:

<id> <ip:port> <flags> <master> <ping-sent> <pong-recv> <config-epoch> <link-state> <slot> <slot> ... <slot>

id:节点 ID。一个40个字符的随机字符串,当一个节点被创建时不会再发生变化(除非CLUSTER RESET HARD被使用)。
ip:port:客户端应该联系节点以运行查询的节点地址。
flags:逗号列表分隔的标志:myself,master,slave,fail,handshake,noaddr,noflags。
master:如果节点是从属节点,并且主节点已知,则节点ID为主节点,否则为“ - ”字符。
ping-sent:以毫秒为单位的当前激活的ping发送的unix时间,如果没有挂起的ping,则为零。
pong-recv:毫秒 unix 时间收到最后一个ping。
config-epoch:当前节点(或当前主节点,如果该节点是从节点)的配置时期(或版本)。每次发生故障切换时,都会创建一个新的,唯一的,单调递增的配置时期。如果多个节点声称服务于相同的哈希槽,则具有较高配置时期的节点将获胜。
link-state:用于节点到节点集群总线的链路状态。我们使用此链接与节点进行通信。可以是connected或disconnected。
slot:散列槽号或范围。从参数9开始,但总共可能有16384个条目(限制从未达到)。这是此节点提供的散列槽列表。如果条目仅仅是一个数字,则被解析为这样。如果它是一个范围,它是在形式start-end,并且意味着节点负责所有散列时隙从start到end包括起始和结束值。

模拟主节点故障

模拟端口为8082的主节点发送故障,执行 docker stop redis-8082 后再次进入端口为8081的节点查看集群信息。可以看到端口为8082的节点的flag 标志为:master,fail;link-state 为disconnected。再看端口为8088的节点变为主节点,因此可以判断原先端口为8082的主节点下线后,故障转移由其从节点替代。

主节点下线后故障转移从节点成为新的主节点

此时我再执行 docker start redis-8082 ,可以发现端口为8082的服务在集群中connect,而且成为端口8088的从节点。

主节点下线后重新上线成为从节点

总结

以上就是使用Docker容器的技术搭建Redis集群,主要描述了Redis集群搭建的过程和模拟故障转移的实践。具体Redis命令背后的原理和详细的执行过程,推荐阅读黄健宏老师写的《Redis 设计与实现》,个人感觉写的十分通俗易懂,给了我很多启示!

参考资料:
https://cloud.tencent.com/developer/section/1374002

《Redis 设计与实现》

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

推荐阅读更多精彩内容