nosql篇mongodb初识与安装整理以及与关系型数据库对比
年前曾经写过关于 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]