开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2710人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6群均已爆满,7群400+,开8群9群)
这是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 范围
3 LIST (通过范围模拟)
三种分别对应不同的状态
1 HASH:选择了HASH的方式主要的目的还是为了插入的速度,因为动态的将数据根据HASH去插入不同的物理节点,这必然是非常快的。
2 范围:这是对于要存储时间较长的历史数据而来的,通过时间范围可以将数据存储在不同的物理位置上
3 LIST (范围模拟):这实际上是针对字段中某个一个属性而对数据进行分离,比如美国,中国,俄罗斯的数据存储在1号节点,日本,韩国,越南,存储在2号节点,但同时这也是容易出现问题的地方,随着你的定义被改变,你的分片将失去平衡。查询和写入的性能不在均衡。
下面举例一个通用基于Hash 的方式是怎么完成相关命令设置的。
sh.enableSharding("mydb")
db.users.createIndex( { 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: 3, 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" }
chunks:
mydb.users
shard0000 3
shard0001 3
shard0002 3复制
同时使用分片的技术时需要考虑你还需要解决如下问题
1 数据的备份问题:如果数据要求多个节点的备份时刻强一直,那么你必须具有LVM快照的方式对多个节点包含config server的部分进行数据备份。或者使用ops manager来进行数据备份。
2 在使用分片的时候,建议MongoDB的数据版本需要超过5.0
3 分片后的数据倾斜的原因主要基于你的分片键本身的问题,重新进行数据均衡只能是治标不治本。
MongoDB 大俗大雅,高端的知识讲“通俗” -- 2 嵌套和引用
MongoDB 大俗大雅,高端的知识讲“低俗” -- 1 什么叫多模
MongoDB 合作考试报销活动 贴附属,MongoDB基础知识速通
MongoDB 使用网上妙招,直接DOWN机---清理表碎片导致的灾祸 (送书活动结束)
数据库 《三体》“二向箔” 思维限制 !8个公众号联合抽奖送书 建立数据库设计新思维
MongoDB 是外星人,水瓶座,怎么和不按套路出牌的他沟通?
PolarDB 相关文章
PolarDB 答题拿-- 飞刀总的书、同款卫衣、T恤,来自杭州的Package(活动结束了)
PolarDB for MySQL 三大核心之一POLARFS 今天扒开它--- 嘛是火星人
PolarDB-MySQL 并行技巧与内幕--(怎么薅羊毛)
PolarDB 并行黑科技--从百套MySQL撤下说起 (感谢8018个粉丝的支持)
PolarDB 杀疯了,Everywhere Everytime Everydatabase on Serverless
POLARDB 从一个使用者的角度来说说,POALRDB 怎么打败 MYSQL RDS
PolarDB 最近遇到加字段加不上的问题 与 使用PolarDB 三年感受与恳谈
PolarDB 从节点Down机后,引起的主从节点强一致的争论
PolarDB serverless 真敢搞,你出圈了你知道吗!!!!
PolarDB VS PostgreSQL "云上"性能与成本评测 -- PolarDB 比PostgreSQL 好?
临时工访谈:PolarDB Serverless 发现“大”问题了 之 灭妖记 续集
临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一
POLARDB -- Ausitndatabases 历年的文章集合
PolarDB for PostgreSQL 有意思吗?有意思呀
跟我学OceanBase4.0 --阅读白皮书 (OB分布式优化哪里了提高了速度)
跟我学OceanBase4.0 --阅读白皮书 (4.0优化的核心点是什么)
跟我学OceanBase4.0 --阅读白皮书 (0.5-4.0的架构与之前架构特点)
跟我学OceanBase4.0 --阅读白皮书 (旧的概念害死人呀,更新知识和理念)
全世界都在“搞” PostgreSQL ,从Oracle 得到一个“馊主意”开始PostgreSQL 加索引系统OOM 怨我了--- 不怨你怨谁
PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!
PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆
PostgreSQL 分组查询可以不进行全表扫描吗?速度提高上千倍?
POSTGRESQL --Austindatabaes 历年文章整理
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
阿里云系列
阿里云数据库产品权限设计缺陷 ,六个场景诠释问题,你可以做的更好?
阿里云数据库--市场营销聊胜于无--3年的使用感受与反馈系列
阿里云数据库产品 对内对外一样的卷 --3年阿里云数据库的使用感受与反馈系列
阿里云数据库使用感受--客户服务问题深入剖析与什么是廉价客户 --3年的使用感受与反馈系列
阿里云数据库使用感受--操作界面有点眼花缭乱 --3年的使用感受与反馈系列
