整理mongodb文档:副本集一
本文讲解较为粗糙,对于没有后台开发经验的人员,建议配合官网了解下相关概念。个人博客,日常求关注
文章会先花费几分钟讲解下关于垂直缩放以及水平缩放的概念,以方便大家对副本集有一个理解,再配置一个基本的副本集加深理解
在了解关于什么是副本集概念之前,先大概讲下副本集能解决什么问题。
前面的博客中,即使到了事务的阶段,依旧使用的是单机服务,即只有一个Mongodb的实例,但我们也都明白,实际的环境中不可能这么处理,比如当我们在线上使用单机服务的时候,如果一个SQL查询时间过大,导致整个服务卡死了,那么就会GG,首先,我们可以通过垂直缩放的方式,也就是通过提供服务器的性能,比如增加Cpu等的方式,提供运算能力,尽可能的避免出现问题。
但垂直缩放的方式是通过钞能力提供服务器的性能,而当我们的业务水平发展到更高的程度时,这台老旧的服务器无法再支持我们的数据更新了,我们就需要更换一台性能更好的服务器,最主要是对很多的小公司来说,垂直缩放代表着需要在前期就投入大量的资源在服务器上,很难说公司会有这样的魄力,而水平缩放就更适合项目前景不明确,不太愿意砸钱的情况下
水平缩放意味着通过添加更多节点用于处理数据库查询来缩放数据库,简单来说,就是当我无法在一台服务器上死命的堆资源的时候,我们就用多个服务来增加服务器的“韧性”,而Mongodb正是属于这种情况。
理想情况下,大家的预想是三台服务器,各自保存着三分之一的数据,这就是分片数据库。理想情况下,分片数据库将数据均匀分布在所有分区中。但这很难实现,因为所有分区中的数据分布都或多或少地需要进行平衡。 一致哈希是当前许多数据库系统常用的主流技术,不过分片下,这个服务器上的数据丢失之后将无法找回,所以我们更倾向于使用’复制‘的方案。
复制是跨多台服务器复制数据的过程,目的在于增加指向各个数据片段的可用路径的数量。可以出于性能、可用性和/或容错性的原因复制数据。复制数据可以提高性能,特别是读取操作的性能,因为复制允许并行访问相同数据的多个副本。复制有助于提高可用性和容错能力,因为如果数据库系统的一部分发生故障,可使用备份位置中的数据。
所谓副本集是指服务于同一数据集的多个mongodb实例;这意味着在mongodb中数据集副本的数量可以是多个,每个副本的数据都是一样的;副本的存在主要作用是对mongodb数据库中的数据做冗余备份和提高数据服务的可用性;在mongodb中对数据做冗余的方式有两种,一种是主从架构,这种架构和mysql中的主从架构没有什么不同,但是在mongodb中,主从架构的方式几乎没有人用,处于废弃的状态。。另外一种是副本集,副本集本质上也是主从架构的一种,它和我们刚才说的主从架构,有一个显著的区别,副本集支持故障自动转移,不需要人工手动干预。
至此,大家也可以理解为什么大家都在讲Mongodb的副本集,很少有人讲Mongodb的主从结构了。
在了解了副本集的设计思想以及面对的问题之后,我们现在开始了解下副本集的组成
一个副本集由主节点以及从节点组成。也就是说维持一个副本集功能实现的最小架构,必须要有一个主节点以及一个从节点来组成。但是我们一般是推荐一个主节点,两个从节点,也就是如果主节点挂了,其中一个从节点也挂了的时候,还有一个从节点。而在主-从结构下,一般也会添加仲裁节点,仲裁节点不持有数据,但是可以选择哪个节点作为主节点。
主节点,是唯一一个可以接受写操作的成员。MongoDB在主节点 上应用写操作,然后将这些操作记录到主节点的oplog中。从节点成员复制这个日志然后应用到它们的数据集中。
从节点是维护了主节点数据集的副本。为了复制数据,从节点通过异步的方式将主节点oplog 应用至自己的数据集中。一个副本集可以有一个或多个从节点。
仲裁节点在某些情况下(例如有一个主节点和一个从节点,但由于成本约束无法添加另一个从节点),你可以在副本集中添加一个仲裁节点。仲裁节点没有数据集的副本,并且不能成为主节点。然而,仲裁节点可以参与主节点选举。
直白来说,一个最小的推荐的副本集就是一个主节点以及两个从节点,主节点的作用是接受我们的读写操作,并且将其保存在oplog中,其他的副节点定时通过oplog将自己的数据进行更新,保证与主节点的一致,而当我们的主节点故障的时候,我们的仲裁节点就可以通过选举,选出新的节点作为主节点(刚刚故障下台的那个主节点,无法被选举为新的主节点),而从节点是无法直接执行写操作的。
在了解了副本集的结构之后,接下来我们开始在单机上配置一个副本集。
1.首先,我们把现在存在的Mongodb服务停止了,防止对后面的步骤产生影响。
net stop mongodb
2.进入到Mongodb的文件夹下,创建三个存放我们副本集数据的文件夹,一主两从的,就设置为data1、data2、data3。
3.在不同的命令窗口中,分别运行下面三个shell。
mongod
--port 27017
--dbpath ./data1
--replSet replSetTest/[localhost:27018,localhost:27019]
mongod
--port 27018
--dbpath ./data2
--replSet replSetTest/[localhost:27017,localhost:27019]
mongod
--port 27019
--dbpath ./data3
--replSet replSetTest/[localhost:27017,localhost:27018]
其中,第一条指的是在27017 端口下启动我们的mongdb服务,将数据存储在data1的目录下,并且设置名字为replSetTest,并且这个副本集的其他两个从节点为27019以及27018。
接下来在我们的可视化软件中输入下面三个链接,方便后面的测试
mongodb://127.0.0.1:27017/?readPreference=primary&appname=MongoDB%20Compass&directConnection=true&ssl=false
mongodb://127.0.0.1:27018/?readPreference=primary&appname=MongoDB%20Compass&directConnection=true&ssl=false
mongodb://127.0.0.1:27019/?readPreference=primary&appname=MongoDB%20Compass&directConnection=true&ssl=false
不过此时由于我们还没有初始化我们的副本集,所以当打开mongodb compass的时候,会出现下面的错误
An error occurred while loading navigation: ‘not master and
slaveOk=false’: It is recommended to change your read preference in
the connection dialog to Primary Preferred or Secondary Preferred or
provide a replica set name for a full topology connection.
因此,我们先使用mongosh链接到我们的服务中
express的使用(五) 简单的使用mongodb
.\mongosh mongodb:localhost:27017
接下来使用rs.inititate方法来配置副本集,rs是replset的意思,是mongodb自带的。我们可以使用rs来配置mongodb的副本集,而_id就是刚刚设置的副本集的名字,members是成员,其中默认设置第一个为主节点。
const config = {
_id: 'replSetTest',
members: [
{ _id: 0, host: '127.0.0.1:27017' },
{ _id: 1, host: '127.0.0.1:27018' },
{ _id: 2, host: '127.0.0.1:27019' }
]
}
rs.initiate(config)
再次打开mongdb compass软件,可以发现,除了27017之外的服务,依旧会出现上述的提示,这是因为27017已经被选定为了主节点,可以有读写的操作,而其他的两个从节点,没有了读写的操作了。故此,后面的操作将会使用shell的方式来演示。
往27017中写入数据,查看27018以及27019是否出现
到此,一个搭配起来的副本集就完成了,由于篇幅过长,会有第二篇博客再延续下去
垂直缩放在部分博客中又叫做纵向扩展,水平缩放也叫做横向扩展,只是因为个人喜欢用这两种称呼,所以在文章中如此使用
副本集中的从节点,有时候我们也会叫做副节点,一般为了统一,我喜欢用secondary表示。
在MongoDb中,一个副本集最多只有50个从节点,当然我们也不会设置这么多个从节点的。