mongodb 3.4 学习 (三)复制集
复制集(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 学习 (三)复制集的更多相关文章
- MongoDB DBA 实践4-----创建复制集
一.复制 复制允许多个数据库服务器共享相同数据的功能,从而确保冗余并促进负载平衡 1.数据冗余及可用性 复制技术提供数据冗余及可用性,在不同的数据库服务器上使用多个数据副本,复制技术防止单个数据库服务 ...
- MongoDB for OPS 02:复制集 RS 配置
写在前面的话 对于生产环境而言,除非是非常不重要的业务,且该业务允许我们出现一定时间的停机,我们一般才会使用单节点,且该单节点必须要有完善的备份手段. RS 复制集 我们这里采取一主两从的方式搭建复制 ...
- MongoDB基础之九 replication复制集
准备工作:创建目录 mkdir -p /home/m17 //home/m18 /home/m19 /home/mlog 1:启动3个实例,且声明实例属于某复制集 # ./bin/mongod --d ...
- kafka学习(三)-kafka集群搭建
kafka集群搭建 下面简单的介绍一下kafka的集群搭建,单个kafka的安装更简单,下面以集群搭建为例子. 我们设置并部署有三个节点的 kafka 集合体,必须在每个节点上遵循下面的步骤来启动 k ...
- MongoDB 2.6复制集单节点部署(三)
MongoDB在单节点中也可以做复制集,但是仅限于测试实验,最大的好处就是部署方便快速,可以随便添加新节点,节省资源.在这里我使用的是MongoDB 2.6版本进行复制集实验(但MongoDB配置文件 ...
- MongoDB学习4:MongoDB复制集机制和原理,搭建复制集
1.复制集的作用 1.1 MongoDB复制集的主要意义在于实现服务高可用 1.2 它的实现依赖于两个方面的功能: · 数据写入时将数据迅速复制到另一个独立节点上 · 在接收写入的 ...
- MongoDB复制集
1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...
- mongodb基础学习8-复制集
今天来简单学习一下复制集(replication),什么是复制集呢,类似于mysql的主从复制吧 简单来说就是有多个mongodb的实例,多个实例有相同的内容,其中一台用于读写,其它用于备份,当用于读 ...
- MongoDB 复制集节点增加移除及节点属性配置
复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致.再结合心跳机制,当感知到主节点不可访问或宕机 ...
随机推荐
- POJ_3069 Saruman's Army 【贪心】
一.题面 POJ3069 二.题意分析 我的理解是,可以在每个点设置一个监测点,能够监测到范围R内的所有其他点,那么问给出N个点的一维位置,需要在其中挑多少个监测点把所有点都监测到. 贪心解决: 1. ...
- Tensorflow基础-mnist数据集
MNIST数据集,每张图片包含28*28个像素,把一个数组展开成向量,长度为28*28=784,故数据集中mnist.train.images是一个形状为[60000,784]的张量,第一个维度数字用 ...
- Wscript.Shell 对象详细介绍
详细 WshShell 对象ProgID Wscript.Shell 文件名 WSHom.Ocx CLSID F935DC22-1CF0-11d0-ADB9-00C04FD58A0B IID F935 ...
- VBS添加Windows登陆账号
Set o=CreateObject( "Shell.Users" ) Set z=o.create("test") z.changePassword &quo ...
- C++ GUI Qt4 编程 (第二版)
[加拿大]JasminBlanchette [英]MarkSummerfield . 电子工业 2008. 前几天的问题多是因为版本不兼容的问题. QT本身Q4 Q5就有版本问题,然后集成到VS08 ...
- Oracle分区表管理的一些笔记
[转自] http://www.linuxidc.com/Linux/2011-07/38381.htm Oracle分区表的管理笔记(仅限于对普通表,即堆表的分区管理,IOT跟CLUSTER TAB ...
- js插件编程-tab框
JS代码 (function (w) { //tab对象 function Tab(config) { //定义变量,防止变量污染 this.tabMenus=null; this.tabMains= ...
- DNS服务器设置
1,域名解析:ip能够访问,但是域名不能访问. 2,配置好网络之后,切换到命令行模式,配置好的网络便不能用了. 具体方法: 打开vim /etc/sysconfig/network-scripts/i ...
- Beam编程系列之Java SDK Quickstart(官网的推荐步骤)
不多说,直接上干货! https://beam.apache.org/get-started/beam-overview/ https://beam.apache.org/get-started/qu ...
- [转]sudo: sorry, you must have a tty to run sudo问题
使用不同账户,执行执行脚本时候sudo经常会碰到 sudo: sorry, you must have a tty to run sudo这个情况,其实修改一下sudo的配置就好了vi /etc/su ...