MongoDB 3.0新增的压缩选项

MongoDB3.0对WiredTiger存储引擎引入了压缩功能。在本文中,我们将观察不同选项,并举例说明这个功能如何运行。由于情况因人而异,所以我们鼓励你测试自己的数据和应用程序。

 

为什么需要压缩?

每个人都知道存储很便宜对吧?

但是,有可能你添加数据的速度比存储价格下降的速度来得更快,你花费在存储上的净支出实际上正在上升。你的内部成本也可能需要包括管理等因素,因此它们的价格可能会比商品市场价格高出很多。换句话说,你仍然需要寻求新的方式以减少您对存储的需求。

 

磁盘存储的大小是一个需要考虑的因素,当然还有其他需要考虑的。磁盘I/ O延迟是由在旋转存储上寻道时间为主导。通过降低数据的大小,用更少的磁盘寻道检索一定量的数据是必要的,这样磁盘I / O吞吐量将得到改善。对于RAM而言,一些压缩格式可以不用解压在内存中的数据。在这样的情况下,更多的数据可以放在RAM中,从而提高了性能。

[Read more…]

为什么MongoDB广受欢迎?这是一个数据结构的问题

“如果你光给我看代码而不让我了解数据结构,我会很迷茫。如果让我了解数据结构,我就明显不再需要经常查看你的代码了。” – 由Eric Raymond写于《The Cathedral and the Bazaar: Musings on Linux and Open Source by an Accidental Revolutionary》,1997年

 

语言创新

 

编程的基本任务是告诉计算机做某些事的方法。正因如此,许多在软件开发领域的创新是语言创新,这种创新在于使程序员能更简单有效地指示计算机的操作。

 

尽管计算机以二进制运行,然而我们并不会以这种方式与它们交流。每隔十年,更高级别编程语言不断出现,而程序员的自我表达能力也随之不断提高。这些创新中包括了对如何表达数据结构,以及如何表达算法的改进。

 

面向对象编程与关系型数据库间的不一致(Object-relational impedance mismatch)

 

几乎所有的现代编程语言支持面向对象(OO),当我们用代码建立对象模型时,我们通常使用原始类型(整数,字符串等),数组和对象的组合。

 

虽然每一种语言处理细节的方式不同,嵌套对象结构的想法已经成为我们用来描述“东西”的通用语言。

 

我们用来持久化数据的数据结构却并没有以同样的速度发展改变。在过去30年,持久性数据的主要数据结构一直是表 – 一个由包含标量值(整数,字符串等等)列组成的行集合。这是一个关系型数据库的世界,从1980年开始流行,它的事务性,快速查询,空间使用效率,比同时代的其他数据库系统更佳,另外它还有一支强大的Oracle销售团队。

 

这面向对象代码建模方式和持久化数据(通过表)存储方式之间的不同,一直是困扰许多程序员的源头。数千年来人们都在改变数据形态的问题上,即在物理形式和关系形式之间转换投入了大量的努力。

[Read more…]

从Redis向MongoDB的迁移 — 一个真实的例子

一位我们曾帮助过的用户,最近又联系了我们,提出对于他们仪表系统构建NOSQL数据库的需求。

在过去的时间里,他们收集了大量重要的传感器数据,并将其存储在一个专用的Redis数据库内。 当他们为每个键收集一个值时,Redis的键值结构运作良好。然而,当一个新的错误检查需求出现,要求它们为每个数据点添加一个时间戳时,每个键要存储两个值, Redis运作就有些笨拙。这样做需要应用值域的人工分隔符或者使用两个Reids数据库,每个数据库都使用相同的键来检索与每个键相关联的独立值。

两者都是低成本或是无成本实现, 他们选择了分隔符的方法,运用 ‘::’ 作为分隔符。当然,他们知道不能像这样持续扩展键值范式, 因为新的数据记录需求出现了,但是运作良好。它几乎不需要改变任何现有的生产代码,只用足够的内存来存储附加的数据点。

他们还使用Rackspace的Redis服务,以检测他们的服务代码,同时继续为现有的数据存储写入实时数据。

他们联系到我们,让我们对他们将传感器数从276升级到8000(增加29X数据量)进行风险评估, 那时似乎已经决定向更复杂的NoSQL数据转移。

[Read more…]

真实世界的NoSQL:MongoDB在Shutterfly

本文地址:https://www.askmac.cn/archives/nosql-real-world-mongodb-shutterfly.html

 

