第2章 数据存储篇

目录

2.1 MongoDB:面向文档的灵活存储

2.1.1 MongoDB基础与架构

2.1.1.1基本概念

2.1.1.2MongoDB安装与配置

1)安装MongoDB-Linux安装示例(以Ubuntu为例)

2)更新包列表并安装MongoDB

3)启动MongoDB服务

4)使用MongoDB Shell

2.1.1.2架构设计

1)主从复制配置示例

2)分片配置示例


2.1 MongoDB:面向文档的灵活存储

MongoDB是一种开源的、基于分布式文件存储的数据库系统,以其灵活的数据模型、高性能、易扩展性著称。它属于NoSQL数据库的一种,特别适合处理大规模、低延迟的数据存储需求,尤其在处理半结构化和非结构化数据方面表现卓越。MongoDB采用面向文档(BSON)的数据模型,每个文档都是由键值对组成的,这使得数据的存储和查询更为直观和灵活。

2.1.1 MongoDB基础与架构

2.1.1.1基本概念

MongoDB的设计哲学深受现代web应用和分布式系统的需求影响,提供了一种灵活、强大且易于理解的数据模型,使得数据存储和处理更加适应复杂多变的业务场景。下面是对几个核心概念的详细阐述:

1)文档(Document)

文档是MongoDB中最基本的数据结构单元,相当于关系型数据库中的一行记录。但与传统数据库不同,MongoDB的文档不是严格固定的表格结构,而是采用类似JSON(JavaScript Object Notation)的对象格式,称为BSON(Binary JSON)。BSON不仅支持字符串、数字、布尔值等基本数据类型,还支持数组、嵌套文档等复杂数据结构,这使得文档能够自然地表示现实世界中的复杂对象和关系。例如,一个用户文档可能包含姓名、年龄、邮箱等基本信息,同时还嵌套有地址(包括街道、城市、国家等)这样的复杂属性。

2)集合(Collection)

集合是一组文档的集合,可以将其类比为关系数据库中的表,但具有更高的灵活性。在MongoDB中,集合不需要预先定义其结构或列,意味着可以随时向文档中添加新的字段,而不会影响到集合中其他文档的结构。该模式被称为“模式自由”(schema-free),极大地提高了数据模型的灵活性和适应性。但在实际应用中,为保持数据的一致性和便于查询优化,通常会为集合设计一个松散的模式指导文档的结构。

3)数据库(Database)

数据库是MongoDB中用于存储集合的容器。与关系数据库相似,MongoDB允许创建多个数据库来组织和隔离数据。每个数据库都有独立的权限控制和命名空间,使得不同项目或应用可以在同一个MongoDB实例中运行而不互相干扰。数据库名称必须是UTF-8编码,且不能是空字符串,同时,".", "$", 和空字符(空格、制表符等)不允许出现在数据库名称中。使用use <database_name>命令可以切换到指定的数据库进行操作。

MongoDB凭借其灵活的数据模型,允许文档结构随需求动态调整,无需预设字段类型,高度契合快速迭代和数据结构多变的应用场景,展现出卓越的灵活性。集合(Collection)作为文档的集合体,实现模式自由,动态适应数据结构的变化,实践中常辅以松散模式指导以维护数据一致性和查询效率。结合其对现代应用需求的深度贴合,使其成为大数据存储和处理领域的一个强大工具。

2.1.1.2MongoDB安装与配置

访问MongoDB的官方网站:Download MongoDB Community Server | MongoDB ,根据您的操作系统选择合适的MongoDB社区版进行下载。本示例以Linux系统为例,但步骤在其他操作系统(如Windows、macOS)上也类似,只需参考相应系统的安装指南。

1)安装MongoDB-Linux安装示例(以Ubuntu为例)

添加MongoDB官方的APT存储库,代码如下:

wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
2)更新包列表并安装MongoDB

更新包列表并安装MongoDB,代码如下:

sudo apt-get update
sudo apt-get install -y mongodb-org
3)启动MongoDB服务

更新包列表并安装MongoDB,设置MongoDB开机启动,代码如下:

sudo systemctl start mongod
sudo systemctl enable mongod
4)使用MongoDB Shell

安装完成后,您可以直接在终端使用mongo命令启动MongoDB Shell,这是与MongoDB数据库交互的命令行界面,代码如下:

mongo
2.1.1.2架构设计

MongoDB采用主从复制和分片技术来实现数据的高可用性和水平扩展。

主从复制(Replication):MongoDB使用主从复制来保证数据的冗余和高可用性。一个集群包含一个主节点和多个从节点。所有写操作首先发生在主节点上,然后被复制到从节点。如果主节点发生故障,其中一个从节点会被自动选为主节点,保证服务的连续性。

