1.安装副本集介绍
副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成。通过Replication,将数据的更新由Primary推送到其他实例上,在一定的延迟之后,每个MongoDB实例维护相同的数据集副本。通过维护冗余的数据库副本,能够实现数据的异地备份,读写分离和自动故障转移。
也就是说如果主服务器崩溃了,备份服务器会自动将其中一个成员升级为新的主服务器。使用复制功能时,如果有一台服务器宕机了,仍然可以从副本集的其他服务器上访问数据。如果服务器上的数据损坏或者不可访问,可以从副本集的某个成员中创建一份新的数据副本。
早期的MongoDB版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主。目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主。在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据。此架构中读写数据都是在主上,要想实现负载均衡的目的需要手动指定读库的目标server。
官方文档地址:https://docs.mongodb.com/manual/replication/
副本集架构图:



2.mongodb副本集搭建
由于在本地虚拟机中,机器有限,搭建伪集群模拟
首先安装启动三个mongod进程 端口分别是:27017,27108,27019
具体步骤如下:
2.1 依次启动mongodb服务
①解压
tar zxvf mongodb-linux-x86_64-rhel62-3.6.3.tgz
②修改名称
mv mongodb-linux-x86_64-rhel62-3.6.3 mongodb1
③创建相应的文件夹
cd mongodb1
mkdir data   //数据目录
mkdir logs   //日志目录
mkdir conf  // 配置文件目录
cd conf
touch mongo.conf   //新建配置文件
port=27017 
dbpath=/home/lcc/mongodb1/data 
logpath=/home/lcc/mongodb1/logs/mongod.log 
fork = true    //后台启动 
bind_ip=0.0.0.0 
replSet = replset  //副本集的名称 
 | 
④启动mongod服务
cd mongodb1
./bin/mongod -f conf/mongo.conf
至此mongodb1就启动起来了,依次启动mongodb2,mongodb3(注意修改暴露端口)
2.2 副本集配置
服务器启动之后,进入任意一个节点的命令行,将三个的实例关联起来
进入mongodb1的客户端:
cd mongodb1
./bin/mongo
> config = { 
... _id : "replset", 
... members : [ 
... {_id : 0, host : "192.168.73.29:27017"}, 
... {_id : 1, host : "192.168.73.29:27018"}, 
... {_id : 2, host : "192.168.73.29:27019"}]} 
{ 
        "_id" : "replset", 
        "members" : [ 
                { 
                        "_id" : 0, 
                        "host" : "192.168.73.29:27017" 
                }, 
                { 
                        "_id" : 1, 
                        "host" : "192.168.73.29:27018" 
                }, 
                { 
                        "_id" : 2, 
                        "host" : "192.168.73.29:27019" 
                } 
        ] 
}
 | 
初始化副本集的配置
rs.initiate(config) 
{ 
        "ok" : 1, 
        "operationTime" : Timestamp(1520260635, 1), 
        "$clusterTime" : { 
                "clusterTime" : Timestamp(1520260635, 1), 
                "signature" : { 
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), 
                        "keyId" : NumberLong(0) 
                } 
        } 
} 
replset:SECONDARY>  
 | 
当初始化配置信息后,可以明显的看到mongodb的命令行发生了变化,会显示出当前节点所属的副本集名称和节点类型。
再次进去mongodb1客户端:

发现mongodb1作为了主节点
至此,mongodb的副本集配置已经完成了,接下来是测试副本集是否可用
3.测试
3.1查看副本集状态
replset:SECONDARY> rs.config() 
{ 
    "_id" : "replset", 
    "version" : 1, 
    "protocolVersion" : NumberLong(1), 
    "members" : [ 
        { 
            "_id" : 0, 
            "host" : "192.168.73.129:27017", 
            "arbiterOnly" : false, 
            "buildIndexes" : true, 
            "hidden" : false, 
            "priority" : 1, 
            "tags" : {
            }, 
            "slaveDelay" : NumberLong(0), 
            "votes" : 1 
        }, 
        { 
            "_id" : 1, 
            "host" : "192.168.73.129:27018", 
            "arbiterOnly" : false, 
            "buildIndexes" : true, 
            "hidden" : false, 
            "priority" : 1, 
            "tags" : {
            }, 
            "slaveDelay" : NumberLong(0), 
            "votes" : 1 
        }, 
        { 
            "_id" : 2, 
            "host" : "192.168.73.129:27019", 
            "arbiterOnly" : false, 
            "buildIndexes" : true, 
            "hidden" : false, 
            "priority" : 1, 
            "tags" : {
            }, 
            "slaveDelay" : NumberLong(0), 
            "votes" : 1 
        } 
    ], 
    "settings" : { 
        "chainingAllowed" : true, 
        "heartbeatIntervalMillis" : 2000, 
        "heartbeatTimeoutSecs" : 10, 
        "electionTimeoutMillis" : 10000, 
        "catchUpTimeoutMillis" : -1, 
        "catchUpTakeoverDelayMillis" : 30000, 
        "getLastErrorModes" : {
        }, 
        "getLastErrorDefaults" : { 
            "w" : 1, 
            "wtimeout" : 0 
        }, 
        "replicaSetId" : ObjectId("5b3c7d50a5952cfcd32c859b") 
    } 
} 
replset:PRIMARY>  
 | 
