声明:本文来自腾讯增值产品部官方公众号小时光茶社,为CSDN原创投稿,未经许可,禁止任何形式的转载。
作者:唐聪,2014年毕业加入腾讯,SNG增值产品部后台开发工程师,一直从事QQ会员后台基础系统、复杂业务系统研发,主要关注分布式系统、存储引擎、容器等技术。
责编:钱曙光,关注架构和算法领域,寻求报道或者投稿请发邮件qianshg@csdn.net,另有「CSDN 高级架构师群」,内有诸多知名互联网公司的大牛架构师,欢迎架构师加微信qshuguang2008申请入群,备注姓名+公司+职位。

导语】如何支持业务接近接入,数万乃至几十万级排行榜自动化申请调度?选择什么样的存储引擎?怎样避免各业务资源抢占?

一、背景

排行榜满足了人的攀比、炫耀心理,几乎每个产品都会涉及。SNG增值产品部的QQ会员、QQ动漫、企鹅电竞、游戏赛事等大量业务都对排行榜有强烈需求,特别是企鹅电竞等业务的发展对我们排行榜系统提出了更多要求和挑战。在过去的一年中,排行榜系统从无到有,接入的业务从单一的QQ会员到企鹅电竞动漫等20几个各类业务,接入的排行榜数实现了从几个到数万的突破,单个排行榜用户数最大9000万, 排行榜存储集群活跃用户量数亿,而在这过程中,排行榜系统也遇到了以下挑战:

  • 如何支持业务就近接入、低延时?
  • 如何支撑数万乃至几十万级排行榜自动化申请调度?
  • 如何降低机器成本,选择合适的存储引擎?
  • 如何避免各业务资源抢占,相互影响?

接下来的各小节会详细讨论目前我们在实践中是如何解决这些挑战的。

二、排行榜系统基本架构

在讨论我们如何解决面对的挑战之前,先简单了解下排行榜系统基本架构、以及业务是如何接入、使用排行榜系统的。排行榜系统基本架构如图三所示,当前的排行榜系统架构不是设计出来的,而是根据我们业务场景、需求、发展等不断演化,不断优化而形成,其主要由以下几个服务组成:

  • 接入服务(无状态,提供访问修改排行榜数据的所有RPC接口给业务使用,如查询名次、topN等)
  • 存储服务(有状态,主备部署,排行榜数据存储)
  • APIServer服务(提供申请排行榜、业务接入、排行榜配置信息、存储机容量等接口)
  • 调度服务(从存储机中筛选满足业务申请条件的存储机,并择优分配)
  • Agent(上报并监控存储机容量信息、存储服务监控数据等)
  • ZooKeeper(排行榜路由数据存储、存储机容量数据存储等,为什么我们选择zookeeper将在第三部分说明)
  • Mysql(业务接入信息、各排行榜配置、用户量、存储服务核心参数监控等存储)

业务接入排行榜系统时,首先会为每个业务分配一个ID,其次需要申请排行榜ID,业务排行榜server通过l5调用排行榜系统的接入服务,接入服务每个接口都包含业务ID、排行榜ID,接入服务通过业务ID、排行榜ID查询zookeeper获取该业务排行榜ID的存储服务实例,最终通过存储服务API操作排行榜数据,返回结果给业务Server。

三、如何支持业务就近接入、低延时?

因部门产品业务较多,服务部署区域也各异,有的业务部署在深圳地区,有的业务部署在上海地区。深圳、上海内网机房ping延时约30ms,这么高的延时是部分业务无法容忍的,作为平台支撑方,我们也希望提供的各接口平均延时应在5ms内,所以要尽量避免跨城访问。如何避免跨城访问呢? 当然是各区域自治,早期因接入业务、排行榜数都较少,只有接入服务、存储服务机器是按地区部署的,排行榜路由数据存储只部署在深圳,排行榜路由也只会在没命中localcache的情况下才会跨城查询深圳的路由数据存储集群,当时延时也能满足业务需求,因此我们并未完全支持业务就近接入。但是后面随着各类业务快速接入、排行榜的快速增加,特别是当localcache失效时,上海地区服务质量、延时波动较大,频繁告警,于是我们不得不推进各区域全面自治方案。

