年前曾经写过关于mongodb的安装,但是后来有朋友弹窗说安装后遇到服务无法启动,在此将windows下以及Linux下的安装重新整理,顺便把会遇到的一些问题的解决方法写出来,其实mongodb的安装还是比较简单的.
随着互联网WEB2.0网站的兴起,传统关系型数据库力不从心
数据库高并发读写的需求
数据库并发负载非常高,往往每秒数万次读写请求,磁盘IO瓶颈
海量数据的高效率访问的需求
对数亿甚至数十亿的记录高效查询
高可扩展性和高可用性的需求
7*24小时高可用,Failover,易扩展
传统SQL数据库时代对大数据的处理
单表单库时代:用户不停的增长、数据量增大导致压力过大
Replication及主从分离
分表分库时代:按业务key分片到不同的库,通常按取模算法
增加维护成本,不停的重复劳动
没有完美的Sharding Framework(Hivedb,限制Order/Join)
需要的存储:高性能、分布式、易扩展
Nosql = Not Only SQL 根据海量数据特点补充关系型数据库的不足
NoSQL使用案例
MongoDB特点
面向集合(collection-orented)
意思是数据被分组存储在数据集中被称为一个集合,每个集合在数据库中都有一个唯一的标识名,并且可以包含无线数目的文档,集合的概念类似关系型数据库里的表,不同的是它不需要定义任何模式.
模式自由(schema-free)
集合里面没有列和行的概念,下面2个记录可以存放在同一个集合里
{“name”,”dennisit”}
{“age”,30}
文档型(documents type)
存储的数据是键值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档,我们把这个数据格式称作”BSON”,即”Binary Serialized DocumentNotation ”.每一个文档相当于关系数据库中的一条记录.
MongoDB特征
MongoDB的特点是高性能、易部署、易使用,存储数据非常方便,主要特征有:
面向集合存储: 易于存储对象类型的数据
模式自由: 没有行列概念,不同类型数据记录可以放在同一个集合里
支持动态查询: 查询指令使用json形势的标记.可轻易查询文档中内嵌的对象及数组.
完整的索引支持:包含内部对象和数组,mongoDB的查询优化器会分析查询表达式,并生成一个高效的查询计划.
支持复制和故障恢复:MongoDB数据库支持服务器之间的数据复制,支持主从模式及服务器之间的相互复制,复制的目的是提供冗余及自动故障转移.
使用高效的二进制数据存储,包括大型对象(如视频,大图片等)
自动处理碎片,以支持云计算层次的伸缩性,自动分片功能支持水平的数据库集群,可动态添加额外的机器.
支持Python、PHP、Ruby、Java、C、C#、Javascript、Perl及C++语言的驱动程序,
支持存储格式为BSON(一种JSON的扩展)
MongoDB使用场景
适合作为信息基础设施的持久化缓存层
高效的实时性:MongoDB具备网站实时数据存储所需的复制及高度伸缩性
MongoDB的Bson数据格式非常适合文档化格式的存数及查询(每个BSON对象大小不能超过4M,如果超过4M时需要使用GridFS来储存数据)
高伸缩性的场景:适合由数十或数百台服务器组成的数据库.因为mongoDB已经包含了对MapReduce引擎的内置支持
大尺寸、低价值的数据存储
MongoDB不使用场景
要求高度事务性的系统
传统的商业智能应用
复杂多表查询
MongDB的数据管理
MongoDB使用了内存映射文件进行数据管理,把所有空间内存当缓存使用,且不能指定内存大小,这样可以最大限度提升性能,但是容易受其他程序干扰.
MongoDB数据空间采用预分配,目的是为了避免形成过多的磁盘碎片,它为每个数据库分配一系列文件,每个数据文件都会被预分配一个大小,第一二个文件名字为”.0”,大小为64M,第二个为”.1”为128M,依次类推,在32位模式运行时支持最大文件为2GB,随着数据量的增加,可以在其数据目录里看到这些不断递增的文件.
为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记”已删除”即可,以后还可以重复利用,所以删除记录不释放空间.
MongoDB的主键策略
MongoDB没有自动递增或序列特性,当BSON对象插入到数据库中时,,如果没有提供”_id”字段,数据库会自动生成一耳光ObjectId对象作为”_id”的值插入到集合中作为该文档的主键(避免了其它数据库意外地选择相同的惟一表示符的情况),”_id”的值由4字节的时间戳,3字节的机器号,2字节的进行id以及3字节的自增计数组成.当然字段”_id”的值可以手动生成.只要能保证唯一性.对于自增Id,查询时db.collection.find({_id:”xx”})查不到结果,正确写法是db.collection.find({_id:new ObjectId(“xx”)})
MongoDB官网: http://www.mongodb.org/
MongoDB下载地址: http://www.mongodb.org/downloads
Linux下安装MongoDB
第一步: 下载MongoDB
[root@localhost mrms] # wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-1.4.4.tgz
第二步:安装MongoDB
[root@localhost mrms]# tar -zxvf mongodb-linux-x86_64-1.4.4.tgz
将解压的文件重命名为mongodb,cd到mongodb目录下创建数据库文件夹与日志文件夹
[root@localhost mrms]# cd mongodb
[root@localhost mongodb]# ls
bin GNU-AGPL-3.0 include lib64 README THIRD-PARTY-NOTICES
[root@localhost mongodb]# mkdir data
[root@localhost mongodb]# mkdir logs
切换到bin目录下启动MonggoDB服务,这里选择第一个无--auth参数(不需要密码启动)
[root@localhost bin]# ./mongod --dbpath=../data --logpath=../logs --logappend --port=27017 --fork [不需要密码登录]
[root@localhost bin]# ./mongod --dbpath=../data --logpath=../logs --logappend --auth --port=27017 --fork [--auth参数,需要用户名/口令登录]
启动命令常用参数选项说明:
--dbpath 指定数据库的目录
--port 指定数据库的端口.默认是27017
--bind_ip 绑定IP
--directoryperdb 为每个db创建一个独立子目录
--logpath 指定日志存放目录
--logappend 指定日志生成方式(追加/覆盖)
--pidfilepath 指定进程文件路径,如果不指定,将不产生进程文件
--keyFile 集群模式的关键标识
--journal 启用日志
--nssize 指定.ns文件的大小,单位MB,默认是16M,最大是2GB
--maxConns最大的并发连接数
--notablescan 不允许进行表扫描
--noprealloc 关闭数据文件的预分配功能
--fork 以后台Daemon形势运行服务
更多的参数选项利用mongod --help进行查看
检查进程列表
pstree -p | grep mongod
或者
netstat -ntlp
如下图:
登录客户端
[root@localhost bin]# ./mongo
设置mongodb服务开机启动
将mongod服务添加到开机启动[追加到/etc/rc.local文件下]
[root@localhost mrms]#echo "/usr/local/mrms/mongodb/bin/mongod --dbpath=/usr/local/mrms/mongodb/data --logpath=/usr/local/mrms/mongodb/logs --auth --fork " >> /etc/rc.local
关闭mongoDB服务
pkill mongod
或者
killall mongod
注意:不能用kill -9杀掉
ps -ef | grep mongod
kill -9 2596
这样导致mongodb的进程将无法启动了.
解决办法: cd到mongodb的data目录下降mongod.lock这个锁文件删掉 rm -rf mongod.lock
Windows下安装MongoDB
下载mongoDB安装包,解压到D:\program files\mongo,解压下的文件结构如下图
在mongo目下创建data(存放数据)文件和logs(存放日志)文件
通常情况下启动数据库只需要关注其中的2个命令:mongod和mongo,前者是mongdb数据库进程本身,是核心数据库服务器,后者是命令行shell客户端,其使用方法类似于mysql命令行shell客户端,用户确保所有内容都已正常安装且能正常运行,并且可以对数据进行CRUD操作,执行管理任务等.
cmd启动dos界面,cd 到D:\program files\mongo\bin>目录,输入:mongod --dbpath=../data --logpath=../logs/mongodb.log
重新启动一个窗口,使用mongo启动客户端
如图,mongodb服务启动成功.
MongoDB的GUI管理工具
MongoVUE、RockMongo、MongoHub(针对Mac平台的MongoDB图形管理客户端)
MongoDB的体系结构
MongoDB中一系列物理文件(数据文件、日志文件等),的集合或与之对应的逻辑结构(集合、文档等)称为数据库,简单来说,数据库是由一系列与磁盘有关的物理文件组成的.
MongoDB由databases组成,databases由collections组成,collections由document(相当于行)组成,而document油fields(相当于列)组成.
MongoDB是异步写数据.
Mongodb与关系型数据库对比
1.逻辑结构关系对比
关系型数据库:
MySQL数据库(database)、表(table)、记录(rows) 三个层次概念
非关系型数据库:
MongoDB数据库(database)、集合(collection)、文档对象(document三个层次概念
MongoDB里的集合对应于关系型数据库里的表,但是集合中没有列、行和关系的概念,集合中只有文档,一个文档就相当于一条记录,这体现了模式自由的特点.
2.数据存储结构
MySQL的数据存储结构
MySQL的每个数据库存放在一个与数据库同名的文件夹中,MySQL如果使用MyISAM存储引擎,数据库文件类型就包括.frm、.MYD、.MYI。
MongoDB的数据存储结构
MongoDB默认的数据目录是/data/db,它负责存储所有的MongoDB的数据文件,在MongoDB内部,每个数据库都包含一个.ns文件和一些数据文件,而且这些
数据文件会随着数据量的增加而变得越来越多, 所以如果系统中有一个叫做mydb的数据库,那么构成mydb这个数据库的文件就会由mydb.ns、mydb.0、mydb.1等等组成.
查看mongodb中的数据库信息,有多少数据库
show dbs
查看当前数据库
db
查看当前数据库中有多少个集合
show tables或者show collections
往当前数据库中的c1集合中插入一条数据,系统会自动创建c1集合,并插入数据
db.c1.insert({name:"user1"});
查询c1集合中的对象
db.c1.find();
3.MongDB的日志
MongoDB中有几种日志,分别是系统日志、Journal日志、oplog主从日志、慢查询日志等.
系统日志
系统日志在mongdb数据库中很重要,它记录着MongoDB启动和停止操作,以及服务器在运行过程中发生的任何异常信息.配置系统日志比较简单,只需要在启动时mongod时指定一个logpath参数即可
Journal日志
Journal日志通过预写式的redo日志为MongoDB增加了额外的可靠性,开启该功能时,数据的更新会先写入Journal日志,定期提交,然后在真实数据上执行这些变更,如果服务器安全关闭,日志会被清除在服务器启动时,如果存在Journal日志,则会执行提交.启动Journal功能只需要在启动mongod时指定-journal参数即可,这样,系统的Journal信息都会被放到数据库目录(默认是/data/db)的journal文件夹中
oplog日志
MongoDB的高可复用策略中有一种叫做Replica Sets,Replica Sets复制过程中一个服务器充当主服务器,而一个或多个服务器充当从服务器,主服务器将更新写入一个本地的collection中,这个collection记录着发生在主服务器的更新操作,并将这些操作分发到从服务器上.
这个日志是一个capped Collection,且有大小之分,所以最好在启动mongod服务时配置好大小(单位:MB). mongd -oplogsize=1024
慢查询日志
慢查询日志记录了执行时间超过所设定时间阈值的操作语句,慢查询日志对于发现性能有问题的语句很有帮助,建议开启此功能经常分析该日志的内容.要配置这个功能值需要在mongod启动时指定profile参数即可.
Eg.将超过5s的操作记录都记录下来
mongod --profile=1 --slowms=5
运行一段时间后,可以通过查看db.system.profile这个collection来获取慢日志信息
4.MongoDB的数据类型
MongoDB的文档使用BSON(Binary JSON)来组织数据,BSON类似于JSON,JSON只是一种简单的表示数据的方式,只包含了6种数据类型(null、布尔、数字、字符串、数组及对象),不能完全满足负责业务的需要,因此,BSON还提供日期,32位数字、64位数字等类型.
MongoDB中的key-value值支持类型
1.null
null类型用于表示空值或不存在的字段
eg. {"one" : null}
2.布尔类型
布尔类型有2个值true和false
eg. {"one" : true}
3.32位整数
MongoDB的控制台使用js引擎进行输入,而JS仅支持64位浮点数,所以32位整数将会被自动转义.
4.64位整数
64位整数与32位整数一样,在MongoDB控制台使用时,会转义为64位浮点数
5.64位浮点数
MongoDB控制台数字的默认类型
eg. {"one":2.02} {"one":521}
6.字符串
UTF-8字符串都可以表示为字符串类型的数据
eg. {"one" : "hello world"}
7.符号
在MongoDB控制台中不支持这种类型,将自动转义成字符串.
8.ObjectOId类型
对象id是文档中唯一的12位的ID
0|1|2|3|4|5|6|7|8|9|10|11
时间戳|机器|PID|计数器一起形成ObjectId值
eg. ObjectId("4eae239f63520362e051e7fd");
9.日期
注意,使用的时候要加上new
eg. {"one" : new Date()}
10.正则表达式
文档键值可以包含正则表达式,其正则表达式采用JS语法来表示.
eg. {"one" : /ho/i}
11.代码
文档中可以包含JS代码
eg. {"one" : function(){/*……*/}}
12.数组
文档中键值可以表示为数组,在数组内还可以嵌套数组
eg. {"x" : [ "a", "b", ["A","B"] ]}
13.内嵌文档
文档可以包含别的文档,也可以作为值嵌入到父文档中
eg. {"x" : {"name" : "tom", "age":20} }
Mongodb常用命令
控制台中的基本操作命令
如果想查看当前连接在哪个数据库下面,可以直接输入db
查看用户列表db.system.users.find();
查看所有用户 show users;
查看所有数据库 show dbs;
查看所有集合 show collections;
删除当前的数据库 db.dropDatabase();
删除collection db.集合名.drop();
想支持mongoDB支持哪些命令, 可以直接输入help
想知道当前数据库支持哪些方法: db.help();
想知道当前集合支持哪些方法: db.集合名.help();
转载请注明出处:[http://www.cnblogs.com/dennisit/archive/2013/02/18/2915361.html]