MongoDB 安装学习笔记
1、 MongoDB 安装
windows 下安装
- 在官网下载安装文件文件 https://www.mongodb.com/download-center#community
- 将文件安装在D盘(D:\Program Files\MongoDB)或其他盘符下。
- 在D盘下创建文件夹 D:\DATA\MongoDB(任意)
- 配置环境变量;将D:\Program Files\MongoDB\Server\3.0\bin 加入到 path
- 进入cmd, 输入
mongod --dbpath D:\DATA\MongoDB
,出现以下界面,数据库安装成功
Linux下安装
1、 下载数据库文件
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz
2、 解压
tar -zxvf mongodb-linux-x86_64-3.0.6.tgz
3、 将文件夹移动至usr
mv mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb
4、MongoDB的数据存储在data目录的db目录下,但是这个目录在安装过程不会自动创建,所以你需要手动创建data目录,并在data目录中创建db目录。
注意:/data/db 是 MongoDB 默认的启动的数据库路径(–dbpath)。
mkdir -p /data/db
注意:如果你的数据库目录不是/data/db,可以通过 –dbpath 来指定。
MongoDB web界面
MongoDB 提供了简单的 HTTP 用户界面。 如果你想启用该功能,需要在启动的时候指定参数 –rest 。
注意:该功能只适用于 MongoDB 3.2 及之前的早期版本。
$ ./mongod --dbpath=/data/db --rest
MongoDB 的 Web 界面访问端口比服务的端口多1000。
如果你的MongoDB运行端口使用默认的27017,你可以在端口号为28017访问web用户界面,即地址为:http://localhost:28017。
2、 MongoDB 指令
进入MongoDB安装目录/bin
- 启动数据库 ./mongod --dbpath=/data/db
- 进入数据库 ./mongo
- show dbs
查看数据库
- use [dbname]
使用数据库,没有数据库时,创建该数据库(如果不进行数据操作则不创建)
- show collections
查看集合
- db.collection.find()
查询集合中的数据 – find({'name':'panlei'})
条件查询
– find().count()
集合总数
– find().skip(3).limit(2).sort({'id':1})
跳过3条,限制2条,根据id排序
- 更新操作 db.collection.update({'id':'1'},{'id':'2'})
更新操作
前面为条件, 默认情况下,后面为全部替换 update({'id':'1'},{$set:{'id':'22'}})
$set 为部分更新 update({'id':'1'},{$set:{'id':'22'}},ture)
有就更新,没有就插入
注意:更新操作默认更新第一条符合条件的记录
更新全部符合条件的数据时:update({'id':'1'},{$set:{'id':'22'}},false,true)
- 删除数据 remove()
方法 db.collection.drop()
删除集合
- 索引 db.collection.getIndexes()
查看集合中索引情况 db.collection.ensureIndex({'name':1})
创建索引 1:正向 2:逆向 db.collection.ensureIndex({'title':1},{'name':'title_index'})
创建索引,并命名 db.collection.dropIndex("title_index")
删除索引 db.collection.ensureIndex({'name':1,'y':1})
复合索引 db.collection.ensureIndex({'name':1},{expireAfterSeconds:10})
过期索引
- 过期索引表示数据在一段时间后过期,数据类型必须为ISODate 或ISODate数组, 该字段的时间过期,表示整条数据都会消失
- 过期时间索引不能是复合索引
- 如果过期时间索引是时间数组,则按照最小时间(最早达成条件)
- 删除时间不是精确的
db.collection.ensureIndex({'name':'text','y':'text'})
创建全文索引 db.collection.ensureIndex({'$**':'text'})
为集合中所有字段添加全文索引 db.collection.find({$text:{$search:'panlei'}})
使用全文索引查询 db.collection.find({$text:{$search:['aa bb cc']}})
或查询 db.collection.find({$text:{$search:['aa bb -cc']}})
不包含cc 的 db.news.find({$text:{$search:"\"wangyan\" \"wangying\""}})
与查询(不可用单引号) db.collections.find({$text:{$search:"wangyan"}},{"score":{$meta:"textScore"}}).sort({$meta:"textScore"})
根据相似度查询
db.collection.ensureIndex({},{'unique':true})
创建唯一索引 db.collection.ensureIndex({},{'sparse':true})
创建稀疏索引
默认是false, 当不存在key 时也会重建索引
注意: 当强制使用稀疏索引判断key 是否存在时会出现异常数据
比如 db.collection.find({'title':{$exists:false}}).hint("index")
地理位置索引 db.locations.ensureIndex({"position":"2d"})
创建2d索引
经纬度:[经度,纬度] db.locations.find({'position':{$near:[1,1]}})
找出附近的100个点 db.locations.find({'position':{$near:[1,1],$maxDistance:10}})
查找距离小于10的点
3、MongoDB 监控
使用mongostat 效果验证 ./mongostat -h 127.0.0.1:27017
各字段解释说明:
insert/s : 官方解释是每秒插入数据库的对象数量,如果是slave,则数值前有*,则表示复制集操作
query/s : 每秒的查询操作次数
update/s : 每秒的更新操作次数
delete/s : 每秒的删除操作次数
getmore/s: 每秒查询cursor(游标)时的getmore操作数
command: 每秒执行的命令数,在主从系统中会显示两个值(例如 3|0),分表代表 本地|复制 命令
注: 一秒内执行的命令数比如批量插入,只认为是一条命令(所以意义应该不大)
dirty: 仅仅针对WiredTiger引擎,官网解释是脏数据字节的缓存百分比
used:仅仅针对WiredTiger引擎,官网解释是正在使用中的缓存百分比
flushes:
For WiredTiger引擎:指checkpoint的触发次数在一个轮询间隔期间
For MMAPv1 引擎:每秒执行fsync将数据写入硬盘的次数
注:一般都是0,间断性会是1, 通过计算两个1之间的间隔时间,可以大致了解多长时间flush一次。flush开销是很大的,如果频繁的flush,可能就要找找原因了
vsize: 虚拟内存使用量,单位MB (这是 在mongostat 最后一次调用的总数据)
res: 物理内存使用量,单位MB (这是 在mongostat 最后一次调用的总数据)
注:这个和你用top看到的一样, vsize一般不会有大的变动, res会慢慢的上升,如果res经常突然下降,去查查是否有别的程序狂吃内存。
qr: 客户端等待从MongoDB实例读数据的队列长度
qw:客户端等待从MongoDB实例写入数据的队列长度
ar: 执行读操作的活跃客户端数量
aw: 执行写操作的活客户端数量
注:如果这两个数值很大,那么就是DB被堵住了,DB的处理速度不及请求速度。看看是否有开销很大的慢查询。如果查询一切正常,确实是负载很大,就需要加机器了
netIn:MongoDB实例的网络进流量
netOut:MongoDB实例的网络出流量
注:此两项字段表名网络带宽压力,一般情况下,不会成为瓶颈
conn: 打开连接的总数,是qr,qw,ar,aw的总和
注:MongoDB为每一个连接创建一个线程,线程的创建与释放也会有开销,所以尽量要适当配置连接数的启动参数,maxIncomingConnections,阿里工程师建议在5000以下,基本满足多数场景
‘
在每个find()查询后面添加explain() 获取查询详细信息参数
4、MongoDB 安全
mongodb 守护进程方式关闭
ps -ef|grep mongod|grep 27017
root 5435 4914 1 19:13 pts/2 00:00:14 mongod --dbpath=/data/mongodata/rs1 --logpath=/data/mongodata/rs1/rs1.log
kill -2 5435
mongod.conf 配置文件
# mongodb.conf
# Where to store the data.
dbpath=/var/lib/mongodb
#where to log
logpath=/var/log/mongodb/mongodb.log
logappend=true
bind_ip = 127.0.0.1
port = 27017
# Enable journaling, http://www.mongodb.org/display/DOCS/Journaling
journal=true
# Enables periodic logging of CPU utilization and I/O wait
#cpu = true
# Turn on/off security. Off is currently the default
#noauth = true
#auth = true
# Verbose logging output.
#verbose = true
# Inspect all client data for validity on receipt (useful for
# developing drivers)
#objcheck = true
# Enable db quota management
#quota = true
# Set oplogging level where n is
# 0=off (default)
# 1=W
# 2=R
# 3=both
# 7=W+some reads
#oplog = 0
# Diagnostic/debugging option
#nocursors = true
# Ignore query hints
#nohints = true
# Disable the HTTP interface (Defaults to localhost:27018).
#nohttpinterface = true
# Turns off server-side scripting. This will result in greatly limited
# functionality
#noscripting = true
# Turns off table scans. Any query that would do a table scan fails.
#notablescan = true
# Disable data file preallocation.
#noprealloc = true
# Specify .ns file size for new databases.
# nssize = <size>
# Accout token for Mongo monitoring server.
#mms-token = <token>
# Server name for Mongo monitoring server.
#mms-name = <server-name>
# Ping interval for Mongo monitoring server.
#mms-interval = <seconds>
# Replication Options
# in replicated mongo databases, specify here whether this is a slave or master
#slave = true
#source = master.example.com
# Slave only: specify a single database to replicate
#only = master.example.com
# or
#master = true
#source = slave.example.com
# Address of a server to pair with.
#pairwith = <server:port>
# Address of arbiter server.
#arbiter = <server:port>
# Automatically resync if slave data is stale
#autoresync
# Custom size for replication operation log.
#oplogSize = <MB>
# Size limit for in-memory storage of op ids.
#opIdMem = <bytes>
# SSL options
# Enable SSL on normal ports
#sslOnNormalPorts = true
# SSL Key file and password
#sslPEMKeyFile = /etc/ssl/mongodb.pem
#sslPEMKeyPassword = pass
./mongod --config ../conf/mongod.conf
以配置文件方式启动
创建用户信息
db.createUser(
{
user: "panlei",
pwd: "panlei",
roles: [ { role: "dbAdmin", db: "test" } ]
}
)
角色介绍
roles:指定用户的角色,可以用一个空数组给新用户设定空角色;在roles字段,可以指定内置角色和用户定义的角色。role里的角色可以选:
Built-In Roles(内置角色):
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
// 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 内部角色:__system
复制代码
具体角色:
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限