MongoDB复制集技术

第1章 MongoDB复制集简介:

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

1.1 复制集的目的:

保证数据在生产部署是的冗余和可靠性,通过在不同的机器上保存副本来保证数据的不会因为单间损坏而丢失,能够随时应对数据丢失或者机器损坏带来的风险

还可以提高用户读写数据的性能,提高整个系统的负载

1.2 简单介绍:

1.      一组复制集就是一组MongoDB实例掌管同一个数据集,实例可以在不同的机器上面,实例中包含一个主导,接受客户端所有的写入操作,其他都是副本实例,从主服务器上获得数据并保持同步

2.      主服务器很重要,包含了所有的改变操作的日志,但是副本服务器集群包含所有的主服务器数据,因此当主服务器挂掉了,就会在副本服务器上重新选取一个成为主服务器

3.      每个复制集还有一个仲裁者,仲裁者不存储数据,只是负责通过心跳包来确认集群中集合的数量,并在主服务器选举的时候作为仲裁决定结果

1.3 复制集的基本架构:

基本的架构由三台服务器组成,一个三成员的复制集,由三个有数据,或者两个有数据,一个作为仲裁者

1.3.1 三个存储数据的复制集:

主库宕机时,两个从都可以被选为主库

当主库宕机后,两个从库都会进行竞选,其中一个变为主库,当原主恢复后,作为从库加入当前的复制集群即可

1.1.1 存在arbiter节点的复制集:

两个正常的主从,及一台arbiter节点

当主库宕机时,从库成为主,主库修复后,将其加入现有的复制集群即可

1.1 复制集中成员说明:


成员


说明


Secondary


正常情况下,复制集的Seconary会参与Primary选举(自身也可能会被选为Primary),并从Primary同步最新写入的数据,以保证与Primary存储相同的数据。

Secondary可以提供读服务,增加Secondary节点可以提供复制集的读服务能力,同时提升复制集的可用性。另外,Mongodb支持对复制集的Secondary节点进行灵活的配置,以适应多种场景的需求。


Arbiter


Arbiter节点只参与投票,不能被选为Primary,并且不从Primary同步数据。

比如你部署了一个2个节点的复制集,1个Primary,1个Secondary,任意节点宕机,复制集将不能提供服务了(无法选出Primary),这时可以给复制集添加一个Arbiter节点,即使有节点宕机,仍能选出Primary。

Arbiter本身不存储数据,是非常轻量级的服务,当复制集成员为偶数时,最好加入一个Arbiter节点,以提升复制集可用性。


Priority0


Priority0节点的选举优先级为0,不会被选举为Primary

比如你跨机房A、B部署了一个复制集,并且想指定Primary必须在A机房,这时可以将B机房的复制集成员Priority设置为0,这样Primary就一定会是A机房的成员。

(注意:如果这样部署,最好将『大多数』节点部署在A机房,否则网络分区时可能无法选出Primary)


Vote0


Mongodb 3.0里,复制集成员最多50个,参与Primary选举投票的成员最多7个,其他成员(Vote0)的vote属性必须设置为0,即不参与投票。


Hidden


Hidden节点不能被选为主(Priority为0),并且对Driver不可见。因Hidden节点不会接受Driver的请求,可使用Hidden节点做一些数据备份、离线计算的任务,不会影响复制集的服务。


Delayed


Delayed节点必须是Hidden节点,并且其数据落后与Primary一段时间(可配置,比如1个小时)。

因Delayed节点的数据比Primary落后一段时间,当错误或者无效的数据写入Primary时,可通过Delayed节点的数据来恢复到之前的时间点。

1.1.1 Priority 节点

作为一个辅助可以作为一个备用,调整选主的权重

1.1.1 hidden隐藏节点

客户端将不会把读请求分发到隐藏节点上,即使我们设定了读选项,这些隐藏节点将不会收到应用程序的请求,因此隐藏节点一般用与报表节点或者备份节点,延时节点也应该是一个隐藏节点

1.1.1 Delayed延时节点

延时节点的数据集是延时的,因此它可以帮助我们在人为误操作或其他意外情况下恢复数据

例如当应用升级失败,或者误操作时,我们可以通过延时节点进行恢复数据

第1章 复制集架构实现:

1.1 准备多实例环境:

在mongod用户下操作:

for  i in 280{17..20} ; do

mkdir -p /mongodb/$i/conf

mkdir -p /mongodb/$i/data

mkdir -p /mongodb/$i/log

done

1.1.1 编写配置文件:

systemLog:

destination: file

path: /mongodb/28017/log/mongodb.log

logAppend: true

storage:

journal:

enabled: true

dbPath: /mongodb/28017/data

directoryPerDB: true

#engine: wiredTiger

wiredTiger:

engineConfig:

# cacheSizeGB: 1

directoryForIndexes: true

collectionConfig:

blockCompressor: zlib

indexConfig:

prefixCompression: true

processManagement:

fork: true

net:

port: 28017

replication:

oplogSizeMB: 2048

replSetName: my_repl

1.1.2 启动实例:

