美文网首页
System Design 关系型数据库的扩展 - 学习笔记

System Design 关系型数据库的扩展 - 学习笔记

作者: 专职跑龙套 | 来源:发表于2018-04-25 15:37 被阅读25次

    引用:
    系统设计入门

    主从复制

    主从复制
    主库同时负责读取和写入操作,并复制写入到一个或多个从库中,从库只负责读操作。
    树状形式的从库再将写入复制到更多的从库中去。如果主库离线,系统可以以只读模式运行,直到某个从库被提升为主库或有新的主库出现。

    缺点:

    • 将从库提升为主库需要额外的逻辑。

    主主复制

    主主复制

    两个主库都负责读操作和写操作,写入操作时互相协调。如果其中一个主库挂机,系统可以继续读取和写入。

    缺点:

    • 你需要添加负载均衡器或者在应用逻辑中做改动,来确定写入哪一个数据库。
    • 多数主-主系统要么不能保证一致性(违反 ACID),要么因为同步产生了写入延迟。
    • 随着更多写入节点的加入和延迟的提高,如何解决冲突显得越发重要。

    主从复制和主主复制共同的问题

    • 如果主库在将新写入的数据复制到其他节点前挂掉,则有数据丢失的可能。
    • 副本可能因为过多写操作阻塞住,导致读取功能异常。
    • 读取从库越多,需要复制的写入数据就越多,导致更严重的复制延迟。
    • 在某些数据库系统中,写入主库的操作可以用多个线程并行写入,但读取副本只支持单线程顺序地写入。
    • 复制意味着更多的硬件和额外的复杂度。

    联合

    联合(或按功能划分)将数据库按对应功能分割。
    例如,你可以有三个数据库:论坛、用户和产品,而不仅是一个单体数据库,从而减少每个数据库的读取和写入流量,减少复制延迟。
    较小的数据库意味着更多适合放入内存的数据,进而意味着更高的缓存命中几率。没有只能串行写入的中心化主库,你可以并行写入,提高负载能力。

    缺点:

    • 如果你的数据库模式需要大量的功能和数据表,联合的效率并不好。
    • 你需要更新应用程序的逻辑来确定要读取和写入哪个数据库。
    • 从两个库联结数据更复杂。
    • 联合需要更多的硬件和额外的复杂度。

    分片

    分片

    分片将数据分配在不同的数据库上,使得每个数据库仅管理整个数据集的一个子集。
    以用户数据库为例,随着用户数量的增加,越来越多的分片会被添加到集群中。

    类似联合的优点,分片可以减少读取和写入流量,减少复制并提高缓存命中率。也减少了索引,通常意味着查询更快,性能更好。如果一个分片出问题,其他的仍能运行,你可以使用某种形式的冗余来防止数据丢失。类似联合,没有只能串行写入的中心化主库,你可以并行写入,提高负载能力。

    常见的做法是用户姓氏的首字母或者用户的地理位置来分隔用户表。

    缺点:

    • 你需要修改应用程序的逻辑来实现分片,这会带来复杂的 SQL 查询。
    • 分片不合理可能导致数据负载不均衡。例如,被频繁访问的用户数据会导致其所在分片的负载相对其他分片高。
    • 再平衡会引入额外的复杂度。基于一致性哈希的分片算法可以减少这种情况。
    • 联结多个分片的数据操作更复杂。
    • 分片需要更多的硬件和额外的复杂度。

    非规范化

    非规范化试图以写入性能为代价来换取读取性能。在多个表中冗余数据副本,以避免高成本的联结操作。

    在多数系统中,读取操作的频率远高于写入操作,比例可达到 100:1,甚至 1000:1。需要复杂的数据库联结的读取操作成本非常高,在磁盘操作上消耗了大量时间。

    参见 细聊冗余表数据一致性 学习笔记

    SQL调优

    参见 MySQL 性能优化学习笔记
    参见 MySQL 索引学习笔记

    相关文章

      网友评论

          本文标题:System Design 关系型数据库的扩展 - 学习笔记

          本文链接:https://www.haomeiwen.com/subject/lrlylftx.html