MongoDB基础

一、MongoDB概述
1、非关系型数据库
(1)存储数据不以关系型模型为依据,不需要固定的格式表。非关系型数据库作为关系型数据库的一个补充,在日益发展的网站时代,发挥着高效与高性能。
(2)优点
    ①数据库高并发读写
    ②对海量数据高效率存储与访问
    ③数据库高扩展性与高可用性
(3)常用非关系型数据库
    ①MongoDB
    ②Memcache
    ③Redis
    ④HBase

2、MongoDB简介
(1)一款跨平台、面向文档的数据库。可实现高性能、高可用性,并且能够轻松扩展
(2)是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系型数据库的
(3)不采用关系模型,主要是为了获得更好的扩展性,它不再有行的概念,运行方式主要基于两个概念:集合(colletion)和文档(document)

3、MongoDB的特点
(1)面向集合存储、模式自由、丰富的查询语句和多索引、复制集机制、易于水平扩展、可插入存储引擎、跨平台多语言支持
(2)安装简单,提供了面向文档存储功能,操作起来比较容易
(3)提供了复制、高可用性和自动分片功能。分片:如果负载增加,可以吗分布在计算机网络中的其他节点上
(4)支持丰富的查询表达式,查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组
(5)支持各种语言:Ruby、Python、Java、C++、PHP、C#等多种语言

4、适用领域
(1)可以为web应用提供可扩展的高性能数据存储解决方案。主要适用领域有网站数据、分布式场景、数据缓存和JSON文档格式存储。
(2)适合大数据量、高并发、弱事务的互联网应用,内置的水平扩展机制提供了从几百万到十亿级别的数据处理能力,可以很好满足web2.0和异动互联网应用数据存储的要求

二、MongoDB的安装
1、安装及运行控制
(1)安装
    ①安装支持软件:yum install -y openssl-devel
    ②安装MongoDB
    ③创建相关目录
        1)存储目录
            a.mkdir -p /data/mongodb1
        2)日志目录
            a.mkdir -p /data/logs/mongodb
            b.touch /data/logs/mongodb/mongodb1.log
            c.chmod -R 777 /data/logs/mongodb/mongodb1.log
        3)进程占用资源设置
            a.ulimit -n 25000
(2)运行控制
    ①创建配置文件和启动参数
        1)vim /usr/local/mongodb/mongodb1.conf
            port = 27017
            dbpath = /data/mongodb1
            logpath = /data/logs/mongodb/mongodb1.log
            fork = true
            maxConns = 5000
            storageEngine = mmapv1
        2)
            ②设置内核参数
echo 0 > /proc/sys/vm/zone_reclaim_mode
sysctl -w vm.zone_reclaim_mode=0
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

2、启动和停止MongoDB
(1)启动
    ①usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/mongodb1.conf
    ②usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb1.conf
(2)停止
    ①usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb1.conf --shutdown
    ②非正常关闭需手动删除mongod.lock文件:rm -rf /data/mongodb1/mongodb1.lock
(3)设置开机启动
(4)连接并访问MongoDB
    ①/usr/local/mongodb/bin/mongo

三、MongoDB的存储结构

1、逻辑存储结构

(1)常用术语及说明

mongodb存储过程开发 mongodb内存数据库_mongodb


(2)数据库

    ①默认数据库:text

    ②保留数据库

        1)admin:root数据库。如果将一个用户添加到这个数据库,则它将自动集成所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行

        2)local:这个数据永远不被复制,可以用来存储限于本地单台服务器的任意集合

        3)config:当用于分片设置时,config数据库在内部使用,用于保存分片的相关信息

(3)集合

    ①MongoDB的文档组,类似于关系数据库中的表格

    ②集合没有固定的结构,可以插入不同格式和类型的数据,但通常情况下插入的数据都会有一定关联性

    ③合法的集合名字不能使空字符串,不能含有\0(空字符),这个祖父表示集合名的结尾,不能以system.开头,这是为系统集合保留的前缀

(4)文档

    ①文档是一个键值,即BSON。

    ②文档不需要设置相同的字段,并且相同字段不需要相同的数据类型

    ③文档中的键值对是有序的

    ④文档中的值可以使双银行里面的字符串,也可以是其他几种数据类型

    ⑤区分类型和大小写

    ⑥文档不能有重复键

    ⑦文档的键是字符串,除了少数情况,键可以使用任意UTF-8字符

    ⑧键不能含有空字符,空字符用来标识结尾

    ⑨.和$有特别意义,只有在特定环境下才能使用

    ⑩以_开头的键是保留的


2、物理存储结构

(1)数据存储

    ①数据目录由dbpath指定

    ②每个数据库都包含一个.ns文件和一些数据文件,随着数据量不断增大,文件数量也会增多。

    ③数据文件每次生成一个新文件,大小都会比上一个文件大两倍

    ④文件使用MMAP进行内存映射,会将所有数据文件映射到内存中,但只是虚拟内存,只有访问到这块数据时才会交换到物理内存

