0%

mongodb的主从复制流程

1. mongodb 主从复制

MongoDB 有三种集群部署模式,分别为主从复制(Master-Slaver)、副本集(Replica Set)和分片(Sharding)模式。

  • Master-Slaver 是一种主从副本的模式,目前已经不推荐使用。
  • Replica Set 模式取代了 Master-Slaver 模式,是一种互为主从的关系。Replica Set 将数据复制多份保存,不同服务器保存同一份数据,在出现故障时自动切换,实现故障转移,在实际生产中非常实用。
  • Sharding 模式适合处理大量数据,它将数据分开存储,不同服务器保存不同的数据,所有服务器数据的总和即为整个数据集。

1.1 主从复制(不推荐)

  • –master用来确定主服务器

  • –slave 和 –source 来控制从服务器

  • 可以在mongodb.conf配置文件里指明主从关系,这样启动mongodb的时候只要跟上配置文件就行,就不需要通过–master和–slave来指明主从了。

1.2 副本集

只能 master 写, 从不能写。

  • 下载

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    docker pull mongo:latest

    # 主服务器
    docker run \
    -d \
    -p 27018:27017 \
    --name mongo1 \
    mongo mongod --replSet my-mongo-set

    # 从服务器
    docker run \
    -d \
    -p 27019:27017 \
    --name mongo2 \
    mongo mongod --replSet my-mongo-set
  • 配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    docker exec -it mongo1 mongo

    config = {
    "_id" : "my-mongo-set",
    "members" : [
    {
    "_id" : 0,
    "host" : "172.17.0.1:27018"
    },
    {
    "_id" : 1,
    "host" : "172.17.0.1:27019"
    }
    ]
    }
    rs.initiate(config)
    # 下面是输出
    {
    "ok" : 1,
    "$clusterTime" : {
    "clusterTime" : Timestamp(1595349445, 1),
    "signature" : {
    "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    "keyId" : NumberLong(0)
    }
    },
    "operationTime" : Timestamp(1595349445, 1)
    }

    # 如果一切顺利,提示符将变成这样:(需手动随便敲命令触发下)
    my-mongo-set:PRIMARY>
  • 测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # 启动从服务器
    docker exec -it mongo2 mongo
    my-mongo-set:PRIMARY>


    # 主服务器
    my-mongo-set:PRIMARY> db.mycollection.insert({name : 'sample'})
    WriteResult({ "nInserted" : 1 })
    my-mongo-set:PRIMARY> db.mycollection.find()
    { "_id" : ObjectId("5f171a9bfb41dd82f33d6b2d"), "name" : "sample" }

    # 从服务器
    my-mongo-set:SECONDARY> db.setSlaveOk() # 设置同步
    my-mongo-set:SECONDARY> db.mycollection.find()
    { "_id" : ObjectId("5f171a9bfb41dd82f33d6b2d"), "name" : "sample" }


    # 查询状态
    1. 判断是不是master: db.isMaster()
    2. 复制集状态查询:rs.status()
    3. 查看oplog状态: rs.printReplicationInfo()
    4. 查看复制延迟:  rs.printSlaveReplicationInfo()
    5. 查看服务状态详情:   db.serverStatus()

2. 参考资料

可以加首页作者微信,咨询相关问题!