首先有了主从复制,为什么还要用副本集方式呢?

主从集群

主从复制的优点:

从服务器可以执行查询工作,降低主服务器访问压力

在从服务器执行备份,避免备份期间锁定主服务器的数据

当主服务器出现故障时,可以快速切换到从服务器,减少当机时间.


MongoDB支持在多个机器中通过异步复制到底故障转移和实现冗余,多台机器中同一时刻只有一台是用于写操作,这为mongoDB提供了数据一致性的保障.担当Primary角色的机器能把读操作分发给slave机器.

 

MongoDB的主从集群分为两种

Master-Slave 复制(主从复制)  

Replica Sets 复制(副本集)

主服务器支持增删该,从服务器主要支持读.

 

 

Master-Slave(主从复制)

只需要在某一个服务启动时加上-master参数,以指明此服务器的角色是primary,而另一个服务加上-slave与-source参数,以指明此服务器的角色是slave. 即可实现同步,

MongoDB的最新版本已经不推荐使用这种方法了.

 

Replica Sets 复制(副本集)

MongoDB在1.6版本开发了replica set,主要增加了故障自动切换和自动修复成员节点.各个DB之间数据完全一致,最为显著的区别在于,副本集没有固定的主节点,它是整个集群选举得出的一个主节点.当其不工作时变更其它节点.

副本集的特性:1.没有固定的master主节点。2.故障自动恢复,继续工作。

总的来说:除了性能上的区别,创建副本集集群和主从集群的区别只是命令上的一些变化,下面来看下创建副本集群的命令:

1.首先:创建保存服务datapath及日志logpath的目录:

D:\mongodb\replicaSets\data\63001
D:\mongodb\replicaSets\data\63002
D:\mongodb\replicaSets\data\63003

D:\mongodb\replicaSets\logs\63001
D:\mongodb\replicaSets\logs\63002
D:\mongodb\replicaSets\logs\63003

2.现在开始创建副本成员并设置为window服务(为了自启动,不用每次手动启动)
2.1如图为例创建服务MongoRep63001,并启动。


ubuntu22 mongodb 单点 副本集 mongodb副本集部署_集群

很重要的!执行的命令说明:

-install     创建服务
-replSet   指定该服务所属的副本集名称
-port      指定该服务端口号
-rest      非必须,
-journal   添加这个命令会自动记录日志
-dbpath     指定data目录
-logpath   指定log目录
-serviceName  指定服务名称
-serviceDisplayName   指定默认服务名称


2.2之后重新开两个命令行窗口,同上,再创建MongoRep63002和MongoRep63003两个服务。

2.3创建完成后打开本地服务,查看下,已经创建成功:(并且可以看到data文件夹和logs文件夹下对应的日志,文件等都已自动生成)


ubuntu22 mongodb 单点 副本集 mongodb副本集部署_集群_02

ps.如果创建不成功,可以查看63001.log等日志文件的内容,里面会说错在哪里。

3.初始化各节点:
3.1新开命令行窗口,执行命令:rs.initiate(......)

ubuntu22 mongodb 单点 副本集 mongodb副本集部署_集群_03



执行命令说明:
_id:副本集的名字,必须和命令行的名字匹配,就是在步骤2.1中-replSet 后面跟的名称
members:数组,用来表示副本集中的每个成员,
members数组:包含多个成员,每个成员必须有_id和host


一个成员包含的属性:
_id     每个成员都必须有的一个_id,通常由数字组成
host   由ip地址和端口号组成
pripority(1.0): 权重,更高的权重会被推举为主节点,所以要想把某个成员指定为primary,设置权重即可,默认都是1
其它一些属性:
arbiterOnly(false):如果是true,则表示这个成员为仲裁节点,不接收数据;
buildIndexes(true):如果设置为false,则会阻止在这个节点上创建第二索引,通常这个节点是作为纯粹的数据备份,从不用来被查     询。不过也因为此节点没有第二索引,所以他写入的东西很少,也就需要很少的内存和磁盘。_id的索引还是会被创建的。只有当prio    rity属性设置为0时,此项才能设置为false,一般不会用到这个选项;
hidden(false):如果此项为true,不要告诉客户端的此节点的存在,设置隐藏节点的原因是此节点的数据的使用模式和其他节点大为     不同,比如:报表,统计,备份等。设置为ture时,允许你针对这个节点发送非主要查询。
tags({}):一个文档代表这台服务器的位置,有利于位置感知的读写。其实就是表示此节点位于哪个数据中心的,mongodb会根据tag     s找近的数据中心节点同步数据。
slaveDelay(0):同步数据的延迟,设置为0表示立即更新同步数据。
votes(1):此节点可以发出的投票数,一般不用修改他
settings 对象:settings对象可以在集群建立起来以后用再进行设置,通常使用默认值



3.2接下来,等待1m左右,之后出现以下界面:

ubuntu22 mongodb 单点 副本集 mongodb副本集部署_mongodb_04

ok,创建成功!

4.简单练习下:

4.1随便进入一个服务:
注:mongo localhost:63002和mongo 63002两个命令是不一样的


ubuntu22 mongodb 单点 副本集 mongodb副本集部署_mongodb_05

可以看到此时前面的游标变为了以repSet:SECONDARY>开始的,(SECONDARY即为丛节点)

4.2查看该副本的关联关系:rs.status()


ubuntu22 mongodb 单点 副本集 mongodb副本集部署_服务器_06

可以看到一63001和63002为端口的服务都是secondary(从节点),而63003是primary(主节点),这是因为在步骤3初始化时候,指定了63003的priority:3,而63001和63002分别为1和2,priority越高,权限越高,所以63003的权限最高,被推举为primary。

4.3也可以登录63003的服务看一下:

ubuntu22 mongodb 单点 副本集 mongodb副本集部署_mongodb_07

可以看到,此服务为repSet:PRIMARY>

5.之后可以在primary的服务中查看数据库show dbs,创建数据库和表,
当然63001和63002这两个服务会自动更新数据,不过从节点只会更新,并不支持读写操作。

ubuntu22 mongodb 单点 副本集 mongodb副本集部署_mongodb_08

如图,不能查看数据......提示not master and slaveOk=false

5.2开启从节点查看数据的功能:使用db.getMongo().setSlaveOk()命令或者rs.slaveOk()

ubuntu22 mongodb 单点 副本集 mongodb副本集部署_副本集_09


如上图,second节点可以查看数据,以此来分担主节点查询的压力。(在second节点执行写操作是不行的,只可以执行读操作)

还有一些有用的rs命令

rs.help()


 rs.status()                     { replSetGetStatus : 1 } checks repl set status
 rs.initiate()                   { replSetInitiate : null } initiates set with default settings
 rs.initiate(cfg)                { replSetInitiate : cfg } initiates set with configuration cfg
 rs.conf()                       get the current configuration object from local.system.replset
 rs.reconfig(cfg)                updates the configuration of a running replica set with cfg (disconnects)
 rs.add(hostportstr)             add a new member to the set with default attributes (disconnects)
 rs.add(membercfgobj)            add a new member to the set with extra attributes (disconnects)
 rs.addArb(hostportstr)          add a new member which is arbiterOnly:true (disconnects)
 rs.stepDown([secs])             step down as primary (momentarily) (disconnects)
 rs.freeze(secs)                 make a node ineligible to become primary for the time specified
 rs.remove(hostportstr)          remove a host from the replica set (disconnects)
 rs.slaveOk()                    shorthand for db.getMongo().setSlaveOk()


 db.isMaster()                   check who is primary


另外,搭建副本集的时候一定要看log文件,能看出很多东西。