面试题答案
一键面试1. 副本集架构
连接策略
使用 pymongo.MongoClient
连接副本集时,需要提供副本集中多个成员的地址。例如:
from pymongo import MongoClient
client = MongoClient('mongodb://member1:27017,member2:27017,member3:27017/?replicaSet=myReplicaSet')
数据读写策略
- 读策略:
- Primary:默认策略,从主节点读取数据,保证数据一致性,但主节点压力较大。
- PrimaryPreferred:优先从主节点读取,主节点不可用时从从节点读取。
- Secondary:从从节点读取数据,可分担主节点压力,但数据可能存在延迟。
- SecondaryPreferred:优先从从节点读取,从节点不可用时从主节点读取。
- Nearest:从最近的节点读取数据,适用于分布式部署且对数据一致性要求不高的场景。
- 设置读策略示例:
collection = client['my_database']['my_collection']
results = collection.find(read_preference=ReadPreference.SECONDARY)
- 写策略:
- w=1:默认策略,写操作仅在主节点确认写入成功后返回,性能较高但数据一致性相对较弱。
- w=majority:写操作需等待大多数节点(超过一半)确认写入成功后返回,保证数据一致性,但性能相对较低。
- 设置写策略示例:
collection.insert_one({'key': 'value'}, write_concern=WriteConcern(w='majority'))
可能出现的问题及解决方案
- 数据一致性问题:使用非
Primary
读策略时,可能读到旧数据。解决方案是根据业务场景选择合适的读策略,对一致性要求高的场景使用Primary
策略。 - 主节点压力过大:使用
Primary
读策略或w=1
写策略可能导致主节点压力大。可以通过使用合适的读策略(如SecondaryPreferred
)和写策略(如w=majority
结合合适的副本集配置)来分担压力。
2. 分片集群架构
连接策略
使用 pymongo.MongoClient
连接分片集群时,只需连接到mongos路由节点。例如:
client = MongoClient('mongodb://mongos1:27017,mongos2:27017')
数据读写策略
- 读策略:与副本集类似,可选择不同的读偏好。但由于分片集群中数据分布在多个分片上,读操作会自动路由到相应的分片。
- 写策略:
- 写入操作会自动路由到对应的分片。为保证数据一致性,可使用
w=majority
等写关注。例如:
- 写入操作会自动路由到对应的分片。为保证数据一致性,可使用
collection = client['my_database']['my_collection']
collection.insert_one({'key': 'value'}, write_concern=WriteConcern(w='majority'))
可能出现的问题及解决方案
- 数据倾斜:某些分片负载过高,可能导致读写性能下降。解决方案是合理选择分片键,确保数据均匀分布在各个分片上。
- mongos节点故障:如果某个mongos节点故障,可能影响连接。可通过配置多个mongos节点,客户端自动进行故障转移。