热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mongodb缓存服务器ip_数据存储篇之Mongodb

一、什么是MongoDB?MongoDB是一个面向文档的分布式Nosql数据库。MongoDB将数据存储为一个文档,数据结构由键值(keyvalue)对组成。Mon

一、什么是MongoDB?

MongoDB是一个面向文档的分布式Nosql数据库。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 的BSON格式,所以可以存储比较复杂的数据结构。它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

二、MongoDB的基本概念

下面介绍一些MongoDB的基本概念

1. 文档

文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这是与关系数据库最不同的点。

如:

{"where":"公众号", "name":"lanternteam"}

BSON是一种计算机数据交换格式,它是一种二进制的表示形式,能用来表示简单数据结构、关联数组(MongoDB中称为“对象”或“文档”)以及MongoDB中的各种数据类型。

2. 集合

集合是一组文档,无固定结构,也就是说可以对集合插入不同格式和类型的数据,类似与RDBMS中的表格,存在与数据库中。

908f2f9351b4a6e133f862db3eed7f0f.png

3. 数据库

一组集合可以组成一个数据库。一个MongoDB实例可以承载多个数据库。

4. 数据类型

MongoDB中的文档本质是一种类似JSON的BSON格式的数据

BSON是一种类似JSON的二进制格式数据,它可理解为在JSON基础上添加了一些新的数据类型。

(1)基本数据类型

  1. null:表示空值或不存在的字段
    {'x' : null}
  2. 布尔boolean:truefalse
    {'x' : true}
  3. 数字:MongoDB支持的数字类型比较广泛,包括32位整数、64位整数、64位浮点数。
    {'x' : 3.14}
  4. 字符串:UTF-8字符串都可以表示为字符串类型数据
    {'x' : 'HelloWorld!'}
  5. 数组:值的集合或列表可以表示成数组
    {'x' : ['a', 'b', 'c']}
  6. 对象:对象Object
    {'x' : Object()}

(2)_id和Objectid

MongoDB中存储的文档必须有一个_id键值,这个值可以是任何类型的,若插入文档的时候无指定"_id"值,系统会自动帮你创建一个,每个文档都由唯一的"_id"值,默认是个ObjectId对象。

  1. _id:在创建文档的时候,可以手动定义_id值,但它必须是唯一不重复的,一个_id值就要对应唯一的一个文档。
  2. Objectid:Objectid是一个"_id"的默认类型,可以很快的去生成和排序,包含12bytes,含义是:
  • 前4个字节表示unix时间戳,格林尼治时间UTC时间,比北京时间晚了8小时;
  • 接下来的3个字节是机器标识码;
  • 紧接的两个字节由进程id组成PID;
  • 最后三个字节是随机数
05fa27f57504506124e42c966e953ebb.png

(3)日期

MongoDB中支持Date作为键的一个值。

{'name' : 'jack', 'date' : new Date()}

文档中,date属性值为new Date(),new Date()创建了一个Date对象,返回日期的字符串表示

(4)内嵌文档

把整个MongoDB文档当做另一个文档中的一个键的一个值。

{'name' : 'jack','address' : {'street' : 'Zoo Park Street','city' : 'Landon', }}


二、MongoDB集群架构

MongoDB三大核心优势:灵活模式(json文档,不限制个数和种类)、高可用(副本集)、可扩展(分片,集群)

1. 核心组件

(1)Mongod

它会处理所有的数据请求、管理数据格式并且执行用于后台管理的操作。

(2) mongo

为研发人员提供的一个交互式的JS API,方便在数据库上直接做测试查询和操作,并且也可用于系统管理员对数据库进行有效管理。

(3)mongos(路由服务器)

数据库集群请求的入口,所有请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求转发到对应的shard服务器上

(4)Config server(配置服务器)

存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。

注意点:

  1. mongos第一次启动因故障重启都需要加载配置信息。若配置信息有变化会通知所有mongos更新自己的状态;
  2. 配置信息不能丢失,否则mongos会挂掉。

(5)Replica Set(复制集或副本集)

这是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到副主节点,并重放得以实现主从节点一致,再结合心跳机制,当感知到主节点不可访问或宕机的情形下,辅助节点通过选举机制来从剩余的辅助节点中推选一个新的主节点从而实现自动切换。

4011892b2e72342c390f0087af693452.png

(6)Shard(分片)

一台普通的机器做不了的工作,由多台机器来共同完成。

58cfce2f3814ee6a8d16ba27a96ff4df.png

2.集群架构

(1) 主从复制(Master-Slaver)

建立一个主节点和一个或多个从节点,可用于备份、故障恢复、读扩展等。

它的缺点:当主节点出现故障时,只能人工介入,指定新的主节点,从节点不会自动升级为主节点。

与副本集的区别:副本集能自动故障恢复

(2)副本集(Replica Set)

副本集的集群拥有一个主节点和多个从节点。当集群中主节点发生故障时,副本集可以自动投票,选举出新的主节点,并引导其余的从节点连接新的主节点,这个过程是透明的。

