下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

软件设计:数据库分库解决方案

作者:kingsonCai     来源: https://www.cnblogs.com/kingson-blog/p/12122211.html点击数:746发布时间: 2020-04-13 16:00:37

标签: 数据库设计数据存储数据结构

  数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。

  当业务数据量非常大,单数据库无法支撑的时候,有可能是单库已经写满了,也可能数据库读写比较频繁,已经触碰到单库的io瓶颈了,这时就需要考虑分库。

  下面聊一下该怎么分库,如何优化:

  刚开始只有数据库A,后来又加了数据库B。

  假如数据表都是有时间戳字段,而且数据查询条件都带一个时间戳字段,这样我们可以根据数据创建的时间范围来分库,比如给数据库按年份命名db_2019,到2020年新生成一个库db_2020,在业务端进行数据读写操作时,先根据时间戳条件获取到年份,然后选择相应年份的数据库进行操作。

  但上面这种方式只适合这种特定的业务场景,而且这种方式,可能旧数据很少读取,新数据会比较频繁读取,会导致不同数据库负载是不均匀的。所以会不会有更好的分片方式呢?答案是肯定的。几乎任何一张表都会有键字段,假如键值是数字类型,可以键值与数据库数量取模的方式进行分片,比如键值是100,数据库数量是2,那么100%2得到0,就应该存储到索引为0的数据库。假如键值是字符串呢,可以通过crc32(value)算出一个数字,然后再通过数字取模的方式得到相应的数据库。

  假如在使用过程中,数据库又不够用了,需要再扩容,怎么办?

  停服,根据新的分片逻辑进行数据迁移,起服上线新的分片逻辑。没毛病,假如业务允许停机一段时间,这也是一种稳妥方式。假如业务不允许停机,或只允许停机很短的时间,这时该如何数据库扩容呢,或者说该如何平滑地进行数据库迁移而不影响业务呢?

  可以通过下面步骤来

  方案一:

  1修改写数据库逻辑:对需要迁移的数据,进行双写(写原数据库和要迁往的数据库)

  2写一个迁移脚本:从原数据库迁数据到目标数据库

  3校验原数据库是否跟跟目标数据库数据一致(在迁移的瞬间可能发生了原数据库删除了数据,而目标数据库依然写入),删掉目标数据库多余的数据。

  4修改数据库分片逻辑,去掉双写逻辑

  5删掉各个数据库冗余的数据

  若数据库双倍分库扩容有更好方案

  方案二:

  1原数据库和要迁往的数据库设计成双主同步

  2修改数据库分片逻辑

  3删掉各个数据库冗余的数据

  后面找个时间再补充一些图表,以便读者能更直观得理解。

  还有一些问题:

  问题一:假如方案一中,进行双写的时候一个写成功,一个写失败,该如何处理?

  问题二:分库后,如何分页查询数据?

  在信息化社会,充分有效地管理和利用各类信息资源,是进行科学研究和决策管理的前提条件。数据库技术是管理信息系统、办公自动化系统、决策支持系统等各类信息系统的核心部分,是进行科学研究和决策管理的重要技术手段。

赞(12)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程