MongoDB集群(二) 副本集

 这个也是很牛X的主从集群,不过跟“主从复制”还是有两点区别的。

      <1>:  该集群没有特定的主数据库。

      <2>:  如果哪个主数据库宕机了,集群中就会推选出一个从属数据库作为主数据库顶上,这就具备了自动故障恢复功能,很牛X的啊。

                 好,我们现在就来试一下,首先把所有的cmd窗口关掉重新来,清掉db下的所有文件。

第一步:  既然我们要建立集群,就得取个集群名字,这里就取名为shopex, --replSet表示让服务器知道shopex下还有其他数据库,

            这里就把D盘里面的mongodb程序打开,端口为2222。指定端口为3333是shopex集群下的另一个数据库服务器。(注:可以不加shopex后面的ip地址

MongoDB集群(二) 副本集_第1张图片

 

第二步:  既然上面说3333是另一个数据库服务器,不要急,现在就来开,这里把E盘的mongodb程序打开。注:可以不加shopex后面的ip地址

MongoDB集群(二) 副本集_第2张图片

 

第三步:  ok,看看上面的日志红色区域,似乎我们还没有做完,是的,log信息告诉我们要初始化一下“副本集“,既然日志这么说,那我也就

             这么做,随便连接一下哪个服务器都行,不过一定要进入admin集合。注:可以不加shopex后面的ip地址

MongoDB集群(二) 副本集_第3张图片

 

第四步: 开启成功后,我们要看看谁才能成为主数据库服务器,可以看到端口为2222的已经成为主数据库服务器。

MongoDB集群(二) 副本集_第4张图片

 扩展第三步和第四步:

查询当前的副本集配置命令:rs.config()

查询当前的副本集状态命令:rs.status()

添加副本集成员:rs.add("服务器Ip:端口号")    -- 注意:添加或删除或重新配置副本集成员需要连到主服务器(primary)来操作

删除副本集成员:rs.remove("服务器Ip:端口号")

重新配置副本集成员:rs.reconfig(newconfig)  -- 使用方式如:newconfig = rs.config()    newconfig.members[1].host="server-2:27017"


第五步:我们知道sql server里面有一个叫做仲裁服务器,那么mongodb中也是有的,跟sql server一样,仲裁只参与投票选举,这里我们

           把F盘的mongodb作为仲裁服务器,然后指定shopex集群中的任一个服务器端口,这里就指定2222。

MongoDB集群(二) 副本集_第5张图片

 

然后我们在admin集合中使用rs.addArb()追加即可。

MongoDB集群(二) 副本集_第6张图片

追加好了之后,我们使用rs.status()来查看下集群中的服务器状态,图中我们可以清楚的看到谁是主,还是从,还是仲裁。

MongoDB集群(二) 副本集_第7张图片

 

不是说该集群有自动故障恢复吗?那么我们就可以来试一下,在2222端口的cmd服务器按Ctrl+C来KO掉该服务器,立马我们发现

在3333端口的从属服务器即可顶上,最后大家也可以再次使用rs.status()来看下集群中服务器的状态。

MongoDB集群(二) 副本集_第8张图片


仲裁服务器的优缺点:

首先需要了解的是不需要仲裁服务器,当主服务器挂了之后会自动启动选举机制,在其他副本集中选举新的主节点。选举机制中有个概念叫“大多数 - majority”,选举主节点时需要由大多数决定,只有大多数节点都支持时才能继续作为主节点,这里的大多数被定义为“副本中一半以上的成员”,如:副本集中的成员为3,大多数成员为2;成员为5,大多数成员为3,以此类推。

仲裁服务器就是当主服务器挂了之后选举新的节点用的,仲裁服务器本身是不会保存数据的,只用作选举时投票,如果副本集的数量是奇数,就不需要仲裁服务器。

不管什么情况都会加一个仲裁服务器,这种错误的理解是为了“以防万一”,假设有3个成员的副本集,加了仲裁服务器之后变成了4个,副本及的稳定性降低了:原本只需要67%的成员可用副本集就可用;现在必须要有75%的成员可用才行。而且添加额外成员也会导致选举时间边长,出现偶数个成员之后会出现两个成员票数相同的情况,仲裁者应该是避免出现平票,而不是导致出现平票。

不知道应该将一个成员作为数据节点还是作为仲裁者时,应该将其作为数据节点。在小副本集中使用仲裁者而不是数据节点会导致一些操作任务变得困难。


你可能感兴趣的:(mongodb)