第一部分:
关系型数据库随时间的流逝慢慢的不能满足现在每秒大量的操作、很多打开的连 接、大量的数据和非常高的写比率。为避免这种情况的出现,很多大型站点和SaaS的应用开始使用 sharding技术和他们的关系型数据结合。
怎样对应用分片?下面列出的四点很简单:
1、 分析表schema得出分片该如何设置
2、开启多个MySQL 实例
3、根据shard配置,导入导出 数据
4、更新程序代码来支持shard配置
分析数据:
为了得到一个shard 配置,你 需要做下面三步:
1、列出表名和表的大小。 大表时最需要进行分片的,因为很多SQL命令经常 在表上执行。
2、列出外键(如果有的话)外键帮助我们了解表之间的关系,这样的表需要很明 智的划分,否则你的表将失去一致性
3、分析涉及到的SQL语句 一些SQL语句在shard环境 下是难以执行的。所以需要整理一份SQL语句来决定哪些表时不需要shard的。我们还能得出哪些表时访 问频率很高,哪些不是。
表划分规则:
在实施shard的时候,需明白并不是所有的表都会 被分片。因为sharding会限制SQL的书写(不允许在表之间进行join,表的唯一性,自增字段),你必须 强制修改应用代码。通常情况下一些表被shard,另一些表被复制到其他shard上。
确定哪些表时 需要被分片的;
对表进行shard的算法像下面描述的一样简单:
1、寻找最大的表,很多 表结构中都有几张大表,其余并不是。
2、分析sql语句:
是否表之间使用了join查询?
a、是,让其中较小的表作为一个全局表
b、如果不是,还要根据sql语句来分析访问频率 分析
i、如果这些表访问不频繁,让他们成为全局表
ii、找出访问频繁 的表尤其是那些写入比较严重的进行shard,然后跳到第2步确定他们真的可以被shard(无join操作)
一旦你确定了哪些表是将被shard的,那么下一步就是选择sharding keys ,多数情况下回使用表 的primary key作为shard key。如果某些表之间存在外键关系,那么使用外键作为shard key 也是可以 考虑的。
和数据库分区一样,sharding也有很多算法:hash,list,range等。一般情况下使用 list或者 hast算法来应对多个选择条件的情况。通过不同的DB来保存不同的用户信息。hash往往能够对 数据更加平均的进行分配。
下一步呢?
如果你是一个新的环境,那么可以跳过这一步啦 。
1、在所有的shard上对数据进行克隆,复制物理文件或者mysqldump都行
2、对于每个 shard(shard上的每个表)
a、删除所有的索引
b、删除所有多余的数据 (脚本搞定)
这个操作会产生很多的碎片,可以考虑建立一张临时表,只插入相关的记录,最 后删除原表,再重命名。