MongoDB高阶特性:副本集
一、副本集(主从复制)
1、docker-compose.yml
version: '3'
services:
mongo1:
image: mongo:5.0.8
container_name: mongo1
command: mongod --replSet rs0 --port 27017 --keyFile /data/mongodb/keyFile
volumes:
- /etc/localtime:/etc/localtime
- ./mongodb-cluster/mongod1:/data/db
- ./mongodb-cluster/keyFile:/data/mongodb/keyFile
ports:
- "27017:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: admin
networks:
- weiji-net
mongo2:
image: mongo:5.0.8
container_name: mongo2
command: mongod --replSet rs0 --port 27018 --keyFile /data/mongodb/keyFile
volumes:
- /etc/localtime:/etc/localtime
- ./mongodb-cluster/mongod2:/data/db
- ./mongodb-cluster/keyFile:/data/mongodb/keyFile
ports:
- "27018:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: admin
networks:
- weiji-net
mongo3:
image: mongo:5.0.8
container_name: mongo3
command: mongod --replSet rs0 --port 27019 --keyFile /data/mongodb/keyFile
volumes:
- /etc/localtime:/etc/localtime
- ./mongodb-cluster/mongod3:/data/db
- ./mongodb-cluster/keyFile:/data/mongodb/keyFile
ports:
- "27019:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: admin
networks:
- weiji-net
networks:
weiji-net:
external: true
name: app_net
2、准备keyFile
openssl rand -base64 128 > ./mongodb-cluster/keyFile
sudo chmod 600 keyFile
sudo chown 999:999 keyFile
3、初始化副本集
进入mongodb容器中
docker exec -it mongo1 mongo --host mongo1:27017 -u admin -p admin
初始化副本集(rs0)
var cfg = {"_id": "rs0","members": [{"_id": 0,"host": "mongo1:27017","priority": 2},{"_id": 1,"host": "mongo2:27018","priority": 1},{"_id": 2,"host": "mongo3:27019","priority": 0}]};
rs.initiate(cfg, { force: true }); # 初始化副本集。force: true 强制初始化
rs.reconfig(cfg, { force: true }); # 重新配置副本集
rs.secondaryOk(); # 仅当前会话有效,MongoDB shell 命令,允许你对次要节点进行读取操作,但无需更改默认的读取偏好
rs.status(); # 获取副本集的当前状态,包括主节点(PRIMARY)、次要节点(SECONDARY)
db.getMongo().setReadPref('nearest'); # 仅当前会话有效,临时将读取偏好设置为最近的节点,这意味着在查询时将优先考虑距离你的应用程序最近的节点,不考虑它们的角色(主节点或次要节点),这对于需要低延迟的应用程序非常有用,但可能会导致读取的一致性差异,因为它可能会从不同的节点返回数据。
db.getMongo().setSecondaryOk(); # 仅当前会话有效,MongoDB 驱动程序(如 Node.js 或 Python)中的一个函数,允许你对次要节点进行读取操作,但无需更改默认的读取偏好
4、测试
连接主节点
你也可以使用mongodb客户端工具连接主节点或命令行进入
docker exec -it mongo1 mongo --host mongo1:27017 -u admin -p admin
主节点增加数据
use test
db.testCollection.insert({ message: "Hello, MongoD1111111111111B" })
db.testCollection.find()
连接从节点
docker exec -it mongo2 mongo --host mongo2:27018 -u admin -p admin
检查从节点是否同步
当你从主节点进入容器后,可以直接查询到新增的数据,当从从节点进入后需要手动开启“读偏好”,否则会报错“not master and slaveOk=false”
db.getMongo().setSecondaryOk();
use test
db.testCollection.find()
5、相关命令
rs.secondaryOk(); # 仅当前会话有效,MongoDB shell 命令,允许你对次要节点进行读取操作,但无需更改默认的读取偏好
db.getMongo().setSecondaryOk(); # 仅当前会话有效,MongoDB 驱动程序(如 Node.js 或 Python)中的一个函数,允许你对次要节点进行读取操作,但无需更改默认的读取偏好
db.getMongo().setReadPref('nearest'); # 仅当前会话有效,临时将读取偏好设置为最近的节点,这意味着在查询时将优先考虑距离你的应用程序最近的节点,不考虑它们的角色(主节点或次要节点),这对于需要低延迟的应用程序非常有用,但可能会导致读取的一致性差异,因为它可能会从不同的节点返回数据。
db.getMongo().setReadPref("primaryPreferred"); # 仅当前会话有效,临时将读取偏好设置为主节点首选,这意味着查询将首选主节点,但如果主节点不可用,会考虑次要节点。这对于需要强一致性但也能容忍主节点故障的应用程序非常有用。
# 注意:要永久修改 MongoDB 的读取偏好设置,你需要在应用程序级别使用 MongoDB 驱动程序来配置它们。不同的编程语言(Java/Python)和驱动程序提供不同的方式来设置持久的读取偏好。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了