业务场景决定着我们选择什么存储方案来解决跨城访问导致的高延时问题。

简单分析下我们的业务场景(业务核心链路请求):

  • 存储的是什么数据?数据量多大?路由、存储节点容量数据,预计几十万条,key、value长度较小(当然也可以采用表结构存储)
  • 读写比例?读为主,极少量写(每分钟几个,申请排行榜时才会添加路由配置)
  • CAP如何取舍?尽量保证各区域数据一致性,不丢失数据,高可用性(如其中一节点宕机不影响服务读),在出现网络分区时(如深圳、上海网络中断),集群少数成员一方(上海地区),能够降级提供只读模式。

常用的开源解决方案,以及各方案的优势、不足如下:

存储 原理 优势 不足
MySQL MySQL binlog 稳定性、友好的SQL接口、可根据业务场景需要配置复制模式 系统可用性不如etcd、ZooKeeper
etcd Raft 强一致性、高可用 较成熟,Kubernetes等大型项目应用广泛,但是目前还处在快速发展中,团队内暂未在生产环境应用
Zookeeper Zab 高可用、高性能读、团队已在生产环境应用多年、有配套的Web配置系统 部署维护、C API使用等相比etcd不够友好

结合以上各解决方案的优缺点,再根据我们的业务场景需求,我们选择了ZooKeeper作为核心的路由、存储节点容量数据存储,然后我们还面临着深圳、上海各部署一套还是只部署一套的选择。若深圳、上海各部署一套,我们的方案是深圳集群为主写,主写成功后,write opration log(create/set)可以写入MQ,MQ需支持at-least-once语义,由消费者异步写入上海集群,因为create/set/del都是幂等性接口,对于网络波动、中断等消费者写入上海集群失败的情况下,可以无限重试,确保两集群数据最终一致性。但是鉴于我们业务场景极低的写请求,以及当出现网络分区时,ZooKeeper上海地区集群可以开启read only mode,同时我们还有zk proxy cache、local cache等,我们最终选择了部署一套,在生产环境中我们部署了7台ZooKeeper节点(分布在深圳、上海4个IDC),通过ZooKeeper本身的Zab算法实现深圳、上海地区数据同步,各区域实现完全自治,整体部署方案见图四,部署之后业务调用延时见图五(低于2ms)。

四、如何支撑数万乃至百万级排行榜申请?

和区域自治的低延时部署方案类似,当前的调度系统也是排行榜的申请流程不断优化衍变而来,排行榜的申请可分为以下三个时期:

  • 石器时代: 系统刚上线时,几个排行榜,手动配置;
  • 青铜时代: 几十个排行榜,通过Web界面人工审批排行榜;
  • 铁器时代: 数万个排行榜,通过调度服务筛选、打分选择最优的存储机,自动化容量规划,无需人工干预。

如上所述,排行榜系统提供了两种申请排行榜方法,一种是在Web管理平台提交申请单,一种是通过API Server提供的API实时申请排行榜,前者试用于排行榜数申请不频繁的业务场景,后者适用于需要大量排行榜的业务场景。

那么我们又是如何设计实现调度服务的呢?通过分析我们的业务场景,业务在申请排行榜时一般需要填写部署地区(深圳、上海)、预计用户量、请求量、排行榜类型、是否容器部署、存储引擎类型等条件参数,因此排行榜调度服务的核心职责就是从有效的存储节点中筛选出满足业务申请条件的候选节点,并按某种策略对候选节点进行评分,选择最优分数节点分配。

