您现在的位置是:首页 > 编程 > 

MongoDB 大俗大雅,上来问分片真三俗

2025-07-27 14:21:27
MongoDB 大俗大雅,上来问分片真三俗 这是MongoDB宣传周的第五篇,这周真漫长,今天说说分片,对分片就是那个很多人都在问的MongoDB的分片。你知道吗? 有一些根本没有用过MongoDB的人直接上来就问,MongoDB怎么分片,问分片的性能好不好,能存多少数据!我对此的看法,这人一定不是BT,但可能是SB,抱歉爆粗口了。可能因为MySQL的毒害,很多搞MySQL的开发者,架构师,甚至

MongoDB 大俗大雅,上来问分片真三俗

这是MongoDB宣传周的第五篇,这周真漫长,今天说说分片,对分片就是那个很多人都在问的MongoDB的分片。你知道吗? 有一些根本没有用过MongoDB的人直接上来就问,MongoDB怎么分片,问分片的性能好不好,能存多少数据!我对此的看法,这人一定不是BT,但可能是SB,抱歉爆粗口了。可能因为MySQL的毒害,很多搞MySQL的开发者,架构师,甚至是MySQL的部分DBA,上来对MongoDB的想法就是分片,对应着MySQL在存储大量数据的时候,需要进行分片,物理分库,或者逻辑分库。

抱歉,MongoDB对MySQL来说,他们根本不在一个数据量的存储水平线,可能MySQL一张表你未见过他存储10亿行,但MongoDB一个设计良好的集合,他当然可以存储10亿行。所以你在问分表的时候,你有100亿的数据量?? 你问分片的意义是什么,一副没见过世面样子。

一顿贬损后,我们来说说正题。MongoDB 分片的功能何时去用,为什么MongoDB存储那么大的单表数据量没有问题。(当然你别说你要做聚合)

这里整理了关于必须要使用MongoDB sharding 的缘由

1 插入的速度:对插入的速度极限要求,在物理主机层面,说的通,以前是往一个节点上插入数据,且分发到其他的节点上,而分片则是每次可以将数据根据分片键的设计,将数据分布在不同的物理节点上,这必然分担了插入数据的物理上的速度限制,值得注意的是,必须要合理的使用分片键。

2 查询的速度:虽然我们提到单体的MongoDB在一个集合(表)中可以存储大量的数据,在查询中也能满足查询速度的需求,在你有合理的索引的情况下,但不能否认的是,如果你的业务逻辑合理,且数据量巨大,并且你的查询是分散的,并不是类似聚合类的操作,那么合理的分片还是有助你来实现查询速度在一定数量集上的提升。

MongoDB的分片和传统数据库的分片的原理也是类似,支持两种类型的分片

1 Hash

2 范围

LIST (通过范围模拟)

三种分别对应不同的状态

1 HASH:选择了HASH的方式主要的目的还是为了插入的速度,因为动态的将数据根据HASH去插入不同的物理节点,这必然是非常快的。

2 范围:这是对于要存储时间较长的历史数据而来的,通过时间范围可以将数据存储在不同的物理位置上

LIST (范围模拟):这实际上是针对字段中某个一个属性而对数据进行分离,比如美国,中国,俄罗斯的数据存储在1号节点,日本,韩国,越南,存储在2号节点,但同时这也是容易出现问题的地方,随着你的定义被改变,你的分片将失去平衡。查询和写入的性能不在均衡。

下面举例一个通用基于Hash 的方式是怎么完成相关命令设置的。

代码语言:javascript代码运行次数:0运行复制
("mydb")
db.( { user_id: "hashed" } )
sh.shardCollection("mydb.users", { user_id: "hashed" } )
db.users.insertMany([
  { user_id: 1, name: "Alice" },
  { user_id: 2, name: "Bob" },
  { user_id: , name: "Charlie" },
  { user_id: 4, name: "David" },
  { user_id: 5, name: "Eve" },
  { user_id: 6, name: "Frank" },
  { user_id: 7, name: "Grace" },
  { user_id: 8, name: "Henry" },
  { user_id: 9, name: "Ivy" }
]);
 shards:
        {  "_id" : "shard0000",  "host" : "shard0000/shard0000a:27017" }
        {  "_id" : "shard0001",  "host" : "shard0001/shard0001a:27017" }
        {  "_id" : "shard0002",  "host" : "shard0002/shard0002a:27017" }
  cs:
        mydb.users
                shard0000  
                shard0001  
                shard0002  

同时使用分片的技术时需要考虑你还需要解决如下问题

1 数据的备份问题:如果数据要求多个节点的备份时刻强一直,那么你必须具有LVM快照的方式对多个节点包含config server的部分进行数据备份。或者使用ops manager来进行数据备份。

2 在使用分片的时候,建议MongoDB的数据版本需要超过5.0

分片后的数据倾斜的原因主要基于你的分片键本身的问题,重新进行数据均衡只能是治标不治本。

本文参与 腾讯云自媒体同步曝光计划,分享自。原始发表:2025-01-21,如有侵权请联系 cloudcommunity@tencent 删除数据备份存储备份数据mongodb

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1143142.html

相关标签:无
上传时间: 2025-07-19 08:59:19
留言与评论(共有 11 条评论)
本站网友 白云区
27分钟前 发表
对分片就是那个很多人都在问的MongoDB的分片
本站网友 单眼皮如何变双
2秒前 发表
"shard0000/shard0000a
本站网友 企鹅医生
15分钟前 发表
"shard0000/shard0000a
本站网友 中北路二手房
8分钟前 发表
7
本站网友 亚韩割双眼皮多少钱
23分钟前 发表
架构师
本站网友 黔南房产网
13分钟前 发表
查询和写入的性能不在均衡
本站网友 快速美白肌肤
13分钟前 发表
抱歉爆粗口了
本站网友 唯一抉择
22分钟前 发表
{ user_id
本站网友 肺癌早期症状
8分钟前 发表
如有侵权请联系 cloudcommunity@tencent 删除数据备份存储备份数据mongodb
本站网友 南塔二手房
12分钟前 发表
你有100亿的数据量?? 你问分片的意义是什么