复制集(replica set)
复制集是一组mongodb的进程维护同样的数据集,提供冗余与高可用性。最小的复制集由3台服务器(或者3个实例)组成,最多1个primary和2个secondary实例,其中只有primary允许读写,secondary只读。secondary和primary的数据完全一致,它们之间通过primary实例的oplog异步(asynchronous)方式同步数据。

oplog(operations log)是专门的capped collection,保存所有数据库相关修改的回滚记录,secondary成员通过异步的方式拷贝和执行这些操作。
当primary不可用时,复制集发起投票(elections),选择1台secondary做为primary,请注意priority这个参数,priority为0的secondary不能成为primary,不能触发投票。 Oplog Size
在Unix和Windows系统中, 如果存储引擎使用的是WiredTiger,将占用剩余使用空间的5%。

# 生产环境部署
kvm-70-101 10.0.70.101 # primary
kvm-70-102 10.0.70.102 # secondary
kvm-70-103 10.0.70.103 # secondary
# 生成key
openssl rand -base64 756 > mongodb_product_key
# 拷贝到所有成员服务器,并对文件授权
chmod 400 mongodb_product_key
chown mongod mongodb_product_key
# 变更/etc/mongod.conf,对复制集命名
security:
keyFile: /etc/mongodb_product_key replication:
replSetName: myapp
# primary初始化
rs.initiate( {
_id : 'myapp',
members: [ { _id : 0, host : 'kvm-70-101:27017' }, { _id : 1, host : 'kvm-70-102:27017' }, { _id : 2, host : 'kvm-70-103:27017' } ]
}) {
"info" : "try querying local.system.replset to see current configuration",
"ok" : 0,
"errmsg" : "already initialized",
"code" : 23,
"codeName" : "AlreadyInitialized"
}
# 建立超级用户admin
use admin
db.createUser(
{
user: 'admin',
pwd: '@admin',
roles: [ { role: 'root', db: 'admin' } ]
}
); # 建立app数据库的管理员app
use app
db.createUser(
{
user: 'app',
pwd: '@app',
roles: [ { role: 'dbOwner', db: 'app' } ]
}
); # 认证登录
db.auth('admin', '@admin') # 如果另外增加secondary,使用以下命令
rs.add('kvm-70-104:27017')
rs.add('kvm-70-104:27017') # 查看配置
rs.conf()
{
"_id" : "myapp",
"version" : 3,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "kvm-70-101:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : { },
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "kvm-70-102:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : { },
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : kvm-70-103:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : { },
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : 2000,
"getLastErrorModes" : { },
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("59248e52d45510744805fb78")
}
} # 查看状态
rs.status()
{
"set" : "myapp",
"date" : ISODate("2017-05-23T20:37:08.946Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1495571827, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1495571827, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1495571827, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "kvm-70-101:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 4968,
"optime" : {
"ts" : Timestamp(1495571827, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-05-23T20:37:07Z"),
"electionTime" : Timestamp(1495567955, 2),
"electionDate" : ISODate("2017-05-23T19:32:35Z"),
"configVersion" : 3,
"self" : true
},
{
"_id" : 1,
"name" : "kvm-70-102:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 77,
"optime" : {
"ts" : Timestamp(1495571827, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1495571827, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-05-23T20:37:07Z"),
"optimeDurableDate" : ISODate("2017-05-23T20:37:07Z"),
"lastHeartbeat" : ISODate("2017-05-23T20:37:07.702Z"),
"lastHeartbeatRecv" : ISODate("2017-05-23T20:37:06.951Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "10.0.70.103:27017",
"configVersion" : 3
},
{
"_id" : 2,
"name" : "kvm-70-103:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 77,
"optime" : {
"ts" : Timestamp(1495571827, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1495571827, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2017-05-23T20:37:07Z"),
"optimeDurableDate" : ISODate("2017-05-23T20:37:07Z"),
"lastHeartbeat" : ISODate("2017-05-23T20:37:07.708Z"),
"lastHeartbeatRecv" : ISODate("2017-05-23T20:37:07.733Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "10.0.70.101:27017",
"configVersion" : 3
}
],
"ok" : 1
}
# secondary验证
# 授权从机允许读
rs.slaveOk() use app
db.auth('app', '@app')
db.test.insert({'hello': 'world'}) # 查看建立的数据库及用户
rs0:SECONDARY> db.test.find().pretty();
{ "_id" : ObjectId("5ad6c7e574a09792011db5ee"), "hello" : "world" } # 进行一次新的投票
rs.stepDown()

mongodb 3.4 学习 (三)复制集的更多相关文章

  1. MongoDB DBA 实践4-----创建复制集

    一.复制 复制允许多个数据库服务器共享相同数据的功能,从而确保冗余并促进负载平衡 1.数据冗余及可用性 复制技术提供数据冗余及可用性,在不同的数据库服务器上使用多个数据副本,复制技术防止单个数据库服务 ...

  2. MongoDB for OPS 02:复制集 RS 配置

    写在前面的话 对于生产环境而言,除非是非常不重要的业务,且该业务允许我们出现一定时间的停机,我们一般才会使用单节点,且该单节点必须要有完善的备份手段. RS 复制集 我们这里采取一主两从的方式搭建复制 ...

  3. MongoDB基础之九 replication复制集

    准备工作:创建目录 mkdir -p /home/m17 //home/m18 /home/m19 /home/mlog 1:启动3个实例,且声明实例属于某复制集 # ./bin/mongod --d ...

  4. kafka学习(三)-kafka集群搭建

    kafka集群搭建 下面简单的介绍一下kafka的集群搭建,单个kafka的安装更简单,下面以集群搭建为例子. 我们设置并部署有三个节点的 kafka 集合体,必须在每个节点上遵循下面的步骤来启动 k ...

  5. MongoDB 2.6复制集单节点部署(三)

    MongoDB在单节点中也可以做复制集,但是仅限于测试实验,最大的好处就是部署方便快速,可以随便添加新节点,节省资源.在这里我使用的是MongoDB 2.6版本进行复制集实验(但MongoDB配置文件 ...

  6. MongoDB学习4:MongoDB复制集机制和原理,搭建复制集

    1.复制集的作用   1.1 MongoDB复制集的主要意义在于实现服务高可用   1.2 它的实现依赖于两个方面的功能:    · 数据写入时将数据迅速复制到另一个独立节点上    · 在接收写入的 ...

  7. MongoDB复制集

    1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...

  8. mongodb基础学习8-复制集

    今天来简单学习一下复制集(replication),什么是复制集呢,类似于mysql的主从复制吧 简单来说就是有多个mongodb的实例,多个实例有相同的内容,其中一台用于读写,其它用于备份,当用于读 ...

  9. MongoDB 复制集节点增加移除及节点属性配置

    复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致.再结合心跳机制,当感知到主节点不可访问或宕机 ...

随机推荐

  1. BZOJ - 1497 最小割应用

    题意:基站耗费成本,用户获得利益(前提是投入成本),求最大获利 最小割的简单应用,所有可能的收益-(消耗的成本/失去的收益),无穷大边表示冲突,最小割求括号内的范围即可 #include<ios ...

  2. 爬虫之自动生成url

    Object.extend=function(props){ //继承父类 var prototype=Object.create(this.prototype) //初始化函数ctor var _C ...

  3. 2019.3.22 SQL语句(基础篇)

    SQL语句 创建一个数据库: create database+数据库名; 使用数据库: use+数据库名; 查看mySQL中有哪些数据库: show databases; 删除数据库 drop dat ...

  4. bootstrap日历插件地址

    http://www.bootcss.com/p/bootstrap-datetimepicker/

  5. 第十八章:自定义splash screen、app icon和tab icon

    本文介绍如何自定义splash screen.app icon和tab icon. 1. 自定义splash screen和app icon 1.1 产生resources文件夹,启动命令行: ion ...

  6. connection reset by peer, socket write error问题排查

    2018-03-15更新:弄明白connection reset产生的原因,见重新分析connection reset by peer, socket write error错误原因 在开发文件上传功 ...

  7. Oracle使用sys登录时报错ORA-28009解决方法

    情况一:使用sqlplus登录: 正常输入用户名的口令,就会报错,因为SYS是在数据库之外的超级管理员,所以我们在登录的时候 要在输入口令:口令+as sysdba(比如:123456 as sysd ...

  8. java中创建User Libray

    第一步:右键项目==>Build Path ==>Configure Build Path... 第二步:选择Libraries==>点击 Add Library.. 第三步:选择U ...

  9. nyoj 12——喷水装置二——————【贪心-区间覆盖】

    喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的 ...

  10. 深入理解JavaScript系列(36):设计模式之中介者模式

    介绍 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 主要内容来自:http://www ...