安装配置MongoDB


参考资料:
http://blog.izhoufeng.com/posts/205.html

1. Mongodb介绍
1.1 MongoDB (名称来自”humongous”) 是一个可扩展的,高性能,开源,模式自由,面向文档的数据库,使用C++编写;以下是MongoDB特点:
1.1.1 面向集合的存储:适合存储对象及JSON形式的数据。
1.1.2 动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
1.1.3 完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
1.1.4 查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。
1.1.5 复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。
1.1.6 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)。
1.1.7 自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。

1.2 MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。根据官方网站的描述,Mongo适合用于以下场景:
1.2.1 网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
1.2.2 缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
1.2.3 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
1.2.4 高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。
1.2.5 用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。

1.3 自然,MongoDB的使用也会有一些限制,例如它不适合:
1.3.1 高度事务性的系统:例如银行或会计系统。传统的关系型数据库更适用于需要大量原子性复杂事务的应用程序。
1.3.2 传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式,数据仓库可能是更合适的选择。
1.3.3 需要SQL的问题。

2. Mongodb安装部署
2.1 建立数据目录和日志目录
$ sudo mkdir -p /opt/mongodb/data
$ sudo mkdir -p /opt/mongodb/log
$ sudo mkdir -p /opt/mongodb/etc
$ sudo mkdir -p /opt/mongodb/run

2.2 下载压缩包
$ wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.2.0.tgz

2.3 解压缩文件后不用安装
$ tar xzvf mongodb-linux-x86_64-2.2.0.tgz
$ sudo mv mongodb-linux-x86_64-2.2.0/bin /opt/mongodb/

2.4 查看命令help
$ /opt/mongodb/bin/mongod --help
以下是部分参数的解释:

General options: 
  --dbpath arg              directory for datafiles    #指定数据存放目录
  --quiet                   quieter output   #静默模式
  --logpath arg             file to send all output to instead of stdout   #指定日志存放目录
  --logappend               appnd to logpath instead of over-writing  #指定日志是以追加还是以覆盖的方式写入日志文件
  --fork                    fork server process   #以创建子进程的方式运行
  --cpu                     periodically show cpu and iowait utilization  #周期性的显示cpu和io的使用情况
  --noauth                  run without security  #无认证模式运行
  --auth                    run with security  #认证模式运行
  --objcheck                inspect client data for validity on receipt  #检查客户端输入数据的有效性检查
  --quota                   enable db quota management   #开始数据库配额的管理
  --quotaFiles arg          number of files allower per db, requires --quota  #规定每个数据库允许的文件数
  --nocursors               diagnostic/debugging option  #调试诊断选项
  --nohints                 ignore query hints  #忽略查询命中率
  --nohttpinterface         disable http interface  #关闭http接口,默认是28017
  --noscripting             disable scripting engine  #关闭脚本引擎
  --noprealloc              disable data file preallocation  #关闭数据库文件大小预分配
  --smallfiles              use a smaller default file size  #使用较小的默认文件大小
  --nssize arg (=16)        .ns file size (in MB) for new databases #新数据库ns文件的默认大小
  --diaglog arg             0=off 1=W 2=R 3=both 7=W+some reads #提供的方式,是只读,只写,还是读写都行,还是主要写+部分的读模式
  --sysinfo                 print some diagnostic system information #打印系统诊断信息
  --upgrade                 upgrade db if needed  #如果需要就更新数据库
  --repair                  run repair on all dbs  #修复所有的数据库
  --notablescan             do not allow table scans  #不运行表扫描
  --syncdelay arg (=60)     seconds between disk syncs (0 for never)  #系统同步刷新磁盘的时间,默认是60s
 
