当前位置: 首页 > news >正文

MongoDB副本集搭建

为什么80%的码农都做不了架构师?>>>   hot3.png

一、环境

$ 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
directoryperdb = 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
}
3. 设置开机启动
$ sudo vim /etc/rc.local
/opt/mongodb/bin/mongod --config /data/mongodb/conf/db0/mongodb.conf

四、验证

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台以上才能实现高可用,并且节点的个数最好是基数。


转载于:https://my.oschina.net/aven92/blog/511285

相关文章:

  • nodejs搭建服务篇章三:nodejs搭建服务项目目录的简单介绍及app.js文件简单说明
  • 搭建rsync服务器,实现文件备份同步
  • nodejs搭建服务篇章四:前端通过nodejs搭建的服务连接MySQL数据库中的数据(数据库安装,数据库管理,ajax查询数据),超多图超详细
  • XCode升级到7后,规范注释生成器VVDocumenter插件没有用了,怎么办?
  • vue传值处理:vue中父组件通过props传值给子组件,子组件表单控件使用值,子组件改变该值时如何避免报错
  • axios的二次封装:在vue中如何灵活运用axios请求,二次封装更加灵活,更多参数可配置
  • 清理C盘内存:电脑C盘飘红了,那么如何清理垃圾文件,总结几种亲测方案
  • Part05 - (图文)NSX系列之检查NSX Controller状态
  • JSON.parse转化:如何使得一个字符串类型‘false‘等于布尔类型的false(使‘1‘===1?成立的2种处理办法,与JSON.stringify的)
  • 常用工具函数推荐:前端开发常用的工具函数(拷贝、排序、防抖、去重、合并、时间处理、DOM操作...).md
  • 正则表达式校验文件路径
  • img制图技巧:给img图片添加背景颜色和背景图片,制作出新图片
  • 移动端h5页面click事件延迟300ms,出现该问题的原因分析及解决方案FastClick.js
  • ios移动端兼容:iPhone X等机型底部的安全距离样式的设置
  • js简单判断:js判断对象是否为{},js判断对象是否为null
  • 时间复杂度分析经典问题——最大子序列和
  • 收藏网友的 源程序下载网
  • 【css3】浏览器内核及其兼容性
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • AWS实战 - 利用IAM对S3做访问控制
  • golang 发送GET和POST示例
  • go语言学习初探(一)
  • HTTP中的ETag在移动客户端的应用
  • java2019面试题北京
  • Java编程基础24——递归练习
  • JS函数式编程 数组部分风格 ES6版
  • Less 日常用法
  • Linux Process Manage
  • maven工程打包jar以及java jar命令的classpath使用
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • 阿里云前端周刊 - 第 26 期
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 小程序01:wepy框架整合iview webapp UI
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 从如何停掉 Promise 链说起
  • #QT(一种朴素的计算器实现方法)
  • #stm32整理(一)flash读写
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $.ajax()
  • (NSDate) 时间 (time )比较
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (算法)Game
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • ... 是什么 ?... 有什么用处?
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .Net Web窗口页属性
  • .net 生成二级域名
  • .net 提取注释生成API文档 帮助文档
  • .NET企业级应用架构设计系列之开场白
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数