for i in 280{17..20}; do  mongod -f /mongodb/$i/conf/mongod.conf ; done

停止服务命令

for i in 280{17..20}; do  mongod –shutdown -f /mongodb/$i/conf/mongod.conf ; done

1.1.3 配置复制集:

随便登录一台机器执行即可

config = {_id: 'my_repl', members: [

{_id: 0, host: '10.0.0.18:28017'},

{_id: 1, host: '10.0.0.18:28018'},

{_id: 2, host: '10.0.0.18:28019'}]

}

1.1.4 初始化配置

> rs.initiate(config)

{ "ok" : 1 }

my_repl:OTHER>

my_repl:SECONDARY>

1.2 主从复制测试:

1.2.1 主节点插入数据

db.movies.insert([ { "title" : "Jaws", "year" : 1975, "imdb_rating" : 8.1 },

... { "title" : "Batman", "year" : 1989, "imdb_rating" : 7.6 },

... ] );

BulkWriteResult({

"writeErrors" : [ ],

"writeConcernErrors" : [ ],

"nInserted" : 2,

"nUpserted" : 0,

"nMatched" : 0,

"nModified" : 0,

"nRemoved" : 0,

"upserted" : [ ]

})

1.2.2 主节点查看数据

my_repl:PRIMARY> db.movies.find().pretty();

{

"_id" : ObjectId("5ad6c085a2054234c1597506"),

"title" : "Jaws",

"year" : 1975,

"imdb_rating" : 8.1

}

{

"_id" : ObjectId("5ad6c085a2054234c1597507"),

"title" : "Batman",

"year" : 1989,

"imdb_rating" : 7.6

}

1.2.3 登录从库打开从库可读配置

默认从库是不允许读操作的

my_repl:SECONDARY> rs.slaveOk();

my_repl:SECONDARY> db.movies.find().pretty();

{

"_id" : ObjectId("5ad6c201afd69acbffc224f5"),

"title" : "Jaws",

"year" : 1975,

"imdb_rating" : 8.1

}

{

"_id" : ObjectId("5ad6c201afd69acbffc224f6"),

"title" : "Batman",

"year" : 1989,

"imdb_rating" : 7.6

}

1.3 故障切换测试:

mongod --shutdown -f /mongodb/28017/conf/mongod.conf

killing process with pid: 2493

[[email protected] mongodb]$ mongo --port 28018

MongoDB shell version: 3.2.8

connecting to: 127.0.0.1:28018/test

my_repl:SECONDARY> exit

bye

[[email protected] mongodb]$ mongo --port 28018

MongoDB shell version: 3.2.8

connecting to: 127.0.0.1:28018/test

my_repl:PRIMARY>

第2章 复制集管理操作:

2.1 (1)查看复制集状态:

rs.status();     # 查看整体复制集状态

rs.isMaster();   #  查看当前是否是主节点

2.2 (2)添加删除节点

rs.add("ip:port");     #  新增从节点

rs.addArb("ip:port");  #  新增仲裁节点

rs.remove("ip:port");  #  删除一个节点

2.3  ( 3 ) 配置延时节点:

my_repl:PRIMARY> cfg=rs.conf()

{

"_id" : "my_repl",

"version" : 1,

"protocolVersion" : NumberLong(1),

"members" : [

{

"_id" : 0,

"host" : "10.0.0.18:28017",

"arbiterOnly" : false,

"buildIndexes" : true,

"hidden" : false,

"priority" : 1,

"tags" : {

},

"slaveDelay" : NumberLong(0),

"votes" : 1

},

{

"_id" : 1,

"host" : "10.0.0.18:28018",

"arbiterOnly" : false,

"buildIndexes" : true,

"hidden" : false,

"priority" : 1,

"tags" : {

},

"slaveDelay" : NumberLong(0),

"votes" : 1

},

{

"_id" : 2,

"host" : "10.0.0.18:28019",

"arbiterOnly" : false,

"buildIndexes" : true,

"hidden" : false,

"priority" : 1,

"tags" : {

},

"slaveDelay" : NumberLong(0),

"votes" : 1

}

],

"settings" : {

"chainingAllowed" : true,

"heartbeatIntervalMillis" : 2000,

"heartbeatTimeoutSecs" : 10,

"electionTimeoutMillis" : 10000,

"getLastErrorModes" : {

},

"getLastErrorDefaults" : {

"w" : 1,

"wtimeout" : 0

},

"replicaSetId" : ObjectId("5ad6bfb3db15e96a59976d12")

}

}

注:这里的[2]是rs.conf显示的顺序(除主库外),非ID

my_repl:PRIMARY> cfg.members[2].priority=0

0

my_repl:PRIMARY> cfg.members[2].slaveDelay=120

120

my_repl:PRIMARY> cfg.members[2].hidden=true

true

my_repl:PRIMARY> rs.reconfig(cfg)

{ "ok" : 1 }

2.4 副本集其他操作命令:

查看副本集配置信息:

rs.config()

查看副本集成员的状态:

rs.status()

副本集角色切换:由主降为从

