MongoDB副本集搭建

一、环境

$ cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)
$ uname -a
Linux zhaopin-2-201 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ mongo --version
MongoDB shell version: 3.0.6

二、准备

1.创建目录
$ sudo mkdir -p /data/mongodb/{data/db0,backup/db0,log/db0,conf/db0}
2.编写配置文件
$ sudo vim /data/mongodb/conf/db0/mongodb.conf
# base
port = 27017
maxConns = 800
filePermissions = 0700
fork = true
noauth = true
dbpath = /data/mongodb/data/db0
pidfilepath = /data/mongodb/data/db0/mongodb.pid
journal = true
# security
nohttpinterface = true
rest = false
# log
logpath = /data/mongodb/log/db0/mongodb.log
logRotate = rename
logappend = true
slowms = 50
replSet = rs0

三、配置副本集

1.配置primary
1)启动
$ sudo /opt/mongodb/bin/mongod --config /data/mongodb/conf/db0/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 48583
child process started successfully, parent exiting
$ mongo
MongoDB shell version: 3.0.6
connecting to: test
> rs.status();
{
        "info" : "run rs.initiate(...) if not yet done for the set",
        "ok" : 0,
        "errmsg" : "no replset config has been received",
        "code" : 94
}
2)初始化
> cfg={_id:"rs0", members:[ {_id:0,host:"172.30.2.201:27017"}] }
{
        "_id" : "rs0",
        "members" : [
                {
                        "_id" : 0,
                        "host" : "172.30.2.201:27017"
                }
        ]
}
> rs.initiate( cfg );
{ "ok" : 1 }
rs0:OTHER> rs.status();
{
        "set" : "rs0",
        "date" : ISODate("2015-09-25T08:31:36.354Z"),
        "myState" : 1,
        "members" : [
                {
                        "_id" : 0,
                        "name" : "172.30.2.201:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 112,
                        "optime" : Timestamp(1443169891, 1),
                        "optimeDate" : ISODate("2015-09-25T08:31:31Z"),
                        "electionTime" : Timestamp(1443169891, 2),
                        "electionDate" : ISODate("2015-09-25T08:31:31Z"),
                        "configVersion" : 1,
                        "self" : true
                }
        ],
        "ok" : 1
}
2.添加节点
1)启动新的节点
$ sudo /opt/mongodb/bin/mongod --config /data/mongodb/conf/db0/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 41794
child process started successfully, parent exiting
$ sudo /opt/mongodb/bin/mongod --config /data/mongodb/conf/db0/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 3761
child process started successfully, parent exiting
2)添加新的节点

在primary上执行:

rs0:PRIMARY> rs.add( "172.30.2.202:27017" );
{ "ok" : 1 }
rs0:PRIMARY> rs.status();
{
        "set" : "rs0",
        "date" : ISODate("2015-09-25T08:34:48.161Z"),
        "myState" : 1,
        "members" : [
                {
                        "_id" : 0,
                        "name" : "172.30.2.201:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 304,
                        "optime" : Timestamp(1443170060, 1),
                        "optimeDate" : ISODate("2015-09-25T08:34:20Z"),
                        "electionTime" : Timestamp(1443169891, 2),
                        "electionDate" : ISODate("2015-09-25T08:31:31Z"),
                        "configVersion" : 2,
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "172.30.2.202:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 27,
                        "optime" : Timestamp(1443170060, 1),
                        "optimeDate" : ISODate("2015-09-25T08:34:20Z"),
                        "lastHeartbeat" : ISODate("2015-09-25T08:34:46.884Z"),
                        "lastHeartbeatRecv" : ISODate("2015-09-25T08:34:46.896Z"),
                        "pingMs" : 0,
                        "configVersion" : 2
                }
        ],
        "ok" : 1
}
rs0:PRIMARY> rs.add( "172.30.2.203:27017" );
{ "ok" : 1 }
rs0:PRIMARY> rs.status();
{
        "set" : "rs0",
        "date" : ISODate("2015-09-25T08:36:22.579Z"),
        "myState" : 1,
        "members" : [
                {
                        "_id" : 0,
                        "name" : "172.30.2.201:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 398,
                        "optime" : Timestamp(1443170158, 1),
                        "optimeDate" : ISODate("2015-09-25T08:35:58Z"),
                        "electionTime" : Timestamp(1443169891, 2),
                        "electionDate" : ISODate("2015-09-25T08:31:31Z"),
                        "configVersion" : 3,
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "172.30.2.202:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 121,
                        "optime" : Timestamp(1443170158, 1),
                        "optimeDate" : ISODate("2015-09-25T08:35:58Z"),
                        "lastHeartbeat" : ISODate("2015-09-25T08:36:22.268Z"),
                        "lastHeartbeatRecv" : ISODate("2015-09-25T08:36:20.949Z"),
                        "pingMs" : 0,
                        "syncingTo" : "172.30.2.201:27017",
                        "configVersion" : 3
                },
                {
                        "_id" : 2,
                        "name" : "172.30.2.203:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 24,
                        "optime" : Timestamp(1443170158, 1),
                        "optimeDate" : ISODate("2015-09-25T08:35:58Z"),
                        "lastHeartbeat" : ISODate("2015-09-25T08:36:22.267Z"),
                        "lastHeartbeatRecv" : ISODate("2015-09-25T08:36:22.275Z"),
                        "pingMs" : 0,
                        "configVersion" : 3
                }
        ],
        "ok" : 1
}