3.2 查看主节点信息
replset:PRIMARY> rs.isMaster() 
{ 
    "hosts" : [ 
        "192.168.73.129:27017", 
        "192.168.73.129:27018", 
        "192.168.73.129:27019" 
    ], 
    "setName" : "replset", 
    "setVersion" : 1, 
    "ismaster" : true, 
    "secondary" : false, 
    "primary" : "192.168.73.129:27017", 
    "me" : "192.168.73.129:27017", 
    "electionId" : ObjectId("7fffffff0000000000000001"), 
    "lastWrite" : { 
        "opTime" : { 
            "ts" : Timestamp(1530690959, 1), 
            "t" : NumberLong(1) 
        }, 
        "lastWriteDate" : ISODate("2018-07-04T07:55:59Z"), 
        "majorityOpTime" : { 
            "ts" : Timestamp(1530690959, 1), 
            "t" : NumberLong(1) 
        }, 
        "majorityWriteDate" : ISODate("2018-07-04T07:55:59Z") 
    }, 
    "maxBsonObjectSize" : 16777216, 
    "maxMessageSizeBytes" : 48000000, 
    "maxWriteBatchSize" : 100000, 
    "localTime" : ISODate("2018-07-04T07:56:08.530Z"), 
    "logicalSessionTimeoutMinutes" : 30, 
    "minWireVersion" : 0, 
    "maxWireVersion" : 6, 
    "readOnly" : false, 
    "ok" : 1, 
    "operationTime" : Timestamp(1530690959, 1), 
    "$clusterTime" : { 
        "clusterTime" : Timestamp(1530690959, 1), 
        "signature" : { 
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), 
            "keyId" : NumberLong(0) 
        } 
    } 
} 
replset:PRIMARY>  
 | 
3.3 数据测试
插入100条数据
replset:PRIMARY> show dbs 
admin   0.000GB 
config  0.000GB 
local   0.000GB 
test    0.000GB 
replset:PRIMARY> use test 
switched to db test 
replset:PRIMARY> for(var i = 0; i < 100; i++) { 
... db.test.insert({order: i, name: "test" + i}) } 
WriteResult({ "nInserted" : 1 }) 
replset:PRIMARY> db.test.count() 
100 
replset:PRIMARY> 
 | 
进入副本节点查看数据是否同步
[lcc@localhost mongodb3]$ ./bin/mongo 192.168.73.129:27018 
MongoDB shell version v3.6.3 
connecting to: mongodb://192.168.73.129:27018/test 
MongoDB server version: 3.6.3 
Server has startup warnings: 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database. 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted. 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] **        We suggest setting it to 'never' 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] **        We suggest setting it to 'never' 
2018-07-04T00:46:51.797-0700 I CONTROL  [initandlisten] 
replset:SECONDARY> show dbs 
2018-07-04T01:23:47.373-0700 E QUERY    [thread1] Error: listDatabases failed:{ 
    "operationTime" : Timestamp(1530692619, 1), 
    "ok" : 0, 
    "errmsg" : "not master and slaveOk=false", 
    "code" : 13435, 
    "codeName" : "NotMasterNoSlaveOk", 
    "$clusterTime" : { 
        "clusterTime" : Timestamp(1530692619, 1), 
        "signature" : { 
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), 
            "keyId" : NumberLong(0) 
        } 
    } 
} : 
_getErrorWithCode@src/mongo/shell/utils.js:25:13 
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:65:1 
shellHelper.show@src/mongo/shell/utils.js:816:19 
shellHelper@src/mongo/shell/utils.js:706:15 
@(shellhelp2):1:1 
replset:SECONDARY>  
 | 
当我们要查看从节点数据时,发现出错,这是因为从节点默认情况下是拒绝读取的,因此需开启读取功能
replset:SECONDARY> rs.slaveOk()
 
 | 
接着再查看数据,发现已经同步了
replset:SECONDARY> use test 
switched to db test 
replset:SECONDARY> db.test.count() 
100 
 | 
												
												
								- linux上安装MongoDB副本集(带keyfile安全认证以及用户权限)
		