Replication options:
  --master              master mode #主复制模式
  --slave               slave mode  #从复制模式
  --source arg          when slave: specify master as <server:port> #当为从时,指定主的地址和端口
  --only arg            when slave: specify a single database to replicate #当为从时,指定需要从主复制的单一库
  --arbiter arg         address of arbiter server  #仲裁服务器,在主主中和pair中用到
  --autoresync          automatically resync if slave data is stale #自动同步从的数据
  --oplogSize arg       size limit (in MB) for op log #指定操作日志的大小
  --opIdMem arg         size limit (in bytes) for in memory storage of op ids #指定存储操作日志的内存大小
 
Sharding options:
  --configsvr           declare this is a config db of a cluster #指定shard中的配置服务器
  --shardsvr            declare this is a shard db of a cluster #指定shard服务器

2.5 创建MongoDB配置文件:
$ sudo vim /opt/mongodb/etc/mongod.conf

# mongod.conf

# Where to store the data.

# Note: if you run mongodb as a non-root user (recommended) you may
# need to create and set permissions for this directory manually,
# e.g., if the parent directory isn't mutable by the mongodb user.
dbpath=/opt/mongodb/data

# Where to log
logpath=/opt/mongodb/log/mongodb.log

logappend=true

# The pid file
pidfilepath=/opt/mongodb/run/mongod.pid

# The port number
port = 27017

# Fork server process
fork=true

# Disables write-ahead journaling
#nojournal = true

# Enables periodic logging of CPU utilization and I/O wait
#cpu = true

# Turn on/off security.  Off is currently the default
#noauth = true
#auth = true

# Verbose logging output.
#verbose = true

# Inspect all client data for validity on receipt (useful for
# developing drivers)
#objcheck = true

# Enable db quota management
#quota = true

# Set oplogging level where n is
#   0=off (default)
#   1=W
#   2=R
#   3=both
#   7=W+some reads
#diaglog = 0

# Ignore query hints
#nohints = true

# Disable the HTTP interface (Defaults to localhost:27018).
#nohttpinterface = true

# Turns off server-side scripting.  This will result in greatly limited
# functionality
#noscripting = true

# Turns off table scans. Any query that would do a table scan fails.
#notablescan = true

# Disable data file preallocation.
#noprealloc = true

# Specify .ns file size for new databases.
# nssize = <size>

# Accout token for Mongo monitoring server.
#mms-token = <token>

# Server name for Mongo monitoring server.
#mms-name = <server-name>

# Ping interval for Mongo monitoring server.
#mms-interval = <seconds>

# Replication Options

# In master/slave replicated mongo databases, specify here whether
# This is a slave or master
#slave = true
#source = master.example.com
# Slave only: specify a single database to replicate
#only = master.example.com
# or
#master = true
#source = slave.example.com

# In replica set configuration, specify the name of the replica set
#replSet = setname

2.6 创建服务脚本,方便维护:
$ sudo vim /etc/init.d/mongod

#!/bin/sh

HOME="/opt/mongodb"
PATH="$HOME/bin:$PATH"
EXEC="$HOME/bin/mongod"
CLIEXEC="$HOME/bin/mongo"
CONF="$HOME/etc/mongod.conf"
PIDFILE="/opt/mongodb/run/mongod.pid"

case "$1" in
    start)
        if [ -f $$PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed."
        else
                echo "Starting MongoDB server..."
                $EXEC --config $CONF
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running."
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC admin --eval "db.shutdownServer()"
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for MongoDB to shutdown ..."
                    sleep 1
                done
                echo "MongoDB stopped."
        fi
        ;;
    *)
        echo "Usage: $0 {start|stop}" >&2
        exit 1
        ;;
esac

$ sudo chmod +x /etc/init.d/mongod

2.7 启动服务
$ sudo /etc/init.d/mongod start

查看log可以看到配置文件中定义的启动参数都已经生效。
$ tailf /opt/mongodb/log/mongodb.log