四、验证

1.数据同步
1) primary:
$ mongo
MongoDB shell version: 3.0.6
connecting to: test
rs0:PRIMARY> use aaa;
switched to db aaa
rs0:PRIMARY> db.createCollection( "test" );
{ "ok" : 1 }
rs0:PRIMARY> show collections;
system.indexes
test
2) secondary:
$ mongo
MongoDB shell version: 3.0.6
connecting to: test
rs0:SECONDARY> rs.slaveOk();
rs0:SECONDARY> use aaa;
switched to db aaa
rs0:SECONDARY> show collections;
system.indexes
test
$ mongo
MongoDB shell version: 3.0.6
connecting to: test
rs0:SECONDARY> rs.slaveOk();
rs0:SECONDARY> use aaa;
switched to db aaa
rs0:SECONDARY> show collections;
system.indexes
test
2.读写验证

由上可知,primary是可读写的

在secondary上写测试:

$ mongo
MongoDB shell version: 3.0.6
connecting to: test
> use aaa;
switched to db aaa
> db.createCollection("test2");
{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }
> show collections;
2015-09-23T15:57:49.240+0800 E QUERY    Error: listCollections failed: { "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" }
    at Error (<anonymous>)
    at DB._getCollectionInfosCommand (src/mongo/shell/db.js:646:15)
    at DB.getCollectionInfos (src/mongo/shell/db.js:658:20)
    at DB.getCollectionNames (src/mongo/shell/db.js:669:17)
    at shellHelper.show (src/mongo/shell/utils.js:625:12)
    at shellHelper (src/mongo/shell/utils.js:524:36)
    at (shellhelp2):1:1 at src/mongo/shell/db.js:646
> rs.slaveOk();
> show collections;
system.indexes
test
>

证明secondary节点是不能写,默认也是不可读的,需要执行rs.slaveOk();或者db.getMongo().setSlaveOk();并且只对当前session有效,所以每次连接从库都需要执行。

五、说明

mongodb的副本集至少需要3台以上才能实现高可用,并且节点的个数最好是基数。

时间: 2025-01-06 12:36:56

MongoDB副本集搭建的相关文章

MongoDB副本集搭建及备份恢复

一.MongoDB副本集(repl set)介绍 早起版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主: 目前已经淘汰了master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),只读,支持给他们设置权重,当主宕掉后,权重最高的从切换为主: 在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据 在此架构中读写数据都是在主上,要想实现负载均衡的

mongodb副本集搭建过程中的问题和解决技巧

在我以往的认知中,一个系统一旦正式上线,多半不会轻易的迁移服务器,尤其是那种涉及到多个关联应用,涉及到多台硬件服务器的系统,因为这种迁移将是牵一发而动全身的. 但是,却仍然有这种情况存在,就如我这几天主要负责的事,就是一个系统的全部服务器迁移中的部分机器迁移,还有一部分由别人负责. 这个系统涉及到flume数据采集,storm数据分析,rabbitmq消息分发,ehcache缓存提升系统性能,mongodb副本集存储数据,tomcat管理系统应用等,架构基本如下: 而这里我主要负责的是rabbi