基于以上业务场景,我们设计实现了调度服务,调度服务流程如图六所示,由两部分组成——筛选和打分。筛选模块会根据配置运行一系列模块,比如健康检查模块、标签匹配模块、容量检查匹配模块;健康检查模块会检查所有候选节点的存活性,存活性通过ZooKeeper的临时节点来判断,当一台机器挂掉时,临时节点会自动删除。标签匹配模块非常灵活,提供了强大的筛选能力,比如筛选部署地区、实体机部署或是容器部署、存储引擎类型等。容量匹配模块检查候选节点是否容量满、剩余容量是否能支撑当前排行榜等,那么一个若干G内存的容器能支撑多少排行榜呢?首先一个容器总容量能支撑多少用户量,我们可以根据线上数据,计算出一个经验值作为上限,其次,容量规划目前我们采用两种策略,一种是hard limit, 适合业务能较精准预测排行榜的用户量,若业务指定这种资源分配,就会实际预分配指定的用户量。另外一种是soft limit,业务无法预测排行榜用户量,调度服务会根据此业务历史排行榜用户量计算一个平均值,若平均值低于该业务配置的最低用户量阀值,就预分配阀值,默认我们采用这种策略。通过以上过滤模块筛选后的候选节点就会进入下一轮的评分模块,评分模块支持多种调度算法,如最小资源调度(选择内存资源剩余最多的节点)、多权重混合调度(根据用户申请参数,cpu、memory赋予不同的权重),排行榜最终被调度到节点将是评分最高的节点。调度数据存储保存在ZooKeeper,各个存储机都部署了agent,定时上报存储机容量信息到ZooKeeper集群。

五、如何降低机器成本,选择合适的存储引擎?

选择什么样的存储引擎来存储排行榜数据?我们分析下排行榜的基本操作,查询用户名次/分数、更新用户名次、查询前若干名、删除用户等,有些业务需要用到全部这些接口,有些业务只需要用到其中部分接口(比如更新用户分数、获取前若干名)。我们可选的存储引擎有内存型存储Redis,磁盘型存储LevelDB、RocksDB等,Redis提供了多种丰富的数据结构,其中的sorted sets(zset)能完全满足我们各接口需求,zset的核心数据结构是哈希表+跳跃表,其中哈希表保存各个用户的分数,跳跃表维护各个分数对应的排名,增加用户分数和查询用户排名的时间复杂度都是LOG(N),因此适合对性能要求较高的业务使用。而LevelDB、RocksDB只提供了key、value型接口,为什么也可以在部分业务场景(无需查询用户名次)也可以使用呢?图八是LevelDB架构,从图中可知,LevelDB是key都是有序存储的,SSDB就是通过将分数通过一定规则编码也作为一个key写入LevelDB以支持Redis zset数据结构,不过SSDB的查询排名时间复杂度是O(N),在生产环境中仅适合不查询用户排名的业务使用,但可以支持查询整个排行榜前N名(N一般小于等于200)。

因此降低成本第一个方法就是根据各业务特点、类型按需选择合适的存储引擎!不需要查询名次的业务可以使用SSDB(LevelDB)磁盘性存储引擎!

再看降低成本第二个方法,随着排行榜数越来越多,Redis排行榜存储机也逐渐增多,存储机器资源紧张,申请周期长,成本也较高,通过分析线上存量排行榜,发现部分业务具有明显的周期性,如各类业务的活动、赛事排行榜等上线推广时流量较大,活动结束时几乎无流量访问但是又不能清空整个排行榜,对于这类业务,排行榜系统提供了冷热分离机制,将冷数据从Redis内存中迁移到SSDB(LevelDB)的硬盘中,从而释放宝贵的内存资源,提高机器资源使用率,节省成本。

数据冷热分离方案如图九所示,通过agent采集现网所有排行榜流量,每日定时分析是否有排行榜满足迁移策略(如排行榜用户数大于1万,近两周流量小于某阀值等),若满足策略,就生成迁移任务,记录迁移的排行榜一系列元数据信息,写入MQ。迁移服务轮询MQ,若发现有迁移任务,就开始迁移工作,将全量排行榜数据备份到SSDB(LevelDB)存储节点,缩容或清空现网Redis排行榜数据,释放内存资源,图十是冷数据、热数据占比分析,冷数据占比高达17%。

六、如何避免各业务资源抢占,相互影响?

