mongoDB 2.0已经发布,带来了许多令人振奋的特性,越来越像企业级的数据库了.
下面简单的介绍一下,
1. compact command
compact 命令主要的功能是重组collection,重建索引,类似整理碎片。2.0以前需要通过repair database来达到同样的目的,因此会中断全库的操作。compact 只中断单个collection的操作。同时compact操作不会被复制,因此在replica set环境,SLAVE节点也需要做同样的操作才能达到整理碎片的目的。
3. default stack size
默认stack size值降低到1MB或者小于系统默认设置,当数据库被连接数量很大(如>1000个连接)是可以减少mongod线程的内存开销。
4. index performance enhancements
mongoDB2.0的索引比以前来说,空间占用约减少25%,性能提升25%。在建立索引的时候需要加上{v:1}的标记位。如果不想使用新的索引格式,标记为{v:0}。因此如果加了{v:1}从2.0降级到1.8需要重建索引。
5. sharding authorizaiton
以前sharding是不支持auth的,会产生BUG。现在支持了。
6. replica set enhancements
6.1 priorities
以前replica set支持的优先级只有0和1,即0不提升为primary,1可以提升为primary。现在的优先级范围是0到1000的浮点型数值。
例如:
A的优先级是4 (primary)
B的优先级是2
C的优先级是3
当A挂掉了,或者不可用。选举发生的时候,如果B和C的up-to-date一致 (并且与primary的数据差异在10秒内)。那么C会被选举为primary。
如果C和A的差异超过了10秒,那么B将被选举为PRIMARY。如果B和C都进入了up-to-date状态,但是B比较接近A,那么还是C被选举为PRIMARY。而B将产生一个ROLLBACK文件,需要手工ROLLBACK超过C的部分数据。
这里算是高可用的一个折中方案吧。对于数据要求严谨的可能不太适用。
6.2 datacenter awareness
这是一个令人期待的特性,在做系统架构设计时,可以考虑到数据库节点的地域分布,机架分布。给replica set里的每个member都打上1个或者多个TAG。
利用这些TAG,和getLastError,可以控制这条DML操作需要在多少个打了某个你需要的TAG的MEMBER里面成功之后才返回。
例如,
Make sure there are at least three copies of the data and it is present on at least two continents.
All of the rules up until now have only had one condition, but you can include as many and-conditions as you want. Suppose we have the following:
Server | Tags |
---|---|
S1 | {"continent" : "nAmerica", "copies" : "S1"} |
S2 | {"continent" : "nAmerica", "copies" : "S2"} |
S3 | {"continent" : "Europe", "copies" : "S3"} |
S4 | {"continent" : "Africa", "copies" : "S4"} |
S5 | {"continent" : "Asia", "copies" : "S5"} |
Then create a mode like:
level : {copies : 3, continent : 2}
Note that modes can contain as many clauses as you need.
{ _id : replSetName, members : [ { “_id” : 0, “host” : S1, “tags” : {} }, ... ], settings : { getLastErrorModes : { level : {copies : 3,continent : 2} } } }
使用下面的命令插入数据时,确保数据至少有3个拷贝,并且在2个地域被写入。
db.foo.insert(doc, {w : "level"})
6.3 w:"majority"
majority可以认为是少数服从多少的意思,如5个节点的replica set。majority就是3。
db.foo.insert(doc, {w : "majory"})
在5个节点的replica set环境。表示至少有3个节点被写入才返回正常。
7. journal 增强
7.1 journal压缩后写入磁盘,缩短了写入时间,降低磁盘占用。
7.2
2.0开始,journalCommitInterval支持配置,默认是100MS。配置范围2到300毫秒。
其实这个journal有点类似PostgreSQL在配置了synchronous_commit = off 时的wal_writer_delay 参数。
间隔多少时间做一次FSYNC,把journal的缓存写入到磁盘。
7.3
{j: true}
DML操作时可以使用这个参数,使用之后journal会被立即写入到磁盘,不必等待journalCommitInterval的发生。使用这个参数那么这笔DML操作即达到了ACID的D的要求。
其他的可以参看release notes.
【参考】
http://www.mongodb.org/display/DOCS/2.0+Release+Notes