什么是单主数据库复制? -Vlad Mihalcea


本文解释什么是单主数据库复制,以及如何使用它来提高应用程序可用性和扩展只读事务。
数据库服务器是企业系统的核心部分,如果发生故障,服务可用性可能会受到影响。如果数据库服务器在单个服务器上运行,那么我们将出现单点故障。任何硬件问题(例如,磁盘驱动器故障)或软件故障(例如,驱动程序问题,更新故障)都将导致系统不可用。

有限的资源
如果只有一个数据库服务器节点,则垂直缩放是适应更高流量负载的唯一选择。垂直扩展或纵向扩展意味着购买功能更强大的硬件,该硬件可提供更多资源(例如CPU,内存,I / O)来为传入的客户端事务提供服务。
对于特定的硬件配置,垂直扩展可以是扩展数据库系统的可行且简单的解决方案。问题是性价比不是线性的,因此,在达到一定的阈值之后,垂直缩放的收益就会递减。
垂直扩展的另一个问题是,为了升级服务器,需要停止数据库服务。因此,在硬件升级期间,该应用程序将不可用,这可能会影响基础业务运营。

数据库复制
为了克服与单个数据库服务器节点相关的上述问题,我们可以设置多个数据库服务器节点。节点越多,处理传入流量的资源就越多。
另外,如果数据库服务器节点已关闭,只要有备用数据库节点要连接,系统仍可以处理请求。因此,可以在不影响整体系统可用性的情况下完成给定数据库服务器节点的硬件或软件的升级。
具有多个节点的挑战是数据一致性。如果所有节点在任何给定时间都处于同步状态,则系统是串行化/线性化Linearizable,这是跨多个寄存器的数据一致性的最有力保证。
在所有数据库节点之间同步数据的过程称为复制,我们可以使用多种策略。

单主数据库复制
主节点(也称为主节点)是接受写操作的节点,而副本节点只能处理只读事务。有了单一的事实来源,就可以避免数据冲突。
为了使副本保持同步,主节点必须提供所有已提交事务完成的更改列表。
关系数据库系统具有一个重做日志,其中包含成功提交的所有数据更改。PostgreSQL使用WAL(预写日志)记录来确保事务持久性和流复制。由于存储引擎与MySQL服务器是分开的,因此MySQL使用单独的二进制日志进行复制。重做日志是由InnoDB存储引擎生成的,其目标是在MySQL服务器创建二进制日志的同时提供事务持久性,并存储逻辑日志记录,而不是由重做日志创建的物理日志。通过应用记录在WAL或二进制日志条目中的相同更改,副本节点可以与主节点保持同步。

同步复制
如果当前事务正在等待一个或多个节点确认当前提交的更改已应用于副本,则复制过程是同步的。
同步复制的优点是副本与主节点同步,因此读取可线性化。
在主节点发生故障的情况下,数据库系统可以将任何同步副本提升为下一个主节点,并且不会丢失任何已提交的事务。
同步复制的缺点是将当前事务更改应用于一个或多个副本所引起的延迟。如果唯一的同步副本关闭,则可用性也会受到影响。

异步复制
使用异步复制时,在将控件返回给应用程序之前,主节点不会等待副本确认所有更改都已应用。因此,异步副本落后于主节点。由于主节点不再等待副本以确认已应用所有更改,因此事务响应时间较短,并且如果一个或多个副本崩溃,可用性不会受到影响。缺点是数据不一致。如果复制时间窗口大于只读事务的到达时间,则只读事务可以返回陈旧的数据。

水平缩放
单主复制为只读事务提供水平可伸缩性。如果只读事务的数量增加,我们可以创建更多的副本节点来容纳传入的流量。这就是水平缩放或向外扩展的全部内容。与需要购买功能更强大的硬件的垂直缩放不同,可以使用商用硬件来实现水平缩放。另一方面,由于存在单个主节点,因此只能按比例放大(垂直缩放)读写事务。

结论
单主数据库复制非常有用,因为它既提供了容错功能,又提供了负载分割功能。因此,任何非平凡的企业应用程序都使用单主复制。著名问答社区Stack Overflow architecture 使用具有一个主节点和一个异步副本的单主SQL Server复制群集。