越来越多的业务接入同时,各业务排行榜之间资源争夺、相互影响成了一个不可忽视的问题,比如上海地区某业务排行榜申请了大量排行榜,触发上海地区存储机资源容量限制,所有业务申请上海地区的排行榜都失败。为了解决各业务之间相互影响,排行榜系统实现了业务资源配额、资源隔离方案。排行榜资源隔离容器方案如图十一所示,容器Daemon引擎使用了Docker,网络模式使用了host模式,没有性能损失,简单可控,数据卷使用主机映射,容器重启、宕机数据都不丢失,后续也将测试使用分布式文件系统Ceph。镜像存储驱动选择公司TLinux2操作系统自带的Aufs,Aufs不适合对容器内的文件进行频繁写操作,首次写需要copy up和多层branch检索开销,而我们的业务场景对容器镜像文件读写操作都极少,也将最大程度避免存储镜像潜在的内核BUG,各种镜像存储驱动优缺点对比见图十二。Registry使用公司内部的通用仓库,Docker Daemon使用内部gaia团队维护的Docker 1.9.1,使用内部维护版本的好处是经过了公司大量其它业务的应用,相比Docker最新版本而言比较稳定,同时对于我们遇到的一些BUG、需求功能,反馈给gaia团队之后,他们也会较快修复、合并新版本中我们需要的功能。比如我们之前遇到的两个Docker Daemon BUG,在内部版本中都较快解决或避免了。

  • https://github.com/docker/docker/pull/22932
  • https://github.com/docker/containerd/pull/265

图十二 存储镜像驱动优缺点(引用docker官方)

相比之前的混合部署,容器方案推出后,各业务接入时需要简单估算此业务未来排行榜总用户量,预计需要的资源量,调度服务通过一定的策略从容器存储节点中筛选一个最优的节点,动态创建一个若干G的容器分配给此业务使用,后续此业务下所有排行榜将调度到该容器,若容器资源不够,一方面可以在线提高容器资源大小,另一方面可以新增容器,一业务对应多容器。

最后总结下Docker container资源隔离方案的优缺点。

优点:

  1. 各业务资源隔离,通过Cgroup限制各业务使用的内存、CPU等资源,同时可以根据业务最终数据量、请求量在线动态调整资源大小;
  2. 简化部署,一个image镜像,任意一台存储机器,简单快速起多个Redis容器,充分利用多核机器的资源,各业务相互隔离;
  3. 提高机器资源利用率。之前实体机一主一备模式,备机负载很低,容器化部署后,各容器主备可混合部署在一台机器上,调度时只需保证主备容器不在同一台机器。

缺点:

  1. 所有容器进程共享同一个内核空间,若某容器触发内核BUG,将导致内核崩溃,影响机器上所有容器进程,因此在生产环境实践上应吸收业界的最佳实践经验,主备容器数据热同步,定时备份数据,加强监控、容灾能力。
  2. 低版本的Docker Daemon退出后将导致所有容器进程死亡,Docke1.12版本增加了–live-restore参数,若指定此参数,Docker Daemon关闭后容器进程将继续运行,https://github.com/docker/docker/pull/23213。

七、总结&未来计划

在解决以上问题的过程中,排行榜系统逐步实现了一套较高可用性、低延迟、低成本的排行榜解决方案(涵盖自动接入、调度、容灾、资源隔离、监控、扩缩容、数据冷热分离等),后续将加强系统自愈能力的建设,比如对于写流量不大的主备实例的全自动切换(对于写流量较大的实例因Redis是异步复制,master_repl_offset与slave offset存在几十万的差异),还有数据卷使用ceph-rbd, 即便出现主备容器都挂,通过系统监控探测到后,可以动态创建新容器、挂载ceph-rbd数据卷,重建Redis实例等,更重要的是要支持实现排行榜级别的在线迁移。


