MONGODB 奇怪12问 switch over

dde50833a08a9430bc5b67d190780246.png

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共600人左右 1 + 2)。

最近我们公司的 REDIS DBA 和 MONGODB DBA 在SWITCH OVER, 我提出了一些问题关于MONGODB 的问题,来让两个DBA 能更快的融合对方的知识。

下面有12 个关于MONGODB 的问题,咱们来看看这些问题以及一些在此时此刻我认为正确的答案

1  Mongodb 众多的版本中,划时代的版本是那个?

实际上这个问题是一个比较难回答的问题,我可以说 5.0 我也可以说 6.0,但这里我给出的答案是 3.2 因为在MONGODB 3.2  wiredTiger 引擎作为MONGODB 的默认引擎推出,而不再是MMAPV1,这段对于MOGNODB 是十分重要的,重要性和MYSQL 从 MYSIAM 到 INNODB 的 意义一样重要。

2  MONGODB 运行当中,如果开发抱怨说写入的数据经常无法读取到,他们希望的是,写入即刻读取,那么你有什么办法?

这里能想到的方案有两个

1  让数据写入的时候,确认写入的节点,如当前有3个节点,则需要 writeconcern 的节点数是 3 ,这样,在进行读取并且通过 secondary  preferred 去读取的情况下,是可以读取到数据的。在MOGNODB 4.2后我们可以使用 majority committed 的方式来解决这个问题。

2  设置连接为 primary preferred 也就是写入和读取都会在主节点进行相关的操作,这里就不会出现读不出数据的问题了。

那么这里两个方案都会有各自的问题, 1 方案整体的写入延迟会较高,各个节点的写入压力会升高,2 方案 主节点的压力会变高

当然还有软件的解决方案,这里就不在啰嗦了。

3  问题,目前我有两个从节点,但是一个从节点由于某些原因导致延迟严重,那么我还是要使用 secondary prefer 是否可以避免读取这个延迟的严重的节点 ?

这个问题的解决方案可以从mongodb 3.4 后的在客户使用 secondary , secondaryPreferred 中实现,在连接串中使用 maxStalenessSeconds 来指定当客户读取的从库与主库之间的数据差距太大(时间)的情况下,将不会选择这个从库来进行读取数据。但这里需要指明的,这个值不能太小需要在90秒以上,避免由于时间设置太短导致的问题。

0f8f0ee087643a17a1e38faf7cf38afb.png

4   MONGODB 在复制集中常用的索引类型有那些?

MONGODB 中主要的索引类型主要有以下几种

1  单字段索引

2  复合索引

3  多键索引

4  文本索引

6  通配符索引

7   唯一索引

8   隐藏索引

而在这些索引中还会有其他的组织形式,如sparse 索引,我们可以称之为稀疏索引。TTL 索引,部分索引,不区分大小写的索引 等等 这些索引在使用上的功能的划分。

5  如何判断一个MONGODB 的INDEX 是从来没有使用的?

通过  db.collation_name.aggregate([{$indexStats: {}}]) 中的 ops 中的信息来获取时间和次数

4eef252fd6f53987b63bc521c63de0f0.png

6  Mongodb 是否可以和其他的应用一起安装,或者多个MOGNODB 的实例进行在同一个物理机上进行安装 ?

不建议这样使用,主要的原因是MOGNODB 是使用内存映射存储的引擎,将IO 操作转换为内存的处理操作,一般MONGODB 的早期版本在内存释放方面是有问题的,所以我们不建议在一些较低版本如 5.0以下的版本去在一个物理机安装多个实例,避免互相因为内存的问题引出的资源争抢导致的问题。

7  MongoDB 怎么判断内存不足或内存需要进行添加的问题 ?

MONGODB 的数据是压缩应存储到磁盘上的,所以数据需要缓冲到LINUX 的系统缓冲CACHE 中,加速文件的解压和获取。所以不能用传统的数据库内存的管理方式来看MONGODB 的缓存设置

除此之外, mongodb 在除了以上内存的使用以外,还有一些内存的使用

1   在数据库操作commit 的操作时,数据并不是立即刷到磁盘中,而是有对应的缓冲来在脏页刷新到磁盘前,进行数据的缓冲

2   mongodb 是一个支持MVCC 的多版本控制的数据库,所以在操作时,数据行的多个版本是要存储在内存中的

3  客户的连接,以及聚合操作等内存的消耗

