数据库服务器、分区和实例

Database servers, partitions and instances

在MySQL(和PostgreSQL)中,数据库实例和数据库分区究竟是由什么组成的?

例如,不同的DB 分区 是否必须存在于不同的 数据库实例 上?或者单个数据库实例可以管理多个分区吗?如果是后者,称它为 “分区” 有什么意义?在这种情况下,数据库会知道吗?

以下是描述在线课程系统设计的文档中的一段话:

How can we plan for the future growth of our system?

We can have a large number of logical partitions to accommodate future data growth, such that in the beginning, multiple logical partitions reside on a single physical database server. Since each database server can have multiple database instances on it, we can have separate databases for each logical partition on any server. So whenever we feel that a particular database server has a lot of data, we can migrate some logical partitions from it to another server. We can maintain a config file (or a separate database) that can map our logical partitions to database servers; this will enable us to move partitions around easily. Whenever we want to move a partition, we only have to update the config file to announce the change.

分区,就MySQL和PostgreSQL特性集而言,是数据的物理分段。它们存在于单个数据库实例中,用于缩小您在特定时间交互的数据范围,以应对高数据量情况。

您引用的文档在系统设计级别谈到了数据分区的更抽象概念。

这些术语令人困惑、被误用且定义不一致。

对于MySQL:

一个数据库有多个定义:

  • 一个“模式”(被其他 vendors/standards 使用)。这是table的合集。一个实例中有一个或多个"数据库。
  • 实例。您应该使用“服务器”或“数据库服务器”更清楚。
  • 数据。 “数据集”可能是一个更好的术语。

一个实例指的是某处某台机器上mysqld运行的副本。

  • 您可以在一个硬件上拥有多个实例。 (罕见)
  • 您可以在单个硬件上拥有多个实例,这些实例位于不同的 VM 或 Docker 中。 (便于测试)
  • 通常“实例”是指一台服务器上有一份MySQL。 (典型的大规模情况)

A PARTITION 是布局 table(在 database 中)的特定方式。

  • 见于CREATE TABLE (...) PARTITION BY ...
  • 它是数据的“水平”分割,通常按日期,但也可以按其他 'column'。
  • 它对性能没有直接影响,因此很少有用。

Sharding 未在 MySQL 中实现,但可以在 MySQL.

之上完成
  • 它也是数据的“水平”拆分,但在这种情况下跨越多个“实例”。
  • 例如,用例是社交媒体,其中有数以百万计的“用户”大多由他们自己处理。也就是说,大多数查询都集中在数据的单个切片上,因此对于一群用户在一台服务器上并在那里进行所有这些查询是实用的。
  • 它可以称为“水平分区”,但不应与 table 的 PARTITIONs 混淆。

垂直分区 是将一些 从 table 中拉出并放入并行 table.

  • 两个 table 将(通常)具有相同的 PRIMARY KEY,从而促进 JOINs
  • 垂直分区(通常)仅在单个“实例”中完成。
  • 目的包括拆分大 text/blog 列;拆分可选列(并使用 LEFT JOIN 得到 NULLs)。
  • 垂直分区在 MyISAM 中有些用处,但在 InnoDB 中很少用,因为该引擎会自动执行此操作。

复制集群

  • 多个实例包含相同的数据。
  • 用于“高可用性”(HA)。
  • 用于扩展读取。
  • 与分区或分片正交。
  • 将实例放在同一台服务器上没有意义(testing/experimenting/staging/etc 除外)。