rs.stepDown()

锁定从,使其不会转变成主

rs.freeze(300)

设置副节点可读

rs.slaveOk()

查看副本节点

rs.printSlaveReplicationInfo()

原文地址:http://blog.51cto.com/13520772/2105557

时间: 2024-10-04 03:46:01

MongoDB复制集技术的相关文章

MongoDB复制集原理

版权声明:本文由孔德雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/136 来源:腾云阁 https://www.qcloud.com/community MongoDB的单实例模式下,一个mongod进程为一个实例,一个实例中包含若干db,每个db包含若干张表.MongoDB通过一张特殊的表local.oplog.rs存储oplog,该表的特点是:固定大小,满了会删除最旧记录插入新记录,而且只支持append操作,因

MongoDB复制集及数据分片详解

前言 MongoDB是一个由C++语言编写的基于分布式文件存储的数据库,是当前NoSQL数据库中比较热门的一种,旨在为Web应用提供可扩展的高性能数据存储解决方案.本文介绍MongoDB复制集及数据分片. MongoDB 简介 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.支持的数据结构非常松散,因此可以存储比较复杂的数据类型.最大的特点是其支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询

mongodb复制集的实现

复制集(Replica Sets),是一个基于主/从复制机制的复制功能,进行同一数据的异步同步,从而使多台机器拥有同一数据的都多个副本,由于有自动故障转移和恢复特性,当主库宕机时不需要用户干预的情况下自动切换到其他备份服务器上做主库,一个集群最多可以支持7个服务器,并且任意节点都可以是主节点.所有的写操作都被分发到主节点,而读操作可以在任何节点上进行,实现读写分离,提高负载. 资源有限测试一个VM开3个实例: 环境:centos7.0 192.168.1.21:20011 P 192.168.1

mongodb复制集配置步骤

mongodb复制集配置步骤 2012-11-09 14:10:24|  分类: mongodb|举报|字号 订阅 复制升级版的主从复制,它实现了故障自动转移功能,同时从节点支持读 一,节点类型: a)    主节点:支持读写 b)    从节点:支持读(需设置) c)    仲裁节点:参与投票同时也支持读(需设置) 二,实验 主节点:192.168.129.47 从节点:192.168.129.48 仲裁节点:192.168.129.49 1.主节点配置如下: vi  /etc/rc.loca

一步一步教你搭建基于docker的MongoDB复制集群环境

一步一步教你搭建基于docker的MongoDB复制集群环境 1.安装docker 2.创建MongoDB的Image 3.搭建MongoDB的集群 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中. 1.ubuntu14.04安装docker 参考文档 http://docs.docker.com/installation/ubuntulinux/ 参考文档 http://docs.docker.com/mac/started/ pc@pc-Th

MongoDB复制集数据库拆分和版本升级实战

MongoDB复制集数据库拆分和版本升级实战 问题描述 复制集rs_1上承载了所有的数据库业务,而加内存已经无法满足应用程序压力. 解决方案 考虑拆分复制集rs_1的部分数据库到rs_2,并同时升级数据库版本到2.6. 架构图 准备 评估升级可能性 1. 连接2.6 mongo shell到2.4 复制集辅助成员,在admin库执行db.upgradeCheckAllDBs().   2. 评估升级到2.6的应用程序兼容性问题,参考:http://docs.mongodb.org/manual/

MongoDB 复制集

关于读写分离 由于写入主之后,同步到从有一个时间,所以读写分离会引发数据一致性问题. MongoDB 通过复制集(Replica Set)来实现读写分离. MongoDB复制集(Replica Set) 通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用. 当遇到复制集轮转升级.Primary宕机.网络分区等场景时,复制集可能会选举出一个新的Primary,而原来的Primary则会降级为Secondary,即发生主备切换.所以,MongoDB复制集里Primary

MongoDB复制集架构

MongoDB复制集架构 由数据结点,投票结点组成,需要配置集群信息,可自动检测集群中的结点健康状态,当有结点出故障时,自动下线和切换主从结点.适用于数据量较大,高可用服务 通常,为了防止单点故障应用程序需要做集群.然而在数据库中除了防止单点故障,还需要做到数据库备份,读写分离,故障转移等.而 MongoDB 的 Replica Set 恰恰都能满足这些要求. Replica Set角色 Replica Set 的成员是一堆有着同样的数据内容 mongod 的实例集合,包含以下三类角色: 主节点

配置MongoDB复制集

什么是复制集? 复制集是额外的数据副本,是跨多个服务器同步数据的过程,复制集提供了冗余并增加了数据可用性,通过复制集可以对硬件故障和中断的服务进行恢复.复制集的优势如下: 让数据更安全 高数据可用性(24*7) 灾难恢复 无停机维护(如备份.索引重建.故障转移) 读缩放(额外的副本读取) 副本集对应用程序是透明的 复制集工作原理 MongoDB的复制集至少需要两个节点.其中一个是主节点(Primary),负责处理客户端的请求,其余的都是从节点(Secondary),负责复制主节点上的数据.Mon