分片(Sharding):当单个服务器无法满足数据量增长或性能要求时,MongoDB可以通过分片技术将数据分布在多个服务器上。分片基于分片键(shard key)进行,这个键决定了数据如何在各个分片服务器间分布。

1)主从复制配置示例

假设有两个MongoDB实例运行在本地的27017和27018端口,以下是如何配置一个简单的副本集:

在第一个实例上初始化副本集,代码如下:

mongo --port 27017
use admin
rs.initiate({_id : "myReplicaSet",members: [{ _id : 0, host : "localhost:27017" },{ _id : 1, host : "localhost:27018" }]}
)

在第二个实例上加入副本集,需要修改第二个实例的配置文件(如/etc/mongod.conf),添加replication.replSetName: "myReplicaSet",然后重启服务,连接到第二个实例并执行以下命令,代码如下:

mongo --port 27018
rs.add("localhost:27017")

注意:实际生产环境中,每个实例应部署在不同的物理或虚拟服务器上,以确保高可用性。

2)分片配置示例

分片配置较为复杂,涉及到配置服务器、分片服务器、路由服务器等组件。这里简要介绍基本流程如下:

启动配置服务器,至少需要三个配置服务器来确保高可用性。编辑配置文件(如mongod.conf),设置shardsvr: true,并指定不同的端口和数据目录,然后分别启动。

启动分片服务器,为每个分片服务器设置不同的端口和数据目录,启动时指定shardsvr: true。

配置路由服务器(mongos),安装并配置mongos实例,需要指向配置服务器,代码如下:

mongos --configdb configReplSet/host1:port1,host2:port2,host3:port3

在mongos上启用分片,选择一个数据库进行分片,再选择一个合适的分片键(shard key),代码如下:

use admin
sh.enableSharding("yourDatabaseName")
sh.shardCollection("yourDatabaseName.yourCollectionName", { "yourShardKey": "hashed" })

注意分片键的选择非常关键,应考虑数据分布的均匀性和查询模式。在生产环境中,确保所有组件都有适当的安全配置,比如启用身份验证、使用SSL连接等。实施分片前,充分测试以确保其符合实际业务性能和扩展需求。

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

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

相关文章

利用OPT算法解决最短访问次数问题

一、题目 数据库缓存&#xff0c;模拟访问规则如下&#xff1a; 当查询值在缓存中&#xff0c;直接访问缓存&#xff0c;不访问数据库。否则&#xff0c;访问数据库&#xff0c;并将值放入缓存。 若缓存已满&#xff0c;则必须删除一个缓存。 给定缓存大小和训练数据&#xff…

对代理模式和动态代理以及AOP的一些理解

代理模式&#xff1a; 代理模式&#xff0c;也叫做静态代理&#xff0c;是一种结构型设计模式&#xff0c;它为其他对象提供了一种代理&#xff0c;以控制对这个对象的访问。 代理模式可以在不修改原有类的情况下&#xff0c;对其功能进行扩展&#xff0c;编译时就确定了代理…

【JavaEE】多线程代码案例(1)

&#x1f38f;&#x1f38f;&#x1f38f;个人主页&#x1f38f;&#x1f38f;&#x1f38f; &#x1f38f;&#x1f38f;&#x1f38f;JavaEE专栏&#x1f38f;&#x1f38f;&#x1f38f; &#x1f38f;&#x1f38f;&#x1f38f;上一篇文章&#xff1a;多线程&#xff08;2…

leetcode每日一练:顺序表OJ题

第一题&#xff1a;移除元素 题目要求&#xff1a;给一个数组nums和一个值val&#xff0c;你需要 原地 移除所有所有数值等于val的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用0(1)的额外空间并 原地 修改输入数组。 元素的顺序…

【Tools】AIGC:人工智能生成内容的新时代

那年夏天我和你躲在 这一大片宁静的海 直到后来我们都还在 对这个世界充满期待 今年冬天你已经不在 我的心空出了一块 很高兴遇见你 让我终究明白 回忆比真实精彩 &#x1f3b5; 王心凌《那年夏天宁静的海》 随着人工智能&#xff08;AI&#xff09;技术的…

三生随记——午夜咖啡馆

在城市的边缘&#xff0c;隐藏着一间古老的咖啡馆——“午夜咖啡馆”。它的外观不起眼&#xff0c;却总能在夜晚吸引那些寻找安宁或寻求刺激的顾客。据说&#xff0c;咖啡馆的老板是一位年长的绅士&#xff0c;他的脸上总是挂着神秘莫测的微笑。 艾米是一名作家&#xff0c;常常…

