mongodb中文文档 mongodb中文网
Oracle或sqlserver或mysql如何连接到MongoDB??
mongodb支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富在MongoDB中,文档是对数据的抽象,它从以下几个维度,对redis、memcache、mongoDB 做了对比:被使用在端和端的交互中。所有的端(各种语言的Driver)都会使用这种抽象,它的表现形式就是我们常说的BSON(Binary JSON )。
mongodb中文文档 mongodb中文网
mongodb中文文档 mongodb中文网
B块的拆分:初始化时只有一个块,达到块尺寸64MB或100000个文档就会触发块的拆分。把原来的范围一分为二,这样就有了两个块,每个块都有相同数量的文档。SON是一个轻量级的二进制数据格式。
MongoDB能够使用BSON,并将BSON作为数据的存储存放在磁盘中。
当端要将写入文档,使用查询等等作时,需要将文档编码为BSON格式,然后再发送给端。同样,端的返回结果也是编码为BSON格式再放回给端的。
非关系型数据库有哪几个
(2)索引以下是几种常见的非关系型数据库:MongoDB、HBase、Redis、CouchDB、Neo4j等。
1、MongoDB:MongoDB是一种面向文档的数据库,采用BSON(二进制JSON)格式存储数据。它支持丰富的查询语言和索引,适用于存储如果主的数据还没有写到从库,那么数据不能算提交,当该主变成从时,便会触发回滚,那些没写到从库的数据将会被删除,可以通过rollback子目录中的BSON文件恢复回滚的内容。大量结构化或半结构化数据。
2、HBase:HBase是一个基于Hadoop的分布式列式存储系统,适用于大规模storageSize超过dataSize 数据大小 两倍以上,就会因磁盘碎片而影响性能,需要压缩。数据的实时读写作。它常被用于构建实时分析和搜索引擎。
3、Redis:Redis是一个内存中的数据存储系统,支持多种数据结构,如字符串、哈希表、列表等。它被广泛用于缓存、消息队列和实时数据分析等场景。
5、Neo4j:Neo4j是一种图数据库,专注于存储和处理图形结构。它适用于需要高效处理复杂关系的应用,如社交网络、系统等。
mongodb数据库怎么使用
只能链接到主,如果链接到从的话,会被拒绝写入作,但是如果没有使用安全模式,因为mongo的fire and forget 特性,会把拒绝写入的异常给吃掉。MongoDB是由10gen团队开发的基于分布式存储的开源数据库系统,使用C++编写。MongoDB作为一个文档型数据库,其中数据以键值对的方式来存储。
下面我们来看下MogoDB的基本使用。
1、连接MongoDB数据库
使用如下命令来连接MongoDB数据库
mongo
图1 连接MongoDB数据库
2、查看目前所使用的数据库。
在MongoDB中,想查看使用的是哪个数据库,可以使用如下命令来查看。
db
图2 查看所使用的数据库
3、查看有哪些数据库。
在MongoDB中存在着许多个数据库,对于有哪些数据库,可以使用如下命令来查看。
show switched to db csserdb
图3 查看MongoDB中所有的数据库
现阶段所存在的数据库如果不能满足要求,可以使用如下命令来创建新的数据库。
use database_name
其中database_name则代表所要创建的数据库名字,下面将演示创建一个名为offcn的数据库。
use offcn
图4 创建offcn数据库
5、删除数据库
当数据库没有作用时,可以将数据库删除从而释放所占用的空间资源。使用如下命令来进行对数据库进行删除,在删除前应该先选中所要删除的数据库。
use offcn
db.dropDatabase(目录)
图5 删除数据库
一份难得的数据库市场分析报告
数据库市场份额:云服务和新兴厂商主导NoSQL- 数据库分类维度:关系型/非关系型、交易型/分析型
4、创建数据库。- NoSQL数据库的进一步分类
- OLTP市场规模:关系型数据库仍占营收大头
- 数据库市场份额:云服务和新兴厂商主导NoSQL
- 开源数据库 vs. 商业数据库
- 数据库三大阵营:传统厂商和云服务提供商
可能本文比较适合普及性阅读,让数据库领域资深的朋友见笑了:)
数据库分类维度:关系型/非关系型、交易型/分析型
首先是分类维度,上图中的纵轴分类为Relational Database(关系型数据库,RDBMS)和Nonrelational Database (非关系型数据库,NoSQL),横轴的分类为Operational(交易型,即OLTP)和Analytical(分析型,即OLAP)。
按照习惯我们先看关系型数据库,左上角的交易型类别中包括大家熟悉的商业数据库Oracle、MS SQL 、DB2、Infomix,也包括开源领域流行的MySQL(MariaDB是它的一个分支)、PostgreSQL,还有云上面比较常见的SQL Azure和Amazon Aurora等。
比较有意思的是,SAP HANA正好位于交易型和分析型的中间分界处,不要忘了SAP还收购了Sybase,尽管后者今天不够风光了,而早年微软的SQL 都是来源于Sybase。Sybase的ASE数据库和分析型Sybase IQ还是存在的。
右上角的分析型产品中包括几款知名的列式数据仓库Pivotal Greenplum、Teradata和IBM Netezza(已宣布停止支持),来自互联网巨头的Google Big Query和Amazon RedShift。至于Oracle Exadata一体机,它上面运行的也是Oracle数据库,其最初设计用途是OLAP,而在后来发展中也可以良好兼顾OLTP,算是一个跨界产品吧。
再来看非关系型数据库,左下角的交易型产品中,有几个我看着熟悉的MongoDB、Redis、Amazon DynamoDB和DocumentDB等;右下角的分析型产品包括的Hadoop分支Cloudera、Hortonworks(这2家已并购),Bigtable(来自Google,Hadoop中的HBase是它的开源实现)、Elasticsearch等。
显然非关系型数据库的分类要更加复杂,产品在应用中的异化也比传统关系型数据库更大。Willian Blair很负地对它们给出了进一步的分类。
NoSQL数据库的进一步分类
上面这个图表应该说很清晰了。非关系型数据库可以分为Document-based Store(基于文档的存储)、Key-Value Store(键值存储)、Graph-based(图数据库)、Time Series(时序数据库),以及Wide Cloumn-based Store(宽列式存储)。
我们再来看下每个细分类别中的产品:
文档存储 :MongoDB、Amazon DocumentDB、Azure Coos DB等
Key-Value存储 :Redis Labs、Oracle Berkeley DB、Amazon DynamoDB、Aerospike等
图数据库 :Neo4j等
时序数据库 :InfluxDB等
WideCloumn :DataStax、Cassandra、Apache HBase和Bigtable等
多模型数据库 :支持上面不只一种类别特性的NoSQL,比如MongoDB、Redis Labs、Amazon DynamoDB和Azure Coos DB等。
OLTP市场规模:关系型数据库仍占营收大头
上面这个基于IDC数据的交易型数据库市场份额共有3个分类,其中深蓝色部分的关系型数据库(RDBMS,在这里不统计数据挖掘/分析型数据库)占据80%以上的市场。
Dynamic Database(DDMS,动态数据库管理系统,同样不统计Hadoop)就是我们前面聊的非关系型数据库。这部分市场显得小(但发展势头看好),我觉得与互联网等大公司多采用开源+自研,而不买商业产品有关。
而遵循IDC的统计分类,在上图灰色部分的“非关系型数据库市场”其实另有定义,参见下面这段文字:
代表非关系型数据库的DDMS分类中(这里同样加入Hadoop等),云服务和新兴厂商成为了主导,微软应该是因为云SQL 的基础而小幅领先于AWS,这2家一共占据超过50%的市场,接下来的排名是Google、Cloudera和Hortonworks(二者加起来13%)。
上面是IDC传统分类中的“非关系型数据库”,在这里IBM和CA等应该主要是针对大型机的产品,InterSystems有一款在国内医疗HIS系统中应用的Caché数据库(以前也是运行在Power小机上比较多)。我就知道这些,余下的就不瞎写了。
开源数据库 vs. 商业数据库
按照流行度来看,开源数据库从2013年到现在一直呈现增长,已经快要追上商业数据库了。
商业产品在关系型数据库的占比仍然高达60.5%,而上表中从这列往左的分类都是开源占优:
Wide Cloumn:开源占比81.8%;
时序数据库:开源占比80.7%;
文档存储:开源占比80.0%;
Key-Value存储:开源占比72.2%;
图数据库:开源占比68.4%;
搜索引擎:开源占比65.3%
按照开源Lnse的授权模式,上面这个三角形越往下管的越宽松。比如MySQL属于GPL,在互联网行业用户较多;而PostgreSQL属于BSD授权,国内有不少数据库公司的产品就是基于Postgre哦。
数据库三大阵营:传统厂商和云服务提供商
前面在讨论市场份额时,我提到过交易型数据库的4个巨头仍然是Oracle、微软、IBM和SAP,在这里William Blair将他们归为阵营。
随着云平台的不断兴起,AWS、Azure和GCP(Google Cloud Platform)组成了另一个阵营,在国外分析师的眼里还没有BAT,就像有的朋友所说,国内互联网巨头更多是自身业务导向的,在本土发展公有云还有些优势,短时间内将技术输出到国外的难度应该还比较大。(当然我并不认为国内缺的DBA和研发人才)
第三个阵容就是规模小一些,但比较专注的数据库玩家。
甲骨文的产品,我相对熟悉一些的有Oracle Database、MySQL以及Exadata一体机。
IBM DB2也是一个庞大的家族,除了传统针对小型机、x86(好像用的人不多)、z/OS大型机和for i的版本之外,如今也mongd --repair 修复所有数据库有了针对云和数据挖掘的产品。记得抱枕对Informix的技术比较推崇,可惜这个产品发展似乎不太理想。
微软除了看家的SQL 之外,在Azure云上还能提供MySQL、PostgreSQL和MariaDB开源数据库。应该说他们是传统软件Lnse+PaaS服务两条腿走路的。
如今人们一提起SAP的数据库就想起HANA,之前从Sybase收购来的ASE(Adaptive Enterprise)和IQ似乎没有之前发展好了。
在云服务提供商数据库的3巨头中,微软有SQL 的先天优势,甚至把它移植到了Linux拥抱开源平台。关系型数据库的创新方面值得一提的是Amazon Aurora和Google Spanner(也有非关系型特性),至于它们具体好在哪里我就不装内行了:)
非关系型数据库则是Amazon全面开花,这与其云计算业务发展早并且占据优势有关。Google当年的三篇经典论文对业界影响深远,Yahoo基于此开源的Hadoop有一段时间几乎是大数据的代名词。HBase和Hive如今已不再是人们讨论的热点,而Bigtable和BigQuery似乎仍然以服务Google自身业务为主,毕竟GCP的规模比AWS要小多了。
这张DB-Engines的排行榜,相信许多朋友都不陌生,今年3月已经不是的数据,在这里列出只是给大家一个参考。该排行榜几乎在每次更新时,都会有国内数据库专家撰写点评。
以上是我周末的学习笔记,班门弄斧,希望对大家有帮助。
参考资料《Database Software Market:The Long-Awaited Shake-up》
扩展阅读:《 数据库&存储:互相最想知道的事 》
尊重知识,转载时请保留全文。感谢您的阅读和支持!
mongodb使用场景是什么?
请注意,这里的关系型数据库统计又包含了分析型产品。Oracle营收份额42%仍居,随后排名依次为微软、IBM、SAP和Teradata。使用场景:
(1)网站数据:MongoDB适合实时的插入,更新与查询,并具备网站实时数据存储所需的及高度伸缩性。
(2)缓存:由于性能很高,MongoDB也适合作为信息基础设施的缓存层。在系统重启之后,由MongoDB搭建的持久化缓存层可以避免下层的数据源过载。
(3)大尺寸,低价值的数据。
(4)高伸缩性的场景:MongoDB适合由数十或数百台组成的数据库。
(5)用于对象及JSON数据的存储:MongoDB的BSON数据格式适合文档化格式的存储及查询。
最近由于时间原因我写东西少了,在公众号上也转载过几篇搞数据库朋友的大作。按说我算是外行,没资格在这个领域品头论足,而当我看到下面这份报告时立即产生了学习的兴趣,同时也想就能看懂的部分写点心得体会分享给大家。功能
1、面向的存储:适合存储对象及JSON形式的数据。
2、动态查询:MongoDB支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
3、完整的索引支持:包括文档内嵌对象及数组。MongoDB的查询优化器会分析查询表达式,并生成一个高效的查询。
4、查询监视:MongoDB包含一系列监视工具用于分析数据库作的性能。
5、及自动故障转移:MongoDB数据库支持之间的数据,支持主-从模式及之间的相互。的主要目标是提供冗余及自动故障转移。
6、高效的传统存储方式:支持二进制数据及大型1.MongoDB是什么?用一句话总结对象(如照片或)。
7、自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器
如何将json数据导入到Hive中
(2)mongorestoreSolution 1 : 将json格式数据导入到MongoDB中,然后MongoDB可以将数据转换为CSV格式数据,然后导入到mysql中;
> db.ts.count()CSSer采用的是wordpress程序,数据库为mysql,要想移植到MongoDB数据库,则需要进行数据转换。
数据转移有多种方案,本质上需要将mysql数据转换为一种MongoDB可以直接导入的格式即可。MongoDB提供了mongoimport工具,可以支持导入json,csv的格式。
先来看一下mongoimport支持的参数:
$ mongoimport --
options:
-- produce message
-v [ --verbose ] be more verbose (include multiple times for more
verbosity e.g. -vvvvv)
-h [ --host ] arg mongo host to connect to (
--port arg server port. Can also use --host hostname:port
--ipv6 enable IPv6 support (disabled by default)
-u [ --username ] arg username
-p [ --password ] arg password
--dbpath arg directly access mongod database files in the given
path, instead of connecting to a mongod server -
needs to lock the data directory, so cannot be used
if a mongod is currently accessing the same path
--directoryperdb if dbpath specified, each db is in a separate
directory
-d [ --db ] arg database to use
-c [ --collection ] arg collection to use (some commands)
-f [ --fields ] arg comma separated list of field names e.g. -f name,age
--fieldFile arg file with fields names - 1 per line
--ignoreBlanks当然是 MongoDB 公司推出的免费在线课程 MongoDB University。这是关于 MongoDB 的在线教程,没有之一,权威、系统并且更新及时。可以告诉你的是,MongoDB 新入职员工培训都从这些在线课程开始。MongoDB University 比其它地方能找到的文章和教程要好太多。 if given, empty fields in csv and tsv will be ignored
--type arg type of file to import. default: json (json,csv,tsv)
--file arg file to import from; if not specified stdin is used
--drop drop collection first
--headerline CSV,TSV only - use first line as headers
--upsert insert or update objects that already exist
--upsertFields arg comma-separated fields for the query part of the
upsert. You should make sure this is indexed
--jsonArray load a json array, not one per line. Currently
limited to 4MB.
由上面的帮助文档可以看出,采用csv作为中间数据格式,无论对于mysql的导出,还是mongodb的导入,都算得上是成本了,于是一回就尝试了一把:
首先,将mysql数据库中的wp-ts表导出,一回偷懒了,直接用phpmyadmin的导出功能,选择csv格式导出,并选中了“删除字段中的换行符”以及“将字段名放在行”,保存文件名为csser.csv。
接着,到mongodb,shell下连接MongoDB数据库,并进行数据导入:
$ mongoimport -d csser -c ts -type csv -file csser.csv --headerline
connected to: 127.0.0.1
imported 548 objects
$ mongo
MongoDB shell version: 1.8.1
connecting to: test
547
> db.ts.find({}, {"t_title":1}).sort({"ID":-1}).limit(1)
{ "_id" : ObjectId("4df4641d31b0642fe609426d"), "t_title" : "CSS Sprites在线应用-CSS-sprit" }
Solution2 : 通过Hive中SerDe将JSON数据转换为hive理解的数据格式,原因有:
1、创建Hive表使用序列化时,需要自写一个实现Deserializer的类,并且选用create命令的row format参数;
2、在处理海量数据的时候,如果数据的格式与表结构吻合,可以用到Hive的反序列化而不需要对数据进行转换,可以 节省大量的时间。
MongoDB 或者 redis 可以替代 memcached 吗
mongodb和memcached不是一个范畴内的东西。mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据。mongodb和memcached不存在谁替换谁的问题。
和memcached更为接近的是redis。它们都是内存型数据库,数据保存在内存中,通过tcp直接存取,优势是速度快,并发高,缺点是数据类型有限,查询功能不强,一般用作缓存。在我们团队的项目中,一开始用的是memcached,后来用redis替代。
相比mem一种替代方案是,不用redis本身的机制,采用自己做主动(多份存储),或者改成增量的方式(需要自己实现),一致性问题和性能的权衡cached:
1、redis具有持久化机制,可以定期将内存中的数据持久化到硬盘上。
2、redis具备binlog功能,可以将所有作写入日志,当redis出现故障,可依照binlog进行数据恢复。
3、redis支持virtua过了一段时间,你使用 MongoDB 的项目已经开始开发,或者已经上线了,遇到了新问题。可能你会需要:l memory,可以限定内存使用大小,当数据超过阈值,则通过类似LRU的算法把内存中的最不常用数据保存到硬> use csser盘的页面文件中。
4、redis原生支持的数据类型更多,使用的想象空间更大。
5、前面有位朋友所提及的一致性哈希,用在redis的sharding中,一般是在负载非常高需要水平扩展时使用。我们还没有用到这方面的功能,一般的项目,单机足够支撑并发了。redis 3.0将推出cluster,功能更加强大。
6、redis更多优点,请移步网站查询。
怎样学 MongoDB
4、CouchDB:CouchDB是一个基于文档的数据库,使用JSON格式存储数据。它支持多版本并发控制,允许离线作,适用于需要离线同步和分布式部署的应用。入门
课程分别针对开发者和 DBA 而设计,非常用心。拿 MongoDB for Dlopers 来说,它在 mongo shell 之外使用 python 教学,但并不要求 python 经验。7周的课程中,从安装开始,带你写出一个基于 MongoDB 数据库的博客。每周的课程都有小作业,写写代码,答答题。除了在实践中学习,课程也涵盖了开发者需要知道的各方面细节,全面深入。另外,还有对 Foursquare 和 Codecademy 的采访,分享他们的使用经验和演变过程。还可以选择从 Kaltura 加载视频,不用看 Youtube,是不是非常贴心?
另一个值得的免费课程是 edX 上的 Introduction to MongoDB using the MEAN Stack。这个课程由 edX 与 MongoDB 合作完成,使用 Node.js,AngularJS 与 MongoDB 建设一个在线商城,帮你快速上手。
如果你的团队都希望快速学习 MongoDB,MongoDB 提供定制化的 MongoDB University 团队培训 ,讲师都有非常丰富的手经验。这其实就是 MongoDB 新员工培训的第二部分,所以课程质量没得说。客户包括像 ebay 这样的大公司,也包括创业小公司。国内当然提供中文培训。
进阶
了解基本概念和用法之后,在项目里试试吧。英文的 MongoDB 文档 会是的帮手,能解答你许多疑问。主要内容都有中文翻译 MongoDB 中文文档。不夸张地说,80% 的疑问都可以很容易在文档里找到在关于schema 的设计中要注意一些原则,比如:。
这个时候,你可能会遇到问题,需要帮助。加入 MongoDB中文社区,你需要的同路人都在这里。中文社区在两年建立起来,帮助翻译了中文文档,也欢迎你加入翻译的队伍。社区里包括了国内各大公司的用户,不时举办 MongoDB User Group 线下用户组,现在在、上海、重庆、深圳和杭州都有不定期活动。社区邀请 MongoDB 的大牛们做技术讲座,答疑解惑,也提供一个机会让大家互相结识,拓宽社交圈子。中文在线讲座 则会由 MongoDB 的工程师和资深架构师带接下来我再带大家简单过一下这前两个阵容,看看具体的数据库产品都有哪些。来最权威的内容。我也做过一次在线讲座,讨论 Replica Set 集的内部机制。印象最深的是大家的提问特别热情,Q&A 环节时间根本不够用。2016年8、9月的中文讲座 你的个MongoDB应用 也特别适合入门。加入中文社区首页上的微信公众号吧,时间得到通知。
希望在社区里提问?区同事积极活跃在 segmentfault 问答中的 MongoDB 标签下,那是中文社区里提问的好地方。遇到问题还可以到 stackoverflow 看看,的 Google Group 也有专人负责。在公司最初的四年里,CTO 每天都亲自在 Google Group 上回答问题,而且基本秒回。从那时开始,重视开发者社区作为一个传统一直到了今天。市面上有一些书也很好,比如《MongoDB权威指南》,不过书很容易过时。
实战
首先要重磅 MongoDB 自己开发的数据库托管服务 MongoDB Atlas!依靠 Amazon AWS,部署和管理 MongoDB 不能更方便!2017年推出了免费款机型,512MB 磁盘空间,共享CPU和内存,特别容易上手。
咨询。MongoDB 公司提供咨询服务 Global Consulting Servs,帮你优化架构设计方案。
运维。你的项目越来越火,运维开始成了新问题。MongoDB Cloud Mar 提供和备份。
托管。2016 年推出的 Database as a Serv 数据库即服务 MongoDB Atlas 依靠 AWS 让整个运维都变简单。
可视化。MongoDB Compass 是 MongoDB 开发的数据可视化工具,好评不断。
认证。包括针对开发者和 DBA 的两种认证考试。在区众多用户中,大概只有10名左右工程师成功获得认证,可见其中含金量。
云计算方面,国外 AWS,Azure 和 Google Cloud 都有各种合作和整合。国内的话,阿里云和腾讯云都支持 MongoDB,他们的团队也在社区里做了很多贡献,技术实力有目共睹。
遇到问题,你的团队可能需要更专业、更及时的帮助,MongoDB Professional 客户支持是 MongoDB 公司最早开展的服务。我们开发工程师每几个月就要到客户支持部门轮岗,为了更好地了解用户。我的感觉就是绝不只是关掉一个 ticket,而是门大学问。在时间限制里尽快地找到用户问题,提出解决方案,就像急救室的医生一样,背后有完善的流程和深厚的技术积累。个别问题也会很快升级到开发工程师那里,毕竟我们就坐在不远的地方。自己写的代码哪里有搞不定的道理?用户也是普通人,会高兴会生气,也会力不能及,所以理解客户和技术精通一样重要。对了,他们也提供中文服务。
这篇文章毕竟不是广告,就不提大公司用的商业版和相应的服务了。我总觉得工程师和 DBA 时间那么值钱,不应该花在找免费资源和“在线等”好心人解答问题上,毕竟还有技术理想等着去实现呢。介绍 MongoDB 的产品和服务,就像健身建议请个教练一样,少走些弯路。
MongoDB 是什么?看完你就知道了
总的来说,扫描尽可能少的文档。点击上方 蓝色字体 ,选择“置顶公众号”
这个点没必要过多描述,但是有一个特殊场景,如果从和仲裁都了,只剩下主,他会把自己降级成为从。优质文章,时间送达
链接 |
MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统。没错MongoDB就是数据库,是NoSQL类型的数据库。
(1)MongoDB提出的是文档、的概念,使用BSON(类JSON)作为其数据模型结构,其结构是面向对象的而不是二维表,存储一个用户在MongoDB中是这样子的。
使用这样的数据模型,使得MongoDB能在生产环境中提供高读写的能力,吞吐量较于mysql等SQL数据库大大增强。
(2)易伸缩,自动故障转移。易伸缩指的是提供了分片能力,能对数据集进行分片,数据的存储压力分摊给多台。自动故障转移是副本集的概念,MongoDB能检测主是否存活,当失活时能自动提升从为主,达到故障转移。
(3)数据模型因为是面向对象的,所以可以表示丰富的、有层级的数据结构,比如博客系统中能把“评论”直接怼到“文章“的文档中,而不必像myqsl一样创建三张表来描述这样的关系。
3.主要特性
(1)文档数据类型
SQL类型的数据库是正规化的,可以通过主键或者外键的约束保证数据的完整性与性,所以SQL类型的数据库常用于对数据完整性较高的系统。MongoDB在这一方面是不如SQL类型的数据库,且MongoDB没有固定的Schema,正因为MongoDB少了一些这样的约束条件,可以让数据的存储数据结构更灵活,存储速度更加快。 (2)即时查询能力
MongoDB保留了关系型数据库即时查询的能力,保留了索引(底层是基于B tree)的能力。这一点汲取了关系型数据库的优点,相比于同类型的NoSQL redis 并没有上述的能力。 (3)能力
MongoDB自身提供了副本集能将数据分布在多台机器上实现冗余,目的是可以提供自动故障转移、扩展读能力。 (4)速度与持久性
MongoDB的驱动实现一个写入语义 fire and forget ,即通过驱动调用写入时,可以立即得到返回得到成功的结果(即使是报错),这样让写入的速度更加快,当然会有一定的不安全性,完全依赖网络。
MongoDB提供了Journaling日志的概念,实际上像mysql的bin-log日志,当需要插入的时候会先往日志里面写入记录,再完成实际的数据作,这样如果出现停电,进程突然中断的情况,可以保障数据不会错误,可以通过修复功能读取Journaling日志进行修复。
(5)数据扩展
MongoDB使用分片技术对数据进行扩展,MongoDB能自动分片、自动转移分片里面的数据块,让每一个里面存储的数据都是一样大小。
MongoDB核心主要是通过mongod程序启动的,而且在启动时不需对MongoDB使用的内存进行配置,因为其设计哲学是内存管理是交给作系统,缺少内存配置是MongoDB的设计亮点,另外,还可通过mongos路由使用分片功能。
MongoDB的主要客户端是可以交互的js shell 通过mongo启动,使用js shell能使用js直接与MongoDB进行交流,像使用sql语句查询mysql数据一样使用js语法查询MongoDB的数据,另外还提供了各种语言的驱动包,方便各种语言的接入。
mongoexport和mongoimport,用来导入导出JSON、CSV和TSV数据,数据需要支持多格式时有用。mongoimport还能用与大数据集的初始导入,但是在导入前顺便还要注意一下,为了能充分利用好mongoDB通常需要对数据模型做一些调整。
mongosniff,网络嗅探工具,用来观察发送到数据库的作。基本就是把网络上传输的BSON转换为易于人们阅读的shell语句。
因此,可以总结得到,MongoDB结合键值存储和关系数据库的特性。因为简单,所以数据极快,而且相对容易伸缩还提供复杂查询机制的数据库。MongoDB需要跑在64位的上面,且单独部署,因为是数据库,所以也需要对其进行热备、冷备处理。
因为本篇文章不是API手册,所有这里对shell的使用也是基础的介绍什么功能可以用什么语句,主要是为了展示使用MongoDB shell的方便性,如果需要知道具体的MongoDB shell语法可以查阅文档。
创建数据库并不是必须的作,数据库与只有在次插入文档时才会被创建,与对数据的动态处理方式是一致的。简化并加速开发过程,而且有利于动态分配命名空间。如果担心数据库或被意外创建,可以开启严格模式。
以上的命令只是简单实例,设如果你之前没有学习过任何数据库语法,同时开始学sql查询语法和MongoDB 查询语法,你会发现哪一个更简单呢?如果你使用的是ja驱动去作MongoDB,你会发现任何的查询都像Hibernate提供出来的查询方式一样,只要构建好一个查询条件对象,便能轻松查询(接下来会给出示例),博主之前熟悉ES6,所以入手MongoDB js shell完成没问题,也正因为这样简洁,完善的查询机制,深深的爱上了MongoDB。
使用ja驱动链接MongoDB是一件非常简单的事情,简单的引用,简单的做增删改查。在使用完ja驱动后我才发现spring 对MongoDB 的封装还不如自身提供出来的东西好用,下面简单的展示一下使用。
这里只举例了简单的链接与简单的MongoDB作,可见其作的容易性。使用驱动时是基于TCP套接字与MongoDB进行通信的,如果查询结果较多,恰好无法全部放进中,将会向发送一个getmore指令获取下一批查询结果。
插入数据到时间,不会等待的响应,驱动会设写入是成功的,实际是使用客户端生成对象id,但是该行为可以通过配置配置,可以通过安全模式开启,安全模式可以校验端插入的错误。
要清楚了解MongoDB的基本数据单元。在关系型数据库中有带列和行的数据表。而MongoDB数据的基本单元是BSON文档,在键值中有指向不定类型值的键,MongoDB拥有即时查询,但不支持联结作,简单的键值存储只能根据单个键来获取值,不支持事务,但支持多种原子更新作。
如读写比是怎样的,需要何种查询,数据是如何更新的,会不会存在什么并发问题,数据结构化的程度是要求高还是低。系统本身的需求决定mysql还是MongoDB。
数据库是的逻辑与物理分组,MongoDB没有提供创建数据库的语法,只有在插入时,数据库才开始建立。创建数据库后会在磁盘分配一组数据文件,所有、索引和数据库的其他元数据都保存在这些文件中,查阅数据库使用磁盘状态可通过。
是结构上或概念上相似得文档的容器,的名称可以包含数字、字母或 . 符号,但必须以字母或数字开头,完全。
mongodump和mongorestore,备份和恢复数据库的标准工具。输出BSON格式,迁移数据库。限定名不能超过128个字符,实际上 . 符号在中很有用,能提供某种虚拟命名空间,这是一种组织上的原则,和其他是一视同仁的。在中可以使用。
其次是键值,在MongoDB里面所有的字符串都是UTF-8类型。数字类型包括double、int、long。日期类型都是UTC格式,所以在MongoDB里面看到的时间会比时间慢8小时。整个文档大小会限制在16m以内,因为这样可以防止创建难看的数据类型,且小文档可以提升性能,批量插入文档理想数字范围是10~200,大小不能超过16MB。
(2)解析查询时MongoDB通过选择一个索引进行查询,当没有最适合索引时,会先不同的使用各个索引进行查询,最终选出一个索引做查询
(3)如果有一个a-b的复合索引,那么仅针对a的索引是冗余的
(4)复合索引里的键的顺序是很重要的
(2)复合索引
(3)性索引
(4)稀疏索引
如索引的字段会出现的值,或是大量文档都不包含被索引的键。
如果数据集很大时,构建索引将会花费很长的时间,且会影响程序性能,可通过
对索引进行压缩,重建。
(2)分析慢查询
注意新版本的MongoDB 的explain方法是需要参数的,不然只显示普通的信息。
本节同样主要简单呈现MongoDB副本集搭建的简易性,与副本集的强壮性,容易性
提供主从能力,热备能力,故障转移能力
实际上MongoDB对副本集的作跟mysql主从作是不多的,先看一下mysql的主从数据流动过程
而MongoDB主要依赖的日志文件是oplog
写作先被记录下来,添加到主的oplog里。与此同时,所有从结点oplog。首先,查看自己oplog里一条的时间戳;其次,查询主oplog里所有大于此时间戳的条目;,把那些条目添加到自己的oplog里并应用到自己的库里。从使用长轮询立即应用来自主结点oplog的新条目。
当遇到以下情况,从会停止
local数据库保存了所有副本集元素据和oplog日志
可以使用以下命令查看情况
每个副本集成员每秒钟ping一次其他所有成员,可以通过rs.status看到上次的心跳检测时间戳和 健康 状况。
(2)使用副本集方式链接
能根据写入的情况自动进行故障转移,但是当副本集进行新的选举时,还是会出现故障,如果不使用安全模式,依旧会出现写不进去,但现实成功的情况。
分片是数据库切分的一个概念实现,这里也是简单总结为什么要使用分片以及分片的原理,作。
当数据量过大,索引和工作数据集占用的内存就会越来越多,所以需要通过分片负载来解决这个问题
(2)分片的核心作
分片一个:分片是根据一个属性的范围进行划分的,MongoDB使用所谓的分片键让每个文档在这些范围里找到自己的位置
块:是位于一个分片中的一段连续的分片键范围,可以理解为若干个块组成分片,分片组成MongoDB的全部数据
(3)拆分与迁移
迁移:当分片中的数据大小不一时会产生迁移的动作,比如分片A的数据比较多,会将分片A里面的一些块转移到分片B里面去。分片集群通过在分片中移动块来实现均衡,是由名为均衡器的软件进程管理的,任务是确保数据在各个分片中保持均匀分布,当集群中拥有块最多的分片与拥有块最少分片的块大于8时,均衡器就会发起一次均衡处理。
启动两个副本集、三个配置、一个mongos进程
配置分片
分片只允许在_id字段和分片键上添加性索引,其他地方不行,因为这需要在分片间进行通信,实施起来很复杂。
当创建分片时,会根据分片键创建一个索引。
(2)低效的分片键
(3)理想的分片键
根据不同的数据中心划分
(2)要求
(3)配置的注意事项
需要估计集群大小,可使用以下命令对现有进行分片处理
备份分片时需要停止均衡器
使用64位机器、32位机器会制约mongodb的内存,使其值为1.5GB
(2)cpu mongodb 只有当索引和工作集都可放入内存时,才会遇到CPU瓶颈,CPU在mongodb使用中的作用是用来检索数据,如果看到CPU使用饱和的情况,可以通过查询慢查询日志,排查是不是查询的问题导致的,如果是可以通过添加索引来解决问题
mongodb写入数据时会使用到CPU,但是mongodb写入时间一次只用到一个核,如果有频繁的写入行为,可以通过分片来解决这个问题 (3)内存
大内存是mongodb的保障,如果工作集大小超过内存,将会导致性能下降,因为这将会增加数据加载入内存的动作
(4)硬盘
mongodb默认每60s会与磁盘强制同步一次,称为后台刷新,会产生I/O作。在重启时mongodb会将磁盘里面的数据加载至内存,高速磁盘将会减少同步的时间
(5)文件系统
使用ext4 和 xfs 文件系统
禁用访问时间
(6)文件描述符
linux 默认文件描述符是1024,需要大额度的提升这个额度
(7)时钟
mongodb各个之间使用ntp
启动时使用 - -bind_ip 命令
(2)身份验证
启动时使用 - -auth 命令
(3)副本集身份认证
使用keyFile,注意keyFile文件的权限必须是600,不然会启动不起来
搭建副本集至少需要两个,其中仲裁结点不需要有自己的
(2)Journaling日志 写数据时会先写入日志,而此时的数据也不是直接写入硬盘,而是写入内存
但是Journaling日志会消耗内存,所以可以在主库上面关闭,在从库上面启动
可以单独为Journaling日志使用一块固态硬盘
在插入时,可以通过驱动确保Journaling插入后再反馈,但是会非常影响性能。
-vvvvv 选项(v越多,输出越详细)
db.runCommand({logrotare:1}) 开启滚动日志
(2)top
(3)db.currentOp
动态展示mongodb活动数据
占用当前mongodb端口往上1000号的端口
把数据库内容导出成BSON文件,而mongorestore能读取并还原这些文件
把导出的BSON文件还原到数据库
(3)备份原始数据文件 可以这么做,但是,作之前需要进行锁库处理 db.runCommand({fsync:1,lock:true}) db.$cmd.sys.unlock.findOne 请求解锁作,但是数据库不会立刻解锁,需要使用 db.currentOp 验证。
db.runCommand({repairDatabase:1}) 修复单个数据库
修复就是根据Joing文件读取和重写所有数据文件并重建各个索引 (2)压紧
压紧,会重写数据文件,并重建的全部索引,需要停机或者在从库上面运行,如果需要在主库上面运行,需要添加force参数 保证加写锁。
(2)为提升性能检查索引和查询
保证没有冗余的索引,冗余的索引会占用磁盘空间、消耗更多的内存,在每次写入时还需做更多工作
(3)添加内存
dataSize 数据大小 和 indexSize 索引大小,如果两者的和大于内存,那么将会影响性能。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。