开发者学堂课程【MongoDB精讲课程(下):故障测试_1】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/727/detail/12978
故障测试_1
主节点的选取原则:
第一要获得票数最高,获得票数最高之后还得获得大多数成员的一个统一,才能去成为这个主节点。
根据刚刚了解到的选举原则,来测试一下,比如说一些副节点挂,或者主节点挂了之后是什么样的情况,当前的这个副本集,首先来模拟一下这个副本节点故障,比如说现在把这个副本节点给它挂了。
让它当机,当机完之后,再来查看一下整个副本级的一些状态,它的主节点和它的仲裁节点会不会有受影响,主要去观察一下这方面的内容,首先搞一个窗口,主要是去模拟当机场景。
把这个 clean 一下,这样先查看一下,查看一下当前的这个 mongo ,启动的这些 mongo 服务。
首先,现在这块是六个服务,这前面这三个是客户端,就是在前面启动的这三个客户端。
主要看这个三个启动的 mongo 服务27017 27018 27019 这三个服务。
第一步,模拟一下副本节点故障,副本节点,是这个 27018 是这个服务。
先把它挂掉,直接找到这个进程给它挂掉,挂掉之后,这时候这个副本节点挂掉,副本节点挂掉了之后,看一下主节点,主节点来执行一下这个查询的命令: db.comment.find 。
这时主节点,是不受任何影响的查看是没问题的,模拟再去插一下数据。再来翻译一下,这时候有两条数据了,两条数据,再找到的这个副本节点,这个副本节点是 second 的,再来按一下回车,按回车的时候会发现,这时候它已经挂掉了,不能做任何操作,这个主节点,会发现它主节点不受任何影响,插入和查询都没有任何问题。
如果说再把这个副本节点给它重启起来,再让它起来。
去找一下刚刚的这个启动命令,可以把这个副本节点再给它起来。
执行一下,再把这个补起来,这时的副本节点又起来了,起来了之后再来看一下, Comment.find ,发现了有意思的现象,就是这时候当副本节点再起来的时候,再去查看的时候,有两条数据。
说白了就是当副本节点,刚才模拟了一下 dbc 完之后,再去查询它的时候,它是会自动的去同步主节点的数据,副本节点它的数据还是会和这个主节点保持一致,这就是这个 mongo db的副本集的一个好处,数据的一个高可用,包括通过数据融于的方式,它会自动去同步主节点的数据,模拟副本节点挂了整个副本集是不受任何影响的,如果说主节点挂了实际上想要触发的是不是它的第二次选举。
重新选举,这时可以模拟一下,把这个主节点给它挂掉,同样先查看一下这个服务,现在还是一样是三个服务。
可以把主节点27017挂掉,找到这个主节点挂掉,找到这个主节点,再来看内容,发现这主节点也贵了,再来看这个副本节点,这是副本节点,副本节点重新退出一下,给它重连一下会发现这时候它就不是主节点27018。
这打开的是刚刚27018的这个窗口,27018它会自动的把它升级为主节点。
如果说刚才没有像这样操作的话,它还是从节点的时候才能找到这个,如果它还是副本节点的时候,直接按回车,大概过个十秒钟的时候,心跳同步的时候,它会自动的把它推举为主节点,这时候其实刚刚就是完整的演示了一下它的选取的规则,但是什么规则,最开始搭建的这个图:
现在有三个这个服务节点:一主一副一仲裁,当主节点挂掉了之后,它变成了当前有两个服务存在,它会主节点挂了之后会突发这个重新的选举,首先第一点,这个仲裁节点是不具备选举权的,因为它是零,它的这个优先级是零,就算给它投票也没用。
这时这个副本节点,它自己给自己投了一票,然后仲裁节点又给它投了一票,一加一就变成了两票,它获得了两票,两票它代表两个成员同意它,整个副本集现在是三,整个副本集是三之后,这个二代表的是大多数,大多数同样满足这个成员大多数。
第二它获得的票数也是最高的,它一共拿到的是两票,这个副本集呢,它是没有权利,就算它有选举权,因为它的这个优先级是零,是零,然后它再加上这个 secondary 给它的一票也最多也就是得到票数之一,它还是少于它的这个票数。
所以说,唯一的这个主节点挂了之后,唯一的选择实际上就是这个副本节点,会自动的升级成这个主节点。