搭建前准备 MongoDB版本:4.0 主要参考搭建MongoDB副本集网站:https://www.jianshu.com/p/f021f1f3c60b 安装之前最好先确定一下几点: 防火墙关闭 M ...
		 
						- Docker下搭建mongodb副本集
		
背景 有需求需要对mongodb做一个容灾备份.根据官网,发现mongodb最新版本(4.0)已经抛弃了主从模式而采用副本集进行容灾.副本集的优势在于:"有自动故障转移和恢复特性,其任意节点 ...
		 
						- MongoDB在单机上搭建分片副本集群(windows)
		
------------------------------1.安装MongoDB...... ------------------------------2.准备好文件夹 --config:配置文件 ...
		 
						- window系统上实现mongodb副本集的搭建
		
一.问题引出 假设我们生产上的mongodb是单实例在跑,如果此时发生网络发生问题或服务器上的硬盘发生了损坏,那么这个时候我们的mongodb就使用不了.此时我们就需要我们的mongodb实现高可用, ...
		 
						- MongoDB在单机上搭建分片副本集群(windows),版本二
		
配置可以参考前面一篇 https://www.cnblogs.com/a-horse-mosaic/p/9284010.html 副本集是一组服务器,其中有一个主服务器(primary),用于处理客户 ...
		 
						- docker-compose搭建mongoDB副本集(1主+1副+1仲裁)
		
一.基本概念 1.副本集:一个副本集就是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成 2.主节点(master):主节点接收所有写入操作 ...
		 
						- MongoDB 副本集搭建
		
搭建mongodb副本集 [root@ mongodb]# cd /u02 [root@ u02]# mkdir -p mongodb/data_2777 [root@ u02]# mkdir -p  ...
		 
						- MongoDB 副本集的原理、搭建、应用
		
概念: 在了解了这篇文章之后,可以进行该篇文章的说明和测试.MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组 ...
		 
						- MongoDB副本集学习(一):概述和环境搭建
		
MongoDB副本集概述 以下图片摘自MongoDB官方文档:http://docs.mongodb.org/manual/core/replication-introduction/ Primary ...
		 
		
	
随机推荐
	
									- Buildroot构建指南--快速上手与实用技巧
			
Buildroot官方全英文使用手册的链接是https://buildroot.org/downloads/manual/manual.html,需要知道每一个细节的朋友,可以仔细查阅,这篇文章只是我 ...
			 
						- 关于Fildder更改ip简单配置
			
之前由于我们公司之前的域名备案 所以临时购买了一个域名主机,可能你如果不配置的话有时候看不到你自己app一些抓包信息具体分为以下几步 配置Filter过滤器记得勾选 第一次进入的时候 2.然后我们再H ...
			 
						- Android深入理解JNI(二)类型转换、方法签名和JNIEnv
			
相关文章 Android深入理解JNI系列 前言 上一篇文章介绍了JNI的基本原理和注册,这一篇接着带领大家来学习JNI的数据类型转换.方法签名和JNIEnv. 1.数据类型的转换 首先给出上一篇文章 ...
			 
						- Google内部培训过1.8万人的机器学习速成课
			
什么是(监督)机器学习?简而言之,它是以下几点: ML系统学习如何组合输入以产生对从未见过的数据的有用预测. 我们来探讨基本的机器学习术语. 标签 一个标签是我们预测物品的属性,比如变量y在简单线性回 ...
			 
						- Xcode 8 修改项目名
			
很麻烦,不想修改了 有个教程,贴一下. From: 大发写字的地方 Xcode8 修改包名(含cocopods)
			 
						- 真机调试watch的一系列bug
			
真机调试watch的一系列bug 系列一 WatchKit 2.0 app's bundle ID com.jiaoshi.memoKB is not prefixed by the parent a ...
			 
						- html5大纲算法(目录树)
			
看了<CSS那些事儿>我一直遵循着给每个板块写一个h标签,并保持层次,比如导航条.焦点图我都写了一个缩进隐藏的h标签.这种规范一般人根本看不出来,即使是行内的大多数人也觉得没有必要.可是我 ...
			 
						- 添加删除表格(js完成)【自己实际项目】
			
// 通过dom对象完成 注释掉了 /** function insertRows(){ var tempRow=0; var tbl=document.getElementById("di ...
			 
						- 每天一个linux命令:【转载】nl命令
			
nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...
			 
						- 原生Ajax使用
			
Ajax基础 Ajax(Asynchronous JavaScript And XML)概念:通过XMLHttpRequest对象向服务器提出请求并处理响应,进行页面的局部更新. AJAX都有哪些优点 ...