Fri Sep 28 16:40:32 [initandlisten] MongoDB starting : pid=2372 port=27017 dbpath=/opt/mongodb/data 64-bit host=mongodb
Fri Sep 28 16:40:32 [initandlisten] db version v2.2.0, pdfile version 4.5
Fri Sep 28 16:40:32 [initandlisten] git version: f5e83eae9cfbec7fb7a071321928f00d1b0c5207
Fri Sep 28 16:40:32 [initandlisten] build info: Linux ip-10-2-29-40 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_49
Fri Sep 28 16:40:32 [initandlisten] options: { config: "/opt/mongodb/etc/mongod.conf", dbpath: "/opt/mongodb/data", fork: "true", logappend: "true", logpath: "/opt/mongodb/log/mongodb.log", pidfilepath: 

"/opt/mongodb/run/mongod.pid", port: 27017 }
Fri Sep 28 16:40:32 [initandlisten] journal dir=/opt/mongodb/data/journal
Fri Sep 28 16:40:32 [initandlisten] recover : no journal files present, no recovery needed
Fri Sep 28 16:40:33 [initandlisten] waiting for connections on port 27017
Fri Sep 28 16:40:33 [websvr] admin web console waiting for connections on port 28017

2.8 使用自带客户端连接
$ /opt/mongodb/bin/mongo

2.9 关闭Mongod
$ sudo /etc/init.d/mongod stop

3 体验MongoDB
3.0.1 新建集合集
> db.createCollection("user");
{ "ok" : 1 }
> show collections
system.indexes
user

3.0.2 插入数据:
> db.user.insert({uid:1,username:"Falcon.C",age:25});
> db.user.insert({uid:2,username:"aabc",age:24});

3.0.3 查询数据:
> db.user.find();
{ "_id" : ObjectId("4bfcaa62315398de2d288bbd"), "uid" : 1, "username" : "Falcon.C", "age" : 25 }
{ "_id" : ObjectId("4bfcaa6c315398de2d288bbe"), "uid" : 2, "username" : "aabc", "age" : 24 }

3.0.4 查询数据的方式很丰富,有类似于SQL的条件查询
如:我想查询UID为1的用户的数据:
> db.user.find({uid:1});
{ "_id" : ObjectId("4bfcaa62315398de2d288bbd"), "uid" : 1, "username" : "Falcon.C", "age" : 25 }
他还支持丰富的查询还有limit ,sort ,findOne,distinct等

3.0.5 更新数据
> db.user.find();
{ "_id" : ObjectId("4bfcaa62315398de2d288bbd"), "uid" : 1, "username" : "Falcon.C", "age" : 26 }
{ "_id" : ObjectId("4bfcaa6c315398de2d288bbe"), "uid" : 2, "username" : "aabc", "age" : 24 }
出了以上的2种用法,更新的条件还有$unset、$push 、$pushAll 、$pop 、$pull 、$pullAll
想要快速的学习的话,这里有个SQL与MongoDB语法的一对一介绍:
http://www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart

以上就是MongoDB简单的使用介绍,在以后的文档中将会详细的介绍MongoDB非常酷的CURD方法,MongoDB的Replication及分布式。

最后,我们还可以通过浏览器查看MongoDB的状态:
打开端口为28017的网页

  1. #1 by mcsrainbow on 2012/11/14 - 15:54

    Ubuntu下可通过以下方式方便的安装最新的稳定版本
    Mongodb:
    http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/

    Steps:
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
    sudo -i
    echo deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen > /etc/apt/sources.list.d/10gen.list
    apt-get update
    apt-get install mongodb-10gen
    service mongodb start

  2. #2 by mcsrainbow on 2012/12/06 - 15:15

    快捷操作命令:
    rs.initate() 初始化配置一个复制集,初始化节点默认为Primary
    rs.add() 添加节点
    rs.addArb() 添加仲裁节点
    rs.stepDown() 使Primary 主动降级为Slave
    rs.freeze() 冻结节点,使其一定时间内不能被选为Primary,用于切换时人工干预
    rs.remove() 删除节点

(will not be published)
*