当前位置: 首页 > 科技观察

一次网上意外,领悟到MongoDB的精髓

时间:2023-03-20 12:24:29 科技观察

大家好,我是哪吒。最近项目在使用MongoDB作为图片和文档的存储数据库。为什么不直接存储在MySQL中,搭建一个MongoDB集群。麻烦吗?一起来一探究竟,继续学习“MongoDB分片”的理论与实践,实现快速入门,丰富简历,提升面试水平,给自己加一点谈资,秒变面试高手。BAT不是梦。三分钟你将学会:一次MongoDB线上事故的快速解决方案什么是MongoDB分片?MongoDB是如何分片的?什么时候分片?搭建MongoDB分片服务器MongoDB如何跟踪分片的集群数据?MongoDB拒绝连接?很明显MongoDB服务又宕机了。连接到MongoDB服务器以找出答案。使用ps-aef|grepmongo查看mongo服务是否还在?不出所料,他们走了。很可能是因为磁盘已满。df-TH查看磁盘空间。如何解决磁盘100%的问题?cd到日志目录,通过rm-rf*删除所有日志,重启MongoDB。Mongodb启动异常:即将fork子进程,等待服务器准备好连接由于MongoDB部署在集群中,启动时会进行数据同步,可能比较耗时。心急,怎么忍,直接按CtrlC,强行停止,再重启。通过ps-aef|grepmongo查看进程,列出了两个相同的进程。通过ps-aef|grepmongo|强制停止所有mongo进程grep-vgrep|awk'{print$2}'|xargs杀死-9。删除data目录下的mongod.lock和diagnostic.data文件,重启MongoDB,启动脚本mongos_start.sh(mongod--configdata/mongodb.conf),完美解决。MongoDB服务器的部署目录是什么意思?他们之间是什么关系?下面简单介绍一下MongoDB的分片。1、什么是MongoDB分片?分片是指跨机器拆分数据的过程,也称为分区。MongoDB支持手动分区。使用这种方法,应用程序维护与多个不同数据库服务器的连接,每个服务器是完全独立的。该应用程序不仅管理不同服务器上不同数据的存储,还管理在适当服务器上查询数据。但是当节点从集群中添加或删除时,或者面对数据分布或负载模式的变化时,很难维护。MongoDB支持自动分片,它试图从应用程序中抽象出数据库模式并简化系统管理。MongoDB自动平衡分片之间的数据,从而更容易添加和删除节点。MongoDB的分片机制允许您创建一个由许多分片组成的集群,并将集合中的数据分布在整个集群中,将数据的一个子集放在每个分片上。这允许应用程序超过独立服务器或副本集的资源限制。由分片组成的集群就像应用程序的独立服务器。一个或多个称为mongos的路由进程在分片之前运行。Mongos维护一个“目录”,指定每个分片包含哪些数据。应用程序可以连接到这个路由服务器并正常发出请求。路由服务器知道哪些数据在哪个分片上,并可以将请求转发到适当的分片。如果有对请求的响应,服务器收集它们的原因,合并它们,并将它们返回给应用程序,只要应用程序知道它连接到单个mongod。2、MongoDB如何分片?在单机上快速搭建集群。首先,使用--nodb和--norc选项启动mongoshell:mongo--nodb--norc。使用ShardingTest类创建集群。运行以下代码:st=ShardingTest({name:"one-min-shards",chunkSize:1,shards:2,rs:{nodes:3,oplogSize:10},other:{enableBalancer:true}});name:分片集群的标签。shards:指定集群由两个分片组成。rs:将每个分片定义为3个节点的副本集。enableBalancer:在集群启动后启用平衡器。ShardingTest旨在支持服务器端测试套件。它在保持尽可能低的资源使用率和构建具有相对复杂架构的分片集群方面提供了很多便利。运行ShardingTest时,它会创建一个包含两个分片的集群,每个分片都是一个副本集。同时,配置副本集并启动每个节点,并使用必要的选项来建立复制协议。它启动一个mongos来管理跨分片的请求,以便客户端可以与集群交互,就像它们与独立的mongod通信一样。最后,它为配置服务器启动一个额外的副本集,用于维护调整表的置信度,以确保查询被定向到正确的分片。分片的主要用例是拆分数据集以解决硬件和成本限制,或为应用程序提供更好的性能。当ShardingTest完成集群设置时,它将启动并运行10个进程,您可以连接到这些进程:两个副本集(每个副本集3个节点)、一个配置服务器副本集(3个节点)和一个mongos。默认情况下,这些进程将在端口20000上启动。mongos将在端口20009上运行。3.何时分片?通常,分片用于:增加可用RAM。增加可用磁盘空间。减少服务器负载。处理单个MongoDB无法维持的吞吐量。4.搭建MongoDB分片服务器1.配置服务器配置过程配置服务器是集群的大脑,保存着每个服务器包含哪些数据的所有元数据,因此必须先创建配置服务器。配置服务器非常重要,运行时必须启用日记功能并确保其数据存储在非临时驱动器上。配置服务器必须在任何mongos进程之前通过mongod-fconfig.conf启动,因为mongos需要从配置服务器中提取配置信息。写入配置服务器时,MongoDB使用“多数”的writeConcern级别;从配置服务器读取时,MongoDB使用“多数”的readConcern级别;如果它被滚动,它只会被提交到配置服务器副本集。它还确保只读取那些不受配置服务器故障影响的元数据。这确保所有mongos路由节点在数据在分片集群中的组织方式上具有一致性。在服务器资源方面,配置服务器要有足够的网络和CPU资源。配置服务器只保存数据在集群中的目录,因此只需要很少的硬盘存储资源。由于配置服务器的重要性,在任何集群维护之前都应该备份配置服务器的数据。2.mongos进程mongos是应用程序连接的路由服务器。通过mongod-fconfig.conf启动路由服务器。mongos进程需要知道配置服务器的地址,所以需要在config.conf中配置cnotallow=configReplSet/configurationserver这三个地址,通过配置logpath保存MongoDB日志。启动一定数量的mongos进程,并尽可能靠近所有分片放置,这样可以提高查询性能。3.将副本集转换为分片。依次启动配置服务器和路由服务器后,就可以添加分片了。如果之前已经存在一个副本集,那么这个副本集将成为第一个分片。从MongoDB3.4开始,对于分片集群,分片mongod实例必须配置--shardsvr选项,即在config中添加shardsvr=true。每个成员重复以上动作。将副本集作为分片加入集群后,可以将应用从副本集连接到mongos路由服务器,通过设置防火墙切断应用与分片的直接连接。4.数据分片(1)如何分片数据假设有一个test数据库,worker集合在namekey上分片。首先对数据库进行分片,>sh.enableSharding("test")。然后对集合进行分片,sh.shardCollection("test.worker",{"name":1});。如果worker集合已经存在,name字段必须有索引,否则shardCollection会返回错误。如果分片集合不存在,mongos将自动在名称分片键上创建索引。shardCollection命令会将集合拆分成多个数据块,MongoDB会将集合中的数据均匀分散到集群中的分片中。5、MongoDB如何跟踪集群数据?1.数据块由于MongoDB中数据量巨大,MongoDB一般以数据块的形式对文档进行分组。这些数据块是分片键指定范围内的文档。MongoDB一般使用较小的表来维护数据块与分片的映射关系。注意:块不能重叠。当一个块中的文档数量过多时,会自动拆分成两个文档。一份文档始终属于一个且仅属于一个块。2.blockrangenewfragments集合中只有一个block,block的边界是从负无穷大到正无穷大。随着块的增长,MongoDB会自动将其分成两个块,范围从负无穷大到值和值到正无穷大。较小范围的块包含小于值的值,较大范围的块包含值和大于值的值。所以mongos可以很容易的找到文档在哪个chunk中。3.分割块每个分片的master节点mongod进程会跟踪他们当前的块。一旦达到某个阈值,它将检查该块是否需要拆分。如果需要拆分,mongod会从配置服务器大小配置值中请求全局块,然后在配置服务器上进行chunk拆分和更新元数据。配置服务器创建新的块文档并修改旧块的范围。当客户端写入一个块时,mongod检查该块的分割阈值。如果已达到拆分阈值,mongod会向平衡器发送请求以迁移最顶层的块,否则该块将保留在分片上。因为具有相同分片键的两个文档必然在同一个块中,所以只能在具有不同分片键值的文档之间进行拆分。如果下面的文档被readTime分片了,那是有可能的。但是如果我看书快一点,一个月内把所有的书都看完,readTime是一样的,分片就不行了。因此,分片时具有不同的shardkey值就显得尤为重要。{"name":"哪吒编程","book":"Java核心技术","re??adTime":"十月"}{"name":"哪吒编程","book":"Java编程思想","re??adTime":"十月"}{"name":"哪吒编程","book":"深入理解Java虚拟机","re??adTime":"十月"}{"name":"哪吒编程","book":"effectivejava","re??adTime":"十一月"}{"name":"哪吒编程","book":"重构改进现有代码的设计","re??adTime":"十一月"}{"name":"哪吒编程","book":"高性能MySQL","re??adTime":"十二月"}{"name":"哪吒编程","book":"Spring技术内幕","re??adTime":"December"}{"name":"哪吒编程","book":"再学Java设计模式","re??adTime":"December"}{"name":"哪吒编程","book":"In-深入理解高并发编程》,"readTime":"January"}{"name":"哪吒编程","book":"Redis设计与实现","re??adTime":"January"}的前提分片是所有配置服务器必须已启动且可访问。如果mongod不断收到一个块的写请求,它将继续尝试拆分该块但失败了,这些拆分尝试会减慢mongod的速度。mongod反复尝试分片而无法分片的过程称为“分裂风暴”。6.均衡器均衡器负责数据迁移。平衡器定期检查分片之间的不平衡,如果是,则迁移块。在MongoDB3.4+上,平衡器驻留在配置服务器副本集的主要成员上。平衡器是配置服务器副本集主服务器上的后台进程,用于监视每个分片上的块数。只有当分片上的块数达到某个迁移阈值时,平衡器才会被激活。本文转载自微信公众号《哪吒编程》,可通过以下二维码关注。转载本文请联系哪吒编程公众号。