分库分表概念
顾名思义,即把原本存放在一个库中的数据分块存储到多个库中,把原本存放在一张表中的数据分块存放到多张表上。
分库分表的实施策略
垂直切分
将表按功能模块、关系密切程度进行划分,部署到不同的库中。如产品库productDB,订单库orderDB, 用户库userDB,日志库logDB等。
水平切分
当一个表中的数据量过大时,就需要将表中数据按照某种规则(userid区间划分或者散列),存储到不同库中的相同结构的表中。如userTable表中数据可以切分到不同数据库的多个结构相同的userTable0、userTable1、userTable2等表中。
分库分表的策略选择
1)数据库中表太多(门票订单系统已有30个表)而造成海量数据,且各项业务逻辑划分清晰、低耦合,则首选垂直划分。
2)数据库中表不多,但单个表中数据量很大或数据热度很高则需要考虑进行水平切分。
3)多数情况下,为达到最佳效果,往往采取垂直切分和水平切分共同进行的方式。
水平切分方式和规则
要想做到水平切分,在每一个表中都要有冗余字段作为切分依据和标识字段,通常选用userid作为区分字段。
1)按区间划分,比如1~1000的对应到DB1 , 1001~2000的对应到DB2,以此类推。
优点:可部分迁移。
缺点:数据分布不均(老用户活跃度肯定没有新用户高)。
2)hash取余运算, 对userid进行hash运算,一般取512或1024,视具体数据量大小。比如userid%512, 结果为1的对应到DB1,结果为2的对应到DB2,以此类推。
优点:数据分布均匀。
缺点:数据迁移的时候麻烦,不能按照机器性能进行分摊数据。
3)采用映射表进行映射的方式,存储到DB或者ES
单独建立一个DB,用于映射userid到DB的映射关系。
优点:灵活性强,一对一的关系
缺点:多一次RPC查询。