最近掀起的一波非关系数据库浪潮,也称“NoSQL”热潮,它引起了人们的热烈反映。大肆的宣传炒作下,真实情况到底如何就很难说了。人们的谈论很多,但在现实世界NoSQL到底有多牛逼?在这个系列中,我们将看到一些真实世界的NoSQL。

 

Shutterfly的是一种流行的,基于互联网的,照片共享和个人出版公司,管理着超过60亿图像的持久性存储,每秒的事务处理率高达10,000次操作。数据架构师Kenny Gorman接受了帮助Shutterfly的任务,选择并替换其现有的关系型数据库管理系统:Oracle的RDBMS。

最初,Shutterfly考虑过如MySQL和PostgreSQL的开源数据库。但是,在评估和重新架构应用程序的过程中,非关系型数据库似乎更符合Shutterfly的数据的需求,它有可能改善程序员的工作效率以及性能和可扩展性。“我们有过权衡,最后不得不说服自己,不太成熟的非事务性数据存储在这里也OK,” Gorman说。

 

[Read more…]

MongoDB 中找出非空的VALUE, NOT NULL

MongoDB 中找出非空的VALUE, NOT NULL 的方法:

以下的方法能找出所有有某个KEY的Document


db.mycollection.find({"IMAGE URL":{$exists:true}});

 

但仍可能返回 “IMAGE URL”为NULL的值

以下的方法能找出所有某个KEY不为空 NOT NULL的Document

 

db.mycollection.find({"IMAGE URL":{$ne:null}});

 

请注意 $exists 无法利用到索引, 但$NE 可以用上索引, 所以处于性能的考虑尽可能用 $ne:null

给Oracle开发者和DBA上的MongoDB课程

mongodb课程

 

给Oracle开发者和DBA上的MongoDB课程

老刘花了6个月时间学习mongodb,尝试把学习oracle的方法和精神用到学习mongodb nosql上,来听听老刘的心得

报名地址: http://t.cn/R2B1GKU

学习目标
MongoDB For Oracle DBA和开发者

  • 了解MongoDB的历史和特点
  • MongoDB与Oracle特性比较
  • MongoDB与Oracle学习曲线比较
  • MongoDB学习方法推荐

课程目标:

  • 了解MongoDB的历史和特点
  • MongoDB与Oracle特性比较
  • MongoDB与Oracle学习曲线比较
  • MongoDB的历史和特点学习方法推荐

 

课程特色:maclean liu老刘花了6个月时间学习mongodb,尝试把学习oracle的方法和精神用到学习mongodb nosql上,来听听老刘的心得

适用人群:对mongodb不了解的任何人

优惠方式:免费

 

 

MongoDB中trace Query跟踪查询的方法

MongoDB中可以使用db.setProfilingLevel的方法来跟踪查询语句,语法为db.setProfilingLevel(level, slowms)。其作用是修改当前数据库的PROFILER级别来让数据库记录更多的性能数据。

LEVEL 参数:制定profiling的级别,0是不跟踪,1代表只跟踪慢的操作,2代表跟踪所有操作。

slowms 参数:设置的时间阈值,大于该阈值则认为查询是慢的SLOW的

设置LEVEL=2可能会少量影响MongoDB性能,由于查询的历史将被记录到日志,所以也可能存在安全风险。

也可以通过设置slowOpThresholdMs参数来指定慢的查询,默认为100ms。

mongod会将大于slowOpThresholdMs指定时间的查询记录到mongod.log日志中。

使用方法:

 

db.setProfilingLevel(2);
{ "was" : 0, "slowms" : 100, "ok" : 1 }

> db.test.count();
50000

> db.system.profile.find();
{ "op" : "insert", "ns" : "test.test", "query" : { "_id" : ObjectId("55813154648066edd8eda678"), "a" : 48087, "b" : 48088, "c" : 48089, "d" : 48090, "e" : [ 1, 2, 3, 4, 5, 6, 48086 ] }, "ninserted" : 1, "keyUpdates" : 0, "writeConflicts" : 0, "numYield" : 0, "locks" : { "Global" : { "acquireCount" : { "w" : NumberLong(1) } }, "Database" : { "acquireCount" : { "w" : NumberLong(1) } }, "Collection" : { "acquireCount" : { "w" : NumberLong(1) } } }, "millis" : 0, "execStats" : {  }, "ts" : ISODate("2015-06-17T08:35:32.967Z"), "client" : "127.0.0.1", "allUsers" : [ { "user" : "maclean", "db" : "test" } ], "user" : "maclean@test" }

在MongoDB的sharding cluster 追尾tailing OPLOG的缺陷和解决方法

介绍

