nosql篇mongodb初识与安装整理以及与关系型数据库对比
年前曾经写过关于mongodb的安装,但是后来有朋友弹窗说安装后遇到服务无法启动,在此将windows下以及Linux下的安装重新整理,顺便把会遇到的一些问题的解决方法写出来,其实mongodb的安装还是比较简单的. 随着互联网WEB2.0网站的兴起,传统关系型数据库力不从心 数据库高并发读写的需求 数据库并发负载非常高,往往每秒数万次读写请求,磁盘IO瓶颈 海量数据的高效率访问的需求 对数亿甚至数十亿的记录高效查询 高可扩展性和高可用性的需求 7*24小时高可用,Failover,易扩展
传统SQL数据库时代对大数据的处理 单表单库时代:用户不停的增长、数据量增大导致压力过大 Replication及主从分离 分表分库时代:按业务key分片到不同的库,通常按取模算法 增加维护成本,不停的重复劳动 没有完美的ShardingFramework(Hivedb,限制Order/Join) 需要的存储:高性能、分布式、易扩展 Nosql=NotOnlySQL根据海量数据特点补充关系型数据库的不足
NoSQL使用案例
MongoDB特点 面向集合(collection-orented) 意思是数据被分组存储在数据集中被称为一个集合,每个集合在数据库中都有一个唯一的标识名,并且可以包含无线数目的文档,集合的概念类似关系型数据库里的表,不同的是它不需要定义任何模式.
模式自由(schema-free) 集合里面没有列和行的概念,下面2个记录可以存放在同一个集合里 {“name”,”dennisit”} {“age”,30}
文档型(documentstype) 存储的数据是键值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档,我们把这个数据格式称作”BSON”,即”BinarySerializedDocumentNotation”.每一个文档相当于关系数据库中的一条记录.
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:newObjectId(“xx”)})
MongoDB官网:http://www.mongodb.org/ MongoDB下载地址:http://www.52php.cn/tag/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:programfilesmongo,解压下的文件结构如下图
在mongo目下创建data(存放数据)文件和logs(存放日志)文件 通常情况下启动数据库只需要关注其中的2个命令:mongod和mongo,前者是mongdb数据库进程本身,是核心数据库服务器,后者是命令行shell客户端,其使用方法类似于mysql命令行shell客户端,用户确保所有内容都已正常安装且能正常运行,并且可以对数据进行CRUD操作,执行管理任务等. cmd启动dos界面,cd到D:programfilesmongobin>目录,输入: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(BinaryJSON)来组织数据,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(); 查看所有用户showusers; 查看所有数据库showdbs; 查看所有集合showcollections; 删除当前的数据库db.dropDatabase(); 删除collectiondb.集合名.drop(); 想支持mongoDB支持哪些命令,可以直接输入help 想知道当前数据库支持哪些方法:db.help(); 想知道当前集合支持哪些方法:db.集合名.help();
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |