数据库集群和负载平衡

什么是数据库集群?如果允许同一个数据库位于两个不同的服务器上,它们如何保持数据之间的同步。从数据库服务器的角度来看,这与负载平衡有什么不同?

160492 次浏览

从 SQLServer 的角度来看:

集群将为您提供主动-被动配置。这意味着在2节点集群中,其中一个节点将是主动的(服务) ,另一个节点将是被动的(等待主动节点失败时接管)。从硬件的角度来看这是个高可用性。

您可以拥有一个活动-活动群集,但是它需要在每个节点上运行多个 SQLServer 实例。(即节点 A 上的实例1未能转移到节点 B 上的实例2,而节点 B 上的实例1未能转移到节点 A 上的实例2)。

负载平衡(至少从 SQL Server 的角度来看)不存在(至少在 web 负载均衡的意义上)。这样不能平衡负载。但是,您可以将应用程序分割为在服务器1上的某个数据库上运行,也可以在服务器2上的某个数据库上运行,等等。这是 SQL 世界中“负载平衡”的主要手段。

数据库集群是一个有点模棱两可的术语,有些供应商认为一个集群有两个或多个服务器共享相同的存储,有些供应商则称一个集群为一组复制服务器。

复制定义了一组服务器保持同步而不必共享能够在地理上分散的存储的方法,主要有两种方法:

  • Master-master (或 multi-master)复制: 任何服务器都可以更新数据库。它通常由数据库中的一个不同模块(或者在某些情况下运行在它们之上的一个完全不同的软件)来处理。

    缺点是很难做好,有些系统在这种复制模式下会失去 ACID 属性。

    好处是它很灵活,您可以在更新数据库的同时支持任何服务器的故障。

  • 主从复制: 只有一个权威数据副本,它被推送到从服务器。

    缺点是容错性较差,如果主人死了,奴隶就没有进一步的变化。

    优点是它比 multi-master 更容易实现,并且通常可以保留 ACID 属性。

负载平衡是一个不同的概念,它包括分发发送到这些服务器的查询,以便尽可能均匀地分配负载。它通常在应用程序层(或使用连接池)完成。复制和负载平衡之间唯一的直接关系是需要一些复制才能实现负载平衡,否则就只有一台服务器。

集群使用某种类型的共享存储(例如驱动器笼或 SAN) ,并将两个数据库前端放在其上。前端服务器共享客户端用于连接的 IP 地址和集群网络名称,它们自己决定谁当前负责服务客户端请求。

如果您询问某个特定的数据库服务器,将它添加到您的问题中,我们可以添加关于它们实现的细节,但在其核心,这就是集群。

数据库集群实际上是两个或可能多个节点之间的同步复制模式,它具有添加到系统中的容错功能,而且也是在无共享体系结构中。无共享意味着各个节点实际上不共享任何物理资源,如磁盘或内存。

就保持数据同步而言,有一个管理服务器,所有的数据节点都与 SQL 节点连接在一起,以实现这一点(特别是 MySQL)。

现在谈谈差异: 负载平衡只是通过集群实现的结果之一,其他的还包括高可用性、可伸缩性和容错性。