58同城大数据架构:100亿数据1万属性设计方案

需积分: 12 3 下载量 177 浏览量 更新于2024-09-01 收藏 563KB DOCX 举报
"100亿数据1万属性数据架构设计,主要探讨了在大数据背景下,如何应对海量数据和复杂查询需求的挑战。文章通过58同城的案例,详细介绍了version+ext方案以及面对100亿级别的数据和大量属性时的架构设计策略。" 在大数据场景下,如何有效地存储和查询具有大量可变属性的数据是一个关键问题。这篇文档聚焦于100亿条数据,每条数据包含1万属性的情况,提出了version+ext方案。这个方案的核心思想是在数据库中使用一个version字段和一个ext字段,version用于标识不同版本的属性结构,而ext字段则用来存储动态变化的个性化属性。这样做的好处在于能够灵活地添加新的属性,同时保持对旧数据的兼容性。然而,这种方法的局限性在于ext字段内的属性无法建立索引,且可能存在大量的冗余key。 58同城作为一个信息平台,其核心数据是“帖子信息”,这些帖子覆盖了各种垂直领域,每个领域又有各自的属性。由于属性的多样性、数据量的巨大以及频繁的查询需求,传统的数据库设计方法已经无法满足需求。面对这样的挑战,文档提出了一些可能的解决方案: 1. **属性扩展性需求**:一开始,可以采用单一表格设计,如tiezi表,包含tid、uid以及一些基础属性c1、c2、c3。为了支持组合查询,可以创建多个组合索引。但随着属性的增加,这种模式会变得复杂且难以维护。 2. **分库分表**:随着数据量的增长,可以采用分库分表策略来分散负载。根据不同的属性或者tid进行水平拆分,以降低单个表的数据量,提高查询效率。 3. **字段合并**:对于version+ext方案,可以将所有可变属性合并到ext字段,通过version字段来区分不同版本的属性结构。虽然无法对ext字段内的属性建立索引,但可以通过其他方式优化查询,比如建立针对基础属性的索引,或者使用搜索引擎等技术来辅助查询。 4. **组合查询优化**:针对多属性组合查询,可能需要构建更复杂的索引策略,例如使用覆盖索引或者自定义索引。同时,考虑使用缓存技术,如Redis或Memcached,来减少数据库的压力。 5. **数据分区和并行计算**:将数据划分为多个分区,并利用并行计算框架(如Hadoop或Spark)处理大规模数据查询,以提高处理速度。 6. **列式存储**:考虑使用列式存储数据库(如HBase或Google Bigtable),因为列式存储更适合大数据分析和复杂查询。 7. **数据预处理和聚合**:对常见查询模式进行数据预处理和聚合,生成汇总表,以加速查询。 8. **实时与批量处理结合**:结合实时流处理(如Apache Flink或Kafka Streams)和批量处理(如MapReduce),实现数据的实时更新和历史数据分析。 9. **数据冗余和一致性**:为了性能牺牲部分一致性,可能需要在某些情况下接受数据的短暂不一致,通过最终一致性保证数据的正确性。 在设计这样的大规模数据架构时,需要综合考虑数据量、查询性能、扩展性和成本等因素,选择最适合当前业务场景的技术方案。通过不断的迭代和优化,可以逐步构建出一个高效、稳定且具有高度扩展性的数据架构。