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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/150257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringDoc基础配置和集成OAuth2登录认证教程

本期内容 学会通过注解和Java代码的方式添加SpringDoc配置。在swagger-ui提供的页面上提供OAuth2登录认证,在集成Security的情况下便捷获取access_token并在请求时按照OAuth2规范携带。 为什么集成OAuth2登录认证? 现在大部分教程是在swagger-ui页面添…

系列十、ReentrantReadWriteLock

一、概述 ReentrantReadWriteLock是ReadWriteLock的一个子类,具有读锁和写锁的双重功能,通常用于做缓存。 二、案例代码 2.1、ReentrantReadWriteLockCache /*** Author : 一叶浮萍归大海* Date: 2023/11/20 17:57* Description: 使用ReentrantReadWri…

学习笔记5——对象、直接内存、执行引擎,string

学习笔记系列开头惯例发布一些寻亲消息 链接:https://baobeihuijia.com/bbhj/contents/3/192486.html 创建对象的步骤 对象对应的类是否被加载,链接(链接到真实的内存地址),初始化(类初始化)…

Linux常见命令手册

目录 文件命令 文件和目录命令 文件的权限命令 文件搜索命令 进程命令 查看进程命令 关闭进程命令 用户和群组命令 网络命令 firewall-cmd 网络应用命令 高级网络命令 网络测试命令 网络安全命令 网络配置命令 软件管理命令 系统信息命令 vi编辑器 关机命令…

【android】install android NDK

目录 1 下载NDK 2 解压 3 android-ndk的配置 1 下载NDK 下载网址:NDK 下载 | Android NDK | Android Developers 如果没有所需要的版本,则点击页面下面 不受支持的 NDK 下载需要的版本。 2 解压 将压缩文件(例如 android-ndk-r25c-…

webpack 中,filename 和 chunkFilename 的区别

filename filename 是一个很常见的配置,就是对应于 entry 里面的输入文件,经过webpack打包后输出文件的文件名。比如说经过下面的配置,生成出来的文件名为 index.min.js。 chunkFilename chunkFilename 指未被列在 entry 中,却…

使用 Splashtop 的开放 API 简化 IT 工作流程

我们的工作方式在不断变化,IT 技术人员必须迅速适应时代的变化。越来越多的公司正在转向混合和远程策略,这为那些在服务台或IT技术人员工作的人增加了额外的工作层。对于系统管理员来说,管理一切都可能变得更加复杂。 找到合适的软件来管理多…

Stable Diffusion - StableDiffusion WebUI 软件升级与扩展兼容

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/134463035 目前,StableDiffusion WebUI 的版本是 1.6.0,同步更新 controlnet、tagcomplete、roop、easy-prompt-selector等…

JDY蓝牙注意事项

波特率设置:9600,不接受115200,或者38400. 不同于WiFi测试,jdy蓝牙不接受AT"指令,可以使用“ATVERSION"指令测试 安信可公司的那个蓝牙指令在这里没有用,不知道是不是生产的公司不一样

9 Redis的发布和订阅

127.0.0.1:6379> publish topic1 jack (integer) 0 #表示此时没有被订阅,消息丢了发布订阅:发送即忘的原则,发了就不管了,没有人订阅,就丢了。 127.0.0.1:6379> subscribe topic1 Reading message ... #表示开…

【LeetCode】每日一题 2023_11_20 最大子数组和(dp)

文章目录 刷题前唠嗑题目:最大子数组和题目描述代码与解题思路 刷题前唠嗑 LeetCode? 启动!!! 今天是一道 LeetCode 的经典题目,如果是 LeetCode 老手,估计都刷过,话是这么说,但咱…

Python 自动化(十八)admin后台管理

admin后台管理 什么是admin后台管理 django提供了比较完善的后台数据库的接口,可供开发过程中调用和测试使用 django会搜集所有已注册的模型类,为这些模型类提供数据管理界面,供开发使用 admin配置步骤 创建后台管理账号 该账号为管理后…

简单回顾矩阵的相乘(点乘)230101

[[1 0 1][1 1 0]] [[3 0 0 3][2 2 1 3][1 3 1 1]] [[4. 3. 1. 4.][5. 2. 1. 6.]]乘以 c11 a11*b11 a12*b21 a13*b31 1*3 0*2 1*1 4 c12 a11*b12 a12*b22 a13*b32 1*0 0*2 1*3 3 c13a11*b13 a12*b23a13*b33 c14a11*b14 a12*b24a13*b34 c21a21*b11 a22*b21 a23*b…

《QT从基础到进阶·三十五》QT插件实现侧边工具栏tabBar

tabBar是用QT插件实现的一个dll,对于插件的使用可以参考文章: 《QT从基础到进阶三十三》QT插件开发QtPlugin 源码放在文章末尾 该功能类似侧边工具栏,可以在该标签栏上添加自己开发的界面,实现代码如下: 1、所有功能…

Tomcat无法映射到activiti-app导致activiti无法启动页面

原因之一:JDK版本与Tomcat版本不匹配,jdk8 yyds 我使用的是JDK11,Tomcat是9.0的,都是最新的,但还是不行,最后JDK改为8,tomcat的cmd后台没有报错,activiti-pp也可以正常访问了,很神奇…

Linux输入设备应用编程(键盘,按键,触摸屏,鼠标)

目录 一 输入设备编程介绍 1.1 什么是输入设备呢? 1.2 什么是输入设备的应用编程? 1.3 input子系统 1.4 数据读取流程 1.5 应用程序如何解析数据 1.5.1 按键类事件: 1.5.2 相对位移事件 1.5.3 绝对位移事件 二 读取 struct input_e…

ATFX汇市:欧元区10月CPI年率终值不变,EURUSD逼近1.1000心理关口

ATFX汇市:据欧盟统计局11月17日发布的数据,欧元区10月名义CPI年率终值2.9%,与10月末公布的初值持平。欧央行对通胀率的长期调控目标为2%左右,10月份名义CPI年率已经非常接近目标范围,欧央行继续加息的紧迫性降低。10月…

【AI视野·今日Robot 机器人论文速览 第六十二期】Wed, 25 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Wed, 25 Oct 2023 Totally 25 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers EquivAct: SIM(3)-Equivariant Visuomotor Policies beyond Rigid Object Manipulation Authors Jingyun Yang, Congyue Deng,…

Java的IO流-转换流

乱码问题 package com.itheima.d2;import java.io.*; import java.nio.charset.StandardCharsets;public class Test4 {public static void main(String[] args) {try (//1、创建一个文件字符输入流与源文件接通//Reader fr new FileReader("IO\\src\\itheima04.txt"…

Git企业开发级讲解(四)

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、理解分⽀二、创建分支三、切换分⽀四、合并分⽀五、删除分⽀六、合并冲突七、分⽀管理策略…