在应对海量数据的实时读写和复杂查询时,IT领域面临着严峻的挑战。在这个名为“海量数据的实时读写和查询实践”的PPT中,详细介绍了如何构建一个能够处理亿级数据并保证高可用性的系统架构。以下是该文档中涵盖的关键知识点:
1. **多租户SAAS系统场景**:
- 该系统服务于数万租户的商家结算,处理数十万用户的实时在线操作,每天产生亿级增量账单数据。
- 需求包括实时读写、复杂的SQL分页查询以及每月商家的数百万明细数据导出。
2. **系统挑战**:
- 存储亿级增量结算数据,同时保证数据的实时性、一致性和完整性。
- 应对数百个应用实例对数据库的压力,确保结算系统的高可用性(目标99.95%以上)。
- 实时处理来自消费端的复杂数据逻辑。
3. **云原生微服务架构**:
- 构建基于Spring Boot、Dubbo、Zookeeper的高可用、解耦系统。
- 利用Docker、Kubernetes(K8S)实现弹性扩容和易开发、易维护。
- 建立业务中台,通过OpenAPI提供服务给其他应用。
- 实现服务治理,包括熔断、限流、鉴权和监控预警。
4. **数据库架构**:
- 使用MySQL进行分表分库策略,基于sharding-jdbc定制中间件,采用三种分表规则:商家ID、结算单号、时间。
- 数据通过MQ同步到TiDB,作为只读库,不进行分表,以兼容现有程序。
- 使用TBSchedule实现分布式job,按分片规则并发处理消费数据。
- MySQL集群为主从模式,三个月清理一次数据,TiDB半年清理一次。
5. **数据异构与数据聚合**:
- 按商家ID、结算单号、日期进行数据异构,便于不同业务场景检索。
- 使用Canal进行MySQL数据同步的异构方案,存储方式可选ES、REDIS等。
- 数据聚合在客户端合并请求,服务端做数据聚合。
6. **TiDB使用与优化**:
- 选择TiDB来解决MySQL的单机性能和容量限制,因其兼容MySQL协议并提供强一致的分布式事务。
- 替换MySQL从库时,需要注意主键冲突问题,切换顺序应从非核心业务逐步过渡到核心业务。
- 避免使用大宽表,对低延时场景谨慎使用,大量删除数据可能导致GC问题。
7. **不足与展望**:
- MySQL在容量和性能方面有瓶颈,扩展性受限。
- 分库分表查询在架构层面需要提高灵活性和可扩展性。
- 计划扩大TiDB的使用,逐步迁移核心业务库。
- 整合MySQL、TiDB、Hive、Spark的使用场景,探索大型互联网系统的云原生微服务和云原生数据库的集成。
总结,该实践案列展示了在处理海量数据时,如何通过微服务架构、数据分片、异构存储和分布式数据库来提升系统的实时处理能力和可扩展性,同时也揭示了在实际应用中可能遇到的问题及其解决方案。