[NewLife.XCode]分表分库(百亿级大数据存储)
阅读目录
NewLife.XCode是一个有15年历史的开源数据中间件,支持netcore/net45/net40,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。
整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。
开源地址:https://github.com/NewLifeX/X (求star, 938+)
XCode是重度充血模型,以单表操作为核心,不支持多表关联Join,复杂查询只能在where上做文章,整个select语句一定是from单表,因此对分表操作具有天然优势!
!! 阅读本文之前,建议回顾《百亿级性能》,其中“索引完备”章节详细描述了大型数据表的核心要点。
100亿数据其实并不多,一个比较常见的数据分表分库模型:
MySql数据库8主8从,每服务器8个库,每个库16张表,共1024张表(从库也有1024张表) ,每张表1000万到5000万数据,整好100亿到500亿数据!
例程剖析
例程位置:https://github.com/NewLifeX/X/tree/master/Samples/SplitTableOrDatabase
新建控制台项目,nuget引用NewLife.XCode后,建立一个实体模型(修改Model.xml):
<Tables Version="9.12.7136.19046" NameSpace="STOD.Entity" ConnName="STOD" Output="" BaseClass="Entity" xmlns:xs="upload/201909091050193281.gif" alt="复制代码" style="margin: 0px; padding: 0px; max-width: 900px; height: auto; border: none !important;" />
在Build.tt上右键运行自定义工具,生成实体类“历史.cs”和“历史.Biz.cs”。不用修改其中代码,待会我们将借助该实体类来演示分表分库用法。
为了方便,我们将使用SQLite数据库,因此不需要配置任何数据库连接,XCode检测到没有名为STOD的连接字符串时,将默认使用SQLite。
此外,也可以通过指定名为STOD的连接字符串,使用其它非SQLite数据库。
按数字散列分表分库
大量订单、用户等信息,可采用crc16散列分表,我们把该实体数据拆分到4个库共16张表里面:
static void TestByNumber() { XTrace.WriteLine("按数字分表分库"); // 预先准备好各个库的连接字符串,动态增加,也可以在配置文件写好 for (var i = 0; i < 4; i++) { var connName = $"HDB_{i + 1}"; DAL.AddConnStr(connName, $"data source=numberData\\{connName}.db", null, "sqlite"); History.Meta.ConnName = connName; // 每库建立4张表。这一步不是必须的,首次读写数据时也会创建 //for (var j = 0; j < 4; j++) //{ // History.Meta.TableName = $"History_{j