文档中说的是集群needs at least three nodes。我们能够在两台主机上运行,并且故障转移测试似乎可以正常工作。
我们在一个集群中设置了两个主机(A,B),每个主机都有一个林。A上的森林是主森林。B上的林是副本林。我们将林A附加到一个数据库。此时,林"A“的状态为”开放“,而"B”的状态为“同步复制”。
然后,我们关闭了主机A。林B的状态变为“打开”。
即使我们在集群中只有两台主机,故障转移似乎也能正常工作。这是预期的行为吗?
发布于 2014-11-07 21:56:59
要更好地理解这个问题,请尝试这个。让主机B复制所有数据库,包括Security DB。(在B上放置一个林,它是A上匹配林的副本)。您的描述与所谓的“本地磁盘故障切换”相符。
https://docs.marklogic.com/guide/cluster/failover#id_65543
(这个术语有误导性,磁盘不需要是“本地”的,它们可以在SAN上,也可以是物理上远程的--这个术语意味着每个主机只能看到自己的磁盘,而不是共享磁盘)。
测试您可以在A或B上可靠地登录和执行操作,并且两者都可以看到结果。
理想情况下,可以通过创建一个简单的应用程序来模拟现实世界的用例,比如每次单击按钮都会更新文档的应用程序。或者使用REST服务进行测试,您可以在两台主机上执行相同的操作。
现在断开A和B之间的网络连接(拔出电缆或禁用网络更改路由器设置,只要是最简单的)。
现在,在两台主机上尝试您的应用程序。分别转到每台主机的管理控制台,查看它认为自己和另一台主机的状态。您希望状态显示什么?
A和B都无法通信,因此它们都认为另一台主机发生了故障。如果没有第三个主机来仲裁...您期望或希望得到的结果是什么?两台主机都应该停止工作吗?还是应该让两台主机都继续工作?或者应该只运行一种?哪一个?他们将如何决定?“故障转移”主机是否应该接管主服务器,因为它认为主服务器发生了故障?或者,主服务器是否应该确定故障转移主机发生了故障?这两个选择都是正确的-在不知道其他情况的情况下,您希望集群继续运行。
现在尝试使用应用程序在两个系统上添加或修改文档。它会起作用吗?对每个主机上的同一文档进行不同的更改。
您期望每个应用程序都能继续运行吗?应该是这样的,这就是故障转移的目的。但每个人都认为对方已经死了,所以他们不会试图复制,相反,他们都充当主控(或者他们都失败了-他们无法区分,所以没有办法选择哪个更好)
现在,在A和B都有不同的更改后,重新连接网络。您预计会发生什么?A和B的哪些更改将被复制?B会放弃自己的主控地位,把它的修改交给A吗?或者A会意识到B刚刚恢复并将其更改发送给B吗?两个文档都更改了怎么办?
另一个(更复杂但很有启发性的)实验是在你和集群之间设置一个负载均衡器。这将随着时间的推移向两个主机发送请求。
现在断开主机之间的网络,但不要断开负载均衡器和每个主机之间的网络。运行你的应用...它仍然会像以前一样相信自己只是在与“一个主机”对话。但更改将发送到A和B,具体取决于负载均衡器。您期望的用户体验是什么?如果请求1更新A,则请求2从B获取文档...用户(和应用程序)将得到不一致的结果-如果有的话。这真是不太好。
发生故障转移...但系统作为一个整体是不一致的,并且没有意识到这一点。它将在您尝试的实验中工作,因为您知道只与A对话,但这不是故障转移的目的。您可以使用RAID或分布式文件系统或简单的连续备份来实现这一点...
故障转移是指能够处理系统脱机或彼此断开连接,并且无论您将请求发送到哪台主机,群集作为一个整体仍可正常工作并保持一致。
对于3台主机,它可以从所有3台主机工作到所有3台完全离线或断开连接,它不会以不一致的方式运行。对任何主机的请求要么会成功并与其余主机保持一致,要么会失败(因为主机离线或已确定它不再是集群的一部分)。
对于2台主机(或任意偶数),您无法同时可靠地实现一致性和复制的“故障转移”。
您可以在集群之间进行“复制”(请参阅数据库复制和灵活复制),甚至可以在1个节点的集群之间进行复制。但这并不等同于“故障转移”复制是单向的。主节点将数据发送到副本服务器。如果其中一个失败,您可以决定将流量发送到另一个...但在这一点上,您需要稍后进行手动干预,以尝试使数据恢复同步。
您可以看到https://docs.marklogic.com/guide/database-replication中的差异
发布于 2014-11-08 01:01:46
要使故障转移正常工作,群集至少需要三台主机。在只有两台主机的情况下,存在"split brain“问题的危险,例如,如果网络链路出现故障。
https://stackoverflow.com/questions/26802068
复制相似问题