更新时间:2024-11-29 GMT+08:00

Redis开源增强特性

完善的集群管理功能

系统提供完善的Redis集群管理功能,通过Manager,用户可以将Redis实例组建为Redis集群,提升系统处理能力,同时满足高可靠性要求。

  • 向导式创建Redis集群系统
    图1 创建Redis集群

    MRS支持一主一从模式的Redis集群,系统自动计算节点上可安装的Redis实例个数并分配主从关系。

  • 集群扩容、减容

    当集群需要提供大规模的处理能力时,可以一键式扩容一对或多对主从实例。在此过程中,系统会自动完成数据迁移和数据平衡,用户无需关注。

  • Balance

    出现扩容异常、部分实例掉线等异常场景时,Redis集群中的数据可能会分布不均匀,此时可以通过管理界面上提供的Balance功能,让系统自动对集群数据进行平衡,保证集群的健康运行。

  • 性能监控与告警

    系统提供Redis集群的性能监控功能,可以通过直观的曲线图方式,了解当前Redis集群、实例的TPS吞吐量情况。

    系统为Redis集群提供了多种告警,例如集群下线告警、持久化失败告警、槽位分布不均告警、主备倒换事件、集群高可靠性受损告警等,甚至主从实例内存大小不一致都可以自动上报告警。丰富的告警帮助用户更加轻松的进行Redis集群的监控和管理。

集群可靠性保证

Redis社区提供ruby脚本的集群管理工具redis-trib.rb,创建集群时主从分配只能按照固定顺序排列,且无法保证集群的高可靠性。如果主实例和从实例在同一台机器上,则这种主从备份的意义不大,或者集群内一个主机发生故障将导致整个集群不可用。

MRS在创建Redis集群的时候,能够根据用户选择的实例范围,自动进行计算,按照主机级高可靠原则来部署集群,同时在进行扩容和减容的操作时,仍然会保证该原则。这样可以保证集群内任意一台主机发生故障,集群都能够通过主从实例倒换来保证集群继续工作。

同时如果发生了部分节点、实例故障,整个集群无法继续保证高可靠性时,系统会自动发送相关告警,提示用户进行修复。

数据导入导出工具

Redis集群构建了16384个槽位,通过计算不同key的crc16码值来决定key存放在哪个槽位,用来做键值的哈希,来保证不同的主实例负载均衡。这样不同的槽位存放着不同的值,如果两个集群的拓扑结构不相同,则其不同实例上存放着的键是不同的,此时如果需要进行数据迁移或者备份恢复是非常困难的。

MRS提供了一个专用的数据导入导出工具,可以方便的导出Redis集群中的数据,并支持在原集群、新集群、异构集群(节点个数不同的集群)进行数据恢复。

完善的安全特性

社区redis仅提供简单的密码认证机制,其密码以明文的方式保存在配置文件当中,在企业级应用当中,这种安全机制是不够的。MRS提供了完善的安全特性,增加了认证、鉴权、审计机制。

只有认证过的客户端才能向服务端发送或请求数据,而服务端之间(集群内部)也有认证机制,防止伪造的实例发送未认证的请求。同时鉴权管理机制则将Redis的命令分为三类:读取型、写入型、管理型,不同的用户赋予不同的权限,避免越权的操作。

审计机制则对Redis的一些高危操作记录了详细的审计日志,比如更改集群拓扑结构、清除Redis中的数据等。

性能优化

Redis已经是一个高性能的分布式缓存数据库,但原始的Redis实例部署在普通OS上,会发现存在这样一个问题:当客户端并发量提高时,尽管服务端CPU等资源并不存在瓶颈,但TPS吞吐量却无法继续提高。当组建Redis集群的时候,集群的性能也无法随着集群规模的扩大而线性提升。 MRS在OS层面进行了多重优化,包括CPU核绑定、网卡中断队列绑定、OS系统参数优化等,从而保证了Redis的性能,特别是Redis集群性能的线性增长。

图2 单实例优化前后测试
图3 集群场景优化后性能线性扩展测试

增强的淘汰算法

Redis是一个缓存系统,在其内存达到配置的最大值之后,将会触发数据的淘汰。原生Redis具备LRU、Random、TTL三种淘汰策略,但是在实际业务使用中并不能很好的达到“淘汰冷数据、留下热数据”的目的。

MRS中的Redis组件对淘汰算法做了增强,引入了Smart淘汰策略,该淘汰策略基于对key的热度统计进行淘汰,确保每次尽量只淘汰最冷的数据。在模拟的业务测试中,Smart淘汰策略的热数据命中率可以始终保持在99%以上,热数据淘汰率最高则也只有3%左右(原生LRU策略的这两个测试数据则分别是85%和35%)。由于热数据命中率的提高,从而也使得业务请求的TPS得到提高。

集群管道

redis-server支持客户端发过来的管道命令,即一次接收多个命令进行处理,这样能减少网络传输时间,极大提高redis-server的每秒请求处理数量。但是Jedis社区仅提供单实例的管道模式。客户端通过对Jedis进行封装,使得这种模式也能应用在集群上,并且使用方式与单实例的管道模式保持一致。