(2)日志存储

    ①存放位置由logpath指定

    ②journal日志文件,用于MongoDB崩溃恢复的保障

    ③oplog复制操作日志文件在启动主从复制时出现

    ④man查询日志文件,需要在配置文件中指定profile=1与slowms=200,查看慢查询的命令为:>db.system.profile.find()


3、数据类型

mongodb存储过程开发 mongodb内存数据库_数据库_02

四、MongoDB基本操作

1、常用基本操作

mongodb存储过程开发 mongodb内存数据库_mongodb_03



2、连接数据库

(1)/usr/local/mongodb/bin/mongo

(2)mongodb://zhangsan:123456@192.168.100.100:27017

3、创建和删除数据库

(1)创建:use database_name

(2)删除(先进入相应库):db.dropDatabase()


4、集合和文档的操作

(1)直接创建集合:

    ①db.createCollection(“name”,{capped:true,autoIndexId:true,size:6142800,max:10000})

    ②capped:是否启用集合限制,如果开启需要制定一个限制条件,默认为不启用,这个参数没有实际意义

    ③autoindexid:是否使用_id作为索引,默认为使用(true或false)

    ④size:限制集合使用空间的大小,默认为没有限制

    ⑤max:集合中最大条数限制,默认为没有限制

(2)向集合中插入文档:db.collection_name.insert({“key”:”value”})

    ①不指定_id:db.collection_name.save(document)

(3)跟新文档:db.collection_name.update({“_id”:1},{“key”:”value”})

    ①只更新一条记录:db.collection_name.update({“_id”:1},{$set:(“key”:”value”)})

    ②也可用save命令进行跟新

(4)删除文档:db.collection_name.remove()

    ①deleteOne()

    ②deleteMany()

五、MongoDB日常维护
1、备份与恢复管理
(1)导入导出
    ①导出:mongoexport -d dbname -c collectionname -o filename.json
    ②导入:mongoimport -d bdname -c collectioname file
    ③d:数据库名字
    ④c:collection名字
    ⑤f:导出哪些列
    ⑥o:要导出的文件
    ⑦q:导出数据的过滤条件
(2)备份与恢复
    ①备份:mongodump -h dbhost -d dbname -o dbdirectory
    ②h:数据库服务器地址
    ③d:需要备份的实例
    ④o:备份的数据存放位置,备份后会自动在此目录建立相应文件夹及备份文件
    ⑤恢复:mongorestore -h dbhost -d dbname --dir dbdirectory
(3)复制数据库
    ①db.copyDatabase(“db1”,”db2”,”127.0.0.1:27017”)
(4)克隆集合
    ①db.runCommand({“cloneCollection”:”test.user”,”from”:”127.0.0.1:27018”})
(5)不同数据库之间数据迁移(扩展知识)

2、安全管理
(1)限定监听特定IP和端口(配置文件)
    ①bind_ip=192.168.11.30
    ②port=27017
(2)授权启动
    ①配置文件添加auth=true
    ②添加用户
        1)use admin
        2)db.createUser({“user”:”root”,”pwd”:”111111”,”roles”:[“root”]})
            a.“rules”:[{role:”userAdminAnyDatabase”,db:”admin”}]
    ③使用用户
        1)use admin
        2)db.auth(“root”,”111111”)
    ④查看用户
        1)db.system.users.find()
        2)show users
    ⑤删除用户
        1)db.system.users.remove({user:”root”})
    ⑥数据库内置角色
        1)数据库用户角色:
            a.read:指定数据库读取权限
            b.readWrite:指定数据库读写权限
        2)数据库管理角色:
            a.dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
            b.dbOwner:允许在当前DB中执行任意操作
            c.userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
        3)集群管理角色:
            a.clusterAdmin:赋予管理集群的最高权限,只在admin数据库中可用
            b.clusterManager:赋予管理和监控集群的权限
            c.clusterMonitor:赋予监控集群的权限,对监控工具具有readonly的权限
            d.hostManager:赋予管理Server
        4)备份恢复角色:
            a.backup:备份权限
            b.restore:恢复备份权限
        5)所有数据库角色:
            a.readAnyDatabase:赋予用户所有数据库的读权限,只在admin数据库中可用
            b.readWriteAnyDatabase:赋予用户所有数据库的读写权限,只在admin数据库中可用
            c.userAdminAnyDatabase:赋予用户所有数据库管理User的权限,只在admin数据库中可用
            d.dbAdminAnyDatabase:赋予管理所有数据库的权限,只在admin数据库中可用
        6)超级用户角色:
            a.root:超级账号,超级权限,只在admin数据库中可用
            b.这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
        7)内部角色:
            a.__system
(3)进程管理
    ①查看进程:db.currentOp()

3、MongoDB监控
(1)查看数据库统计信息
    ①查看数据库实例状态信息:db.serverStatus()
    ②查看当前数据库统计信息:db.stats()
    ③通过web界面查看:在配置文件中添加httpinterface=true
(2)查看集合统计信息
    ①查看集合统计信息:db.users.stats()
    ②查看集合大小:db.user.dataSize()
(3)第三方监控工具
    ①可以再Nagios中配置使用MongoDB插件来监控MongoDB数据库