当前位置: 首页 > 后端技术 > Java

采访者:Redis有什么扩展计划?

时间:2023-04-01 14:07:20 Java

作者:Vt\来源:https://juejin.im/post/5eb0e7...前言Redis大家都不陌生,即使没用过,也听说过。作为应用最为广泛的KV内存数据库之一,在当今大流量时代,单机模式显得有些单薄,难免有些扩容的打算。笔者将在下面介绍各种解决方案,并对场景、实现等进行概述,同时也会提到一些新手容易理解的误区。正文从基本的展开方式入手,更容易理解更高级的模式。分区概述分区是最简单的扩展方式。当我们面临单机的存储空间瓶颈时,首先想到的就是像传统关系型数据库一样进行数据分区。或者假设手头有N台机器可以作为Redis服务器。所有机器的总内存为256G,客户端只需要一个大的内存存储空间。除了把内存条全部拆下来焊接到一台机器上,我们还可以选择分区使用,这样就扩展了计算能力。在分区方面,所有数据都分散在多个Redis实例中。每个实例不需要关联,可以完全独立。客户端处理和传统的分库分库分表一样。可以从key入手,先进行计算,找到对应的数据存储实例进行操作。Range角度,比如orderId:1~orderId:1000进入instance1,orderId:1001~orderId:2000进入instance2...Hash计算,就像我们的hashmap一样,使用hash函数加位运算或者取模,高级玩法和操作比如consistentHash,找到对应的实例使用代理中间件进行操作,我们可以开发独立的代理中间件,屏蔽处理数据分片的逻辑,独立运行。当然,已经有别人造的轮子了。Redis也有优秀的代理中间件,比如Twemproxy,或者codis,可以根据场景使用。缺点是没有理由进行多键操作,键不一定在一个实例上,自然不支持多键操作或多键交易。维护成本,因为每个实例在物理上和逻辑上都属于一个单独的节点,缺乏统一管理。灵活性有限,范围分片很好。比如hash+MOD方式,如果要动态调整Redis实例数,就得考虑大量的数据迁移,非常麻烦。作为开发者,我知道,虽然我们总可以“曲线救国”来完成一些当前环境不支持的功能,但总是会很麻烦。主从概述数据迁移常被称为主从(Master-Slave),即复制(Replication)方式,你可以随意称呼。和上面的分区一样,也是Redis高可用架构的基础。新手可能会误以为这种基本模式就是“高可用”,这是不太正确的。分区可以暂时解决单点无法容纳的数据量问题,但是一个Key仍然只在一个实例上,在大流量时代不太可靠。主从是纬度的另一种延伸。节点将数据同步到从节点,就像“拆分”实例一样,可靠性提高了很多。图片有点夸张,主要是为了体现结构的灵活性,是一主一从,还是一主多从,还是一主多从多从……看情况你的心情。有了“实例克隆”,自然可以实现读写分离,将读流量平均分配到从节点。在掌握使用方法的时代,聊天软件难免会有这样的表情包。这个表情符号与它的使用方式有什么关系?先看使用方法:Redis实例作为master节点不需要配置任何参数。只需要正常启动实例作为从节点,使用配置文件或者命令方式REPLICAOFmasternodeHost主节点端口即可完成主从配置是的和表情包不一样,“dalao”没有一动不动,我就去“抱大腿”。这样一个最小的主从配置就完成了,主从实例就可以对外提供服务了。命令中的“主节点”是相对的,slave也可以抱slave的大腿,也就是上面说的灵活结构。缺点:从节点都是只读的。如果写流量大,就有点力不从心了。那我可以关闭只读从节点吗?当然不是,数据复制是从master到slave,slave节点唯一的数据无法和master同步,数据会不一致。故障转移并不友好。master节点挂掉后,写处理就无处安放了。需要手动设置一个新的master节点,比如使用REPLICAOFnoone(我不抱任何人的大腿)来提升master节点,然后再整理其他slave节点的新master配置,比较麻烦。Sentinel概述了master和slave的手动故障转移,这肯定是难以接受的。自然而然,一个高可用的解决方案——哨兵(Sentinel)就出现了。在主从架构不变的场景下,我们可以直接加入RedisSentinel来监控节点,完成自动故障发现和转移。并且它还可以充当配置提供者,提供主节点的信息,即使发生故障转移,它也可以提供正确的地址。Sentinel本身也是Redis实例的一种,只是不作为数据存储,启动命令也不一样。虽然画面有些复杂,但看样子他是要召唤光明使者。其实用起来很方便。Sentinel的最低配置,只需一行:sentinelmonitor只需要配置master,然后使用redis-sentinel<配置文件>命令启用.Redis官网提到的“最低配置”如下。除了上面提到的这一行,还有其他的配置:sentinelmonitormymaster127.0.0.163792sentineldown-after-after-millisecondsmymaster60000sentinelfailover-timeoutmymaster180000sentinelparallel-syncsmymaster1sentinelmonitorresque192.168.1.363804sentineldown-after-millisecondsresque10000sentinelfailover-timeoutresque180000sentinelparallel-syncsresque5这是因为官网加了一个修饰符,就是“典型的最小配置”,重要的参数和多个主要的例子都写出来了。在照顾大家的CV大法的时候,不要忘记了重要的参数。事实上,它们都有默认值。如本例所示,在监控多个master时,设置master节点的别名与其附加配置项相对应,一些sentinel命令,如SENTINELget-master-addr-by-name,会使用该别名。哨兵数量建议三个以上,且为奇数。Redis官网上也提到了针对各种情况的“排列”方法,值得参考。更由于是高可用的方案,并不存在严格意义上的“缺点”,需要结合使用场景来考虑。failover时暂时不可用,但其实官网的例子也给出了parallel-syncs参数来指定并行同步实例的个数,避免所有实例同步时整体不可用,相对来说比较好比手动故障转移更方便。分区逻辑需要自定义处理。虽然解决了master-slave下的高可用问题,但是Sentinel并没有提供分区方案,需要开发者考虑如何构建。既然还是master-slave,如果异常写流量毁坏了master节点,那么自动“failover”会不会变成自动“灾难转移”,即slave升为Master后挂掉,然后再被升职后挂掉。不过最后一点也是笔者的猜测,没听说过这样的案例,也就没必要深究了。集群概述RedisCluster是官方在3.0版本之后推出的分布式解决方案。对于开发者来说,“官方支持”这个词很可能是非常好的,小到问题大到特性。定制解决问题的成本总是更高。配合官方正式的集群方案,从请求路由、故障转移、弹性伸缩等几个纬度上使用起来会更方便。Cluster不同于Sentinel,支持分区。据说Cluster是Sentinel的升级,不确切。两者的纬度不同。如果Cluster也有故障转移功能,说它是Sentinel的升级版就有点牵强了。Cluster在分区管理中使用了“hashslot”的概念。一共有16384个slot,每个instance负责一部分slot。对应的key通过CRC16(key)&16383slot的公式计算得到。虽然在节点和键中都引入了槽的概念,但似乎很难理解。事实上,由于粒度更细,降低了节点扩容和缩容的难度,相对于传统策略还是很有优势的。当然,“slot”是一个虚拟的概念,节点本身维护着“slot”的关系,并不是真正下载并启动一个“slotservice”来运行。Redis的各种使用方式都是从配置文件开始的,集群也不例外。cluster-enabledyescluster-config-file"redis-node.conf"关键配置简洁明了。启用集群有两个步骤。指定集群配置文件。集群配置文件(cluster-config-file)供内部使用。你不能指定它。Redis将帮助创建一个。启动还是正常的方式redis-serverredis.conf首先以集群方式启动N个Redis实例,当然还没结束。下一步我称之为“配对分配槽”,听起来很流畅。“撮合分配槽位”的方式也在不断升级,从直接用原来的命令处理,到使用脚本,现在官方支持Redis-cli,随便用哪种方式。redis-cli--clustercreate127.0.0.1:7000127.0.0.1:7001\127.0.0.1:7002127.0.0.1:7003127.0.0.1:7004127.0.0.1:7005\--cluster-replicas1上面的命令是Redis官网给出的redis-cli使用方法,一行命令完成“三主三从”操作和槽位自动分配。这样集群就搭建完成了。当然也需要使用官方的check命令进行检查。redis-cli--clustercheck127.0.0.1:7001more虽然对分区有很好的支持,但是也有一些分区的老问题,比如:如果数据不在同一个“slot”,就无法使用类似于mset的多键操作。select命令页面上提到集群模式下只能使用一个库,虽然一般都是这样使用,但是需要了解一下。在操作和维护方面也应谨慎。俗话说“使用越简单,底层越复杂”。配置参数。结尾有趣的说说在写“Master-Slave”方案的时候,我发现了一个有趣的事情:我记得一开始主从的关键命令是SLAVEOF。后来查官方的时候发现命令改成REPLICAOF了。.官网的一些描述词有些地方还是Slave,有些地方用的是Replication。好奇的笔者查阅了相关资料,又看了一些Redis作者antirez关于这段时间的博客,发现是两年前的事了。事实上,“Slave”这个变量名给了一些人“喷”一波作者的机会,作者也做出了一些妥协。有兴趣的朋友可以自行搜索,技术以外不做评论,看得开心就好。作者的主要目的是:在阅读官方文档时,不要让不同的“词汇”把你搞糊涂了。END本文对Redis的这些扩展方案进行了概括性的描述。具体使用上,需要注意详细的配置,以及客户端支持的综合情况。近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.别在满屏的if/else中,试试策略模式,真的很好吃!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!