首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

MongoDB 分片总结

  • 25-04-24 04:01
  • 4557
  • 10383
blog.csdn.net

基础篇(能解决工作中80%的问题):

  1. MongoDB的概述、应用场景、下载方式、连接方式和发展历史等

  2. MongoDB数据类型、重要概念以及shell常用指令

  3. MongoDB文档的各种增加、更新、删除操作总结

  4. MongoDB各种查询操作总结

  5. MongoDB对列的各种操作总结

  6. MongoDB中的索引操作总结

进阶篇:

  1. MongoDB聚合操作总结

  2. MongoDB的导入导出、备份恢复总结

  3. MongoDB的用户管理总结

  4. MongoDB复制(副本集)总结

  5. MongoDB 分片总结

  6. MongoDB 遇见 spark(进行整合)

  7. MongoDB内部的存储原理

其它:

  1. python3操作MongoDB的各种案例

  2. MongoDB命令汇总

一. 分片概述

分片(sharding)是指:将数据拆分,将其分散在不同机器的过程,有时也用分区(partitioning)来表示这个概念。将数据分散在不同的机器上,不需要强大的大型计算机就能存储更多的数据,可以满足MongoDB数据量大量增长的需求。

当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。

注意:
副本集:能解决自动故障转移,主从复制,集群。解决的问题:数据冗余备份,架构高可用;但不能解决单节点压力问题(硬件限制,并发访问压力)

为什么使用分片:
1、本地磁盘不够大
2、当请求量巨大时会出现内存不足。
3、垂直扩展价格昂贵(内存、磁盘、cpu)

二. 分片集群结构

在MongoDB中使用分片集群结构分布:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vs4UlO1S-1657022797641)(evernotecid://B1CD39FE-B044-413D-A086-0649DB3F0070/appyinxiangcom/26430792/ENResource/p1225)]

上图中主要有如下所述三个主要组件:
Shard:用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障

Config Server:mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。

Query Routers:前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

三. 分片实例

分片结构端口分布如下:

Shard Server 1:27031
Shard Server 2:27032
Config Server: 27100
Route Process: 27777
  • 1
  • 2
  • 3
  • 4
步骤一:启动Shard Server
sudo rm -rf /MongoDB/shard/s1 /MongoDB/shard/s2 /MongoDB/shard/log
sudo mkdir -p /MongoDB/shard/s1 /MongoDB/shard/s2 /MongoDB/shard/log
sudo mongod --port 27031 --dbpath=/MongoDB/shard/s1
sudo mongod --port 27032 --dbpath=/MongoDB/shard/s2
  • 1
  • 2
  • 3
  • 4
步骤二: 启动Config Server
sudo rm -rf /MongoDB/shard/config
sudo mkdir -p /MongoDB/shard/config
sudo mongod --port 27100 --dbpath=/MongoDB/shard/config
  • 1
  • 2
  • 3

注意:这里我们完全可以像启动普通mongodb服务一样启动,不需要添加—shardsvr和configsvr参数。因为这两个参数的作用就是改变启动端口的,所以我们自行指定了端口就可以。

步骤三: 启动Route Process
mongos --port 27777 --configdb 192.168.17.129:27100
  • 1
步骤四: 配置Sharding

接下来,我们使用MongoDB Shell登录到mongos,添加Shard节点

mongo admin --port 27777
MongoDB shell version: 2.0.7
connecting to: 127.0.0.1:27777/admin
mongos> db.runCommand({ addshard:"192.168.17.129:27031" })
{ "shardAdded" : "shard0000", "ok" : 1 }
......
mongos> db.runCommand({ addshard:"192.168.17.129:27032" })
{ "shardAdded" : "shard0009", "ok" : 1 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
步骤五:对某个数据库test启用分片
#设置分片存储的数据库
mongos> db.runCommand({ enablesharding:"test" }) 

{ "ok" : 1 }
  • 1
  • 2
  • 3
  • 4
步骤六:对collection进行分片
mongos> db.runCommand({ shardcollection: "test.mycol", key: { _id:1}})
{ "collectionsharded" : "test.mycol", "ok" : 1 }
  • 1
  • 2
步骤七:测试
mongo test --port 27777
  • 1

输出10000条数据

use testvar

num =10000
for (var i=0;i<num;i++){ 
    db.mycol.save({'_id':i}) 
}
  • 1
  • 2
  • 3
  • 4

程序代码内无需太大更改,直接按照连接普通的mongo数据库那样,将数据库连接接入接口27777

步骤八: 查看分片情况

查看分片情况时,必须在config(配置服务器上执行)而且必须在admin(如mongo 127.0.0.1:27100/admin)集合下执行

mongo admin --port 27100  #config(配置服务器上执行)
sh.status()

# 输出如下:
-- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("57cfcdfef06b33543fdeb52e")
}
  shards:
    {  "_id" : "shard0000",  "host" : "localhost:27031" }
    {  "_id" : "shard0001",  "host" : "localhost:27032" }
  active mongoses:
    "3.2.7" : 1
  balancer:
    Currently enabled:  yes
    Currently running:  no
    Failed balancer rounds in last 5 attempts:  0
    Migration Results for the last 24 hours: 
        1 : Success
  databases:
    {  "_id" : "test",  "primary" : "shard0000",  "partitioned" : true }
        test.mycol
            shard key: { "_id" : 1 }
            unique: false
            balancing: true
            chunks:
                shard0000    2
                shard0001    1
            { "_id" : { "$minKey" : 1 } } -->> { "_id" : 1 } on : shard0001 Timestamp(2, 0) 
            { "_id" : 1 } -->> { "_id" : 57 } on : shard0000 Timestamp(2, 1) 
            { "_id" : 57 } -->> { "_id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(1, 3)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

四. Hashed Sharding

选择哈希片键最大的好处就是保证数据在各个节点分布基本均匀,下面使用_id作为哈希片键做个简单的测试:

mongo admin --port 27777
mongos> db.runCommand({ shardcollection: "test.myhash", key: { _id:"hashed"}})
{ "collectionsharded" : "test.myhash", "ok" : 1 }
use test
var num =10000
for (var i=0;i<num;i++){
    db.myhash.save({'_id':i})    
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

总结:哈希分片将提供的片键散列成一个非常大的长整型作为最终的片键。

数据知道的成长之路
微信公众号
成长进阶、技术分享、资源获取
注:本文转载自blog.csdn.net的数据知道的文章"https://cuiyonghua.blog.csdn.net//article/details/125627029"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top