在阿里云云栖社区举办的在线培训中,来自阿里云数据库技术组的白宸为听众带来了题为《Redis实践及在直播行业的应用》的分享,本次直播包括Redis介绍、直播行业介绍、Redis应用场景、云数据库Redis设计、云数据库Redis实践五部分。分享中他重点介绍了Redis在直播行业的应用场景,并对云数据Redis设计的原理给出了精确的解释。
以下为直播整理内容。
云数据库Redis是一种稳定可靠、性能卓越、可弹性伸缩的数据库服务;它基于飞天分布式系统和全SSD盘高性能存储,支持主备版和集群版两套高可用架构;并提供了全套的容灾切换、故障迁移、在线扩容、性能优化的数据库解决方案。
Redis介绍
Redis的全称是Remote Dictionary Server,它是由Salvatore Sanfilippo写的Key-Value存储系统。但它提供了比Key-Value更为丰富的数据结构,包括Lists、Sets、Ordered Sets以及Hashes,当然还有和Memcached一样的Strings结构;Redis当然还包括了对这些数据结构的丰富操作。Redis的优点可以总结为以下几点:
- 性能极高,Redis能支持超过 100K+ 每秒的读写频率;
- 丰富的数据类型,Redis支持二进制案例的 Strings、Lists、Hashes、Sets 及 Ordered Sets 数据类型操作;
- 原子性,Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行;
- 丰富的特性, Redis还支持 Publish/Subscribe、通知、Key过期等等特性。
这些丰富的特性,使得Redis在DB-Engines 排名稳居第十,其中在Key-Value数据库中排名第一。
关于直播
2015年到2016年,视频直播行业异军凸起,国内涌现了一批视频直播公司,如映客、一直播、熊猫TV、花椒等。直播行业的火爆与云计算和移动互联网的关系密不可分,云计算突破了视频直播技术的门槛;移动互联网使得直播随时随地成为可能。
上图是直播系统的完整框架图。用户终端,如智能手机、PAD、电脑等,通过网路接入负载均衡,进而进入后端的服务器系统;在后端服务器上,有不同的应用模块,如用户管理、关注信息、聊天交互、视频编码、金币系统、推送系统、排名系统、录像管理,这些业务系统都是搭建在底层云计算上,用户可以使用云Redis、MySQL、CDN、离线计算等资源构建直播系统。
Redis应用介绍
下面来具体介绍Redis具体应用场景。
场景一:用户信息管理
在直播系统中,用户有很多信息需要管理,如登录信息、注册信息等。传统的方式是采用关系型数据库存储用户信息,定义一张用户表,用户的属性对应表的列,这种方式的可扩展性很差,当用户增加新属性时,需要修改数据库中的用户表、数据订正等操作;采用Redis数据库进行用户信息管理时,通过采用Hashes数据结构,如上表所示,在user9527的个人信息中选择user9527作为Key,同时每一行的用户信息是Hashes内的Field,用户新增加信息时,通过Hset命令向Hashes内新加一个Field,如hset user9527 name xiaoqiang;最后可以通过hgetall user9527获取用户信息。
应用场景二:关注列表
在直播系统中有很多关注链,如明星、游戏玩家等等。用户可以使用sets实现这类关注链,查看不同主播的关注信息。
如上图所示的Jack关注列表,通过调用sadd方法给jack_follow增加响应的value值,用户Jack多关注一个人,则多增加一个记录;同时也可以通过sadd my_follow增加我关注的列表;最后,通过sinter jack_follow my_follow得出两个关注表中的交集部分。
场景三:积分排行
在直播系统中,需要实时更新积分排行榜,每个用户都有自己的积分和姓名信息。通过定义rank这个Key对应每个用户的积分,通过调用zadd增加对应用户的积分值,如 zadd rank 1000 Super;最后通过zrangebyscore zrank -inf +inf 遍历用户的key,得到指定范围内用户的积分,从而得到积分排行榜。
场景四:最新评论
在直播系统中,评论也是很关键的一部分,在Redis中可以通过Lists实现最新评论。如上图所示在Redis中定义latest.comment,当用户有评论时,调用Ipush增加用户的评论,如Ipush latest.comment “今天天气很好”;用户也可以调用 Irange latest.comment 0 2 获得最新评论。
除上述场景外,Redis还可以用在于:
- PHP session信息
- 数据库缓存加速
- 点赞数、评论数目,通过Incr/decr进行数目增加或减少
- 消息广播,通过Subscribe/publish订阅模式实现
- 附件的人,redis 3.2中新增了附近的人功能
云数据库Redis设计
Redis设计时单线程结构,进而导致了整个Redis存在性能瓶颈;另外,在单节点的场景下,机器宕机时,可用性面临着很大的问题;同时,由于Redis是全内存数据库,因此Redis内存受限于单机内存;当内存过大时,也会影响其使用情况,其可扩展性也面临着挑战。
为了解决上述问题,阿里云重新设计了云数据库Redis解决方案,供用户使用。目前阿里云提供了单机版和集群版两种版本的云数据库Redis产品。
上图是云数据库单机架构,用户在ECS上通过SLB来访问后端的Master-Slave结构的Redis,外面的HA模块会探测Master的节点,如果Master的TCP链接无效或请求没有响应或者其他异常时,HA将调用SLB接口,将流量调至备用节点上。
原生Redis中,单节点结构不可靠;同时单线程使得慢请求阻塞,导致误判。为了解决这个问题,在Redis中新增了端口,该新端口和线程一起用于探测,对Redis实际可用性进行检查,如检查内存、CPU、进程存活情况,避免由于慢请求阻塞导致误切换的情况发生。
上图是云数据库集群架构,ECS通过负载均衡访问后端的PROXY;PROXY根据路由表访问后端的Master-Slave结构;Config Server用于维护路由表的关系,在扩容时,用于维护两个路由表的变化;数据迁移通过Config Server促发Redis Server,PROXY链路根据路由表和后端Redis Server反馈情况,来访问迁移中的数据。整个集群同单机版类似,采用双备份架构,同时整个链路部署了全链路监控;此外还支持动态扩容和自动容灾。
用户并不希望在链路升级时出现闪断情况,因此云数据热升级机制就显得尤为重要。目前云数据库支持Proxy热升级和Redis热升级。
对于Proxy热升级,通过unix domain socket把所有TCP连接迁移到New proxy进程,迁移过程中,用户是无感知的,也不会发生闪断现象;所有的Client TCP链接都迁移到New Proxy进程上,再把Old Proxy进程关闭,完成升级。
对于后端的Redis热升级,将Redis进行拆分二进制文件和动态库SO,在升级过程中调用SO中的函数,将老版本内的SO信息复制到新版本SO中,最后释放旧版本中的数据。整个升级过程用户是无感知的,升级时间短,一次升级花费4毫秒。
接下来看下Redis中内核存储优化,原生Redis中有两种持久化方式:RDB和AOF。其中RDB是时间点的备份,用户可以通过两种方式出发RDB的备份;AOF的方式类似MySQL的Binlog,可以通过对AOF文件进行追加。从上图可以看出,这两种持久化方式存在Fork耗时、AOF阻塞请求、大IO影响稳定性的痛点。
对于访问量比较高,延迟要求低的数据库来说,这些问题必须加以解决。通过对Redis内核存储进行了优化,采取RDB加AOF的方式,其中AOF按照大小回滚,废弃AOF Rewrite过程;同时将AOF写入放到后台生成进行写入,在可运维时间内进行全量的写操作。
目前云数据Redis支持全量备份和基于时间点恢复备份,后者尚未在公有云上线。全量备份目前是按天级别的备份,整个备份过程由Backup Server进行管理。Backup Server通过访问元数据库获取信息,通过communicator下发任务给每个DB节点上的Backup Agent;Backup Agent接到任务后,通知Redis Server进行全量备份,将备份文件流式化上传到OSS上。在备份恢复时,Backup Agent从OSS上拉取备份文件,下载到本地;DBNode通过加载文件恢复之前备份的数据。整个备份恢复系统增加系统的可靠性,用户可以在数据丢失的情况下,通过数据恢复找到之前的数据。
云数据Redis运维监控体系主要包括:主机监控、网络监控、实例监控、可用性监控和巡检系统。
上图是主机监控效果图,从图上可以主要记录了CPU TOP进程、每个进程的CPU消耗、用户态的CPU和系统态的CPU以及磁盘I/O、读写等信息。
网络监控主要是通过在协议栈上抓取信息,统计实例级别的流量和链接信息、网络质量,查看是否存在丢包、乱序重传、异常关闭等信息。实例监控主要监控实例的访问量、流量、消耗的CPU、内存、磁盘IO、命令情况、慢请求等。
云数据库Redis实践
用户在选择云数据库Redis时,需要注意以下几点:
- 可用区选择,跨机房延迟比同机房高,因此需要尽量选择同机房;
- 网络类型,目前阿里云提供两种网络类型:经典网络和专有网络,企业应根据对应的业务类型选择合适的网络类型。
- 容量评估,容量受限于内存大小,企业根据业务需求选择对应的内存。
- 计算评估,目前单机版最大是10wqps,集群版本是60-100wqps,企业需要较大的计算能力时,应选择集群版本。
云数据库Redis不同规格的存储容量、最大连接数、吞吐量都有限制,具体参数如上图所示。
在使用Redis过程中,总结了一些最佳实践:
- 使用长连接,避免短连接风暴,因为短连接需要建立链接、鉴权等步骤,性能远不如长连接;
- 使用时避免使用keys*命令,如需获取所有的Key,可以通过Scan代替,这是由于keys *容易阻塞所有的命令,导致CPU占满,出现超时现象;
- 在使用时,如果发现后端Redis Server运行缓慢,可以通过Slowlog命令分析Redis运行情况;
- 用户也可以通过设置过期时间,让缓存占用的内存尽快释放;
- 对于持久化的存储,使用时应尽量避免内存大量淘汰;
- 在使用Redis还使用云监控提前发现性能及容量瓶颈;
此外,用户还可以通过控制台进行历史监控,设置合理的备份时间以及使用DMS查看实时信息。
关于分享者:
白宸,14年加入阿里巴巴,早期在淘宝核心系统负责分布式缓存开发工作;后并入阿里云数据库技术组,专注于云数据Redis设计研发工作。
相关云产品:
云数据库 Redis 版本:https://www.aliyun.com/product/kvstore