【Redis】Redis 集群

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【Redis】Redis 集群

一、集群概念

业务发展过程中遇到的峰值瓶颈:

  • redis提供的服务OPS可以达到10万/秒,当前业务OPS已经达到20万/秒
  • 内存单机容量达到256G,当前业务需求内存容量1T

这个时候可以使用集群的方式可以快速解决上述问题

集群架构:  集群就是使用网络将若干台计算机联通起来,并提供统一的管理方式,使其对外呈现单机的服务效果

集群的作用:

  • 分散单台服务器的访问压力,实现负载均衡
  • 分散单台服务器的存储压力,实现可扩展性
  • 降低单台服务器宕机带来的业务灾难的可能性,实现高可用性

image.png

二、集群数据存储设计

  • 通过hash算法设计,计算出key应该保存的位置
  • 将所有的存储空间切割成16384份,每台主机保存一部分,每份代表的一个存储空间(槽),不是一个key的保存空间,这个存储空间可以保存很多key
  • 将key按照计算出的结果放到对应的存储空间

image.png

假定我们现在增加一台机器,这些存储的数据以及空间应该如何分配呢?

image.png

一台机器分一些槽出来给新的机器,所谓的增加机器和删除机器,改变槽所存储的机器即可

三、集群内部通讯设计

  • 各个数据库相互通信,保存各个库中槽的编号
  • 一次命中,直接返回
  • 一次未命中,告知具体位置,最多两次才命中

image.png

此时有一台客户端查找key,首先会通过hash算法计算出key对应的槽编号,然后在哈希环上找到对应的机器,检查这台机器上是否有对应的槽(由于可能进行了机器的增加、删除,机器上的槽会被添加到不同机器上)

如果这台机器有key对应的槽,直接查找返回;如果没有,则查找每台机器槽编号和机器的记录,然后再到对应机器取即可

四、搭建集群

Cluster配置

设置加入cluster,成为其中的节点


cluster-enabled yes|no

cluster配置文件名,该文件属于自动生成,仅用于快速查找文件并查询文件内容


cluster-config-file <filename>

节点服务响应超时时间,用于判定该节点是否下线或切换为slave


cluster-node-timeout <milliseconds>

master连接的slave最小数量


cluster-migration-barrier <count>

配置3 masters—3 slaves

编写redis-6379.conf

image.png

由redis-6379.conf得到redis-6380.conf、redis-6381.conf、redis-6382.conf、redis-6383.conf、redis-6384.conf,分别作为3个master和3个slave的启动配置文件

image.png

启动所有的master和slave

image.pngimage.png

这还是一个一个的节点,我们需要把他们连在一起,在src目录下有一个redis-trib.rb的可执行程序(这个文件执行需要安装ruby)


image.png

# 这里的n表示1个master对应n个slave
# 后面的ip:port表示master和slave的信息,master和slave的数量需要和前面的n对应
# 假设n=1,写了6组ip:port,则表示前3个为master,后3个为slave,实现1主1从
# 假设n=2,写了9组ip:port,则表示前3个为master,后6个为slave,实现1主2从
./redis-trib.rb create --replicas n ip1:port1 ip2:port2 ....

写6组ip:port,执行指令,生成3组1主1从

image.png

生成多组主从结构前,我们先看一下data目录(在redis-端口.conf中配置)下生成的节点的配置文件nodes-端口.conf

image.png

我们输入yes,生成3组1主1从

image.png

cluster连接在一起后,集群就配置好了,此时nodes-端口.conf就发生了改变。我们看一下master 6379对应的节点配置文件

image.png

我们看一下6379master终端的提示信息

image.png

五、集群使用实践

1. 使用集群存放数据

image.png

我们连接上6379端口的redis服务器后,想要在6379服务器上放数据,可通过CRC算法和模16384计算出itheima这个数据应该放在5798号槽,而这个槽在6380机器上,不允许我们放在6379机器上

我们使用-c参数登录服务器,这个参数是专门操作集群的

image.png

我们依然连接6379服务器,放数据的时候,给出提示信息,虽然我们在6379上放数据,但通过CRC算法和模16384计算出itheima这个数据应该放在5798号槽,故重定向到了6380机器

我们通过-c参数登录6382这台slave服务器取数据

image.png

提示信息告诉我们,重定向到6380机器上的5798号槽取出来的。只要是我们登录集群中的任意一台机器,都能在6380机器上的5798号槽取出来,如果我们登录6380机器就不会有重定向信息,而是直接取出数据

2. slave掉线对集群的影响

集群最大的优势并不是能在多台机器存放数据,而是集群能够很好的解决宕机带来的业务灾难

我们先停掉6382 slave1

image.png

我们看一下slave1对应的master1,master1发现slave1 10s内无响应,则将其标记为已下线

image.png

而此时集群中的其他master和slave都会收到master1的通知,slave1已下线

image.png

这时我们让slave1重新上线

image.png

上线后和master1重新同步即可,master1再通知其他的master和slave有关slave1的上线信息,其他的机器就清除slave1的下线标记

image.png

总结:  slave下线后,与其对应的master会将其标记为下线状态,同时通知集群中其他机器该slave下线;待其上线后,再与其进行数据同步,然后通知集群中其他的机器该slave的上线信息

3. master掉线对集群的影响

我们停掉master1

image.png

下面是与master1对应的slave1的操作

image.png

我们用cluster nodes查看一下节点信息,发现有4个master,其中6379被标记为fail

image.png

我们现在重新启动6379

image.png

6379请求和6382进行数据同步

image.png

再用cluster nodes查看一下节点信息,6379的状态从master fail被修改为slave

image.png

总结:  当master1下线后,对应的slave1会尝试连接,超时后自己成为新的master,然后通知集群中其他的机器,master1下线以及自己成为master的消息,master1的状态被标记为master fail;6379重新上线时,会成为slave,并和自己的master进行数据同步

Cluster节点操作命令

查看集群节点信息


cluster nodes

进入一个从节点redis,切换其主节点


cluster replication <master-id>

发现一个新节点,新增主节点


cluster meet ip:port

忽略一个没有slot的节点


cluster forget

手动故障转移


cluster failover



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
4月前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
141 0
|
6月前
|
存储 运维 NoSQL
Redis Cluster集群模式部署
Redis Cluster集群模式部署
125 4
|
6月前
|
监控 NoSQL 算法
手把手教你如何搭建redis集群(二)
手把手教你如何搭建redis集群(二)
419 1
|
5月前
|
存储 NoSQL 算法
Redis 集群模式搭建
Redis 集群模式搭建
96 5
|
4月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】当使用Azure Redis 集群服务时候,发生了Moved的几点分析
【Azure Redis 缓存】当使用Azure Redis 集群服务时候,发生了Moved的几点分析
|
5月前
|
存储 缓存 NoSQL
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
|
5月前
|
缓存 NoSQL Java
Redis Spring配置集群
【7月更文挑战第5天】
79 10
|
4月前
|
NoSQL Redis
Redis——单机迁移cluster集群如何快速迁移
Redis——单机迁移cluster集群如何快速迁移
142 0