一分钟系列《啥,又要为表增加一列属性?》分享了两个数据库属性扩展的思路,被广为诟病。第二天加了一篇文章《这才是真正的表扩展方案》,分享互联网大数据高并发情况下数据库属性扩展的成熟工具和思路。对于version+ext的方案,还是有很多朋友质疑“网上用不了”。本文将详细介绍58同城最核心的数据“邮”的架构实现技术细节,说明它不是“不能这么用”,而是大数据、变量场景下的“常用方法”属性和高吞吐量。一、背景描述及业务介绍问:数据库扩容的version+ext方案是什么?使用ext承载不同业务需求的个性化属性,使用version标识ext中各个字段的含义。比如上面的user表:verion=0表示passwd/nickversion=1表示passwd/nick/age/sexinext。优点(1)属性可以随时动态扩展,扩展性好(2)新旧数据可以同时使用存在,兼容性不够(1)ext中的字段不能索引(2)ext中的key值有很多冗余,建议key短一些Q:58同城的核心数据是什么?58同城是一个资讯平台,有很多垂直类目:招聘、房产、二手货、二手车、黄页等,每个类目下还有很多子类目。无论是哪一类,核心数据都是“帖子信息”(商家就像一个大论坛?)。Q:帖子信息有什么特点?你去58.com的首页就可以知道:(1)每个品类的属性差别很大,目前恐怕有近万个属性(2)帖子数量非常多,100亿级别(3)每个属性都有查询需求(每个属性组合可能有组合查询需求),招聘需要查职位/经验/薪资范围,二手手机颜色/价格/型号,二手冰箱/洗衣机/空调(4)查询量非常大,10万条/秒级别。如何解决100亿数据量,10000个属性,多属性组合查询,10万并发查询的技术问题,就是今天要讨论的内容。2.最容易想到的解决方案。每个公司的发展都是一个从小到大的过程。抛开并发量和数据量不谈,我们先来看(1)如何实现属性扩展需求(2)多属性组合查询需求一开始招聘分类可能只有一个,post表可能是设计成这样:tiezi(tid,uid,c1,c2,c3)如何满足各种属性之间的组合查询需求?最容易想到的是通过组合索引:index_1(c1,c2)index_2(c2,c3)index_3(c1,c3)随着业务的发展,增加了一个房产类,增加了几个属性,组合了几个增加了查询,所以post表变成:tiezi(tid,uid,c1,c2,c3,c10,c11,c12,c13)其中c1,c2,c3为招聘类别属性,c10,c11,c12,c13为房地产类别属性,这两个Attribute一般没有组合查询需求,但是为了满足房地产类别的查询需求,必须建立几个组合索引(我无法想象有多少索引可以覆盖所有两个-属性查询和三属性查询)。是不是发现玩不下去了?三1.在友商游戏中添加属性是一种扩展方式,添加表格也是一种方式。有的朋友商家是这样玩的,按业务垂直拆分:tiezi_zhaopin(tid,uid,c1,c2,c3)tiezi_fangchan(tid,uid,c10,c11,c12,c13)这些表,这些服务在不同的部门维护而在不同的研发同学手中,似乎各个业务线都变通了,这恰恰是悲剧的开始:(1)tid如何标准化?(2)如何标准化属性?(3)如何根据uid查询(查询自己发表的所有帖子)?(4)如何按时间查询(最新发表的帖子)?(5)跨类目查询(比如首页的搜索框)怎么办?(6)技术范围的扩散,有的用mongo存储,有的用mysql存储,还有自己开发的存储(7)很多组件重复开发(8)维护成本太高(9)...想想它,不可能每个类别都列出一个电子商务产品列表。4、58同城的玩法【统一发布中心服务】平台型创业公司可能有多个品类,比如58同城的二手房产招聘,很多异构数据的存储需求。基础数据服务的统一无疑是58同城技术路线发展路线图上最正确的决策之一。如果我们坚持这个政策,@老洛@晓飞和这些有远见的先贤们功不可没,业务线会有“可扩展性”和“灵活性”的诟病,且看先贤们是如何通过一些巧妙的办法解决的稍后的技术解决方案。如何统一存储不同类别和异构数据,类似version+ext:tiezi(tid,uid,time,title,cate,subcate,xxid,ext)(1)提取一些公共字段单独存储(2)定义ext通过cate、subcate、xxid等的含义(有点像version?)(3)用ext存储不同业务线的个性化需求,比如招聘岗位:ext:{"job":"driver","salary":8000,"location":"bj"}二手帖:ext:{"type":"iphone","money":3500}58同城核心岗位数据,100亿数据卷,分为256个数据库,异构数据mysql存储,上层设置一个服务,使用memcache作为缓存。就是这样一个简单的架构,坚持了这么多年。上层的服务是58中的核心统一服务IMC(ImformationManagementCenter)。注意这里是核心,不是其中之一。解决了海量异构数据的存储问题,新遇到的问题是:(1)每条记录ext中的key需要重复存储,占用空间大,能否压缩存储(2)cateid不足以描述ext类别中的内容是有层次的,深度不确定。ext是否可以自描述(3)可以随时添加属性,保证可扩展性【统一分类属性服务】每个业务有多少个属性,这些属性是什么意思?邮寄服务不能包含价值约束,怎么办?58同城先贤抽象了一个统一的类别和属性服务来单独管理这些信息,并且帖子库ext字段中json的key统一由数字组成,减少存储空间。如上图所示,json中的key不再是“salary”“location”“money”这样的长字符串,而是换成了数字1,2,3,4,这些数字是什么意思,属于哪个子类to,值校验约束统一存储在类别和属性服务中。这张表解释了邮局服务中ext字段的数字键:1代表job,属于招聘类别下的100个子类别,取值必须是一个小于32的[a-z]字符。4代表type,属于二手类200个子类,其取值必须是short,所以原post表中的ext:{"1":"driver","2":8000,"3":"bj"}ext:{"4":"iphone","5":3500}key和value都是统一约束的。另外,如果ext中某个key的值不是常规校验值,而是枚举值,则需要一个限制该值的枚举表来校验:这个枚举校验表示key=4的属性(对应第二个-属性表中的手和手机类型字段),其取值不仅要通过“短类型”来验证,而且该值必须是一个固定的枚举值。ext:{"4":"iphone","5":3500}这个ext是非法的(key=4value=iphone是非法的),合法的应该是ext:{"4":"5","5":3500}另外,类目属性服务还可以记录类目之间的层级关系:(1)一级类目为招聘、房产、二手……(2)二手类目包括二手-handfurniture,Second-handmobilephones...(3)二手手机下分三级分类:二手iphone,二手小米,二手Samsung...(4)...协助解释58同城的核心帖子数据,描述类目层级关系,保证各类目的可扩展性。保证每个属性值校验的合理性是58同城的另一项统一的核心服务CMC(CategoryManagementCenter)。还有一点,类目和属性服务是不是很像电商系统中的SKU扩展服务?(1)品类层级,对应电商中的品类层级(2)属性扩展,对应电商中每个品类的SKUAttribute(3)枚举值校验,对应属性的枚举值,如ascolor:red,yellow,blue解决键压缩,键描述,键扩展,值校验,分类级别问题,等等一个问题没有解决:每个分类下的帖子属性不一样,查询需求是不同的。如何解决百亿数据量、万属性的查询需求,是58同城面临的新问题。【统一检索服务】当数据量很大时,不可能通过组合索引来满足对不同属性的所有查询需求。“统一检索服务”的技术路线:(1)数据库提供“postid”的前排查询需求。:(1)对posts进行tid正行查询,直接访问post服务(2)修改posts,post服务通知检索服务,同时修改索引(3)对posts进行复杂查询,并通过检索服务满足需求处理58同城80%终端请求的服务(无论是PC还是APP,无论是首页、城市页、分类页、列表页、详情页,很有可能是这个请求最终会是一个搜索请求)是58同城的另一项服务。统一的核心服务E-search,这个搜索引擎的每一行代码都来自58同程@老洛@老龚等大咖。目前的系统维护者是《架构师之路》中多次提到的@龙神。对于这个服务的架构,我简单说明一下:为了应对百亿级别的数据量,几十万级别的吞吐量,以及业务线中各种复杂复杂的检索查询,可扩展性是设计的重点:(1)统一的Java代理层集群,其无状态性可以保证系统性能可以通过增加机器进行扩展(2)统一合并层C服务集群,其无状态性也可以保证系统性能可以通过增加机器进行扩展(3)搜索内核检索C层服务集群、服务和索引数据部署在同一台机器上。服务启动时,可以将索引数据加载到内存中,请求访问时从内存中加载数据。访问速度非常快(3.1)为了满足数据容量的可扩展性,对索引数据进行水平切分,增加split数量,性能可以无限扩展(3.2)为了满足性能一条数据的可扩展性,同一条数据是冗余的,理论上增加更多的机器可以无限扩展性能系统延迟,百亿级post检索,包括request分离与组合,zipper交集,合并返回层可在10ms内实现。一致性不是58同城邮政业务的主要问题。易搜会定期重建索引,保证即使数据不一致也不会长期存在。五、总结文章写了很久,最后做一个简单的总结。面对100亿数据量、1万列属性、10万吞吐量的业务需求,58同城体验采用元数据服务、属性服务、搜索服务来解决。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文
