组件结构
核心进程
在 MongoDB 中,核心进程主要包含了 mongod、mongos 和 mongosh 三个。
其中最主要的是 mongod 程序,其在不同的部署方案中(单机部署、副本集部署、分片集群部署),通过不同的配置,可以扮演多种不同的角色:
- 在单机部署中作为数据库服务器(提供所有读写功能)
- 在副本集部署中,通过配置,可以部署为 Primary 节点(负责写数据,也可以提供查询)、Secondary 节点(从主节点复制数据,也可以提供查询)、以及 Arbiter 节点(不保存数据,主要用于参与选举投票)
- 在分片集群中,除了在每个分片中扮演上述角色外,还扮演着配置服务器的角色(存储有分片集群的所有元数据信息,mongos 的数据路由分发等都要依赖于它)
在一台服务器上,可以启动多个 mongod 服务。但在实际生产部署中,通常是建议一台服务器部署一个 mongod 实例,这样不仅减少资源竞争,而且服务器故障也不会同时影响到多个服务。
mongos 在分片集群中扮演路由的角色,提供客户端和分片之间的接口。
mongosh 是 MongoDB 集成的交互式 shell 工具。
数据库工具
MongoDB 数据库工具是用于处理 MongoDB 部署的命令行实用程序的集合。数据库工具包括以下二进制文件:
- 二进制导入导出
- mongodump: 导出 mongod 数据库的二进制数据
- mongorestore: 恢复 mongodump 导出文件的数据到 mongod 或 mongos 数据库
- bsondump: 转换 BSON 导出文件成 JSON 格式
- 数据导入导出
- mongoimport: 从外部 JSON、CSV 或 TSV 文件中加载数据
- mongoexport: 从 mongod 实例中导出数据到 JSON 或 CSV 文件中
- 诊断工具
- mongostat: 快速诊断当前运行的 mongod 或 mongos 实例的状态
- mongotop: 统计 mongod 实例读取和写入数据的时间
- GridFS 工具
- mongofiles: 支持在 GridFS 对象中操作 MongoDB 实例中存储的文件
数据逻辑结构
MongoDB 数据逻辑结构分为数据库 database、集合 collection、文档 document 三层 :
- 一个 mongod 实例中允许创建多个数据库
- 一个数据库中允许创建多个集合,集合相当于关系型数据库的表
- 一个集合则是由若干个文档构成,文档相当于关系型数据库的行,是 MongoDB 中数据的基本单元
数据库
一个数据库中可以创建多个集合,原则上应把逻辑相近的集合都放在一个数据库中。
在 MongoDB 中,会有以下几个内建的数据库:
- admin: 存放有数据库帐号相关信息,在身份验证和授权时使用
- local: 特定于单个服务器的数据会存储在此数据库中。在副本集中,local 数据库用于存储复制过程中所使用的数据,而其本身不会被复制。
- config: 用于分片集群环境,存放了分片相关的元数据信息
- test: 默认创建的测试库,连接 mongod 服务时,如果不指定连接的具体数据库,默认就会连接到 test 数据库
集合
和 SQL 的表不同,集合是动态模式,不需要在读写数据前创建模式就可以使用,集合中的文档也可以拥有不同的字段,随时可以任意增减某个文档的字段。
默认情况下,集合不要求其文档具有相同的模式,但这是一种很好的实践。可以通过使用 MongoDB 的文档验证功能和可用于多种编程语言的对象–文档映射(object-document mapping)库来实现文档验证。
集合由其名称进行标识,集合名称可以是任意 UTF-8 字符串,但有以下限制:
- 不能是空字符串(
""
)。 - 不能含有
/0
(空字符),这个字符用于表示集合名称的结束 - 不能以
system.
开头,该前缀为内部集合保留
集合名称使用 .
字符可以创建子集合,用与区分不同组织集合。虽然子集合没有任何特殊属性,但它们很有用,许多 MongoDB 工具整合了子集合。
文档
文档是 MongoDB 中数据的基本存储单元,以一种叫作 BSON 的文档结构表示。
文档中的键值对是有序的,不同序则是不同文档。并且键是区分大小写的,否则也为不同文档。
文档的键是字符串,而值除了字符串,还可以是 Int
、Long
、Double
、Boolean
、数组、嵌入文档等多种类型。
每个文档都有一个默认的 _id
键,它相当于关系型数据库中的主键,这个键的值在同一个集合中必须是唯一的。
_id
键的值默认是 ObjectId
类型,在插入文档的时候,如果用户不设置文档的 _id
值的话,MongoDB 会自动生成一个唯一的 ObjectId
值进行填充。
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/293135.html