• MongoDB 复制(副本集)学习


    MongoDB 复制(副本集)学习


    replication set复制集,
    复制集,多台服务器维护相同的数据副本,提高服务器的可用性。
    MongoDB复制是将数据同步在多个服务器的过程。
    复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
    复制还允许您从硬件故障和服务中断中恢复数据。

    设置过程:
    (1)创建示例
    假设创建三台,创建三个实例目录和日志目录:
    mkdir /home/m17 /home/m18 /home/m19 /home/mlog
    启动三个示例,端口分别为27017、27018、27019。
    ./mongod --dbpath=/home/m17 --logpath=/home/mlog/m17.log --fork --port=27017 --replSet=rs2 --smallfiles
    ./mongod --dbpath=/home/m18 --logpath=/home/mlog/m18.log --fork --port=27018 --replSet=rs2 --smallfiles
    ./mongod --dbpath=/home/m19 --logpath=/home/mlog/m19.log --fork --port=27019 --replSet=rs2 --smallfiles
    说明:
    参数--replSet设置一样,才能属于同一个复制集
    参数--smallfiles可以节省空间,提高速度。
    然后使用ps aux | grep mongo可以查看到启动起来的三个端口。
    (2)配置

    使用客户端连接mongo进行配置:
    [test@localhost bin]$ ./mongo

    要管理配置,所以切换到admin上:
    >use admin
    (配置是json格式)
    var rsconf = {
    _id:'rs2',
    members:[
    {"_id":0,host:'192.168.8.172:27017'},
    {_id:1,host:'192.168.8.172:27018'},
    {_id:2,host:'192.168.8.172:27019'}
    ]
    }
    如果没有配置ip,使用127.0.0.1
    var rsconf = {
    _id:'rs2',
    members:[
    {_id:0,host:'127.0.0.1:27017'},
    {_id:1,host:'127.0.0.1:27018'},
    {_id:2,host:'127.0.0.1:27019'}
    ]
    }
    执行后,使用 printjson(rsconf)查看刚才的配置。
    然后执行初始化:
    >rs.initiate(rsconf);
    > rs.initiate(rsconf);
    {
    "ok" : 1,
    "operationTime" : Timestamp(1539933041, 1),
    "$clusterTime" : {
    "clusterTime" : Timestamp(1539933041, 1),
    "signature" : {
    "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    "keyId" : NumberLong(0)
    }
    }
    }
    rs2:SECONDARY>

    查看节点:
    rs.status()

    删除节点:
    rs.remove('127.0.0.1:27019')

    添加节点:
    rs.add('127.0.0.1:27019')

    切换节点:
    默认是在27017端口,即rs2:PRIMARY>状态,
    退出mongo客户端命令模式,
    切换到另一个端口:
    [test@localhost bin]$ ./mongo --port=27018,
    即切换到rs2:SECONDARY>状态。

    测试:
    在主服务上,创建库和集合,
    rs2:PRIMARY> use student
    switched to db student
    rs2:PRIMARY> db.user.insert({uid:1,name:'zhang san'})
    WriteResult({ "nInserted" : 1 })
    rs2:PRIMARY> db.user.find();
    { "_id" : ObjectId("5bc9889f85a0986431fd2499"), "uid" : 1, "name" : "zhang san" }
    去从服务上查看
    show dbs
    然后看到有错误,具体错误信息是:
    ...
    "errmsg" : "not master and slaveOk=false",
    ...
    是因为slave默认不允许读写:
    >rs.slaveOk();
    然后就可以看到主服务器创建的库和集合了。
    同理27019也需要执行这个命令才能自动同步和读写。

    当主服务器27017停掉的时候,
    第二个27018就自动变成主服务器master状态。
    但是27019需要再次执行rs.slaveOk()才能自动同步读写。

    shell脚本:

    #!/bin/bash
    IP=127.0.0.1
    NA=rs2
    
    sudo mkdir -p /home/m17 /home/m18 /home/m19 /home/mlog
    sudo chmod -R 777 /home/m17 /home/m18 /home/m19 /home/mlog
    
    ./mongod --dbpath=/home/m17 --logpath=/home/mlog/m17.log --fork --port=27017 --replSet=${NA} --smallfiles
    ./mongod --dbpath=/home/m18 --logpath=/home/mlog/m18.log --fork --port=27018 --replSet=${NA} --smallfiles
    ./mongod --dbpath=/home/m19 --logpath=/home/mlog/m19.log --fork --port=27019 --replSet=${NA} --smallfiles
    
    ./mongo <<EOF
    
    use admin
    var rsconf
    = { _id:'rs2', members:[ {_id:0,host:'${IP}:27017'}, {_id:1,host:'${IP}:27018'}, {_id:2,host:'${IP}:27019'} ] } rs.initiate(rsconf)

  • 相关阅读:
    leetcode 78. 子集 JAVA
    leetcode 91. 解码方法 JAVA
    leetcode 75. 颜色分类 JAVA
    leetcode 74 搜索二维矩阵 java
    leetcode 84. 柱状图中最大的矩形 JAVA
    last occurance
    first occurance
    classical binary search
    LC.234.Palindrome Linked List
    LC.142. Linked List Cycle II
  • 原文地址:https://www.cnblogs.com/gyfluck/p/9816943.html
Copyright © 2020-2023  润新知