资讯专栏INFORMATION COLUMN

有坑勿踩(一):MongoDB PSS vs PSA

Freelander / 939人阅读

摘要:注意记住的作用始终是把集群中具有投票权的节点总数凑成奇数用,防止脑裂。其代表的意义是集群中必须有大多数节点收到并确认了一个写操作,这个写操作才算成功。无论源或者目标片中不能够满足大多数时,迁移都会失败。在有可能的情况下,应尽量使用代替。

前言

在技术社区混了这么长时间,因为一些常见的技术问题反复被问到,总是想写写文章把它们讲清楚。无奈很多时候看似基础的技术问题背后都隐藏着很深的原因,想要一次性说清楚太花时间,而平时又没有很多时间能花在上面(主要是懒),所以产生了写一系列文章的想法,讲讲我或我的客户使用MongoDB过程中经常遇到的各种“坑”。话虽如此,难者不会会者不难,希望看了这些讲解你就不再认为这些是“坑”了。

在讲解这些问题前,我会假设读者已经对MongoDB有了最基础的了解,因此一些基本名词和概念就不做过多的解释,请自己查阅相关资料。

PSS vs PSA 什么是PSS/PSA?

在MongoDB复制集中,存在三种类型的角色:

PRIMARY: 主节点(P)

SECONDARY: 从节点(S)

ARBITER: 仲裁节点(A)

构建一个复制集至少需要3个节点,所以用户就有了两种选择,即PSS和PSA。
注意:记住A的作用始终是把集群中具有投票权的节点总数凑成奇数用,防止“脑裂”。因此诸如PAA,PSSAA之类的配置是没有存在的意义的,极端情况下还会扰乱集群的正常工作。

PSA有什么好处?

最直接的好处:省钱啊!随便找台机器,不消耗什么资源就可以运行一个A,比一个S的成本小多了。

PSA有什么问题? 读写失效

最直接的问题来自于MongoDB中的一个配置选项{w: "majority"},这个配置决定了一次成功的写入操作需要到达多少个节点才算真正的成功,w可以定义为1,2,...n(n<=集群节点总数)或majority。而majority是保证在集群故障时不丢失数据的必要配置(关于majorityw以后再专门写文章讨论)。其代表的意义是:集群中必须有大多数节点收到并确认了一个写操作,这个写操作才算成功。
在三个节点的集群中,{w: "majority"} == {w: 2}。因此如果集群配置是PSA,由于A是不存数据的,所以集群中能够确认写操作的节点只有P和S,刚好是2。到这里可能有人已经看出问题了:在PSA中如果有一个数据节点宕机,则再也不能满足{w: "majority"},所有使用这种配置的写操作都会失败。因此可以说,PSA在一定程度上丢失了高可用性,因为任何一个数据节点的失效都会导致{w: "majority"}类型写入的失败。
引申一下,ReadConcern同样有可选值majority,因此同样可能因为一个数据节点的失效而失效。

集群部分功能失效

可能你会觉得:什么{w: "majority"}没听说过啊,我也不在乎丢失数据,那用PSA是不是就没有问题了?当然不是!在很多你没注意到的场景都存在着{w: "majority"}。比如:

分片集群数据迁移。无论源或者目标片中不能够满足大多数时,迁移都会失败。

分片集群管理。包括但不限于以下这些操作实际上都隐含着{w: "majority"}。一旦不能满足,这些操作都会失败:

db.dropDatabase()

db.collection.drop()

db.collection.dropIndex({...})

sh.shardCollection(...)

db.createUser(...)

结论

majority比你想象的更重要,PSA不能够提供足够的可用数据节点来保证majority,因此在很多场景下会引发隐藏的错误。在有可能的情况下,应尽量使用PSS代替PSA。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/19415.html

相关文章

  • 有坑勿踩(三)——关于数据更新

    摘要:前言数据更新,中的,对任何数据库而言都是最基本的操作。你并不能保证数据在被你读出来到写回去期间是否有别人已经改了数据库中的记录,这就是第一个风险,操作存在潜在的可能性会覆盖掉别人更新过的数据。 前言 数据更新,CRUD中的U,对任何数据库而言都是最基本的操作。看似简单的更新操作中会藏着哪些坑?今天聊一聊这个话题。 在写这个系列文章时,我会假设读者已经对MongoDB有了最基础的了解,因...

    mengera88 评论0 收藏0
  • 有坑勿踩(二)——关于游标

    摘要:本质上所有查询的数据都是从游标来的。的作用是从游标中提取一批数据,具体提取多少则是由决定。同时注意我们已经有了一个游标。为了便于理解,我们下面还是称之为游标超时。 前言 聊一聊一个最基本的问题,游标的使用。可能你从来没有注意过它,但其实它在MongoDB的使用中是普遍存在的,也存在一些常见的坑需要引起我们的注意。 在写这个系列文章时,我会假设读者已经对MongoDB有了最基础的了解,因...

    bawn 评论0 收藏0
  • Head First JNA

    摘要:与动态链接库配套的,会有相应的头文件,来声明动态链接库中对外暴露的方法。结构体映射结构体映射类编写类,继承,表示这个一个结构体。声明字段与,并且设置访问属性为。计算机状态结构体结构体指针结构体具体的值至此,功能完成。 问题描述 虚拟化项目,需要用到Java调用原生代码的技术,我们使用的是开源库JNA(Java Native Access)。 Native(C/C++)代码,编译生成动态...

    YPHP 评论0 收藏0
  • MongoDB Change Stream初体验

    摘要:可以发现,整个同步过程是依赖于来进行的。不考虑导致的问题,正常的应用升级也会导致应用中断运行。注意事项为了避免被回滚的更新被发布出去,选择只在一个变更到达大多数节点不可能被回滚时,才会将这些变更发布到应用。 Change Stream是MongoDB从3.6开始支持的新特性。这个新特性有哪些奇妙之处,会给我们带来什么便利?本次的文章将就这个主题进行初步讨论。 Change Stream...

    1fe1se 评论0 收藏0
  • SaaS化实践——如何用个微信公众号登录多个不同的域名

    摘要:微信登录的核心代码依然采用这个库。核心概念表结构中控机中控机为同一引导用户登录的微信登录服务器,其中此机器做的为截图部分的,引导用户授权,微信回调到此中控机,拿到。微信回调到后,拿着,跳转到对应的客户域名。 背景 SaaS 作为一种服务,需要为不同的客户定制不同的域名以满足客户定制化的需求。而微信登录时需要填写一个回调地址,单一的回调地址是难以处理多客户域名的业务需求的,经过不同的 S...

    alanoddsoff 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<