基于weixin小程序智慧物业系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;员工管理&#xff0c;房屋管理&#xff0c;缴费管理&#xff0c;车位管理&#xff0c;报修管理 工作人员账号功能包括&#xff1a;系统首页&#xff0c;维…

使用electron打包Vue前端项目的详细流程

使用electron打包Vue前端项目的详细流程 需要更改的东西 路由模式的修改 # 修改前&#xff1a;url不带#mode: history# 修改后&#xff1a;url带#mode: hash全局修改Cookies为localStorage 由于打包成exe或deb这类可执行文件后&#xff0c;本地是没有 Cookies 全局搜索Cooki…

Android Studio环境搭建(4.03)和报错解决记录

1.本地SDK包导入 安装好IDE以及下好SDK包后&#xff0c;先不要管IDE的引导配置&#xff0c;直接新建一个新工程&#xff0c;进到开发界面。 SDK路径配置&#xff1a;File---->>Other Settings---->>Default Project Structure 拷贝你SDK解压的路径来这&#xff0c;…

ros笔记01--初次体验ros2

ros笔记01--初次体验ros2 介绍安装ros2测试验证ros2说明 介绍 机器人操作系统(ROS)是一组用于构建机器人应用程序的软件库和工具。从驱动程序和最先进的算法到强大的开发者工具&#xff0c;ROS拥有我们下一个机器人项目所需的开源工具。 当前ros已经应用到各类机器人项目开发中…

ORACLE 、达梦 数据库查询指定库指定表的索引信息

在Oracle数据库中&#xff0c;索引是一种关键的性能优化工具&#xff0c;通过它可以加快数据检索速度。在本文中&#xff0c;我们将深入探讨如何详细查询指定表的索引信息&#xff0c;以及如何利用系统视图和SQL查询来获取这些信息。 索引在数据库中的重要性 索引是一种数据结…

操作符详解(下) (C语言)

操作符详解下 操作符的属性1.优先级2.结合级 表达式求值1.整型提升2.如何进行整形提升呢&#xff1f;3.算术转换4.问题表达式解析 操作符的属性 C语言的操作符有2个重要的属性&#xff1a;优先级、结合性&#xff0c;这两个属性决定了表达式求值的计算顺序。 1.优先级 优先级…

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题&#xff1a;第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

RabbitMQ 进程内流控(Flow Control) 源码解析

1. 概述 1.1 为什么要流控&#xff1f; 流控主要是为了防止生产者生产消息速度过快&#xff0c;超过 Broker 可以处理的速度。这时需要暂时限制生产者的生产速度&#xff0c;让 Broker 的处理能够跟上生产速度。 Erlang进程之间不共享内存&#xff0c;每个进程都有自己的进程邮…

42.HOOK引擎核心代码

上一个内容&#xff1a;41.HOOK引擎设计原理 以 40.设计HOOK引擎的好处 它的代码为基础进行修改 主要做的是读写寄存器 效果图 添加一个类 htdHook.h文件中的实现 #pragma once class htdHook { public:htdHook(); };htdHook.cpp文件中的实现&#xff1a; #include "…

独辟蹊径:我是如何用Java自创一套工作流引擎的(下)

作者&#xff1a;后端小肥肠 创作不易&#xff0c;未经允许严禁转载。 姊妹篇&#xff1a;独辟蹊径&#xff1a;我是如何用Java自创一套工作流引擎的&#xff08;上&#xff09;_java工作流引擎-CSDN博客 1. 前言 在上一篇博客中&#xff0c;我们详细介绍了如何利用Java语言从…

LC437.路径总和Ⅲ、LC207.课程表

给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从父节点到子节点&am…

【每日刷题】Day77

【每日刷题】Day77 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 159. 库存管理 III - 力扣&#xff08;LeetCode&#xff09; 2. LCR 075. 数组的相对排序 - 力…

代理ip匿名原理

代理IP匿名的原理基于代理服务器的工作方式。当用户使用代理服务器访问互联网时&#xff0c;请求数据会先发送到代理服务器&#xff0c;然后由代理服务器再向目标服务器发送请求。在这个过程中&#xff0c;代理服务器会将用户真实IP地址替换成代理服务器的IP地址&#xff0c;从…

Linux——passwd文件,grep,cut

/etc/passwd文件含义 作用 - 记录用户账户信息&#xff1a;共分为7段&#xff0c;使用冒号分割 含义 - 文件内容意义&#xff1a;账户名&#xff1a;密码代号x&#xff1a;UID&#xff1a;GID&#xff1a;注释&#xff1a;家目录&#xff1a;SHELL - 第7列/sbin/nologin&#x…