zoukankan      html  css  js  c++  java
  • nosql篇mongodb初识与安装整理以及与关系型数据库对比

    年前曾经写过关于mongodb的安装,但是后来有朋友弹窗说安装后遇到服务无法启动,在此将windows下以及Linux下的安装重新整理,顺便把会遇到的一些问题的解决方法写出来,其实mongodb的安装还是比较简单的.

    随着互联网WEB2.0网站的兴起,传统关系型数据库力不从心

    数据库高并发读写的需求

    数据库并发负载非常高,往往每秒数万次读写请求,磁盘IO瓶颈

    海量数据的高效率访问的需求

    对数亿甚至数十亿的记录高效查询

    高可扩展性和高可用性的需求

    7*24小时高可用,Failover,易扩展

    传统SQL数据库时代对大数据的处理

    单表单库时代:用户不停的增长、数据量增大导致压力过大

    Replication及主从分离

    分表分库时代:按业务key分片到不同的库,通常按取模算法

    增加维护成本,不停的重复劳动

    没有完美的Sharding FrameworkHivedb,限制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数据库支持服务器之间的数据复制,支持主从模式及服务器之间的相互复制,复制的目的是提供冗余及自动故障转移.

    使用高效的二进制数据存储,包括大型对象(如视频,大图片等)

    自动处理碎片,以支持云计算层次的伸缩性,自动分片功能支持水平的数据库集群,可动态添加额外的机器.

    支持PythonPHPRubyJavaCC#JavascriptPerlC++语言的驱动程序,

    支持存储格式为BSON(一种JSON的扩展)

     

    MongoDB使用场景

    适合作为信息基础设施的持久化缓存层

    高效的实时性:MongoDB具备网站实时数据存储所需的复制及高度伸缩性

    MongoDBBson数据格式非常适合文档化格式的存数及查询(每个BSON对象大小不能超过4M,如果超过4M时需要使用GridFS来储存数据)

    高伸缩性的场景:适合由数十或数百台服务器组成的数据库.因为mongoDB已经包含了对MapReduce引擎的内置支持

    大尺寸、低价值的数据存储

     

    MongoDB不使用场景

    要求高度事务性的系统

    传统的商业智能应用

    复杂多表查询

     

    MongDB的数据管理

    MongoDB使用了内存映射文件进行数据管理,把所有空间内存当缓存使用,且不能指定内存大小,这样可以最大限度提升性能,但是容易受其他程序干扰.

    MongoDB数据空间采用预分配,目的是为了避免形成过多的磁盘碎片,它为每个数据库分配一系列文件,每个数据文件都会被预分配一个大小,第一二个文件名字为.0,大小为64M,第二个为.1128M,依次类推,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,cdmongodb目录下创建数据库文件夹与日志文件夹

    [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个命令:mongodmongo,前者是mongdb数据库进程本身,是核心数据库服务器,后者是命令行shell客户端,其使用方法类似于mysql命令行shell客户端,用户确保所有内容都已正常安装且能正常运行,并且可以对数据进行CRUD操作,执行管理任务等.

    cmd启动dos界面,cd D:\program files\mongo\bin>目录,输入:mongod --dbpath=../data --logpath=../logs/mongodb.log

    重新启动一个窗口,使用mongo启动客户端

    如图,mongodb服务启动成功.

    MongoDBGUI管理工具

    MongoVUERockMongoMongoHub(针对Mac平台的MongoDB图形管理客户端)

    MongoDB的体系结构

    MongoDB中一系列物理文件(数据文件、日志文件等),的集合或与之对应的逻辑结构(集合、文档等)称为数据库,简单来说,数据库是由一系列与磁盘有关的物理文件组成的.

    MongoDBdatabases组成,databasescollections组成,collectionsdocument(相当于行)组成,documentfields(相当于列)组成.

    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.nsmydb.0mydb.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]

    在线交谈

  • 相关阅读:
    WPF Caliburn 学习笔记(五)HelloCaliburn
    MSDN 教程短片 WPF 20(绑定3ObjectDataProvider)
    MSDN 教程短片 WPF 23(3D动画)
    比赛总结一
    HDU3686 Traffic Real Time Query System
    HDU3954 Level up
    EOJ382 Match Maker
    UESTC1565 Smart Typist
    HDU3578 Greedy Tino
    ZOJ1975 The Sierpinski Fractal
  • 原文地址:https://www.cnblogs.com/dennisit/p/2915361.html
Copyright © 2011-2022 走看看