数据库集群和负载均衡
Posted
技术标签:
【中文标题】数据库集群和负载均衡【英文标题】:Database cluster and load balancing 【发布时间】:2010-11-12 21:20:09 【问题描述】:什么是数据库集群?如果您允许同一数据库位于 2 个不同的服务器上,它们如何保持数据之间的同步。从数据库服务器的角度来看,这与负载平衡有何不同?
【问题讨论】:
【参考方案1】:数据库集群是一个有点含糊的术语,一些供应商认为一个集群有两个或多个服务器共享相同的存储,而另一些供应商则将一个集群称为一组复制的服务器。
复制定义了一组服务器保持同步而不必共享存储空间的方法,可以在地理上分散,主要有两种方法:
主-主(或多主)复制:任何服务器都可以更新数据库。它通常由数据库中的不同模块(或在某些情况下运行在它们之上的完全不同的软件)来处理。
缺点是很难做好,有些系统在这种复制模式下会失去 ACID 属性。
优点是它很灵活,您可以在更新数据库的同时支持任何服务器的故障。
主从复制:权威数据只有一个副本,被推送到从服务器。
缺点是容错性较差,如果master死了,slave就没有进一步的变化了。
优点是它比多主机更容易操作,并且通常保留 ACID 属性。
负载平衡是一个不同的概念,它包括分配发送到这些服务器的查询,以便负载尽可能均匀分布。它通常在应用层(或使用连接池)完成。复制和负载平衡之间的唯一直接关系是您需要一些复制才能进行负载平衡,否则您将拥有一个服务器。
【讨论】:
啊,忘了复制 :) 是的,您可以通过结合应用程序级逻辑来实现负载平衡 :)。 +1 Postgresql 文档以不同的方式引用“数据库集群”:“在你可以做任何事情之前,你必须在磁盘上初始化一个数据库存储区域。我们称之为数据库集群。(SQL 使用术语目录集群。 ) 数据库集群是由正在运行的数据库服务器的单个实例管理的数据库集合。" postgresql.org/docs/8.3/static/creating-cluster.html ACID 属性是什么意思,或者更确切地说,如果你不保留它们,你究竟会失去什么? @TheStoryCoder 在计算机科学中,ACID(原子性、一致性、隔离性、持久性)是数据库事务的一组属性,旨在即使在发生错误、电源故障等情况下也能保证有效性。在在数据库的上下文中,满足 ACID 属性的一系列数据库操作(这些可以被视为对数据的单个逻辑操作)称为事务。例如,将资金从一个银行账户转移到另一个银行账户,即使涉及多个更改,例如从一个账户借记和贷记另一个账户,都是一次交易。【参考方案2】:从 SQL Server 的角度来看:
集群将为您提供主动-被动配置。这意味着在 2 节点集群中,其中一个将是主动的(服务),另一个将是被动的(当主动节点发生故障时等待接管)。从硬件的角度来看,这是一种高可用性。
您可以拥有一个主动-主动集群,但它需要在每个节点上运行多个 SQL Server 实例。 (即节点 A 上的实例 1 故障转移到节点 B 上的实例 2,节点 B 上的实例 1 故障转移到节点 A 上的实例 2)。
负载平衡(至少从 SQL Server 的角度来看)不存在(至少在与 Web 服务器负载平衡相同的意义上)。你不能那样平衡负载。但是,您可以将应用程序拆分为在服务器 1 上的某个数据库上运行,也可以在服务器 2 上的某个数据库上运行,等等。这是 SQL 世界中“负载平衡”的主要含义。
【讨论】:
【参考方案3】:集群使用某种类型的共享存储(例如驱动器笼或 SAN),并在其上放置两个数据库前端。前端服务器共享客户端用来连接的 IP 地址和集群网络名称,并由它们自己决定当前负责处理客户端请求的人员。
如果您要询问特定的数据库服务器,请将其添加到您的问题中,我们可以添加有关其实施的详细信息,但其核心就是集群。
【讨论】:
【参考方案4】:数据库集群实际上是一种在两个或可能更多节点之间同步复制的模式,并为您的系统添加了容错功能,并且在无共享架构中也是如此。不共享意味着各个节点实际上不共享任何物理资源,例如磁盘或内存。
就保持数据同步而言,有一个管理服务器,所有数据节点和SQL节点都连接到该管理服务器上来实现这一点(具体来说mysql)。
现在谈谈区别:负载平衡只是可以通过集群实现的结果之一,其他包括高可用性、可扩展性和容错性。
【讨论】:
以上是关于数据库集群和负载均衡的主要内容,如果未能解决你的问题,请参考以下文章