MongoDB由C++语言编写,是一个基于分布式文件存储的数据库,目的在于为web应用提供可扩展的高性能数据存储解决方案。它是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bjson(键为字符串类型,用于唯一表示一个文档;值可以是各种复杂的文件类型。这种存储形式称为bjson)格式,可以存储比较复杂的数据类型。
它最大的特点:面向集合存储(数据被分组存储在数据集中,称为集合,每个集合都有一个唯一的标识名,可以包含无限数目的文档),模式自由(对于存储在mongodb中的文件,不需要知道它的结构定义)
关系数据库与Mongodb的对比
传统的关系数据库一般由数据库(Database)、表(Table)、记录(Record)三层组成;而Mongodb是由数据库(Database)、集合(Collection)、文档对象(Document)三层组成。
一、安装Mongodb
1.下载Mongodb
cd /usr/local/src
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.4.tgz
2.首先创建用户并解压
useradd mgdb
tar -zxvf mongodb-linux-x86_64-3.6.4.tgz -C /home/mgdb
vim /etc/profile
export PATH=/home/mgdb/mongodb/bin:$PATH
chown -R mgdb.mgdb mongodb
3.修改配置文件
vim /etc/mongod.conf
###日志存储位置
systemLog:
destination: file
path: /home/mgdb/mongodb/mongod.log
logAppend: true
storage:
##journal配置
journal:
enabled: false //生产环境建议开启,以保持数据一致性
##数据文件存储位置
dbPath: /home/mgdb/mongodb/data/db
##是否一个库一个文件夹
directoryPerDB: true
##数据引擎
engine: wiredTiger
##WT引擎配置
wiredTiger:
engineConfig:
##WT最大使用cache(根据服务器实际情况调节4~8)
# cacheSizeGB: 4
##是否将索引也按数据库名单独存储
directoryForIndexes: true
##表压缩配置,数据压缩算法,可选值“none”、“snappy”、“zlib”
collectionConfig:
blockCompressor: none
##索引配置
indexConfig:
prefixCompression: true
##使mongo进程成为系统集成(父id为1)
processManagement:
fork: true
pidFilePath: /home/mgdb/mgdbpid/mongod.pid
##端口配置,将默认端口设为10689(默认为27017)
net:
port: 10689
bindIp: xxx.xxx.xxx.xxx
# maxIncomingConnections: 65536
wireObjectCheck: true
ipv6: false
#security:
#keyFile: /data/mongokey
#authorization: enabled
# enableLocalhostAuthBypass: true
5.修改内核参数
echo
never >
/sys/kernel/mm/transparent_hugepage/enabled
echo
never >
/sys/kernel/mm/transparent_hugepage/defrag
vim
/etc/security/limits
.conf
//
加入
mongod soft nofile 64000 #任何一个用户可以打开的最大的文件描述符数量,默认1024,会影响TCP连接
mongod hard nofile 64000
mongod soft nproc 32000 #任何一个用户可以打开的最大进程数
mongod hard nproc 32000
6.准备启动mongodb
建立一个进程文件夹
su - mgdb
mkdir mgdbpid
mongod -f /etc/mondod.conf
此时可以查看日志,看是否启动成功。
二、mongodb使用
1.连接
命令行连接
mongo xxx.xxx.xxx.xxx:10689
Mongodb安全认证
创建管理员用户
use admin
db.createUser({user: "admin",pwd: "123456",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
退出并修改配置文件,将里边的security注释取消,并重新启动
此时再这样mongo xxx.xxx.xxx.xxx:10689就连接不上了,需要采用以下命令连接
mongo -uadmin -p --host xxx.xxx.xxx.xxx --port 10689 --authenticationDatabase "admin"
2.创建用户
#创建管理员用户
use admin
db.createUser({user: "admin",pwd: "123456",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
#创建普通用户
db.createUser({user:"tester",pwd:"123456",roles:[{role:"readWrite",db:"test"}]})
#查看用户
db.system.users.find() //列出所有用户,需要切换到admin库下(use admin)
show users //查看当前库下所有的用户
#删除用户,需要切换到admin库
db.dropUser('admin')
具体用户角色详见http://bbs.51cto.com/thread-1146654-1.html
#修改用户密码
db.changeUserPassword('username','password')
3.数据库管理
#查看版本
db.version()
#查看所有数据库
show dbs(此命令要授权db.auth("admin","123456"))
#显示当前的库 db
# 切换/创建库
use userdb //如果库存在就切换,不存在就创建
#此时show dbs 看不到userdb,需要我们创建一个集合
db.createCollection('clo1')
再show dbs就有userdb了。
#删除数据库 mydb
use mydb //先切换到该库下,然后再删除
db.dropDatabase()
4.数据管理
创建集合
db.createCollection("mycol", { capped : true, autoIndexID : true, size : 6142800, max : 10000 } )
语法:db.createCollection(name,options)
name就是集合的名字,options可选,用来配置集合的参数,参数如下
capped true/false (可选)如果为true,则启用封顶集合。封顶集合是固定大小的集合,会自动覆盖最早的条目,当它达到其最大大小。如果指定true,则需要也指定尺寸参数。
autoindexID true/false (可选)如果为true,自动创建索引_id字段的默认值是false。
size (可选)指定最大大小字节封顶集合。如果封顶如果是 true,那么你还需要指定这个字段。单位B
max (可选)指定封顶集合允许在文件的最大数量。
查看集合
show collections
在集合中添加文档
db.Account.insert({AccountID:2,UserName:"123",password:"123456"}) //如果集合不存在,直接插入数据,则mongodb会自动创建集合
修改
db.Account.update({AccountID:2},{"$set":{"Age":20}})
查看
db.Account.find() //查看所有文档
db.Account.find({AccountID:2}) //根据条件查询
删除
db.Account.remove({AccountID:2}) //根据条件删除
要删除整个文档
db.Account.drop()
查看集合的状态
use dbname //先进入对应的库,然后查看集合状态
db.printCollectionStats()
5)数据库性能
db.stats() //查看当前库的信息
db.serverStatus() //查看mongodb服务器的状态
三、将MongoDB设为开机启动
在CentOS 7下使用systemctl服务管理方式配置MongoDB的启动:
CentOS 7的服务systemctl脚本存放在/usr/lib/systemd/,MongoDB需要开机不登陆就能运行,就要存在系统服务/usr/lib/systemd/system目录下。
每一个服务以.service结尾,如mongod.service。内容分为3部分:[Unit]、[Service]和[Install]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [Unit] Description=MongoDB database server After=network.target After=syslog.target [Service] #Type=forking #一次性启动,mongod的后台保持由mongod自己的配置文件中定义 Type=oneshot User=dp #PIDFile=/home/dp/data/mongodb/pid ExecStart= /usr/bin/numactl --interleave=all /home/dp/bin/mongod -f /home/dp/data/mongodb/config/mongod .conf #ExecReload= #ExecStop= PrivateTmp= true [Install] WantedBy=multi-user.target |
注:MongoDB建议关闭NUMA功能,用 numactl --interleave=all 方式启动 mongod 进程
脚本按照上面编写完成后,以754的权限保存在/usr/lib/systemd/system目录下,这时就可以利用systemctl进行配置:重新加载配置文件用systemctl daemon-reload
用systemctl start mongod可测试服务是否可以成功运行
如果不能运行则可以使用systemctl status mongod查看错误信息和其他服务信息。
如果无法启动MongoDB,可检查日志/home/dp/data/mongodb/log/mongod.log,如果是由于如下错误:
WiredTiger error (13) [1488260221:910792][6102:0x7f33bf806dc0], file:WiredTiger.wt, connection: /home/dp/data/db/WiredTiger.turtle: handle-open: open: Permission denied
可能是由于WiredTiger.turtle的权限不足,或所有者不是dp用户,可以用chmod、chown、chgrp命令修改该文件的属性。
使用systemctl enable mongod就可以将所编写的服务添加至开机启动。这个命令相当于在/etc/systemd/system目录里添加一个软链接,指向/usr/lib/systemd/system里的mongod.service。因为开机时,systemd只执行/etc/systemd/system里的配置文件。