面试题答案
一键面试- 版本控制与冲突检测:
- CouchDB使用基于修订版本号(revision number)的机制。每个文档都有一个修订版本号,每次文档更新时,修订版本号会递增。当客户端尝试更新文档时,它必须提供当前文档的修订版本号。
- 如果多个客户端同时对同一文档发起更新操作,CouchDB会检查修订版本号。若其中一个客户端的更新请求所带的修订版本号不是最新的,CouchDB会检测到冲突。例如,客户端A和客户端B同时读取文档,其修订版本号为
1 - abc
。客户端A先完成更新,修订版本号变为2 - def
。此时客户端B尝试更新,由于它携带的还是1 - abc
,CouchDB会发现冲突。
- 冲突解决策略:
- 手动解决:当检测到冲突时,CouchDB不会自动解决冲突,而是将冲突的文档版本保留下来。这些冲突的文档版本以特殊的格式存储在文档的
_conflicts
属性中。开发人员需要手动检查这些冲突版本,并根据业务逻辑决定如何合并或选择正确的版本。例如,对于一个用户信息文档,一个更新操作可能是修改地址,另一个更新操作可能是修改电话号码,开发人员可以根据实际情况将两个修改合并。 - 自动合并(对于某些简单情况):对于一些简单的更新操作,如增加计数器的值,CouchDB可以使用一种称为“最后写入者获胜(Last - Write - Wins,LWW)”的策略。如果两个更新操作都是增加计数器的值,并且不依赖于当前计数器的具体值,CouchDB可以简单地将两个增加操作的结果合并。但对于复杂且相互依赖的更新操作,这种策略一般不适用。
- 手动解决:当检测到冲突时,CouchDB不会自动解决冲突,而是将冲突的文档版本保留下来。这些冲突的文档版本以特殊的格式存储在文档的
- 跨节点复制与同步:
- CouchDB使用多主复制模型。每个节点都可以接收更新操作,然后将这些更新操作复制到其他节点。当一个节点接收到更新时,它会将更新记录在自己的变更日志(change log)中。
- 节点之间通过定期的复制任务来同步变更。在同步过程中,每个节点会将自己变更日志中的更新发送给其他节点。接收节点会检查这些更新,如果没有冲突,就会应用这些更新。如果有冲突,接收节点会按照上述冲突解决策略来处理。例如,节点A和节点B是CouchDB集群中的两个节点,节点A接收到一个文档的更新,它将更新记录在变更日志中。随后,节点A和节点B之间的复制任务启动,节点A将更新发送给节点B,节点B检查是否有冲突并处理。
- 基于向量时钟(Vector Clock)的一致性保证:
- 向量时钟是一种用于跟踪分布式系统中事件因果关系的数据结构。在CouchDB中,向量时钟用于确保跨节点的一致性。每个节点都维护一个向量时钟,向量时钟中的每个元素对应一个节点以及该节点上发生的事件数。
- 当一个节点接收到更新时,它会更新自己的向量时钟,并将向量时钟与更新一起发送给其他节点。接收节点通过比较向量时钟来确定更新的顺序和因果关系。如果一个更新的向量时钟在接收节点看来是合理的(即没有违反因果关系),接收节点会应用该更新。例如,节点A和节点B分别有向量时钟
VC_A = {A: 5, B: 3}
和VC_B = {A: 4, B: 4}
,当节点A向节点B发送更新时,节点B通过比较向量时钟可以判断该更新是否符合因果关系,从而决定是否应用更新。通过这种方式,CouchDB可以在复杂的跨节点更新场景下,确保最终一致性。