MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)

- 什么是副本集?
- 副本集是一组服务器,其中有一个主服务器(primary),用于处理客户端请求;
- 还有多个备份服务器(secondary),用于保存主服务器的数据副本。
- 如果主服务器崩溃了,备份服务器会自动将其中一个成员升级为新的主服务器。
- 使用复制功能时,如果有一台服务器宕机了,仍然可以从副本集的其他服务器*问数据。
- 如果服务器上的数据损坏或者不可访问,可以从副本集的某个成员中创建一份新的数据副本。

副本集工作模式如下图:
MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)

- 副本集中数据同步过程:
- Primary节点写入数据,Secondary通过读取Primary的oplog得到复制信息,
- 开始复制数据并且将复制信息写入到自己的oplog。如果某个操作失败,则备份节点停止从当前数据源复制数据。
- 如果某个备份节点由于某些原因挂掉了,当重新启动后,就会自动从oplog的最后一个操作开始同步,
- 同步完成后,将信息写入自己的oplog,由于复制操作是先复制数据,复制完成后再写入oplog,
- 有可能相同的操作会同步两份,不过MongoDB在设计之初就考虑到这个问题,将oplog的同一个操作执行多次,
- 与执行一次的效果是一样的。
- 简单的说就是:
当Primary节点完成数据操作后,Secondary会做出一系列的动作保证数据的同步:
1:检查自己local库的oplog.rs集合找出最近的时间戳。
2:检查Primary节点local库oplog.rs集合,找出大于此时间戳的记录。
3:将找到的记录插入到自己的oplog.rs集合中,并执行这些操作。

- 副本集的实现过程
- 副本集创建步骤:

- 第一步:创建数据存储的文件夹
- 在H盘下新建三个文件夹作为存储数据的文件夹,文件夹名称:mongo1、mongo2、mongo3
- 每个文件夹内部创建一个data文件夹,然后data文件夹里面创建一个db文件夹
- 参考图片:1601-数据文件夹创建,注意我的图片中data中已经有数据,是因为我的副本集已经创建过了
- 你们第一次创建,data里面只有db文件夹
- 参考图片:1601
MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)

- 第二步:启动MongoDB服务器(每次都要启动这三个服务器)
- 打开第一个CMD窗口,执行以下命令,启动第一个mongodb服务器
- mongod --port 1111 --dbpath H:\mongo1\data --replSet test --logappend
- 打开第二个CMD窗口,执行以下命令,启动第二个mongodb服务器
- mongod --port 2222 --dbpath H:\mongo2\data --replSet test --logappend
- 打开第三个CMD窗口,执行以下命令,启动第三个mongodb服务器
- mongod --port 3333 --dbpath H:\mongo3\data --replSet test --logappend
- 第一个mongodb服务器启动成功后会显示一些系统版本之类的信息
- 第二个和第三个mongodb服务器启动后,CMD窗口最后一句命令中会显示port接口和等待连接的信息
- 参考图片:1602-启动三个MongoDB服务器
MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)
- 第三步:连接MongoDB服务器,启动mongodb的shell调试窗口
- 打开第四个CMD窗口,执行以下命令,连接到一个mongodb服务器
- mongo --port 1111
- 此处是连接到1111端口的服务器(连接其他端口也可以)
- 每次启动mongodb服务器,主服务器可能会不一样,如果连接的是主服务器
- 开始连接到mongodb服务器,不一定是主服务器,但是shell操作过程中,
- 一般会变成服务器,只有主服务器才能进行写入操作
- shell调试的前缀会变成:test:PRIMARY>,可以参考之后的图片中内容
- 参考图片:1603-连接MongoDB服务器启动mongo调试窗口
MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)
- 第四步:初始化副本集
- 创建一个配置文件,在配置文件中列出每一个成员,
- 让他们每个人都知道知道彼此的存在(第二次启动及以后就不需要再配置)
- 先使用一个空的数据库test,就是第二步启动服务器–replSet后面的名称
- 然后再输入配置文件,然后初始化配置文件
- 具体命令依次如下,没输入依次命令,按下Enter(config_test会转变为swconfig_test):
- use test
- config_test={"_id":“test”,“members”:[{"_id":0,host:“127.0.0.1:1111”},{"_id":1,host:“127.0.0.1:2222”},{"_id":2,host:“127.0.0.1:3333”}]}
- rs.initiate(config_test)
- 参考图片:1604-初始化副本集
- 注意:其中的”_id”值就是第二步中每一个服务器启动时副本集的名字–replSet后面的名称,(“test”),这个名称要保持一致。
- 将这个配置文件发送给其中一个副本集成员,然后该成员会负责将配置文件传播给其他成员,
- 如果副本集中已经有一个有数据的成员,那就必须将配置对象发送给这个拥有数据的成员,
- 如果拥有数据的成员不止一个,那么就无法初始化副本集,因此我们开始第一步就是建立的三个空文件夹,保证里面没有数据。

MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)

- 第五步:查看副本集状态
- rs.status()
- 参考图片1605/1606/1607-查看副本集状态
- 图片中可以发现,在查看状态之前还是显示为test:SECONDARY>
- 查看状态之后已经变成了主服务器,test:PRIMARY>

MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)
MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)
MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)

- 第六步:再次登录副本集
- 先执行exit,退出shell调试模式,然后关闭四个CMD窗口
- 分别打开三个CMD窗口,执行第二步中的三个命令,启动MongoDB服务器副本集
- 注意:启动第一个服务器后,CMD窗口会不断的显示连接port2222和3333接口,
- 但由于还未启动,一直未连接成功,都启动后,就会显示正常
- 参考图片:1608/1609
- 启动后,打开第四个CMD窗口,连接主服务器1111,执行以下命令
- mongo --port 1111
- 第二次启动,可以直接查看状态信息,不需要在设置配置文件。
- 以此运行以下命令,查看主服务器和备份服务器(主从节点)的相关信息:
- use test
- db.isMaster()
- 查看主副节点信息也可以执行:rs.config()
- 参考图片:1610

MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)
MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)
MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)
- 第七步:检查主副节点数据是否同步
- 第六步已经再次登录了副本集,主节点写入数据,然后主节点查看数据,依次执行以下命令
- use test
- db.testdb.insert({“test1”:“Felix”})
- show tables
- db.testdb.find()
- 退出主节点,然后登陆一个副节点,先查看数据是否复制过来,会出现错误提示
- mongodb默认是从主节点读写数据的,副本节点不允许读,读取数据,需要设置标识
- 注意,每个副节点都需要设置标识才能读取数据,设置标识命令如下
- db.getMongo().setSlaveOk()
- 对于不是副本集中的备份节点(可能之前被删除了,它的前缀变成 test:other),是不能查询到写入的数据.
- 不能对备份节点执行写入操作,备份节点只能通过复制功能写入数据,不接受客户端的写入请求
- 参考图片:1611/1612/1613

MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)
MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)
MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)

- 第八步:副本集添加和删减成员
- 副本集创建后,主节点窗口下,执行以下命令可以添加成员
- rs.add(“127.0.0.1:4444”)
- 删除成员
- rs.remove(“127.0.0.1:4444”)
- 然后运行以下命令之一查看主副节点信息
- rs.config()
- db.isMaster()
- 参考图片:1614

MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)

- 第九步:修改副节点配置信息
- 为了修改副本集成员,采用rs.config()可以创建新的配置文档,
- 然后调用rs.reconfig()方法,将刚刚的第三个副节点的接口修改,以此执行以下命令
- var config=rs.config()
- config.members[3].host=“127.0.0.1:5555”
- rs.reconfig(config)
- 参考图片:1615

MongoDB集群(副本集)新手入门图文教程(版本号:V4.0.7)