数据库的读写分离
即master库支持增删,slave库只读,适用于读压力远大于写压力的场景,如商品的基本信息
分库分表
分表:分为横向和纵向
纵向分表即常见的主从表,主表存放基本信息,从表存放扩展信息和长字段。划分时一般需要考虑三个维度,1字段访问热度,2字段长度,3字段业务含义
横向分表即将数据分摊到完全一样的N张表中,适用于数据量大场景,减轻单表数据压力。对于数据的存放常用的有两种方式:
1.主键/业务主键取模法,比如划分3张表则对id取模,此方法保证了数据量的均匀分布。
2.时间片划分法,根据创建时间段将数据存放到不同表中,此方法适用于业务上对数据产生时间敏感的场景
项目中常用的分表插件有shardbatis(教程利用mybatis插件实现数据库分表_慕课手记)
分库:分为横向和纵向
纵向分库即按业务分库,如订单库,商品库等,没啥好说的
横向分库跟横向分表一样,也是分成N个结构一样的库。是数据量巨大情况下,解决单库分表过多问题的终极解决方案。
思考:如果数据被分库分表存储在库A库B两个库中,A,B两个库又各有a,b,c三个表,那么要查一个id=89的数据,路由规则如何?
第一步取模:通过求余 89%(库数*表数量)=5
第二步确定库:通过除 5/表数量=1
第三步定表:通过求余 5%表数量=2
得出结论id=89的数据在A库b表中
常见分库软件有shardingProxy,shardingJDBC等
分库分表设计下,数据的迁移和数据库扩容
数据迁移
1.给现有需要迁移的数据库,设置从库以用于双写
2.同步存量数据到从库
3.切流到从库(双写改单写,从库即新库)
数据库扩容(如图,扩容的时候,数据库数量必须成倍扩容)
1.给现有数据库,设置从库以用于双写
2.同步存量数据到从库
3.修改取模规则,将分母扩大一倍,使增量数据按照新取模规则分布到各库中
4.处理冗余数据(可选)