即便是 MariaDB,也有一个想要处理大数据的心。虽然可能跟其它的例如 HBase、Hive 之类的比有些差异和不足,但并不影响壮志。

简单列举两个要处理大量数据的例子:

  • 1、IoT Sensor Networks
    • 存取特性: 很少大量写入,但多大量读取
    • 事务需求: 少
    • 资料量: 累积数量庞大
  • 2、AI Machine Learning 领域
    • 搜集大量数据进行分析

使用 MariaDB 处理大量数据,先来了解一下这两点。

DATA Sharding (数据分片)和 Data Partition(数据分区)

数据分片简述

  • 单一数据库系统已无法处理 Big Data 服务需求
  • 大部分数据库瓶颈皆处于 I/O 效能问题
  • 提供数据分片技术将数据分散储存于多个数据库实例中
  • 提供水平式,垂直档案分布于不同的 I/O 系统,加速数据存取
  • 可横跨多种不同功能数据库系统
  • 相关技术或引擎:FEDERATEDX , CONNECT , SPIDER , MAXSCALE

关于数据分片,这里有一篇 2019 年 2 月发布的文章,到今天(2020/06/18)一年多,有 169.9k 的浏览量,讲解说明还不错,推荐阅读:

Understanding Database Sharding

个人理解来说:

分片(Sharding) 是一种与水平切分(horizontal partitioning)相关的数据库架构模式,用于在特定的 SQL 操作中减少数据读写的总量以缩减响应时间。——例如将一个表里面的行(row),分成多个不同的表的。

分区(PARTITIONing) 是分片的具体做法实现,例如水平分区、垂直分区。

分片(Sharding)将一个数据分成两个或多个较小的块,称为逻辑分片(logical shards)。然后,逻辑分片(logical shards)分布在单独的数据库节点上,称为物理分片(physical shards)。物理分片(physical shards)可以容纳多个逻辑分片(logical shards)。尽管如此,所有分片中保存的数据,共同代表整个逻辑数据集。

数据库分片(Database shards)是无共享架构( shared-nothing architecture)的一个例子。这意味着分片是自治的:分片间不共享任何相同的数据或服务器资源。但是在某些情况下,将某些表复制到每个分片中作为参考表是有意义的。例如,假设某个应用程序的数据库依赖于重量测量的固定转换率。通过将包含必要转换率数据的表复制到每个分片中,有助于确保查询所需的所有数据都保存在每个分片中。

通常,分片(Sharding)在应用程序级别进行实现。这意味着应用程序包含“要向哪个分片发送读和写”的代码。但是,某些数据库管理系统内置了分片功能,允许您直接在数据库级别实现分片。

分片的优点:

高可用性(High Availability):对于分片数据库,如果一个数据库分片出现故障,则仅会使部分用户无法使用应用程序或网站的一部分,而其它分片可以继续运行而不会出现任何问题。如果数据库未分片,则中断可能会导致整个应用程序不可用。

更快的查询响应(Faster queries response):对尚未分片的数据库提交查询时,它可能必须搜索查询表中的每一行,才能找到您要查找的结果集。对于具有大型整体数据库的应用程序,查询会变得异常缓慢。但是,通过将一个表拆分为多个表,查询必须遍历更少的行,并且其结果集可以更快地返回。

更多的写带宽(More write bandwidth):无需主数据库序列化写操作,就可以并行写操作,从而提高了写吞吐量。写作是许多网站的主要瓶颈。

向外扩展(Scaling out):对数据库进行分片可以帮助促进水平扩展(称为向外扩展)。

分片的缺点:

增加系统的复杂性(Adds complexity in the system):恰当地实现分片数据库体系结构是一项复杂的任务。如果处理不正确,则存在很大的风险,即分片过程可能导致数据丢失或表损坏。分片对团队的工作流程也有重大影响。用户必须从多个入口位置管理数据,而不是从单个入口点管理和访问数据,这可能对某些团队具有潜在地破坏性。

重新平衡数据(Rebalancing data):在分片数据库体系结构中,有时分片会超出其它分片而变得不平衡,这也称为数据库热点(database hotspot)。在这种情况下,分片数据库的任何好处都会被抵消。数据库可能需要重新分片以允许更均匀的数据分发。必须从一开始就建立重新平衡,否则在重新分片时,将数据从一个分片移动到另一个分片需要大量的停机时间。

从多个分片连接数据(Joining data from multiple shards):要实现一些复杂的功能,我们可能需要从分布在多个分片中的不同来源提取大量数据。我们无法发出查询并从多个分片获取数据。我们需要对不同的分片发出多个查询,获取所有响应并将其合并。

没有原生支持(No Native Support):并非每个数据库引擎都原生支持分片。因此,分片通常需要自己实现。这意味着通常很难找到有关分片的文档或解决问题的技巧。

ref: https://medium.com/system-design-blog/database-sharding-69f3f4bd96db