数据库扩展实战:如何用ShardingCore实现高性能分库分表
数据库扩展实战如何用ShardingCore实现高性能分库分表【免费下载链接】sharding-corehigh performance lightweight solution for efcore sharding table and sharding database support read-write-separation .一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案具有零依赖、零学习成本、零业务代码入侵项目地址: https://gitcode.com/gh_mirrors/sha/sharding-core当业务数据量突破百万级传统单库单表架构就像一个过度拥挤的仓库每次查询都要翻遍所有货架。ShardingCore作为一款轻量级分库分表方案能帮助开发者在不重构现有代码的情况下实现数据库水平扩展。本文将通过场景化实践带你掌握分库分表的核心技术和最佳实践。1. 数据爆炸时代你的数据库需要整理收纳吗想象一个电商平台的订单系统从日均1000单增长到10万单数据库性能会经历怎样的变化查询延迟从毫秒级飙升到秒级索引维护成本指数级增长备份恢复时间变得难以接受。这就是典型的数据膨胀综合征而分库分表正是解决这一问题的有效手段。分库分表数据的文件夹分类法如果把数据库比作一个大仓库分库就像是将仓库分成多个区域如电子产品区、服装区分表则是在每个区域内按货架编号如A01货架、A02货架进一步分类。ShardingCore通过虚拟路由技术让应用程序像操作单个数据库一样操作这些分区仓库实现数据的自动分发和聚合查询。分库分表架构示意图左侧展示分库结构右侧展示分表结果实操小贴士并非所有业务都需要分库分表。当单表数据量超过500万行或查询延迟超过200ms时才建议考虑分表分库通常在单库连接数接近数据库最大连接限制时引入。2. ShardingCore的3大核心价值为什么选择它在众多分库分表方案中ShardingCore凭借独特的设计理念脱颖而出主要体现在三个方面零侵入架构无需重构现有代码ShardingCore采用抽象DbContext设计现有EF Core项目只需继承AbstractShardingDbContext无需修改实体类和业务逻辑。这种即插即用的设计极大降低了集成成本。性能损耗极低单次查询仅0.005ms额外开销通过表达式树缓存和路由预计算技术ShardingCore将分表路由解析时间控制在微秒级。实测数据显示在773万数据量下分表查询性能可达原生EF Core的97%。功能全面满足企业级需求支持分库分表、读写分离、自动建表、动态数据源等企业级特性同时提供完善的事务支持和监控能力。分库分表前后性能对比场景单库单表ShardingCore分表性能提升有索引查询4.91ms5.38ms-9.6%无索引查询11.58ms14.52ms-25.4%数据统计3.00ms3.07ms-2.3%列表查询26.06ms51.14ms-96.2%数据来源ShardingCore官方性能测试基于MySQL 8.0773万测试数据实操小贴士性能测试时建议关闭EF Core跟踪AsNoTracking()并确保分表键上有索引这两个因素对分表性能影响最大。3. 场景化实践如何实现无缝集成下面以电商订单和用户行为日志两个典型场景演示ShardingCore的集成过程。整个过程分为准备阶段、核心配置和验证测试三个阶段。准备阶段环境与依赖配置步骤1创建项目并安装依赖# 创建ASP.NET Core项目 dotnet new webapi -n ShardingDemo cd ShardingDemo # 安装核心包 dotnet add package ShardingCore # 安装SQL Server驱动 dotnet add package Microsoft.EntityFrameworkCore.SqlServer步骤2定义实体类电商订单实体按时间分表/// summary /// 订单实体按创建时间分表 /// /summary public class Order { public string Id { get; set; } public string UserId { get; set; } public decimal Amount { get; set; } public OrderStatus Status { get; set; } public DateTime CreateTime { get; set; } // 分表键按时间分表 } public enum OrderStatus { Pending, Paid, Shipped, Completed, Cancelled }用户行为日志实体按用户ID哈希分表/// summary /// 用户行为日志按用户ID哈希分表 /// /summary public class UserBehaviorLog { public long Id { get; set; } public string UserId { get; set; } // 分表键按用户ID哈希 public string Action { get; set; } public string Resource { get; set; } public DateTime ActionTime { get; set; } }核心配置分表规则与上下文设置步骤3创建分片DbContextpublic class AppDbContext : AbstractShardingDbContext, IShardingTableDbContext { public AppDbContext(DbContextOptionsAppDbContext options) : base(options) { } // 订单表分表 public DbSetOrder Orders { get; set; } // 用户行为日志表分表 public DbSetUserBehaviorLog UserBehaviorLogs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 配置订单表 modelBuilder.EntityOrder(entity { entity.HasKey(o o.Id); entity.ToTable(nameof(Order)); // 虚拟表名 }); // 配置用户行为日志表 modelBuilder.EntityUserBehaviorLog(entity { entity.HasKey(l l.Id); entity.ToTable(nameof(UserBehaviorLog)); // 虚拟表名 }); } // 分表路由尾缀 public IRouteTail RouteTail { get; set; } }步骤4实现分表路由规则订单表按月分表路由/// summary /// 订单表按月分表路由 /// /summary public class OrderTableRoute : AbstractSimpleShardingMonthKeyDateTimeVirtualTableRouteOrder { /// summary /// 分表开始时间 /// /summary public override DateTime GetBeginTime() { return new DateTime(2023, 1, 1); } /// summary /// 配置分表属性 /// /summary public override void Configure(EntityMetadataTableBuilderOrder builder) { // 指定分表字段为CreateTime builder.ShardingProperty(o o.CreateTime); // 启用自动创建表 builder.AutoCreateTableByTime(); } }用户行为日志按用户ID哈希分表路由/// summary /// 用户行为日志按用户ID哈希分表8张表 /// /summary public class UserBehaviorLogTableRoute : AbstractShardingModKeyStringVirtualTableRouteUserBehaviorLog { public UserBehaviorLogTableRoute() : base(8) // 分成8张表 { } public override void Configure(EntityMetadataTableBuilderUserBehaviorLog builder) { // 指定分表字段为UserId builder.ShardingProperty(o o.UserId); } /// summary /// 计算哈希值的方法 /// /summary public override int GetShardingKeyToInt(string shardingKey) { // 使用UserId的哈希值取模 return Math.Abs(shardingKey.GetHashCode()) % ShardingCount; } }步骤5配置服务与中间件var builder WebApplication.CreateBuilder(args); // 添加ShardingCore builder.Services.AddShardingDbContextAppDbContext() .UseRouteConfig(op { // 添加分表路由 op.AddShardingTableRouteOrderTableRoute(); op.AddShardingTableRouteUserBehaviorLogTableRoute(); }) .UseConfig(op { // 配置查询连接 op.UseShardingQuery((connStr, builder) { builder.UseSqlServer(connStr); }); // 配置事务连接 op.UseShardingTransaction((connection, builder) { builder.UseSqlServer(connection); }); // 添加默认数据源 op.AddDefaultDataSource(ds0, Data Sourcelocalhost;Initial CatalogShardingDemo;Integrated SecurityTrue;); }) .AddShardingCore(); var app builder.Build(); // 自动创建缺失的分表 app.Services.UseAutoTryCompensateTable(); // 其他中间件配置... app.Run();验证测试分表功能验证步骤6创建API接口测试分表功能[ApiController] [Route(api/[controller])] public class OrdersController : ControllerBase { private readonly AppDbContext _dbContext; public OrdersController(AppDbContext dbContext) { _dbContext dbContext; } [HttpPost] public async TaskIActionResult CreateOrder(Order order) { order.Id Guid.NewGuid().ToString(); order.CreateTime DateTime.Now; _dbContext.Orders.Add(order); await _dbContext.SaveChangesAsync(); return Ok(order); } [HttpGet] public async TaskIActionResult GetOrders(DateTime startTime, DateTime endTime) { var orders await _dbContext.Orders .Where(o o.CreateTime startTime o.CreateTime endTime) .ToListAsync(); return Ok(orders); } }步骤7验证分表效果运行应用程序后通过API创建不同时间的订单然后查看数据库会发现订单表会按月份自动创建如Orders_202301、Orders_202302用户行为日志会按UserId哈希值分散到8张表UserBehaviorLogs_0到UserBehaviorLogs_7实操小贴士首次使用时建议先在测试环境验证分表规则特别是哈希分表的分布均匀性。可以通过查询各分表数据量确保数据分布符合预期。4. 进阶技巧从入门到精通掌握基础分表后这些进阶技巧能帮助你应对更复杂的业务场景动态分库配置应对业务快速扩张当单库性能达到瓶颈时ShardingCore支持动态添加数据源实现无缝水平扩展。通过管理界面可以轻松添加分库键动态分库配置界面可添加新的分库键实现数据库水平扩展添加新分库的代码示例// 注入数据源管理器 private readonly IShardingDataSourceManager _dataSourceManager; // 动态添加分库 [HttpPost(addDataSource)] public async TaskIActionResult AddDataSource(string dataSourceName, string connectionString) { await _dataSourceManager.AddDataSourceAsync(dataSourceName, connectionString); return Ok(); }读写分离提升查询性能配置一主多从架构将读请求分发到从库减轻主库压力// 在服务配置中添加读写分离 .UseConfig(op { // 其他配置... // 配置读写分离 op.AddReadWriteSeparation(o { return new Dictionarystring, ISetstring { { ds0, new HashSetstring { Data Sourceslave1;Initial CatalogShardingDemo;Integrated SecurityTrue;, Data Sourceslave2;Initial CatalogShardingDemo;Integrated SecurityTrue; } } }; }, ReadStrategyEnum.Loop); // 轮询策略 })高性能分页解决大数据量翻页问题针对分表场景下的分页查询ShardingCore提供了优化方案// 高性能分页查询 var pageResult await _dbContext.Orders .OrderBy(o o.CreateTime) .ToShardingPageAsync(pageIndex: 1, pageSize: 20);通过实现IPaginationConfiguration接口进一步优化public class OrderPaginationConfig : IPaginationConfigurationOrder { public void Configure(PaginationBuilderOrder builder) { // 设置分页排序字段 builder.PaginationSequence(o o.Id) .UseRouteCompare(Comparerstring.Default) .UseQueryMatch(PaginationMatchEnum.Owner | PaginationMatchEnum.PrimaryMatch); // 启用反向分页优化 builder.ConfigReverseShardingPage(0.5d, 10000L); } }实操小贴士动态分库分表时建议通过监控系统密切关注各节点的负载情况避免数据分布不均导致的热点库/表问题。5. 资源导航从入门到精通的学习路径快速入门示例分表示例项目分库示例项目自动建表示例开发工具与环境官方模板dotnet new -i ShardingCore.Templates测试工具benchmarks/ShardingCoreBenchmark/社区支持问题反馈项目Issue跟踪系统技术交流Discord社区文档中心项目Wiki通过本文的介绍你已经掌握了ShardingCore的核心功能和使用方法。无论是电商订单、用户行为日志还是其他大数据量场景ShardingCore都能提供简单高效的分库分表解决方案。现在就动手尝试为你的应用打造高性能的数据库架构吧【免费下载链接】sharding-corehigh performance lightweight solution for efcore sharding table and sharding database support read-write-separation .一款ef-core下高性能、轻量级针对分表分库读写分离的解决方案具有零依赖、零学习成本、零业务代码入侵项目地址: https://gitcode.com/gh_mirrors/sha/sharding-core创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2462192.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!