面试题答案
一键面试1. 核心组件
- 文档(Document):CouchDB 中数据的基本存储单元,以 JSON 格式表示。每个文档有唯一的标识符(
_id
),并且可能包含修订版本号(_rev
)。 - 数据库(Database):一组文档的集合,在文件系统中有对应的存储目录。
- 复制协议(Replication Protocol):负责在不同的 CouchDB 节点之间同步数据。
- 冲突检测与解决机制:用于处理多个主节点同时修改同一文档产生的冲突。
2. 多主复制基本工作机制及组件交互
- 初始化复制:
- 用户通过 HTTP API 发起复制请求,指定源数据库和目标数据库。源和目标数据库都可以是不同的 CouchDB 节点上的数据库,这使得多主复制成为可能。例如,有节点 A 和节点 B,用户可以请求从 A 节点的数据库
db1
复制到 B 节点的数据库db2
,同时也可以反向复制。
- 用户通过 HTTP API 发起复制请求,指定源数据库和目标数据库。源和目标数据库都可以是不同的 CouchDB 节点上的数据库,这使得多主复制成为可能。例如,有节点 A 和节点 B,用户可以请求从 A 节点的数据库
- 文档传输:
- 源数据库将文档及其修订版本号发送给目标数据库。每个文档的修订版本号(
_rev
)就像一个版本戳,记录了文档的修改历史。目标数据库接收到文档后,首先检查本地是否已经存在相同_id
的文档。 - 如果目标数据库中不存在该
_id
的文档,直接将其插入。例如,假设 A 节点有一个新文档doc1
要复制到 B 节点,B 节点检查本地没有doc1
(通过_id
判断),就直接插入。 - 如果目标数据库中存在相同
_id
的文档,目标数据库会比较接收到的文档的_rev
与本地文档的_rev
。如果接收到的_rev
版本更新,就用新文档替换本地文档;如果版本相同,说明没有新的修改,不做处理;如果接收到的_rev
版本旧,目标数据库会将自己更新的文档版本信息反馈给源数据库,源数据库可以据此更新自己的文档版本。
- 源数据库将文档及其修订版本号发送给目标数据库。每个文档的修订版本号(
- 冲突检测与解决:
- 当多个主节点同时修改同一文档时,会产生冲突。例如,节点 A 和节点 B 同时修改了
doc1
。在复制过程中,目标数据库(假设是 B 节点,从 A 节点复制数据)发现本地的doc1
与从 A 节点接收到的doc1
虽然_id
相同,但_rev
不同,且修改内容也不同,这就检测到了冲突。 - CouchDB 解决冲突的方式是将冲突的文档版本以数组形式存储在一个特殊的
_conflicts
字段中。应用程序开发者可以在读取文档时,根据_conflicts
字段中的信息,手动编写逻辑来解决冲突,比如根据时间戳选择最新的版本,或者根据特定业务规则合并不同版本的修改。
- 当多个主节点同时修改同一文档时,会产生冲突。例如,节点 A 和节点 B 同时修改了
- 持续同步:
- 多主复制通常是持续进行的。CouchDB 会定期检查源数据库和目标数据库之间的差异,重复上述文档传输、冲突检测与解决等步骤,以确保数据的最终一致性。这意味着即使在复制过程中有新的修改发生在任何一个主节点上,后续的同步操作也能将这些修改传播到其他节点。