参考资料:
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 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 by mcsrainbow on 2012/12/06 - 15:15
快捷操作命令:
rs.initate() 初始化配置一个复制集,初始化节点默认为Primary
rs.add() 添加节点
rs.addArb() 添加仲裁节点
rs.stepDown() 使Primary 主动降级为Slave
rs.freeze() 冻结节点,使其一定时间内不能被选为Primary,用于切换时人工干预
rs.remove() 删除节点