afb4c3c0f4bc7eff7cf330134c4e2745.png

它的优点:自带故障转移功能的主从复制

MongoDB副本集使用的是**N个Mongod节点构建的具备自动容错功能、自动恢复功能的高可用方案。在副本集中,任何一个节点都可作为主节点,但为维持数据一致性,只能有一个主节点。**一个副本集集群中各个服务器的几种状态:

  • 主节点Primary:一个副本集有且仅有一台服务器处于Primary,它负责数据的写入和更新,还负责指定其它节点为从节点。
  • 备用节点Secondary:副本集允许有多台Secondary,每个备用节点数据与主节点的数据是完全同步的。
  • 仲裁节点Arbiter(可无需单独存在):负责在主节点发生故障时,参与选举新节点作为主节点。它不存数据,监控其它节点,无仲裁节点就全部节点投票选举。
  • 无效节点Down:当服务器挂掉或掉线时就会处于该状态。

心跳检测:

副本集中的各节点会通过心跳信息来检测各自的健康状况,当主节点发生故障时,多个从节点会触发一次新的选举操作,并选举其中一个作为新的主节点。

d45790e65e4e6caaeb75e097980c4460.png

选举:

MongoDB的主节点选举由心跳触发

副本集选举采用的是Bully算法:主要思想是集群的每个成员都可以声明它是主节点并通知其它节点

为了保证选举票数不同,副本集的节点数保持为奇数最少3个副本节点,最多12个,最多7个节点参与选举

部署副本集(replicattion set):

多台服务器维护相同的数据副本,提高服务器的可用性,即高可用性

(3) 分片(sharding)(分区)

分片是指将数据拆分,将其分散存放在不同机器上的过程。

构建一个MongoDB的分片集群,需要三个重要的组件:分片服务器(Shard Server)、配置服务器(Config Server)、路由服务器(Route Server)

  1. 分区服务器Shard Server
    每个Shard Server都是一个mongod数据库实例,用于存储实际的数据块。整个数据库集合分成多个块存储在不同的Shard Server中。一个Shard Server可由几台机器组成一个副本集来承担,防止因主节点单点故障导致整个系统崩溃。
  2. 配置服务器Config Server
    这是独立的一个mongod进程,保存集群和分片的元数据(配置信息),在集群启动最开始时建立(启动日志),保存各个分片包含数据的信息。
  3. 路由服务器Route Server
    这是独立的一个mongos进程,Route Server在集群中可作为路由使用,客户端由此接入,让整个集群看起来像一个单一的数据库,提供客户端应用程序和分片集群之间的接口。Route Server本身不保存数据,启动时从Config Server加载集群信息到缓存中

三、应用场景

(1)主要场景:

  1. 网站实时数据处理。它非常适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
  2. 缓存。由于性能很高,它适合作为信息基础设施的缓存层。在系统重启之后,由它搭建的持久化缓存层可以避免下层的数据源过载。
  3. 高伸缩性的场景。非常适合由数十或数百台服务器组成的数据库,它的路线图中已经包含对MapReduce引擎的内置支持。

不适用的场景:

  1. 要求高度事务性的系统。
  2. 传统的商业智能应用。
  3. 复杂的跨文档(表)级联查询。

(2)使用场景:

  • 网站数据:Mongo 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
  • 缓存:由于性能很高,Mongo 也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo 搭建的持久化缓存层可以避免下层的数据源过载。
  • 大尺寸、低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
  • 高伸缩性的场景:Mongo 非常适合由数十或数百台服务器组成的数据库,Mongo 的路线图中已经包含对MapReduce 引擎的内置支持。
  • 用于对象及JSON 数据的存储:Mongo 的BSON 数据格式非常适合文档化格式的存储及查询。

不适场景:

  • 高度事务性的系统:例如,银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
  • 传统的商业智能应用:针对特定问题的BI 数据库会产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
  • 需要SQL 的问题。

(3)应用案例:

  • 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新
  • 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
  • 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能
  • 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析
  • 视频直播,使用 MongoDB 存储用户信息、礼物信息等

参考文献

[1]《NoSQL数据库原理与应用》 ——王爱国、许桂秋主编

[2] MongoDB教程

[3] BSON-百度百科

[4] MongoDB应用场景?

[5] 什么场景应该用MongoDB?



推荐阅读
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • MongoVUE基础操作指南:轻松上手数据库管理
    本文介绍了MongoVUE的基础操作,旨在帮助用户轻松掌握数据库管理技巧。MongoVUE是一款功能强大的MongoDB客户端工具,虽然需要注册,但其用户友好的界面和丰富的功能使其成为许多开发者的首选。文中详细解释了安装步骤、基本配置以及常见操作方法,并对一些常见的问题进行了修正和补充,确保用户能够快速上手并高效使用MongoVUE进行数据库管理。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 本文详细介绍了如何解决DNS服务器配置转发无法解析的问题,包括编辑主配置文件和重启域名服务的具体步骤。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
author-avatar
中国有程序猿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有