MongoDB副本集

MongoDB的复制主要分2种,一种是Master-Salve(主从复制),一种是副本集(replica sets),MongoDB4.0之后就不支持主从复制了,官方原话

MongoDB 4.0 removes support for the deprecated master-slave replication. Before you can upgrade to MongoDB 4.0, if your deployment uses master-slave replication, you must upgrade to a replica set.

MongoDB 4.0删除了对主从复制的支持。在升级到MongoDB 4.0之前,如果部署使用主从复制,则必须升级到副本集.本文只讲解副本集的部署步骤。副本集相比较主从复制而言有2点区别:

  1. 该集群没有特定的主数据库。
  2. 如果哪个主数据库宕机了,集群中就会推选出一个从属数据库作为主数据库顶上,这就具备了自动故障恢复功能,很牛X的啊。

角色说明:

1.主库

理论上所有副本集中的数据库都能读取数据,但是系统会默认让主库来完成读取数据的功能

2.辅助副本

主服务器是副本集中唯一接收写操作的成员。MongoDB在主服务器上应用写操作,然后在主服务器的oplog上记录操作。辅助成员复制此日志并将操作应用于其数据集。

3.仲裁者

在主库宕机后重新投票选举出新的主库,它自己不能是主库也不能是辅助副本

副本集配置

1.创建每个库的配置文件,日志文件和数据存档的目录,我本机选择的是 /Data/MongoReplSet/下,MongoReplSet也是我自建的

MongoReplSet下的目录结构

├── conf
│   ├── db1.conf
│   ├── db2.conf
│   └── db3.conf
├── dbs
│   ├── db1
│   ├── db2
│   └── db3
└── logs
    ├── db1.log
    ├── db2.log
    └── db3.log

conf下的配置内容,其中replSet的值是这个副本集的名称

db1.conf

​ dbpath=/Data/MongoReplSet/dbs/db1
​ logpath=/Data/MongoReplSet/logs/db1.log
​ logappend=true
​ noprealloc=true
​ port=27011
​ fork=true
​ replSet=test

db2.conf

​ dbpath=/Data/MongoReplSet/dbs/db2
​ logpath=/Data/MongoReplSet/logs/db2.log
​ logappend=true
​ noprealloc=true
​ port=27012
​ fork=true
​ replSet=test

db3.conf

​ dbpath=/Data/MongoReplSet/dbs/db3
​ logpath=/Data/MongoReplSet/logs/db3.log
​ logappend=true
​ noprealloc=true
​ port=27013
​ fork=true
​ replSet=test

2.进入3个实例中的任何一个,初始化副本集

mongo --port 27011

use admin
config={
    _id:'test',
    members:[
        {_id:1, host:'localhost:27011',priority:2},
        {_id:2, host:'localhost:27012',priority:1},
        {_id:3, host:'localhost:27013',arbiterOnly:true}
    ]
}

rs.initiate(config)

_id:'test'表示副本集名称,与前面conf配置文件中的replSet参数配置的名称要一致。

priority:2表示优先级,优先级越高,副本集初始化时会选举为主库。arbiterOnly:true表示该实例为仲裁节点,不存储数据,只参与投票。

3.rs.status()查看副本集状态

