面试题答案
一键面试1. 复制与同步机制
- 双向复制:CouchDB支持双向复制,通过将数据在不同节点间进行复制,确保数据的一致性。例如,节点A和节点B之间可以设置双向复制,这样无论在哪个节点进行数据修改,都会同步到另一个节点。
curl -X POST http://localhost:5984/_replicate -d '{"source":"db1","target":"db2","create_target":true,"continuous":true}' -H "Content-Type: application/json"
- 连续复制:设置
continuous
为true
,可实现连续复制,实时监控源数据库的变化并同步到目标数据库,适用于高并发写入场景,能及时传播数据更改。
2. 冲突解决策略
- 修订版本号:CouchDB使用修订版本号(
_rev
)来跟踪文档的变化。每次文档修改,修订版本号都会更新。在多节点并发写入时,如果同一文档在不同节点同时修改,CouchDB会检测到冲突。 - 手动冲突解决:开发人员可以通过API获取冲突文档,手动决定保留哪个版本或合并内容。例如:
curl http://localhost:5984/mydb/_conflicts
然后根据获取到的冲突信息进行处理。
- 自动冲突解决策略:可以设置CouchDB使用特定的自动冲突解决策略,如
last-write-wins
(最后写入获胜),虽然简单但可能丢失部分数据,需谨慎使用。
3. 一致性级别设置
- Quorum 机制:CouchDB支持基于Quorum的一致性级别。通过设置
w
参数,可以指定在写入操作时需要确认写入的节点数量。例如,设置w=majority
,表示需要大多数节点确认写入成功,才认为写入操作成功。这可以有效保证在多节点环境下数据的一致性。
curl -X PUT http://localhost:5984/mydb/my_doc -d '{"key":"value"}' -H "Content-Type: application/json" -d '{"w":"majority"}'
4. 设计文档与验证函数
- 验证函数:在设计文档中,可以编写验证函数(
validate_doc_update
)。这个函数会在每次文档更新时被调用,用于检查更新是否符合特定规则。例如,可以验证数据格式、确保某些字段的唯一性等。
function(newDoc, oldDoc, userCtx) {
if (newDoc.some_field === null) {
throw({forbidden: "some_field cannot be null"});
}
}
这样可以在数据写入时提前拦截不符合规则的更新,保证数据一致性。