单点故障
数据库服务器是企业系统的核心组成部分,如果出现故障,可能会影响服务可用性。
![Single point of failure](https://istack.dev59.com/50s4x.webp)
如果数据库服务器在单个服务器上运行,则我们有一个单点故障。任何硬件问题(例如磁盘驱动器故障)或软件故障(例如驱动程序问题,故障更新)都将使系统不可用。
资源有限
如果只有一个数据库服务器节点,则在容纳更高的流量负载方面,垂直扩展是唯一的选择。垂直扩展或向上扩展意味着购买更强大的硬件,这提供了更多资源(例如CPU、内存、I/O)来服务于传入的客户端事务。
在某种硬件配置范围内,垂直扩展可以成为扩展数据库系统的可行且简单的解决方案。问题是价格性能比不是线性的,因此在某个阈值之后,您会从垂直扩展中获得递减的回报。
垂直扩展的另一个问题是,在升级服务器时,需要停止数据库服务。因此,在硬件升级期间,应用程序将不可用,这可能会影响底层业务操作。
数据库复制
为了克服具有单个数据库服务器节点的前述问题,我们可以设置多个数据库服务器节点。节点越多,处理传入流量的资源就越多。
此外,如果数据库服务器节点关闭,则只要有备用数据库节点连接,系统仍然可以处理请求。因此,可以在不影响整个系统可用性的情况下升级给定数据库服务器节点的硬件或软件。
拥有多个节点的挑战是数据一致性。如果所有节点在任何给定时间都处于同步状态,则系统为
Linearizable
,这是在多个寄存器之间保持数据一致性时最强的保证。
将数据同步到所有数据库节点的过程称为复制,并且有多种策略可以使用。
单主数据库复制
单主复制方案如下:
![Single-Primary Database Replication](https://istack.dev59.com/Q9p5k.webp)
主节点,也称为Master节点,接受写操作,而副本节点只能处理只读事务。拥有唯一的真相来源可以避免数据冲突。
为了保持副本同步,主节点必须提供所有已提交事务所做更改的列表。
关系型数据库系统具有Redo日志,其中包含所有成功提交的数据更改。
PostgreSQL使用WAL(预写式日志记录)以确保事务耐久性和流复制。
由于存储引擎与MySQL服务器分开,因此MySQL使用单独的二进制日志进行复制。Redo日志由InnoDB存储引擎生成,其目标是提供事务耐久性,而Binary Log由MySQL Server创建,它存储逻辑日志记录,而不是由Redo日志创建的物理日志。
通过应用在WAL或Binary Log条目中记录的相同更改,副本节点可以保持与主节点同步。
单主复制为只读事务提供了水平扩展性。如果只读事务数量增加,我们可以创建更多副本节点以容纳传入的流量。
这就是水平扩展或扩展的全部内容。与需要购买更强大硬件的垂直扩展不同,使用普通硬件可以实现水平扩展。
另一方面,由于只有一个主节点,因此只能将读写事务进行垂直扩展。