2个月前,我写了一篇关于您如何追尾Oplog的文章同样在分片群集上,并过滤掉从balancer process中产生的内部插入和删除。

它出版后,我收到了更多关于这个话题的反馈,指出两种scenarios目前在需要OPLOG追尾的应用仍有问题。一个还适用于非分片集群,二是仍是分片相关的问题。两者或许都比第一篇博客文章讨论的模糊,但还是很真实的问题。

[Read more…]

MongoDB INSERT性能测试

MongoDB INSERT性能测试

 

 

 
 startDate=ISODate();
 for(var i=0;i<1000000;i++){db.test.insert({a:1+i, b:i+2, c:i+3, d:i+4, e: [1,2,3,4,5,6,i]})}
 db.runCommand({getLastError:1, j:1, w:1});
 print(ISODate()-startDate);

MongoDB中实现INSERT AS SELECT

MongoDB中实现INSERT AS SELECT

db.orders.find({ 条件: 1 }).
forEach( function(i) {
i.ts_imported = new Date();
db.orders1.insert(i);
});

db.orders.find().forEach( function(i) {
i.ts_imported = new Date();
db.orders1.insert(i);
});

> db.orders1.find();
{ “_id” : ObjectId(“55706f6f0fbdc5f8cdb3cf57”), “OrderID” : 10248, “CustomerID” : “VINET”, “EmployeeID” : 5, “OrderDate” : “1996-07-04 00:00:00.000”, “RequiredDate” : “1996-08-01 00:00:00.000”, “ShippedDate” : “1996-07-16 00:00:00.000”, “ShipVia” : 3, “Freight” : 32.38, “ShipName” : “Vins et alcools Chevalier”, “ShipAddress” : “59 rue de l’Abbaye”, “ShipCity” : “Reims”, “ShipRegion” : “NULL”, “ShipPostalCode” : 51100, “ShipCountry” : “France”, “ts_imported” : ISODate(“2015-06-04T15:34:43.618Z”) }
{ “_id” : ObjectId(“55706f6f0fbdc5f8cdb3cf58”), “OrderID” : 10249, “CustomerID” : “TOMSP”, “EmployeeID” : 6, “OrderDate” : “1996-07-05 00:00:00.000”, “RequiredDate” : “1996-08-16 00:00:00.000”, “ShippedDate” : “1996-07-10 00:00:00.000”, “ShipVia” : 1, “Freight” : 11.61, “ShipName” : “Toms Spezialitäten”, “ShipAddress” : “Luisenstr. 48”, “ShipCity” : “Münster”, “ShipRegion” : “NULL”, “ShipPostalCode” : 44087, “ShipCountry” : “Germany”, “ts_imported” : ISODate(“2015-06-04T15:34:43.626Z”) }
{ “_id” : ObjectId(“55706f6f0fbdc5f8cdb3cf59”), “OrderID” : 10250, “CustomerID” : “HANAR”, “EmployeeID” : 4, “OrderDate” : “1996-07-08 00:00:00.000”, “RequiredDate” : “1996-08-05 00:00:00.000”, “ShippedDate” : “1996-07-12 00:00:00.000”, “ShipVia” : 2, “Freight” : 65.83, “ShipName” : “Hanari Carnes”, “ShipAddress” : “Rua do Paço”, “ShipCity” : 67, “ShipRegion” : “Rio de Janeiro”, “ShipPostalCode” : “RJ”, “ShipCountry” : “05454-876”, “field14” : “Brazil”, “ts_imported” : ISODate(“2015-06-04T15:34:43.627Z”) }
{ “_id” : ObjectId(“55706f6f0fbdc5f8cdb3cf5a”), “OrderID” : 10251, “CustomerID” : “VICTE”, “EmployeeID” : 3, “OrderDate” : “1996-07-08 00:00:00.000”, “RequiredDate” : “1996-08-05 00:00:00.000”, “ShippedDate” : “1996-07-15 00:00:00.000”, “ShipVia” : 1, “Freight” : 41.34, “ShipName” : “Victuailles en stock”, “ShipAddress” : 2, “ShipCity” : “rue du Commerce”, “ShipRegion” : “Lyon”, “ShipPostalCode” : “NULL”, “ShipCountry” : 69004, “field14” : “France”, “ts_imported” : ISODate(“2015-06-04T15:34:43.629Z”) }

 

若要重复插入原有记录 则需要

 

db.orders.find().forEach( function(i) {
i._id = new ObjectId();
db.orders2.insert(i);
});

沪ICP备14014813号-2

沪公网安备 31010802001379号