编辑推荐:架构技术实践系列文章(部分):

  • 唐聪:大规模排行榜系统实践及挑战
  • 左明:半小时深刻理解React
  • 王照辉:魅族自动化测试架构之路
  • 翁宁龙:美团数据库运维自动化系统构建之路
  • 何轼:美团外卖订单中心的演进
  • 申政:唯品会多线程Redis设计与实现
  • 阿刘:千万级用户的Android客户端是如何养成的
  • 卜赫:大道至简——React Native在直播应用中的实践
  • 陈爱珍:从运维的角度看微服务和容器
  • 孙其瑞:VR应用在直播领域上的实践与探索
  • 刘丁:bilibili高并发实时弹幕系统的实战之路
  • 秦鹏:从应用到平台,云服务架构的演进过程
  • 郭炜:从0到N建立高性价比的大数据平台
  • 李智慧:宅米网技术变迁——初创互联网公司的技术发展之路
  • 陶文质:分布式系统设计的求生之路
  • 魏晓军:React Native实践之携程Moles框架
  • 学霸君姜波:耳目一新的在线答疑服务背后的核心技术
  • 爱乐奇麦凯臻:在线教育的内容研发和技术的迭代创新
  • 长虹李玮:老牌消费电子企业如何拥抱Docker
  • 徐汉彬:日请求过亿的Web系统PHP7升级实践
  • 窦威:AcFun的视频架构演化实践
  • 傅鸿城:QQ亿级日活跃业务后台核心技术揭秘
  • 宁峰峰:尖峰日96万订单,59校园狂欢节技术架构剖析
  • 梁阳鹤:每秒处理10万订单乐视集团支付架构
  • 沈辉煌:亿级日PV的魅族云同步的核心协议与架构实践
  • 李任:携程Docker最佳实践
  • 王海军:游戏研发与运营环境Docker化
  • 史海峰:当当网高可用架构之道
  • 黄哲铿:应对电商大促峰值的九个方法
  • 1号店交易系统架构如何向「高并发高可用」演进
  • 京东闫国旗:从C10K到C10M高性能网络的探索与实践
  • 李林锋:服务化架构的演进与实践
  • 1号店架构师王富平:一号店用户画像系统实践
  • 唯品会官华:实现电商平台从业务到架构的治理体系
  • 沈剑:58同城数据库架构最佳实践
  • 荔枝FM架构师刘耀华:异地多活IDC机房架构
  • UPYUN的云CDN技术架构演进之路
  • 初页CTO丁乐:分布式以后还能敏捷吗?
  • 陈科:河狸家运维系统监控系统的实现方案
  • 途牛谭俊青:多数据中心状态同步&两地三中心的理论
  • 云运维的启示与架构设计
  • 魅族多机房部署方案
  • 艺龙十万级服务器监控系统开发的架构和心得
  • 京东商品详情页应对“双11”大流量的技术实践
  • 架构师于小波:魅族实时消息推送架构

2016年11月18日-20日,由CSDN重磅打造的年终技术盛会SDCC 2016中国软件开发者大会将在北京举行,大会秉承干货实料(案例)的内容原则,本次大会共设置了12大专题、近百位的演讲嘉宾,并邀请业内顶尖的CTO、架构师和技术专家,与参会嘉宾共同探讨电商架构、高可用架构、编程语言、架构师进阶、微信开发、前端、平台架构演进、基于Spark的大数据系统设计、自动化运维与容器实践、高吞吐数据库系统设计要领、移动视频直播技术等。10月14日仍是五折抢票,最低1400元,注册参会。

