开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。
最近我们公司的 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秒以上,避免由于时间设置太短导致的问题。
4 MONGODB 在复制集中常用的索引类型有那些?
MONGODB 中主要的索引类型主要有以下几种
1 单字段索引
2 复合索引
3 多键索引
4 文本索引
6 通配符索引
7 唯一索引
8 隐藏索引
而在这些索引中还会有其他的组织形式,如sparse 索引,我们可以称之为稀疏索引。TTL 索引,部分索引,不区分大小写的索引 等等 这些索引在使用上的功能的划分。
5 如何判断一个MONGODB 的INDEX 是从来没有使用的?
通过 db.collation_name.aggregate([{$indexStats: {}}]) 中的 ops 中的信息来获取时间和次数
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 的值的变化、
除此以外还可以通过
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 的写大多数部分对于这个节点是无效的,也就是这个节点虽然是连接到集群中,但是不餐饮集群中的任何操作,对于集群是隐藏,仅仅进行了数据复制和数据直连读取的功能。
11 在MONGODB 的使用中,公司虽然对于MONGODB 的备份有一定的规划,通过SNAPSHOT 镜像的方式来进行备份已经提上日程,但是目前还需要通过文件拷贝的方式进行备份? 怎么来操作
虽然mongodb 在备份中可以通过 mongodump 等方式来进行备份,或通过其他的方式文件快照的方式,但是目前如果无法做到,但需要拷贝某一个时刻的数据文件作为备份,则可以考虑在原有的集群中,添加一个hidden节点,然后在备份的过场中,将节点停止掉,在数据文件CP 后,在开启节点,作为一个临时的备份的方案。
12 MONGODB 在那个版本可以不在通过TTL 索引来进行 expireAfterSeconds 的操作,并且可以直接将现有的索引直接转换为唯一索引?
MONGODB 5.1 后的版本将不在强制通过TTL 索引来进行超过预期时间的索引的数据的处理,而是直接可以通过collmod 命令可以将自动删除数据的功能添加在普通索引中,而6.0中可以在数据允许的情况下,方便的将普通索引转换为唯一索引。
希望他们不要看到这个文字,周一我就考考他俩
标签:MONGODB,over,cache,索引,switch,内存,数据,节点 From: https://blog.51cto.com/u_14150796/6534563