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)和驱动程序提供不同的方式来设置持久的读取偏好。
posted @ 2023-10-04 18:00  yifanSJ  阅读(62)  评论(0编辑  收藏  举报