大规模排行榜系统实践及挑战相关推荐

  1. 基于 MySQL + Tablestore 分层存储架构的大规模订单系统实践-架构篇

    简介: 本文简要介绍了基于 MySQL 结合 Tablestore 的大规模订单系统方案.这种方案支持大数据存储.高性能数据检索.SQL搜索.实时与全量数据分析,且部署简单.运维成本低. 作者 | 弘 ...

  2. 蚂蚁金服大规模分布式事务实践及四种分布式事务模式

    蚂蚁金服大规模分布式事务实践及四种分布式事务模式 作者: 绍辉 | 2019-07-30 13:55   收藏: 1 本文整理自蚂蚁金服技术专家.分布式事务 Seata 发起者之一张森(花名:绍辉)在 ...

  3. 1号店架构师王富平:一号店用户画像系统实践

    转载:https://blog.csdn.net/qiansg123/article/details/80121794 我先引用梵高的一句话:"我想强调的是,同一个人有多样的自画像.与其追求 ...

  4. 一号店用户画像系统实践

    电子商务是互联网应用中发展期最早且模式最为成熟的商业模式,其用户和业务所带来的数据规模不断扩大,如何从大数据获取更大的价值?如何开发出真正贴合用户实际需求的推荐系统?1月9日,在七牛云主办的架构师实践 ...

  5. 【技术分享】京东电商广告和推荐的机器学习系统实践

    讲师简介 ▲包勇军 2014年4月加入京东数字营销业务部,参与组建并带领模型团队,自主研发出京东大规模机器学习平台,同时还负责京东电商广告深度学习算法应用和优化的工作. 正文 大家好,我是来自京东的包 ...

  6. Serverless 在大规模数据处理的实践

    作者 | 西流  阿里云技术专家 <关注阿里巴巴云原生公众号,后台回复 606 即可下载相关 PPT> 前言 当您第一次接触 Serverless 的时候,有一个不那么明显的新使用方式:与 ...

  7. 天龙八部服务器都需要那种系统,天龙八部排行榜系统怎么看 排行榜系统分类介绍...

    天龙八部排行榜系统怎么看?有这么一群人,不但战力高,等级高,在其他玩家眼中,他们就是膜拜的大神,他们便是游戏中排行榜上的大神玩家. 排行榜分类 等级: 排行榜打开后的第一个排名就是玩家角色的等级排名, ...

  8. 用POLARDB构建客到智能餐饮系统实践

    在新零售成为大趋势的今天,餐饮行业也加入到这一浪潮之中.智能餐饮系统将帮助餐饮行业从多个维度提升自己的运营能力和收益,而打造智能餐饮系统SaaS化能力也成为了目前的一个热点.本文中果仁软件联合创始人& ...

  9. ICLR 2022 | 颠覆传统!大规模图像检索系统首次引入「热刷新」模型升级!腾讯清华大学新作...

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 作者:腾讯ARC Lab & 腾讯OVB-AI技术中心 颠覆传统「冷刷新」模型升级范式,腾讯 ARC ...

最新文章

  1. 阿里云 - 更换系统盘(附带文件迁移)过程中遇到的一些错误
  2. tomcat 设定自定义图片路径
  3. 在django中按照时间范围查询数据库
  4. VirtualBox uuid冲突问题
  5. NHibernate配置入门
  6. myeclipse自带客户端连接mysql数据库
  7. 广州新一代域名注册量动态:11月下旬净增3425个
  8. 景观生态学概述[转载]
  9. 用C语言实现俄罗斯方块游戏
  10. 水系图一般在哪里找得到_腾远带你了解:虹吸排水系统原理、组成及应用优势...
  11. bat 注释,echo off 和 rem 和 :
  12. linux+极点五笔输入法,CentOS系统安装极点五笔输入法
  13. 安装vue-cli创建项目的时候 gyp ERR! build error的npm包遇到以下错误
  14. 流利阅读 2019.1.21 Top S. Korean animal rights group slammed for destroying dogs
  15. 海尔简爱s11怎么进入bios_海尔简爱s11系统应用商店没有登录界面怎么办?
  16. 软件工程导论第六版 第一章 软件工程学概述知识点总结(下)
  17. 独家 | 爱奇艺如何用大数据助力娱乐工业革命?
  18. Oracle 锁相关查询脚本
  19. 腾讯视频显示已开启服务器,怎么看自己是否开通了腾讯视频会员?查看腾讯视频会员状态方法介绍...
  20. solr分组查询、统计功能详解

热门文章

  1. maven(3) parent用dependencyManagement控制版本没有传递给module的问题,dependencies.dependency.versionknown-version
  2. 带血的庞氏P2P消亡史:是傻子太多还是骗子不够用?
  3. COM原理与实现之一
  4. 17-分析Ajax请求--爬取易烊千玺微博【以及简单的数据分析】
  5. 31. Python中的多态(Polymorphism)
  6. [JSOI2019]节日庆典(Z-algorithm)
  7. JavaScript中的Object常用方法
  8. UG数控编程中刀过切的原因分析和解决对策
  9. 如何利用Python将PDF转化为图片?
  10. “互联网+”创新创业大赛如何混到省一