面试题答案
一键面试- 确定需要同步的数据:
- CouchDB集群节点通过维护的文档修订历史(_rev字段)来确定需要同步的数据。每个文档在每次修改时,_rev字段都会更新。
- 节点会比较本地和其他节点上相同文档的_rev值。如果本地文档的_rev与其他节点不同,就表明存在数据差异,该文档需要同步。
- 此外,节点还会跟踪数据库的更新序列号(seq),通过比较本地和远程节点的seq值,能快速判断哪些数据范围需要同步。
- 同步的方向:
- 在CouchDB集群中,同步方向是双向的。任何一个节点都可以作为源节点向目标节点推送数据,同时也可以作为目标节点接收其他节点的数据。
- 当一个节点检测到数据差异时,它会与其他节点建立连接,协商同步操作。同步过程可以由主动检测到差异的节点发起,也可以由其他节点响应请求来进行。
- 处理冲突:
- 文档级冲突:
- 当两个或多个节点对同一文档进行并发修改时,会产生文档级冲突。CouchDB会将冲突的文档版本都保留,每个冲突版本有不同的_rev值。
- 在读取文档时,CouchDB会提供所有冲突版本的列表,应用程序可以根据业务逻辑选择合适的版本,比如选择最新修改的版本,或者根据自定义策略(如用户优先级等)选择。
- 数据库级冲突:
- 数据库级冲突主要涉及数据库结构的变更,如新增或删除设计文档等。
- CouchDB通过版本向量(version vector)来处理这类冲突。版本向量记录了每个节点对数据库的变更历史。当节点间发生数据库级冲突时,通过比较版本向量,节点可以识别出哪些变更需要合并,哪些需要丢弃,以达到最终的一致性。
- 文档级冲突:
