redis cluster集群

redis cluster集群是由多个主从节点群组成的分布式服务器集群,具有复制、高可用和分片特性。不需要哨兵也能完成节点的移除和故障转移功能。
需要将每个节点设置成集群模式,这种集群没有中心节点,可以线程扩展高达1000个节点。

密钥分配模型

Redis Cluster集群数据分片没有使用一致哈希,而是使用哈希槽。redis集群有16384个哈希槽,要计算哈希槽,只需要给定键的CRC16取模16384。
集群中的每个节点都负责哈希槽的子集,这样可以轻松添加和删除集群中的节点

集群总线

一个服务于客户端的TCP端口,如6379
一个用于集群总线(客户端端口加10000),16379:用于故障检测、配置更新、故障转移。
节点与节点的通信仅使用集群总线和集群总线协议进行。
如果两个端口没有开放,则集群不能正常工作

redis cluster集群搭建

redis cluster集群至少需要三个master节点,我们这里搭建3个master,且给每个master一个slave节点。这里搭建伪分布式都在一台上,端口8001到8006。


image.png

1、创建文件夹redis-cluster,在redis-cluster下面创建6个文件夹 8001到8006

mkdir -p /opt/redis-cluster
mkdir 8001 8002 8003 8004 8005 8006

2、把redis.conf配置文件复制到8001,并修改如下

daemonize yes
port 8001
bind 127.0.0.1
dir /opt/redis-cluster/8001/
cluster-enabled yes
cluster-config-file nodes-8001.conf
cluster-node-timeout 5000
appendonly yes

其他文件修改对应端口就行
sed 's/8001/8002/g' /opt/redis-cluster/8001redis.conf > /opt/redis-cluster/8002/redis.conf
然后启动8001到8006端口的redis
redis-server /usr/local/redis-cluster/800*/redis.conf

3、设置集群

启动完成之后需要设置集群模式,有以下方式

①原生搭建

meet
cluster meet ip port
指派槽( 0到16383)
根据crc16 算法 算出key槽位
cluster keyslot <key> 计算键 key 应该被放置在哪个槽上。
cluster addslots slot(槽位下标)
分配主从
cluster replicate node-id

②redis提供的rb脚本

如果要使用ruby需要首先安装
apt-get install ruby rubygems
gem install redis --version 3.0.0
然后在redis的安装目录下执行 redis-trib.rb命令创建整个redis集群,槽位可以按照指引完成
./redis-trib.rb create --replicas 1 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005 127.0.0.1:8006

③redis-cli --cluster命令

redis5.0之后可以使用,槽位也可以按照指引完成分配
redis-cli --cluster create 192.127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 192.168.0.104:8004 127.0.0.1:8005 127.0.0.1:8006 --cluster-replicas 1
--cluster-replicas值代表master与slave的比例,如果是1则master有三台slave有三台8004、8005、8006是slave随机对应8001、8002、8003端口

4、验证集群

连接任意客户端/usr/local/redis/bin/redis-cli -c -h 127.0.0.1 -p 8002
验证cluster info(查看集群信息)、cluster nodes(查看节点列表)、及数据添加测试

redis 127.0.0.1:8002> set hello world
-> Redirected to slot [866] located at 127.0.0.1:8001
OK

如果需要关闭,则一个一个关闭redis-cli -c -h 127.0.0.1 -p 800* shutdown

集群伸缩

扩容集群

1、准备新节点
如8007、8008端口节点。创建过程与其他端口相同
2、加入集群
使用redis-cli 并指定主从
add-node 新节点ip 端口 已存在节点ip 端口 --cluster-slave --cluster-master-id masterID
使用原生命令 语法:cluster meet ip port cluster replicate node-id
3、迁移槽和数据
槽迁移 redis-cli --cluster reshard 127.0.0.1:8001
迁移数据:根据提示要分配多少槽、接收节点ID、all/done
添加从节点

缩容集群

1、下线迁移槽
redis-cli --cluster reshard --cluster-from 迁出节点ID --cluster-to 接收槽节点ID --cluster-slots 迁出槽数量 已存在节点ip 端口
2、忘记并关闭节点
redis-cli --cluster del-node 存在节点IP:端口 要删除的节点ID

故障转移

与哨兵类似,故障发现不依赖哨兵
故障恢复:
1、检查每个从节点与主节点断开时间
2、选择偏移量最大的并替换主节点
slaveof no one变为主节点,撤销之前主节点槽位给新主节点,并向集群广播已经替换故障节点

重定向和重新分片

moved重定向:发送命令时,经过crc16算法,客户端没有这个数字范围。需要捕获异常
asx重定向:发送命令时,正在迁移槽位

moved移动重定向

Redis客户端可以向集群的每个节点发送查询,如果这个hash槽由这个节点服务则查询被简单处理。否则,节点将会检查其内部哈希槽到节点的映射,并通过MOVED错误回复客户端。如下面示例所示,仅做参考:

GET x
-MOVED 3999 127.0.0.1:7001

错误包括键的哈希槽(3999)和可以为查询提供服务的ip:port。在收到MOVED重定向后,使用cluster nodes或cluster slots命令刷新整个客户端集群布局,遇到这种情况,可能重新配置了多个插槽,而不仅仅一个,因此尽快更新比较好

ASK重定向

当迁移槽时,可以将插槽设置:
migrating时,表示该节点将接受与该哈希槽有关的所有查询,但是仅当所讨论的键存在是,否则该查询将使用ask重定向转发到迁移目标节点
importing时,则该节点接受与该哈希槽有关的所有查询,前提是请求之前带有ASKING命令。如果客户端未提供命令,则查询会通过-MOVED重定向错误重定向到实际的哈希槽所有者
假如:哈希槽8 从A移动到B
moved意味着我们认为哈希槽由另一个节点永久提供。所以,ASK意味着仅将下一个查询发送到指定节点。这么做的原因是因为哈希槽的查询可能在迁移前的节点B仍然存在,因此始终希望客户端尝试之前的节点A,然后需要时尝试迁移后的节点。
如果客户端查询之前发送asking命令,则节点B将仅接受设置为importing的插槽查询
一旦哈希槽8迁移完成,A将发送moved消息,且客户端永久映射新的ip和端口

总结

redis cluster集群是高可用集群,使用哈希槽分片可以轻松添加或删除节点。
解决了哨兵模式单机存储受限问题、及写操作的负载均衡
可以解决缓存雪崩问题

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

推荐阅读更多精彩内容