在3月26号由 百度开发者中心 、 百度地图开放平台 和 百度车联网 联合举办的第62期《基于地图开放技术的车联网实践》百度沙龙上,来自百度开放平台LBS云方向的技术负责人张鑫,分享了题为《基于LBS云的海量位置数据存储和检索实现》的演讲,介绍了 LBS云平台的整体架构,以及在整个发展过程中的优化历程。
张鑫是百度高级研发工程师,目前是百度开放平台LBS云方向的技术负责人,主要负责LBS云存储和云检索的架构优化和RGC(逆地理编码)的系统架构优化产品布局,主导了百度RGC效果性能优化项目,项目获得百度创新奖。重新设计优化了云存储基础检索集,摘要检索的架构。
百度地图开放平台主要是为地图开发者提供一系列的系统解决方案。目前这些解决方案主要是涵盖六个方面:定位、地图、数据、出行、轨迹和分析。每一个解决方案都有一系列的服务SDK和API,并打包成一个完整的产品来对外提供。开发者也可以根据自己的需求使用集中的服务或者SDK进行开发。在数据处理方面的服务主要还是POI检索,Place检索是对百度地图使用的POI检索服务做了一层封装。
LBS云主要是让开发者上传个性化数据,并支持对这些数据的存储及检索。GC是地理编码引擎,接收一个文本的地址串后解析成百度地址库中对应的地址。还有经纬度信息,RGC和GC恰恰相反,当RGC接收到一个XYZ经纬度坐标之后就会把这个经纬度坐标转换成一个语义上可以解读地址,也就是一个文本串,或者是一个结构化的地址。
目前LBS云所支撑的业务场景可以通过三个相对典型的案例来详述:
这里可以介绍一下百度LBS云系统比较突出的6个特点:
既然这个系统有如此多的特点,那么它的架构又是怎么样的,如何支撑这些特点?
(上图)左边部分是系统监控,LBS云系统里的每一个子模块、子服务都有精密严格的系统监控,这个监控包含了对机器资源本身的监控,CPU、磁盘都有监控。另外对QPS、耗时、SLA的监控都是非常完备的,一旦出现任何问题,系统都会灵敏及时的报警。(上图)右边主要包含三部分,一个是针对检索结果和云分析结果的云展示,做数据可视化的展示。另一个是数据管理平台,用户可以通过这个平台对上传的数据进行便捷的编辑、修改。(上图)中间区域是整个架构的核心——控制服务层,主要功能是负责并发控制、配额控制以及集群。通过对服务请求的控制,将存储请求分发到检索层,存储请求会通过存储检索层更新到存储集群当中。如果将这些数据发布到检索,是可以通过系统推送到检索端。而如果是从检索端进来的请求,首先会进行索引查询,查询完之后再去存储集群中查摘要,把索引跟摘要的信息做一个整合反馈给用户,这就是检索接入层。
AS是高级检索单元,主要负责把查询传给DA,做一些语义理解,把理解的结果发到基础的检索集群当中。基础检索集群主要负责真正的倒排检索,基础检索集群里的库分为两部分,一是全量库,全量库静态不可修改。另一个是增量库,实时发布的内容会更新到增量库。通过实时查检索全量库和增量库,并将结果反馈给AS。最后介绍的建库集群有两个功能:一是把增量信息推送到基础检索集群,其次是及时构建全量库,替换基础检索集群库。
LBS云系统架构在经过全面而细致的调研之后,对各个风险点进行了分析,随后做了如下的一些改进:
通过上图可以看出来,云存储系统可以保证用户数据互相隔离,A用户不能访问B用户的数据,云检索系统中基础检索单元原先的全量库设计是:将所有用户数据的索引混建在一起,取得倒排拉链后,再根据用户的唯一标识user_id做过滤,这种设计会使得某些用户的检索会被其他用户的数据增长影响而导致性能变差,最严重的是会导致很多用户数据会由于拉链过长截断的问题而一直没有机会返回,当用户量小数据量少的时候问题并不明显,而随着接入LBS云的用户越来越多,原先这种索引之间没有彻底隔离的设计对用户体验造成了极大的伤害。
针对这个问题重新设计了LBS全量库的倒排结构,设计目标:
具体方案:
对存储以及监护层性能优化主要分为三点,第一点是把检索监护层从PHP改成了C++,因为存储集群搭配的PHPdriver本身性能是非常差的。第二点是对driver进行升级。经过测试验证,连接池比短连接性能稳定非常多。第三点改进比较重要,引入cache集群来提升table层的性能。
关于提升table层的性能有两点需要说明,第一点性能方面我们如何保障的?
在存储控制优化方面也做了很多改善,V1.0版本只支持非批量操作,单套POI数据实时增删改。V2.0版本引入批量操作,支持用户对自己的表进行批量上传、删除,以及发布检索等批量任务。引入批量操作对系统造成了很大压力,因为部分用户会上传超过严格配额的数据。优化方法就是增加配额管理,减少数据过载现象。
任务调度系统也是优化的重点,此前,只要用户池里有任务就会被提取出来发到后端消息系统,更新到建户集群当中,这样的做法对后端建户集群造成很大压力,消息系统有很多消息堆积。解决方法就是根据后端建库系统性能对任务做一些调整,使得不会有过量任务冲击到后端建库集群,保证一些实时单条数据更新不受太大干扰。
控制服务层升级是非常有意义的事情,将之前控制的服务层内部RPC组建升级到最新最好用的组建,组建升级之后就使得检索的可用性提升了近一个9。