面试题答案
一键面试搭建MongoDB副本集步骤
- 准备工作:
- 确保安装了MongoDB,并且各节点(主节点、从节点)之间网络互通。
- 为每个节点创建数据目录和日志目录,例如:
mkdir -p /data/mongodb/node1/data mkdir -p /data/mongodb/node1/logs
- 配置每个节点的
mongod.conf
文件:- 以一个节点为例,编辑
mongod.conf
,以下是基本配置内容:
systemLog: destination: file path: /data/mongodb/node1/logs/mongod.log logAppend: true storage: dbPath: /data/mongodb/node1/data net: bindIp: 0.0.0.0 port: 27017 replication: oplogSizeMB: 1024 replSetName: rs0
- 其中
replSetName
是副本集的名称,所有节点需保持一致。oplogSizeMB
用于设置操作日志大小,可根据实际需求调整。
- 以一个节点为例,编辑
- 启动各节点的
mongod
服务:- 在每个节点所在目录执行:
mongod -f /etc/mongod.conf
- 初始化副本集:
- 连接到其中一个节点,例如主节点:
mongo --port 27017
- 在MongoDB shell中执行初始化命令:
rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "node1:27017" }, { _id: 1, host: "node2:27017" }, { _id: 2, host: "node3:27017" } ] });
- 这里
_id
需与replSetName
一致,members
数组中列出了副本集中所有节点的主机名和端口。
读写分离相关配置参数说明
- 读偏好(Read Preference):
- Primary:默认设置,读操作只在主节点执行。这确保了读取到的是最新数据,但可能会给主节点带来较大负载。
- PrimaryPreferred:优先在主节点执行读操作,如果主节点不可用,则在从节点执行读操作。
- Secondary:读操作只在从节点执行。适用于对数据实时性要求不高,希望减轻主节点负载的场景,但可能读取到的数据不是最新的。
- SecondaryPreferred:优先在从节点执行读操作,如果所有从节点不可用,则在主节点执行读操作。
- Nearest:在延迟最小的节点执行读操作,无论该节点是主节点还是从节点。
- 在应用程序中设置读偏好,以Python的
pymongo
库为例:
from pymongo import MongoClient, ReadPreference client = MongoClient('mongodb://node1:27017,node2:27017,node3:27017/?replicaSet=rs0', read_preference = ReadPreference.SECONDARY)
- 写关注(Write Concern):
- w参数:用于指定写操作需要确认的节点数。例如
w:1
表示只需主节点确认写操作成功;w:2
表示需要主节点和至少一个从节点确认写操作成功。更高的w
值可以提高数据的安全性,但会增加写操作的延迟。 - j参数:
j=true
表示写操作需要等待数据写入磁盘日志(journal)后才返回确认,这可以保证数据的持久性,但同样会增加写操作的延迟。在应用程序中设置写关注,以pymongo
为例:
collection = client.test.collection result = collection.insert_one({"key": "value"}, write_concern = {"w": 2, "j": true})
- w参数:用于指定写操作需要确认的节点数。例如