mongodb副本集搭建以及增减机器

1. replica set 每个副本集需要设置副本集名称. 在启动mongod时指定. 2. 搭建步骤 2.1 启动 首先启动mongod 启动时设置为副本集模式,并设置名称. 两种方式,通过配置文件,或命令行模式. 配置文件: # mongodb.conf replSet = replsetname 命令行模式: mongod --replSet "replsetname" 2.2 mongo shell 打开mongo shell $ ./bin/mongo 2.3 初始化 在m

mongodb 副本集搭建

mongodb的副本集模式较早前的master-slave模式有了很大的改进,由于之前的master-slave模式不支持主机宕机之后切换到从机,已经逐渐被淘汰.而现在官方推荐的副本集模式,支持多个节点并存,当主节点宕机后从权重最高的副节点开始,依次切换为主节点,非常好用,下面是笔者整理的一些搭建步骤和注意事项以及故障处理等等内容. 注意事项: 1.mongodb已经不再支持32位操作系统,因此一定要安装64位系统. 2.搭建副本集的过程中,一定要关闭防火墙,不论是selinux还是iptabl

mongo副本集搭建及服务器复用方案

比较常见的mongodb副本集搭建是有:常规节点.数据副本.仲裁节点组成,也就是需要三台服务器组建.常规节点即数据的主存储节点,数据副本是主存储节点的从属节点,它定期去主节点获取更新日志来更新自己.仲裁节点的作用是为客户端指明连接方向(选择主还是选择从),主节点存活时连接主节点,主节点挂掉时连接从节点. 但上述方案有一个弊端,当仲裁节点挂掉以后,整个集群同样面临挂掉的危险. 第二种方案:一个主节点,两个从节点.从节点都定期去主节点获取更新日志.当主节点挂掉以后,会按优先级在两个从节点中选取一个当

MongoDb的副本集搭建教程(个人操作笔记)

很多公司都在用MongoDb ,一直没有时间研究,最近好好的整了一下,做下笔记,直接上操作步骤,关于Mongodb的理论知识可以搜索其他资料,也可以联系我索取 mongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模式,主从模式其实就是一个单副本的应用,没有很好的扩展性和容错性.而副本集具有多个副本保证了容错性,就算一个副本挂掉了还有很多副本存在,并且解决了上面 第一个问题“主节点挂掉了,整个集群内会自动切换”.难怪mongoDB官方推荐使用这种模式.我们来看看mongoDB副本集的

MongoDB 3.2.8 副本集搭建

记录一下,MongoDB的角色创建及配置,以便以后使用 简介 Replica Set,中文翻译叫做副本集,不过我并不喜欢把英文翻译成中文,总是感觉怪怪的.其实简单来说就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据需要和主节点一致 Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点.主备节点存储数据,仲裁节点不存储数据.客户端同时连接主节点与备节点,不连接仲裁节点. 默认设置下,主节点提供所有增删查改服务,备

Mongodb 副本集+分片集群搭建

环境需求: 在三台机器上搭建副本集,在副本集上做分片 服务器IP: 192.168.1.232/192.168.1.238/192.168.1.241 安装Mongodb all nodes: tar zxvf mongodb-linux-x86_64-rhel62-3.4.4.tgz cp -rvf  mongodb-linux-x86_64-rhel62-3.4.4  /opt/mongodb_3.4.4 cd /opt/mongodb_3.4.4/ mkdir -pv conf logs

MongoDB 副本集+分片 认证方式搭建

MongoDB 副本集+分片 认证方式搭建 参考资料: https://www.cnblogs.com/ityouknow/p/7344005.htmlhttps://jorwen-fang.iteye.com/blog/2031756https://www.cnblogs.com/bjx2020/p/9350232.htmlhttps://www.jb51.net/article/161315.htmhttps://blog.51cto.com/beigai/1751381 环境规划: 服务器