我的理解可能不错。据我了解,Couchbase使用智能客户端自动选择要在群集中写入或读取的节点。我不明白的是,当这些数据被写入/读取时,它是否也会立即写入所有其他节点?如果是这样,如果节点发生故障,Couchbase如何知道使用与当前操作/密钥“标记为主”的节点不同的节点?如果其中一个节点发生故障,您是否会丢失数据?
Couchbase服务器手册中的这句话让我觉得你做会丢失数据(这会使Couchbase不适合高可用性要求):
用较少的较大节点,在节点发生故障的情况下对其产生影响 申请会更大
提前感谢您的时间:)
答案 0 :(得分:4)
默认情况下,将数据写入couchbase客户端后,只需将数据写入一个节点的内存后返回success
。之后,couchbase将其保存到磁盘并进行复制。
如果要确保数据在大多数客户端库中持久保存到磁盘,则可以使用允许您执行此操作的功能。借助这些功能,您还可以确保将数据复制到另一个节点。此函数称为observe
。
当一个节点发生故障时,它应该是failover
。当在服务器设置中设置Auto failover
超时时,Couchbase服务器可以自动执行此操作。即如果您有3个节点集群,并且存储的数据有2个副本,并且一个节点发生故障,则不会丢失数据。如果第二个节点出现故障,您也不会丢失所有数据 - 它将在最后一个节点上可用。
如果Master
的一个节点发生故障并且故障转移 - 其他活动节点就成了Master
。在您的客户端中,您指向群集中的所有服务器,因此如果它无法从一个节点检索数据,则会尝试从另一个节点获取数据。
此外,如果您有2个节点,则可以安装2个独立的couchbase服务器并配置XDCR(跨数据中心复制),并使用HA代理或其他方式手动检查服务器可用性。这样你只能连接一个ip(代理的ip),它将自动从活动服务器获取数据。
答案 1 :(得分:3)
希望Couchbase是HA系统的一个很好的系统。
让我用几句话解释它是如何工作的,假设你有一个5节点集群。使用客户端API / SDK的应用程序始终了解群集的拓扑结构(以及拓扑中的任何更改)。
当您在群集中设置/获取文档时,Client API使用与服务器相同的算法,以选择应在哪个节点上编写。因此客户端选择使用CRC32哈希节点,在此节点上写入。然后异步地,群集会将1个或多个副本复制到其他节点(取决于您的配置)。
Couchbase当时只有1个文档的活动副本。因此很容易保持一致。因此应用程序从此活动文档中获取和设置。
如果发生故障,服务器还有一些工作要做,一旦发现故障(自动或由监控系统),就会发生“故障转移”。这意味着副本被提升为活动状态,并且知道可以像以前一样工作。通常,您会对节点进行重新平衡以正确平衡群集。
您评论的句子只是说您拥有的节点数量越少,在失败/重新平衡的情况下影响就越大,因为您必须将相同数量的请求路由到较小数量的节点。希望你不要丢失数据;)
您可以在Couchbase CTO博客上找到有关这种工作方式的一些非常详细的信息: http://damienkatz.net/2013/05/dynamo_sure_works_hard.html
注意:我在Couchbase担任开发人员传播者