test:SECONDARY> rs.status()
{
    "set" : "test",
    "date" : ISODate("2019-03-05T05:44:28.581Z"),
    "myState" : 2,
    "term" : NumberLong(0),
    "syncingTo" : "",
    "syncSourceHost" : "",
    "syncSourceId" : -1,
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(0, 0),
            "t" : NumberLong(-1)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1551764659, 1),
            "t" : NumberLong(-1)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1551764659, 1),
            "t" : NumberLong(-1)
        }
    },
    "lastStableCheckpointTimestamp" : Timestamp(0, 0),
    "members" : [
        {
            "_id" : 1,
            "name" : "localhost:27011",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 108,
            "optime" : {
                "ts" : Timestamp(1551764659, 1),
                "t" : NumberLong(-1)
            },
            "optimeDate" : ISODate("2019-03-05T05:44:19Z"),
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "infoMessage" : "could not find member to sync from",
            "configVersion" : 1,
            "self" : true,
            "lastHeartbeatMessage" : ""
        },
        {
            "_id" : 2,
            "name" : "localhost:27012",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 8,
            "optime" : {
                "ts" : Timestamp(1551764659, 1),
                "t" : NumberLong(-1)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1551764659, 1),
                "t" : NumberLong(-1)
            },
            "optimeDate" : ISODate("2019-03-05T05:44:19Z"),
            "optimeDurableDate" : ISODate("2019-03-05T05:44:19Z"),
            "lastHeartbeat" : ISODate("2019-03-05T05:44:28.245Z"),
            "lastHeartbeatRecv" : ISODate("2019-03-05T05:44:28.124Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "",
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "infoMessage" : "",
            "configVersion" : 1
        },
        {
            "_id" : 3,
            "name" : "localhost:27013",
            "health" : 1,
            "state" : 7,
            "stateStr" : "ARBITER",
            "uptime" : 8,
            "lastHeartbeat" : ISODate("2019-03-05T05:44:28.245Z"),
            "lastHeartbeatRecv" : ISODate("2019-03-05T05:44:27.654Z"),
            "pingMs" : NumberLong(0),
            "lastHeartbeatMessage" : "",
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "infoMessage" : "",
            "configVersion" : 1
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1551764659, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1551764659, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

members下面就是整个副片集的成员,其中 27011端口号下面的 infoMessage:'could not find member to sync from',表示它没有可以同步的数据集,因为他是主库,只负责写入

4.主库添加测试数据

test:PRIMARY> use test
switched to db test
test:PRIMARY> db.person.insertMany([{"name":"tom", "age": 20}, {"name":"jack", "age":21}, {"name":"luna", "age":18}])
{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("5c7e13b79d270105c2390fcd"),
        ObjectId("5c7e13b79d270105c2390fce"),
        ObjectId("5c7e13b79d270105c2390fcf")
    ]
}

进副库检查

mongo --port 27012
test:SECONDARY> show dbs
2019-03-05T14:14:44.483+0800 E QUERY    [js] Error: listDatabases failed:{
    "operationTime" : Timestamp(1551766483, 1),
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1551766483, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
} :

发现没有权限查看,临时解决方案 执行 rs.slaveOk()

test:SECONDARY>  rs.slaveOk()
test:SECONDARY> show collections
person
test:SECONDARY> db.person.find()
{ "_id" : ObjectId("5c7e652ecf158632e56497cb"), "name" : "jack", "age" : 21 }
{ "_id" : ObjectId("5c7e652ecf158632e56497cc"), "name" : "luna", "age" : 18 }
{ "_id" : ObjectId("5c7e652ecf158632e56497ca"), "name" : "tom", "age" : 20 }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 1. 副本集概述 某些情况下,副本可以提供更高的读取容量,就像客户端可以发送读操作到不同的服务器。在不同数据中心维...
    LLLeon阅读 10,456评论 2 7
  • mongodb副本集即客户端连接到整个副本集,不关心具体哪一台机器是否挂掉。主服务器负责整个副本集的读写,副本集定...
    yaya520阅读 7,121评论 0 4
  • 网上有很多说副本集用户名密码配置的,但是很多都不靠谱,本人实测采坑总结如下: ######配置副本集#### 1....
    山石水寿阅读 5,737评论 1 0
  • 一.什么是MongoDB副本集? 副本集是一组mongod维护相同数据集的实例,它提供了数据的冗余备份,并在多个服...
    会九卦的兔子阅读 6,400评论 0 1
  • 2017年8月6号第一次参加拆书帮线下活动,在此之前对这一帮毫无了解,那次活动是一次考验,炎热的天气,身体的不...
    蓝色木棉花阅读 412评论 0 0