扩展

关于数据库的扩展,一般分为两类,水平扩展和垂直扩展。

对于许多类型的应用,传统的解决方法是购买更多强悍的机器,也就是常说的垂直扩展或者向上扩展。 另外一个与之相反的方法是将任务分配到多台计算机上,这通常称为水平扩展或者向外扩展。

垂直扩展

对于垂直扩展,意味着购买更多性能强悍的硬件,对很多应用来说这是唯一需要做的事情。

但是在现代硬件上 MySQL 能扩展的合理值为 256 GB RAM,32 核 CPU 以及一个 PCIE flash 驱动器,并且需要使用尽可能最新的 MySQL 版本。 如果在此基础上继续提升硬件的配置,MySQL 的性能虽然还能提升,但性价比就会降低。

水平扩展

一般策略划分为三个部分:复制、拆分、以及数据分片。

最简单也最常见的水平扩展的方法是通过复制将数据分发到多个服务器上,然后将备库用于读查询。 这种技术对于以读为主的应用很有效。但也有一些缺点,例如重复缓存,不过如果数据规模有限就不存在这个问题。

在 MySQL 架构中,一个节点就是一个功能组件。 如果没有规划冗余和高可用性,那么一个节点可能就是一台服务器。 如果设计的是能够故障转移的冗余系统,那么一个节点通常可能就是下面的某一种:

  • 主从复制双机结构
  • 一主多备
  • 一主,并使用分布式复制块设备(DRBD)作为备用服务器
  • 一个基于存储区域网络(SAN)的集群

在大多数情况下,一个节点内的所有服务器应该拥有相同的数据。

  1. 按功能划分 数据库拆分一般可以按照功能拆分或者说是业务拆分,也就是把不同的功能或者是不同的业务尽可能地拆分开, 然后把各个功能或业务需要的数据库独立运行,也是一种很好的方式。可想而已肯定可以减小写入和读取数据的压力。

  2. 数据分片 在目前用于扩展大型 MySQL 应用的方案中,数据分片是最通用且最成功的方法。 把数据分割成一小片,或者说一块,然后存储到不同的节点中。

数据分片在和某些类型的按功能划分联合使用时非常有用。 大多数分片系统也有一些全局的数据不会被分片(例如城市列表或者登陆数据)。 全局数据一般存储在单个节点上,并且通常保存在类似 memcached 这样的缓存里。

分片数据存储看起来像是优雅的解决方案,但除非是在项目架构阶段就考虑过并留有扩展空间,不然很难实现。 为什么要选择这个架构呢?因为如果想扩展写容量,就必须切分数据。如果只有单台主库,那么不管有多少备库,写容量都是无法扩展的。

  1. 选择分区键 选择分区键的时候,尽可能选择那些能够避免跨分片查询的,但同时也要让分片足够小,以避免过大的数据片导致问题。 如果可能,应该期望分片尽可能同样小,这样在为不同数量的分片进行分组时能够很容易平衡。

  2. 多个分区键

  3. 跨分片查询
  4. 分配数据、分片和节点
  5. 在节点上部署分片
  6. 固定分配 将数据分配到分片中有两种主要的方法:固定分配和动态分配。 两种方法都需要一个分区函数,使用行的分区健值作为输入,返回存储该行的分片。

固定分配使用的分区函数仅仅依赖于分区键的值,哈希函数和取模运算就是很好的例子。

但固定分配也有缺点,如果分片很大并且数量不多,就很难平衡不同分片间的负载。 修改分片策略比较困难,因为需要重新分配已有的数据。

  1. 动态分配 另外一个选择使用动态分配,将每个数据单元映射到一个分片。假设一个有两列的表,包括用户ID和分片ID。
create table user_to_shard {
    user_id INT NOT NUll,
    shard_id INT NOT NULL 
    primary key (user_id)
}

这个表本身就是分区函数。给定分区键(用户ID)的值就可以获取分片号。

动态分配增加了分区函数的开销,因为需要额外调用一次外部资源。

powered by Gitbook该文件修订时间: 2020-04-10 10:05:54

results matching ""

    No results matching ""

    results matching ""

      No results matching ""