所以内存到底够不够用,这里通过db.serverStatus().wiredTiger.cache 命令捕获下面的一些数据,可以来判断内存的使用情况

wiredTiger.cache.tracked dirty bytes in the cache

这个值是脏数据驻留在wiredTiger cacheSize 里面的脏数据大小,如果这个值对比wiredTiger cacheSize 的设置的内存值 超过 5%的容量,同时通过工具 mongostat持续观察其中的指标dirty如果此时你的dirty持续在20%,会得出两个可能

1 你的磁盘系统不能满足当前的业务在MONGODB中的使用

2 你的内存有必要进行添加了

同时也可以通过  db.serverStatus().wiredTiger.concurrentTransactions 来看数据写入时是否有内存缺少的可能,注意available 的值的变化、

bd890db19b7b0d249cd79d15ab19e83a.png

除此以外还可以通过

db.serverStatus().wiredTiger.cache['pages requested from the cache']

db.serverStatus().wiredTiger.cache['pages read into cache']

我们以 2秒为一个取数点,将 page requested from the cache 的值减去上一个 2秒的值,作为一个增量,通过针对 page read into cache 也是一样的处理方式。然后将第一个值 /  第二个值 * 100  =  buffer cache hit ratio

来查看当前数据在cache 中的命中率。

8  Mongodb 如果选择进行分片的方式进行数据库的安装和使用,这里建议的版本是那个版本及以上?同时MONGODB 那个版本出现了时序数据库的概念和使用方式?

MONGODB 在5.0 版本后推出了,在线数据重新分片的功能,这让很多之前分片键选错或业务改造的同学,在MOGNODB 数据分片部分获得了重生的机会通过 reshardcollection 命令就可以重新分片。

后台将所有当前集合的数据复制并重新写入新集合,同时与应用程序新的写入保持同步。将重新分片花费的时间从几周或几个月压缩到几分钟或几小时,避免了冗长繁杂的手动数据迁移。

同时5.0 推出了时序数据表的功能,为时序数据在MONGODB中实现创造了可能。

9   Mongodb 在复制集中有几种节点的类型 ,分别代表的意义?

MOGNODB 复制集合中,节点的类型有以下几种

Primary        主节点,写节点

secondary    从节点,读节点  ,选举节点

Arbiter          参与选举投票的节点

Secondary hidden   隐藏节点

10  如果系统中出现一个从节点,由于硬件的原因导致他经常出现延迟,但是目前需要他作为一个节点存在在系统中,我们可以直接连接他 即可,但是因为延迟,需要这个节点做到以下工作,1 不能进行投票  2 不能被选举  2 不能通过集群连接到这个节点 ?

这里应该在MONGODB 的选择中需要针对这个问题的节点设置为hidden , 也就是这个节点 对于整个集群是隐藏的,在设置中这个节点是不在参与投票,并且在使用MONGODB 的写大多数部分对于这个节点是无效的,也就是这个节点虽然是连接到集群中,但是不餐饮集群中的任何操作,对于集群是隐藏,仅仅进行了数据复制和数据直连读取的功能。

41fba823d373bffc7a2f8aa0c514a9ed.png

11  在MONGODB 的使用中,公司虽然对于MONGODB 的备份有一定的规划,通过SNAPSHOT 镜像的方式来进行备份已经提上日程,但是目前还需要通过文件拷贝的方式进行备份? 怎么来操作

虽然mongodb 在备份中可以通过 mongodump 等方式来进行备份,或通过其他的方式文件快照的方式,但是目前如果无法做到,但需要拷贝某一个时刻的数据文件作为备份,则可以考虑在原有的集群中,添加一个hidden节点,然后在备份的过场中,将节点停止掉,在数据文件CP 后,在开启节点,作为一个临时的备份的方案。

12  MONGODB 在那个版本可以不在通过TTL 索引来进行 expireAfterSeconds 的操作,并且可以直接将现有的索引直接转换为唯一索引?

MONGODB 5.1 后的版本将不在强制通过TTL 索引来进行超过预期时间的索引的数据的处理,而是直接可以通过collmod 命令可以将自动删除数据的功能添加在普通索引中,而6.0中可以在数据允许的情况下,方便的将普通索引转换为唯一索引。

希望他们不要看到这个文字,周一我就考考他俩 

f29b9dcf26952dc69bf26b6beb14b068.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值