一批马赛克 MongoDB在单机上搭建分片副本集群(windows) - smile0821/learngit GitHub Wiki

配置可以参考前面一篇 https://www.cnblogs.com/a-horse-mosaic/p/9284010.html

副本集是一组服务器,其中有一个主服务器(primary),用于处理客户端请求;还有多个备份服务器(secondary),用于保存主服务器的数据副本。如果主服务器崩溃了,备份服务器会自动将其中一个成员升级为新的主服务器。 使用复制功能时,如果有一台服务器宕机了,仍然可以从副本集的其他服务器上访问数据。如果服务器上的数据损坏或者不可访问,可以从副本集的某个成员中创建一份新的数据副本。 在本地建立包含三个成员的副本集: (1)首先在本地机器建立三个文件夹,用于存放数据,路径分别是F:\mongo1\data\db ;F:\mongo2\data\db ;F:\mongo3\data\db: (2)分别在三个单独的cmd中,启动服务器(每次都要启动这三个服务器): 启动服务器一:

启动服务器二:

启动服务器三:

三个服务器启动完毕之后,不要关闭。另开一个cmd窗口,连接到1111端口的服务器(连接其他端口也可以):

每次启动,主服务器可能会不一样,如果连接的是主服务器,前缀会变成如下所示:

创建一个配置文件,在配置文件中列出每一个成员,知道彼此的存在(第二次启动就不需要再配置):

注意:其中的”_id”值就是每一个服务器启动时副本集的名字(“test”),这个名称要保持一致。 将这个配置文件发送给其中一个副本集成员,然后该成员会负责将配置文件传播给其他成员,如果副本集中已经有一个有数据的成员,那就必须将配置对象发送给这个拥有数据的成员,如果拥有数据的成员不止一个,那么就无法初始化副本集:

现在可以查看状态信息:

如果是第二次启动,可以直接查看状态信息,不需要在设置配置文件。 查看状态信息,可以看到主服务器和备份服务器:

连接主服务器后,可以写入数据:

重新启动一个cmd,连接一个备份服务器,查看是否数据被复制:

备份节点可能会落后于主节点,可能没有最新写入数据,所以备份节点默认情况下会拒绝读取请求,这是为了保护应用程序,以免意外连接到备份节点,读取到过期数据:

从备份节点读取数据,需要设置标识:

从备份服务器查询结果:

在主节点插入数据后,如果有备份节点服务器没有启动,当在该备份启动后,也可以查询到写入的数据:

但是对于不是副本集中的备份节点(可能之前被删除了,它的前缀变成 test:other),是不能查询到写入的数据:

不能对备份节点执行写入操作,备份节点只能通过复制功能写入数据,不接受客户端的写入请求:

可以随时添加或删除成员,先按之前的方法创建一个备用服务器,再添加进去:

rs是一个全局变量,其中包含与复制相关的辅助函数。 删除成员:

也可以这样查看修改结果:

修改现有的成员: 为了修改副本集成员,可以创建新的配置文档,然后调用rs.reconfig()方法,如下将第二个主机端口改为3344:

自动故障转移:当主节点挂了,其中一个备份节点会自动选举为主节点: 客户端在单台服务器上可以执行的请求,都可以发送到主节点执行(读、写、执行命令、创建索引等) 副本集中”大多数”:选择主节点时需要由大多数决定,主节点只有在得到大多数支持时才能继续作为主节点。”大多数”被定义为”副本中一半以上的成员”:

如果副本集中有些成员挂了或者不用,并不会影响”大多数”,因为大多数是基于副本集配置来计算的。 只有达到”大多数”的情况才能选举或者维持主节点,这是为了避免出现多个主节点。 推荐的配置方式: 1、将”大多数”成员放在同一个数据中心。总有一个数据中心满足”大多数”条件,可以判断出是数据中心之间的网络问题还是中心内部的问题。 2、如果成员总数总是偶数,成员平分到不同的数据中心中,任何一边都无法满足”大多数”条件。可以在第三个地方放置一个用于决定胜负的副本集成员。这样,任何一个数据中心都可以满足大多数。 选举机制 当一个备份节点无法与主节点连通时,它就会联系并请求其他的副本集成员将自己选举为主节点。其他节点会判断:a、自身是否能够与主节点连通;b、希望被选举为主节点的备份节点的数据是否是最新;c、是否有其他更高优先级的成员可以被选举为主节点。 如果被选举为主节点的成员能够得到大多数成员投票,那它就会成为主节点。 但是,即使”大多数”成员中只有一个否决了本次选举,那选举就会取消。一张否决票相当于10000张赞成票,可以看到得票数为较大的负数。 每个成员都只能要求自己被选举为主节点,不能推荐其他成员被选举为主节点,只能为申请成为主节点的候选者投票。 选举仲裁者 配置2个成员的副本集:一个主节点和一个备份节点。假如其中一个成员不可用,那网络任何一端都无法满足大多数的条件,这个副本集会退化为拥有两个备份节点(没有主节点)。 针对这种缺点,使用一种特殊类型的成员,成为”仲裁者”。它的唯一作用就是参与选举。仲裁者并不保存数据,也不会为客户端提供服务:它只是为了帮助具有两个成员的副本集能够满足大多数这个条件。 仲裁者不能保存数据(前缀是test:arbiter):

启动仲裁者与启动普通mongod的方式相同,副本集的名称保持一致,将仲裁者添加到副本集中:

添加的结果:

删除仲裁者,也是正常的操作:

使用另一种方法添加仲裁者:

成员一旦以仲裁者的身份添加到副本集中,它就永远只能是仲裁者,无法将仲裁者重新配置为非仲裁者,反之亦然。 最多只能使用一个仲裁者,如果节点数量是奇数,就不需要仲裁者。 在不知道应该将一个成员作为数据节点还是作为仲裁者时,应该将其作为数据节点。应该尽可能在副本集中使用奇数个数据成员,而不要使用仲裁者。 优先级 优先级用于表示一个成员渴望成为主节点的程度。优先级的取值范围可以是0-100。默认是1,将优先级设为0,表示成员永远不能够成为主节点。这样的成员被成为被动节点。

设置优先级并不会导致副本集中选不出主节点,也不会使数据不够新的成员成为主节点(一直到它的数据更新到最新)。 修改副本集配置时,新的配置必须要发送给在新的配置下可能成为主节点的成员。无法在一次reconfig操作中将当前主节点的优先级设置为0,也不能对所有成员优先级为0的副本集执行reconfig。 优先级的值只会影响副本集成员间相对优先级大小关系。 隐藏成员 客户端不会向隐藏成员发送请求,隐藏成员只有在其他复制源都不可用时,才会被作为复制源。只有优先级为0的成员才能被隐藏,不能将主节点隐藏:

注意:使用rs.status()和rs.config()能够看到隐藏成员,隐藏成员只对isMaster()不可见。客户端连接到副本集时,会调用isMaster()来查看可用成员。 延迟备份节点 有意设置延迟节点,延迟节点的数据会比主节点延迟指定的时间(单位是 秒),从先前的备份中恢复过来,避免数据遭到毁灭,可以使用 slaveDelay配置。 也是要求成员的优先级为0,应该将延迟备份节点隐藏掉。避免客户端请求。 创建索引 备份节点并不需要与主节点拥有相同的索引,甚至可以没有索引。可以配置 buildIndexs:false 。可以阻止备份节点创建索引。也是要求成员的优先级为0。 一旦成员设置为false,那就永远无法恢复为可以创建索引的正常成员。除非将这个成员从副本集中移除,再删除它的所有数据,任何再添加到副本集中,允许它同步进行数据更新。

附录:

由于windows上启动配置进程,需要开多个cmd窗口,所以用.bat批处理文件封装下,每次直接执行批处理就可以了。

mongo1_start.bat

mongo2_start.bat

mongo3_start.bat

mongo4_start.bat

connect_mongo1.bat

客户端测试

https://www.cnblogs.com/a-horse-mosaic/p/9284297.html