前言在写开源项目的时候,想到了支持多种redis部署方式,于是对这个生产环境的架构选型进行了研究。1.引擎版本建议使用更新的引擎版本以支持更多功能。Redis6.0的新特性表明模块系统增加了多个API。支持SSL/TLS加密。支持新的Redis协议:RESP3。服务器支持多模式客户端缓存。支持多线程IO。副本中支持无盘复制。Redis-benchmark添加了Redis集群模式。支持重写Systemd。支持磁盘模块。Redis5.0新特性说明云数据库Redis5.0版本对内核进行了大幅优化,运行更加稳定,同时新增了Stream、账户管理、审计日志等特性,满足您更多场景的需求.新的数据类型:流数据(Stream)。有关详细信息,请参阅Redis流。新增账号管理功能。新增日志管理功能,支持审计日志、运行日志、慢日志。可以通过日志管理查询读写操作、敏感操作(如KEYS、FLUSHALL)、管理命令的使用记录、慢日志等。添加了基于快照的缓存分析。新的定时器(Timers)、集群(Cluster)和字典(Dictionary)模块API。将LFU和LRU信息添加到RDB中。集群管理器从Ruby(redis-trib.rb)移植到redis-cli中的C代码。添加了有序集命令ZPOPMIN、ZPOPMAX、BZPOPMIN和BZPOPMAX。将主动碎片整理升级到v2版本。增强了HyperLogLog的实现。优化内存统计报告。将HELP子命令添加到许多具有子命令的命令中。改进了客户端频繁连接和断开连接时的性能。将Jemalloc升级到5.1版。添加了命令CLIENTID和CLIENTUNBLOCK。添加了为艺术而生的LOLWUT命令。从术语已弃用(需要API向后兼容性的情况除外)。对网络层进行了多项优化。做了一些Lua相关的改进。添加了动态赫兹(DynamicHZ)以平衡空闲CPU使用率和响应能力。Redis核心代码在多方面进行了重构和改进。2、架构需要根据业务需求选择:集群架构可以轻松突破Redis本身的单线程瓶颈,满足大容量、高性能的业务需求。主从架构提供高性能缓存服务和高数据可靠性。读写分离架构提供高可用、高性能、高弹性的读写分离服务,解决热点数据集中、高并发读取的业务需求,最大化用户运维成本。1.Master-slave架构-双副本以master-replica模式构建。主节点提供日常服务接入,备节点提供HA高可用。当主节点出现故障时,系统会在30秒内自动切换到备份节点,保证业务的顺畅运行。1)ReliableserviceReliable采用双机主从(master-replica)架构,主从节点位于不同的物理机上。主节点对外提供访问,用户可以通过Redis命令行和通用客户端进行数据的增删改查。当主节点出现故障时,HA系统会自动进行主从切换,保证业务的平稳运行。数据可靠性默认开启数据持久化功能,所有数据都放在磁盘上。支持数据备份功能,用户可以根据备份集回滚实例或克隆实例,有效解决数据误操作等问题。2)使用场景Redis作为持久化数据存储的业务标准版,提供持久化机制和备份恢复机制,极大的保证了数据的可靠性。对单台Redis性能压力可控的业务由于Redis原生采用单线程机制,所以建议10万QPS以下的业务使用。如果您需要更高的性能要求,请选择集群版本。Redis命令比较简单,对于排序和计算命令较少的业务,由于Redis的单线程机制,CPU会成为主要瓶颈。对于排序计算类较多的业务,推荐使用集群版本配置。2、主从架构——单副本在没有数据可靠性要求的纯缓存场景下可以发挥性能优势。1)场景①单副本版本纯缓存业务场景只有一个数据库节点。当节点出现故障时,系统会重启一个Redis进程(没有数据)。重新预热,避免访问压力对后端数据库的影响。单副本架构无法提供数据可靠性。如果某个节点出现故障,则需要重新预热业务。因此,对于对数据可靠性要求高的敏感业务,推荐使用双副本架构。②单个Redis的性能压力可控。由于Redis原生采用单线程机制,CPU具备单核能力,性能推荐8万QPS的业务使用。如果您需要更高的性能要求,请选择集群版本配置。③Redis命令比较简单,排序和计算命令很少。由于Redis的单线程机制,CPU是主要的瓶颈。对于排序计算类较多的业务,推荐使用集群版本配置。3、集群版——双副本,轻松突破Redis自身的单线程瓶颈,满足大容量、高性能的业务需求。双副本集群版实例采用集群架构,各分片服务器采用主从双副本模式。集群版支持代理和直连两种连接方式。您可以根据本章的描述选择适合您业务需求的连接方式。1)代理模式集群架构的本地磁盘实例默认采用代理(proxy)模式,支持通过统一的连接地址(域名)访问Redis集群。客户端的请求通过代理服务器转发给各个数据分片。芯片和配置服务器均不提供单独的连接地址,降低了应用开发难度和代码复杂度。下面介绍代理模式的服务架构图和组件。2)在直连模式下,所有的请求都通过代理服务器转发。代理模式降低了业务开发的难度,同时也略微影响了Redis服务的响应速度。如果业务对响应速度要求非常高,可以采用直连模式,绕过代理服务器,直接连接后端数据分片,从而减少网络开销和服务响应时间。直连方式的服务结构和描述如下。前提:使用Jedis、PhpRedis等支持RedisCluster的客户端。如果您使用不支持RedisCluster的客户端,您可能无法获取所需的数据,因为客户端无法将请求重定向到正确的分片。Jedis对RedisCluster的支持是基于JedisCluster类。详情请参考Jedis文档。您可以在Redis官网的客户端列表中找到更多支持RedisCluster的客户端。使用自定义连接池的示例代码`importredis.clients.jedis.*;importjava.util.HashSet;导入java.util.Set;publicclassmain{privatestaticfinalintDEFAULT_TIMEOUT=2000;privatestaticfinalintDEFAULT_REDIRECTIONS=5;privatestaticfinalJedisPoolConfigDEFAULT_CONFIG=newJedisPoolConfig();publicstaticvoidmain(Stringargs[]){JedisPoolConfigconfig=newJedisPoolConfig();//最大空闲连接数根据业务需要设置,不能超过实例规格最大连接数config.setMaxIdle(200);//最大连接数,根据业务需要设置,不能超过实例规范中规定的最大连接数config.setMaxTotal(300);config.setTestOnBorrow(false);配置.setTestOnReturn(假);//开启直连访问时申请的直连地址Stringhost="r-bp1xxxxxxxxxxxx.redis.rds.aliyuncs.com";内部端口=6379;//实例密码Stringpassword="xxxxx";设置<主机和端口>jedisClusterNode=newHashSet<主机和端口>();jedisClusterNode.add(newHostAndPort(host,port));JedisClusterjc=newJedisCluster(jedisClusterNode,DEFAULT_TIMEOUT,DEFAULT_TIMEOUT,DEFAULT_RE方向,密码,“clientName”,配置);}}`4。集群版-单副本5、读写分离版,为读多写少的业务场景提供高可用、高性能、灵活的读写分离服务。满足热点数据集中、高并发读取的业务需求,最大限度节省运维成本。读写分离版本主要由主备节点、只读节点、代理(proxy)节点、高可用系统组成。1)特点①高可用自研高可用系统,自动监控所有数据节点的健康状态,保证整个实例的可用性。当主节点不可用时,自动选择一个新的主节点并重建复制拓扑。当只读节点异常时,高可用系统可以自动检测并重启新节点完成数据同步,异常节点将下线。代理节点实时感知每个只读实例的服务状态。当只读实例异常时,Proxy会自动降低该节点的服务权重。发现只读节点故障一定次数后,会停止异常节点的服务权限,并有能力继续监控并重启节点服务。②高性能读写分离版本采用链式复制架构,通过扩展只读实例数量,线性提升整体实例性能。同时,基于对Redis复制过程在源代码层面的定制和优化,可以最大化线性复制系统的稳定性,充分利用每个只读节点的物理资源。2)使用场景读请求QPS(QueriesPerSecond)压力比较大。Redis标准版无法支持大QPS。如果业务类型是读多写少的类型,需要部署多个只读节点来突破Redis单线程性能瓶颈。Redis集群版提供1、3、5个只读节点配置,相比标准版可提升近5倍QPS。对Redis协议兼容性要求高的业务的读写分离版本,完全兼容Redis协议命令。可将自建Redis数据库迁移至读写分离版本,支持从Redis标准版(双副本)一键平滑升级至读写分离版。3)建议和注意事项当只读节点发生故障时,请求将转发给其他节点;如果所有只读节点都不可用,所有请求将被转发到主节点。只读节点异常可能导致主节点负载增加,响应时间变长。因此,在读取负载较高的业务场景中,建议使用多个只读节点。有些场景会触发只读节点的全量同步,比如主节点触发高可用切换后。全量同步时,只读节点不提供服务,返回消息-LOADINGRedisisloadingthedatasetinmemory\r\n。
