MongoDB数据库
一、MongoDB认识
MongoDB是一款C语言开源开发的,跨平台,面向文档的NoSQL数据库
什么是NoSQL?
存储数据不以关系模型为依据,不需要固定的表格式。非关系型数据库作为关系型数据库的一个补充,在日益快速发展的网站时代,发挥着高效与高性能,NoSQL用于超大规模数据的存储
常用的非关系型数据库:MongoDB、Memcache Redis、HBase
非关系型数据库的优点:1.数据库高并发读写的需求
2.对海量数据高效率存储与访问
3.数据库的高扩展性与高可用性的需求
MangoDB的定义
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的
为 Web 应用提供可扩展的高性能数据存储解决方案,主要适用于网站数据、数据缓存、分布式场景和JSON文档格式存储,适合大数据量,高并发、弱事务的互联网应用上
MongoDB的优缺点
优点:高可扩展性、分布式计算、低成本、架构的灵活性,半结构化数据、没有复杂的关系
MongoDB提供了复制、高可用性和自动分片功能,支持丰富的查询表达式,支持各种编程语言,比如RUBY,PYTHON,JAVA,C++,PHP,C#等
缺点:没有标准化、有限的查询功能
MongoDB运行的两大概念:集合(collection)和文档(document)
在MongoDB中表的概念换成了集合,数据的概念换成了文档
二、MongoDBLinux下的安装
1.下载安装依赖包和MongoDB安装包
yum -y install openssl-devel
tar zxf mongodb-linux-x86_64-rhel62-3.2.10.tgz
mv mongodb-linux-x86_64-rhel62-3.2.10 /usr/local/mongodb
2.创建MongoDB的数据存储目录/data/mongodb1,日志目录/data/logs,日志文件,并加权限
注意:大多类似UNIX的操作系统,包括Linux和OS X,都提供了限制每个进程和每个基本用户使用线程,文件和网络连接等系统资源的一些方法
mkdir -p /data/mongodb1
mkdir -p /data/logs/mongodb
touch /data/logs/mongodb/mongodb1.log
chmod -R 777 /data/logs/mongodb/mongodb1.log
当MongDB处于频繁访问状态,如果shell启动进程所占用的资源设置过低,将会产生错误导致无法连接MongoDB,需要设置
Linux系统默认一个进程最大文件打开数目为1024,有时,这些限制的默认值太小,这会导致正常MongoDB操作过程中出现一系列问题
ulimit -u 25000(单个进程文件打开数)
ulimit -n 25000(可打开的进程/线程)
3.创建MangoDB配置文件和设置启动参数
vim /usr/local/mongodb/bin/mongodb1.conf
port=27017 \\默认服务端口号
dbpath=/data/mongodb1 \\数据存储目录
logpath=/data/logs/mongodb/mongodb1.log \\日志文件
logappend=true \\使用追加的方式写日志
fork=true \\后台运行
maxConns=5000 \\最大同时连接数,默认是2000
storageEngine=mmapv1 \\指定存储引擎为内存映射文件
4.设置内核参数
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
5.启动和停止MongoDB
启动:/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb1.conf
停止:/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/bin/mongodb1.conf --shutdown
MongoDB的多实例
创建MongoDB新的数据存储目录/data/mongodb2,日志文件并添加权限
mkdir /data/mongodb2
touch /data/logs/mongodb/mongodb2.log
chmod -R 777 /data/logs/mongodb/mongodb2.log
在存放主配置文件的目录创建新主配置文件,内容对比第一个实例的配置文件修改下面参数即可(需要创建几个实例就复制编辑几个,名字不同)
vim /usr/local/mongodb/bin/mongodb2.conf
port=27018
dbpath=/data/mongodb2
logpath=/data/logs/mongodb/mongodb2.log
启动实例(启动方式跟第一个实例一样)
三、MongoDB基础
MongoDB的存储结构
逻辑结构主要由集合(collection)、文档(Document)、数据库(database)三个部分组成,其中文档是核心概念,它是MongoDB逻辑存储最小的存储单元
★集合:
合法的集合名:1.集合名不能是空字符串""。
2.集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
3.集合名不能以"system."开头,这是为系统集合保留的前缀。
4.用户创建的集合名字不能含有保留字符,有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的 集合中包含该字符,除非你要访问这种系统创建的集合,否则千万不要在名字里出现$
★文档:
文档是一组键值(key-value)对(即BSON),MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点
需要注意的是:1.文档中的键/值对是有序的
2.文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)
3.MongoDB区分类型和大小写
4.MongoDB的文档不能有重复的键
5.文档的键是字符串,除了少数例外情况,键可以使用任意UTF-8字符
物理存储结构:
数据存储结构:命名空间文件(.ns结尾文件) 数据文件(.0,1,2,3...)
日志存储结构:journal日志文件:用于MongDB崩溃恢复的保障
oplog复制操作日志文件:只有在主从复制开启之后才会出现
慢查询日志:需要开启后才可以
★数据库:
初始内建数据库:admin:admin库主要存放有数据库帐号相关信息。
local:local数据库永远不会被复制到从节点,可以用来存储限于本地单台服务器的任意集合
config:config数据库用于分片集群环境,存放了分片相关的元数据信息。
test:MongoDB默认创建的一个测试库
MongoDB数据类型
String:字符串,存储数据常用的数据类型,在 MongoDB 中,UTF-8 编码的字符串才是合法的
Integer:整型数值,用于存储数值,根据你所采用的服务器,可分为 32 位或 64 位
Boolean:布尔值,用于存储布尔值(真/假)
Double:双精度浮点值,用于存储浮点值
Min/Max keys:将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比
Array:用于将数组或列表或多个值存储为一个键
Timestamp:时间戳,记录文档修改或添加的具体时间
Object:用于内嵌文档
Null:用于创建空值
Symbol:符号,该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言
Date:日期时间,用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息
Object ID:对象 ID,用于创建文档的 ID
Binary Date:二进制数据,用于存储二进制数据
Code:代码类型,用于在文档中存储 JavaScript 代码
Regular expression:正则表达式类型。用于存储正则表达式
MongoDB的基础操作
本地登录:/usr/local/mongodb/bin/mongo(默认登录27017端口,数据库test,默认无密码登录)
远程登录:mongodb://zhangsan:123456@192.168.100.100:27017
查看数据库:>show dbs
显示用户:>show users
切换数据库:>use 数据库名(如果数据库不存在,则创建数据库,否则切换到指定数据库)
显示数据库操作命令:>db.help()
查看集合:>show collections
显示集合操作命令:>db.集合名.help()
查找文档:>db.集合名.find()
创建集合:>db.createCollection(name,options)
options参数:
capped(布尔):(可选)如果为 true,则创建固定集合,固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档,当该值为 true 时,必须指定 size 参数
autoIndexId(布尔):(可选)如为 true,自动在 _id 字段创建索引,默认为 false
size(数值):(可选)为固定集合指定一个最大值(以字节计),如果 capped 为 true,也需要指定该字段
max(数值):(可选)指定固定集合中包含文档的最大数量
创建固定集合 test,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个
>db.createCollection("test", { capped : true, autoIndexId : true, size : 6142800, max : 10000})
集合被设置成了固定集合 ,固定集合的数据不能被修改,只能查找-删除-再插入,也就是创建集合的时候设置了capped参数为true
插入文档自动创建集合:
>db.test.insert({"name":"zhangsan"}
创建文档:
自动产生_id:>db.集合名.insert({"key":"value"})
可以手动指定_id:>db.集合名.save(document)
四、MongoDB日常维护
MongoDB备份与恢复管理
数据导出工具:mongoexport
MongoDB中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件
mongoexport -d dbname -c collectionname -o file --type json/csv -f field
数据导入工具:mongoimport
mongoimport -d dbname -c collectionname --file filename --type json/csv -f field
-d:指定数据库名
-c:指定collection集合名
-f:指定导出哪些列
-o:指定要导出的文件名
-q:指定导出数据的过滤条件
注意:在MySQL导入的时候,之前MySQL导出的时候加个database的选项,导入的时候就可以不用创建
MongoDB数据库备份与恢复:mongodump
备份:mongodump -h dbhost -d dbname -o dir
恢复:mongorestore -h dbhost -d dbname -dir dir
-h:MongoDB所在的服务器IP地址(可以在后面加指定端口号)
-d:指定需要备份的数据库实例
-o:指定备份的数据库存放的位置(该目录要提前创建好,备份数据会存放在该目录下自动创建的test目录下)
在MongoDB数据库中复制数据库
>db.copyDatabase("db1","db2","localhost")
克隆集合(从远程MongoDB实例中复制集合到当前MongoDB实例,集合名称是一致的)
>db.runCommand({"cloneCollection":"abc.test","from":"192.168.100.7:27017"})
MongoDB安全管理
限制监听的IP地址和端口(在配置文件中设置)
vim /usr/local/mongodb/conf/mongodb.conf
bind_ip=192.168.0.111 \\只允许这个IP地址进行访问
port = 27017 \\只允许这个端口号进行访问
授权启动登录userAdminAnyDatabase(MongoDB第一次默认不需要密码,也没有任何用户)
1.登录进入数据库,切换到admin库
> use admin
2.创建管理用户
> db.createUser({user:"admin",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
roles:指定用户的角色,可以用一个空数组给新用户设定空角色,在roles字段,可以指定内置角色和用户定义的角色
Built-In Roles(内置角色):
数据库用户角色:read、readWrite;
数据库管理角色:dbAdmin、dbOwner、userAdmin
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
备份恢复角色:backup、restore
所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色:root
补充:这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
内部角色:__system
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
3.启动用户验证功能
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/mongodb.conf --auth
或者编辑配置文件:vim /usr/local/mongodb/conf/mongodb.conf
添加auth = true
查看已有用户:> show users或> db.system.users.find()
4.登录MongoDB,使用admin用户对admin库进行验证登录
> use admin
> db.auth("admin","123456")
使用管理用户的用户admin 来创建其他数据库的用户名和密码
> use test
> db.createUser({user:"testuser",pwd:"123456",roles:[{role:"readWrite",db:"test"}]})
更新用户:> db.updateUser('testuser',{pwd:"111111",roles:[{role:"readWrite",db:"test"}]})
删除用户:> db.dropUser("testuser")
注意:使用有管理用户的权限的用户admin登陆之后才能删除用户
进程管理
查询正在执行的操作进程:> db.currentOp()
终止进程:> db.killOp("shard3:466404288")
MongoDB监控
1.数据库命令查看
查看数据库实例状态信息:> db.serverStatus()
查看当前数据库的统计信息:> db.stats()
查看集合统计信息:> db.users.stats()
查看集合大小:> db.users.dataSize()
2.通过网页来进行监控(编辑配置文件):vim /usr/local/mongodb/conf/mongodb.conf
添加httpinterface=true
通过http://localhost:28017进行网页访问
3.三方监控工具:Nagios
补充:Windows下安装MongoDB
mongo.exe启动
MongoDB可视化软件安装