当前位置: 首页 > news >正文

MongoDB随记

MongoDB

  • 1、简单介绍
  • 2、基本术语
  • 3、shard分片概述
    • 背景
    • 架构
    • 路由功能
    • chunk(数据分片)
    • shard key(分片键值)
  • 4、常用命令

1、简单介绍

MongoDB是一个分布式文件存储的数据库,介于关系数据库和非关系数据库之间,支持的数据结构类型为BSON,类似于JSON。MongoDB中的记录是一个document,由字段和值对组成的数据结构。

MongoDB适合在数据量大,读写频繁,对事务性要求不高的场景应用。


2、基本术语

  • database:数据库
  • collection:表
  • document:一条数据
  • field:字段
  • index:索引

3、shard分片概述

分片(sharding)是 MongoDB 用来将大型集合分割到不同服务器(或者说一个集群)上所采用的方法。

背景

高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。为了解决这些问题,有两个基本的方法: 垂直扩展和水平扩展。垂直扩展:增加更多的CPU和存储资源来扩展容量。水平扩展:将数据集分布在多个服务器上。水平扩展即分片。

分片为应对高吞吐量与大数据量提供了方法。使用分片减少了每个分片需要处理的请求数,因此,通过水平扩展,集群可以提高自己的存储容量和吞吐量。举例来说,当插入一条数据时,应用只需要访问存储这条数据的分片。而且当某个shard的负载超过一定阙值后,就会自动的重新分发数据,用来保证系统的负载均衡。

架构

在这里插入图片描述

  • shard:分片,数据的真正存储位置,以chunk为单位存数据。

  • mongos:数据路由,和客户端打交道的模块。提供对外应用访问,所有操作均通过mongos执行

    ​ mongos本身没有任何数据,他也不知道该怎么处理这数据,会去找config server。

  • config server:存储元数据和所有shard节点的信息,分片功能的一些配置信息。

Mongos本身并不持久化数据,Sharded cluster所有的元数据都会存储到Config Server,而用户的数据会议分散存储到各个shard。Mongos启动后,会从配置服务器加载元数据,开始提供服务,将用户的请求正确路由到对应的碎片。

路由功能

  • 当数据写入时,MongoDB Cluster根据分片键设计写入数据。

  • 当外部语句发起数据查询时,MongoDB根据数据分布自动路由至指定节点返回数据。

chunk(数据分片)

在一个shard server内部,MongoDB还是会把数据分为chunks,每个chunk代表这个shard server内部一部分数据。chunk的产生,会有以下两个用途:

Splitting:当一个chunk的大小超过配置中的chunk size时,MongoDB的后台进程会把这个chunk切分成更小的chunk,从而避免chunk过大的情况

Balancing:在MongoDB中,balancer是一个后台进程,负责chunk的迁移,从而均衡各个shard server的负载,系统初始1个chunk,chunk size默认值64M,生产库上选择适合业务的chunk size是最好的。ongoDB会自动拆分和迁移chunks。

shard key(分片键值)

MongoDB 中数据的分片是以集合为基本单位的,集合中的数据通过片键(Shard key)被分成多部分。其实片键就是在集合中选一个键,用该键的值作为数据拆分的依据。

片键必须是一个索引。

对集合进行分片时,你需要选择一个片键,片键是每条记录都必须包含的,且建立了索引的单个字段或复合字段,MongoDB按照片键将数据划分到不同的数据块中,并将数据块均衡地分布到所有分片中。

MongDB查询结果按照shard key排列,且每一shard中按索引有序排列。


4、常用命令

show dbs # 查看所有数据库
use [database] # 选择某一数据库
show tables # 查看数据库中的所有表
db.[collection].find() # 查看某一集合的数据
db.[collection].find({"id":{$regex:"^a*"}}) # 正则查询,^:表示匹配字符串开头;*:匹配任意字符;$:表示匹配字符串结尾
db.[collection].find().limit() # 限制查询结果条数
db.[collection].find({}, {id:1, name:1}) # 限制返回结果字段只有id和name
db.[collection].insert({}) # 插入一条数据
db.[collection].update({"id":"123456"}, {$set:{"name":"minh"}}) # 更新id为123456的name字段值为minh
db.[collection].sort() # 对查询结果按某字段排序
pretty() # 查询结果进行格式化处理
findOne() # 查询单条数据
db.[collection].remove({"name":"minh"}) # 删除数据
db.[collection].find().hint({name:1}) # 强制使用某个索引查询
$and $or

示例:

show dbs
use books
show tables
use literaturedb.literature.find()
db.literature.findOne()
db.literature.find().pretty()
db.literature.find().sort()
db.literature.find().hint({name:1})
db.literature.find().limit(10)
db.literature.find({"name":"WeThree"})
db.literature.find({"name":"WeThree"}, {name:1, author:1, price:1})
db.literature.find({$and:[{"name":"WeThree"}, {"price": {$gte: 30}}]})
db.literature.find({$or:[{"name":"WeThree"}, {"name": "homeless"}]})
db.literature.find({"name": {$in : ["a", "b", "c"]}})db.literature.insert({id:"2", name:"name", author:"minh", price:NumberInt(66), date:NumberLong(12345678)})db.literature.update({name:"name"}, {$set: {name:"minh"}})db.literature.remove({id:"2"})

参考:

https://www.mongodb.com/docs/manual/sharding/

https://zhuanlan.zhihu.com/p/598892366

相关文章:

  • 节点导纳矩阵
  • 100天精通Python(可视化篇)——第108天:Pyecharts绘制多种炫酷词云图参数说明+代码实战
  • Vue3 shallowRef 和 shallowReactive
  • 机器学习笔记 - 了解常见开源文本识别数据集以及了解如何创建用于文本识别的合成数据
  • 使用Flink处理Kafka中的数据_题库子任务_Java语言实现
  • 【React】React 基础
  • uniapp如何上传文件,使用API是什么
  • 2023.11.18 - hadoop之zookeeper分布式协调服务
  • Flutter最新稳定版3.16 新特性介绍
  • 基于springboot实现智能热度分析和自媒体推送平台系统项目【项目源码】
  • 基于FPGA的五子棋(论文+源码)
  • hypermesh学习总结(一)
  • 邀请报名|11月24日阿里云原生 Serverless 技术实践营 深圳站
  • 控制您的音乐、视频等媒体内容
  • 【算法】二分查找-20231120
  • gitlab-ci配置详解(一)
  • JavaScript 基本功--面试宝典
  • learning koa2.x
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • spring boot 整合mybatis 无法输出sql的问题
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • vue2.0项目引入element-ui
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • vue中实现单选
  • 代理模式
  • 关于字符编码你应该知道的事情
  • 聚簇索引和非聚簇索引
  • 模型微调
  • 《天龙八部3D》Unity技术方案揭秘
  • gunicorn工作原理
  • MPAndroidChart 教程:Y轴 YAxis
  • MyCAT水平分库
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • # Apache SeaTunnel 究竟是什么?
  • #define,static,const,三种常量的区别
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • (12)目标检测_SSD基于pytorch搭建代码
  • (4)logging(日志模块)
  • (9)目标检测_SSD的原理
  • (a /b)*c的值
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (二)WCF的Binding模型
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (五)网络优化与超参数选择--九五小庞
  • (一) springboot详细介绍
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)JAVA中的堆栈
  • (转)Scala的“=”符号简介
  • (转)菜鸟学数据库(三)——存储过程
  • .apk文件,IIS不支持下载解决
  • .Net IOC框架入门之一 Unity
  • .NET Micro Framework初体验