mongodb数据库

概述

Mongodb是一个开源、高性能、无模式的文档型数据库,是最像关系型数据库的非关系数据库,数据结构为BSON。
应用场景:社交场景、游戏场景、物流场景、物联网场景、视频直播,适用与大量数据,对事务要求不高的场景。
mongodb数据库_第1张图片
mongodb数据库_第2张图片

搭建MongoDB服务器

tar -zxf mongodb-linux-x86_64-rhel70-3.6.3.tgz
Mkdir /usr/local/mongodb
cp -r mongodb-linux-x86_64-rhel70-3.6.3/bin /usr/local/mongodb/
cd /usr/local/mongodb/
mkdir -p etc log data/db
配置文件
Vim /usr/local/mongodb/etc/mongodb.conf
logPath=/usr/local/mongodb/log/mongodb.log
Dbpath=/usr/local/mongodb/data/db
Logappend=true 追加方式记录日志
Fork=true 守护进程运行
Port=27050
Bind_ip=192.168.4.50
启动服务
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongodb.conf
Ss -anptul|grep mongod
Ps -C mongod
连接服务
/usr/local/mongodb/bin/mongo --host 192.169.4.50 --port 27050
断开服务
[root@50log]#/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongodb.conf --shutdown
可以把启动停止的命令设置为别名

常用管理命令

数据库名称规范:不能是空字符串,不得含有空格,全部小写,最多64字节
集合名命名规范:不能是空字符串,不能含有\0字符(空字符),不能以“system.”开头,不能含有保留字符
Admin默认库:存放数据库授权信息
Local默认库:存储限于本地单台服务器的任意集合
Config默认库:保存分片的相关信息
show dbs //显示已有的库
Exit //断开连接
db //显示当前所在的库
use 库名 //切换库,若库不存在延时创建库
show collections 或 show tables //查看库下已有集合
db.dropDatabase() //删除当前所在的库
db.集合名.drop() //删除集合
db.集合名.save({’ ‘,’ '}) //创建集合,集合不存在时,创建并添加文档 >db.user.save({name:‘bob’,age:21})

db.test1.save([{_id:4,name:“xiaogou”},{_id:5,name:“jingke”}])
db.集合名.find() //显示集合中的所有内容
save和insert的区别
相同点:当集合不存在时创建集合,并插入记录
不同点:save() _id字段值已经存在时,修改文档字段值
insert() _id字段值已经存在时,放弃修改文档字段值
db.集合名.count() //统计集合的行数
db.集合名.find({条件}) //显示包含条件的行
db.集合名.findOne() //显示第一行内容
db.集合名.remove({}) //删除所有文档
db.集合名.remove({条件}) //删除匹配的所有文档
Db.集合名.insert({文档}) //插入文档
db.test1.insert({title:null,by:“mongodbzhongwenwang”,tags:[‘jjj’,‘ddd’,‘ssss’]})
插入多条记录
db.集合名.insertMany(
[
{name:“xiaojiu”,age:19} ,
{name:“laoshi”,email:“[email protected]”}
]
)
db.集合名.find({条件},{定义显示的字段})
db.user.find({},{_id:0,name:1,shell:1})//0 不显示,1 显示,没指定的默认输出
db.t3.find().pretty() 竖着显示
db.t3.find({shell:"/bin/bash"})
skip(数字) //跳过前几行
db.集合名.find().skip(2)
db.t3.find({},{_id:0,name:1}).limit(10).skip(3)
db.集合名.find().limit(3)
db.t3.find({},{_id:0,name:1}).limit(10)
sort(字段名) //1升序,-1降序
db.t3.find({shell:"/sbin/nologin"},{_id:0,name:1,shell:1,uid:1}).sort({uid:-1})
db.集合名.find().sort({age:1|-1})
正则匹配:
db.t3.find({name:/^a/},{_id:0,name:1})
范围比较:
KaTeX parse error: Expected '}', got 'EOF' at end of input: ….t3.find({uid:{in:[1,6,9]}},{_id:0,name:1,uid:1})
KaTeX parse error: Expected '}', got 'EOF' at end of input: …t3.find({name:{nin:["/bin/bash","/sbin/nologin"]}},{_id:0,name:1,shell:1})
KaTeX parse error: Expected '}', got 'EOF' at end of input: … 或 db.t3.find({or:[{name:“sync”},{uid:1},{shell:"/bin/bash"}]},{_id:0,name:1,uid:1,shell:1})
KaTeX parse error: Expected '}', got 'EOF' at end of input: … 和 db.t3.find({and:[{name:“sync”},{uid:1},{shell:"/bin/bash"}]},{_id:0,name:1,uid:1,shell:1})
数值比较:
$lt $lte $gt $gte $ne KaTeX parse error: Expected '}', got 'EOF' at end of input: ….t3.find({uid:{lte:10}},{_id:0,name:1,uid:1})
db.t3.find({KaTeX parse error: Expected '}', got 'EOF' at end of input: or:[{uid:{lt:10}},{uid:{KaTeX parse error: Expected 'EOF', got '}' at position 6: gt:20}̲}]},{_id:0,name…lte:4}},{KaTeX parse error: Expected 'EOF', got '}' at position 20: …{password:"mj"}}̲,false,true) db…set:{修改的字段}}) //默认只更新与条件匹第1行
KaTeX parse error: Expected '}', got 'EOF' at end of input: …r.update({条件},{set: {修改的字段}})修改指定字段的值
db.t3.update({name:“bin”},{$set:{password:“A”}})
KaTeX parse error: Expected '}', got 'EOF' at end of input: …名.update({条件},{unset:{key:values}})
KaTeX parse error: Expected '}', got 'EOF' at end of input: …名.update({条件},{inc:{字段名:数字}})+num 自增,-num 自减
db.t3.update({name:“bin”},{KaTeX parse error: Expected 'EOF', got '}' at position 12: inc:{uid:2}}̲) {Multi:true}批…set:{nickname:”李四”}},{multi:true}) 批量更改满足条件的字段
KaTeX parse error: Expected group after '^' at position 1033: …db.t2.save({x:/^̲/})

索引

单字段索引:支持在单个字段上创建用户定义的升序/降序索引
复合索引:多字段的用户定义索引
其他索引:地理空间索引、文本索引、哈希索引
查询索引 db.集合名.getIndexes()
创建单字段索引 db.集合名.createIndex({字段:1|-1})
创建复合索引 db.集合名.createIndex({字段1:1,字段2:-1})
删除索引 db.集合名.dropIndex({字段:1})
执行计划:分析查询性能,看查询的情况,耗费的时间,是否基于索引查询
Db.集合名.find().explain()
涵盖查询:当要查询的结果刚好是有索引的字段,那么可以直接可以从索引中获取数据,效率非常高

副本集

是维护相同数据集的mongod服务,可提供冗余和高可用性,是通过选举机制确定主库,主要成员有主要成员,接收所有写操作;副本成员,备份数据,不可写数据,可读数据;仲裁者,不保存数据,只有选举作用,但也可以同时作为副本成员
mongodb数据库_第3张图片

Master 和 slave 是分发关系和通信关系,slave和slave也有联系,是一种点对点的模式,有心跳检测和投票机制,zoopkeeper和redis都是采用的这种投票机制来选举mater的,arbiter(仲裁)只有能投票不能同步数据,secondary即可以投票也可以同步数据

1.启动服务时,指定主节点和从节点的副本集名称,几个节点都要设置
vim /usr/local/mongodb/etc/mongodb.conf
dbpath=/usr/local/mongodb/data/db
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
fork=true
port=27050
bind_ip=192.168.65.137
replSet=rs1 //指定副本集名称(51-53)
2.设置path变量
#vim /etc/profile
Export PATH=/usr/local/mongodb/bin:$PATH
#source /etc/profile
3.启动服务,连接数据库
4.定义副本集成员列表 ,连接任意一台配置
rs1_config = {
_id:“rs1”,
members:[
{_id:0,host:“192.168.4.51:27051”},
{_id:1,host:“192.168.4.52:27052”},
{_id:2,host:“192.168.4.53:27053”}
]
}
5.初始化环境

rs.initiate( rs1_config)
6.查看状态信息
rs1:PRIMARY> rs.status( )
rs1:PRIMARY> rs .isMaster( )
7.验证副本集,同步数据验证
在从库能够同步数据,但要同步数据验证,允许从库查看数据
当从库宕机然后重新启动后会同步主库的数据
在从节点上看需要授权才能查询rs1:SECONDARY> db.getMongo( ).setSlaveOk( )
8.验证选举,停掉主节点,查看从节点哪个变为了主节点(高可用)
当主库和总裁库宕机后,从库任然是从库,当从库和总裁库宕机后,主库降级为从库
注意:如果初始化错误,重启服务登陆之后重新设置变量,之后再重新初始化
排错:vim /usr/local/mongodb/etc/mongodb.conf
#replSet rs1
use local
db.dropDatabase()
然后重新配置
初始化Replica Sets环境
rs.initiate(config)
“ok” : 1

分片

是一种将数据跨多台服务器分布存储的方法,这是水平扩展,垂直扩展是提高服务器的配置
mongodb数据库_第4张图片
分片(存储):存储数据
Mongos(路由):充当查询路由,为客户端程序和分片集群提供接口
Config server(调度的配置):存储集群的元数据和配置设置
mongodb数据库_第5张图片
1.搭建两套存储真实数据的副本集
在副本集的配置基础上添加clusterRole:shardsvr
2.搭建配置副本集
在副本集的配置基础上添加clusterRole:configsvr
3.搭建路由节点
准备日志目录 mkdir -p /usr/local/mongodb/log
新建配置文件 在配置普通mongod的基础上添加
ConfigDB:myconfigrs/180.76.159.126:27019,180.76.159.126:27020,180.76.159.126:27021
启动mongos mongos -f 配置文件
连接mongos
添加两个数据存储的副本集
Sh.addShard(“副本集名/IP1:端口1,IP2:端口2,IP3:端口3”)
开启分片的功能
Sh.enableSharding(“库名”)
Sh.shardCollection(“库名.集合名”,{“key”:1})
集合分片
再增加一个路由节点,和路由节点一样
安全认证:
添加用户和权限
use admin 进入库
db.createUser({user:“myroot”,pwd:“123456”,roles:[“root”]}) 创建管理员用户 db.createUser({user:“myadmin”,pwd:“123456”,roles:[{role:“userAdminAnyDatabase”,db:“admin”}]}) admin库的管理用户
db.system.users.find() 查看所有用户
Db.dropUser(“myadmin”) 删除myadmin用户
db.changeUserPassword(“myroot”,“654321”)你修改myroot用户密码
db.auth(“myroot”,“654321”) 认证用户myroot
use mongotest 进入要授权的库
db.createUser({user:“bobo”,pwd:“123456”,roles:[{role:“readWrite”,db:“mongotest”}]} 授权普通用户
db.auth(“bobo”,“123456”) 认证用户bobo
服务端开启认证和客户端连接:
关闭mongod,在配置文件中添加auth=true
重新启动,连接进去,认证use admin ,db.auth(“myroot”,”654321”)
认证之后才能看见授权的库
副本集的安全认证:
创建key文件 openssl rand -base64 90 -out ./mongo.keyfile
Chmod 400 ./mongo.keyfile
将key文件传送给其他副本成员
所有副本修改配置文件指定key文件
添加security:
KeyFile:/mongodb/replica_sets/myrs_27017/mongo.keyfile
Authorization:enabled
创建管理和普通账号

数据导入导出

数据导出:
mongoexport [–host IP地址 --port 端口 ]-d 库名 -c 集合名 -f 字段名1,字段名2–type=csv -o 目录名/文件名.csv
[root@50 etc]# mkdir /mdb
[root@50 ~]# cd /usr/local/mongodb/bin/
[root@50 bin]# ./mongoexport --host 192.168.4.50 --port 27050 -d gamedb -c t2 --type=csv -f name,age -o /mdb/t1.csv
mongoexport --host IP地址 --port 端口 -d库名 -c 集合名 -q ‘{条件}’ -f 字段名1,字段名2 --type=csv -o 目录名/文件名.csv
注意:导出为csv格式必须使用-f 指定字段名列表!!!
[root@50 bin]# ./mongoexport --host 192.168.4.50 --port 27050 -d gamedb -c t2 --type=json -o /mdb/t2.json
数据导入:
mongoimport --host IP地址 --port 端口-d 库名 –c 集合名–type=json 目录名/文件名.json
[root@50 bin]# ./mongoimport --host 192.168.4.50 --port 27050 -d userdb -c user --type=json /mdb/t2.json
mongoimport --host IP地址 --port 端口-d 库名 -c 集合名–type=csv [–headerline] [–drop] 目录名/文件名.csv
导入数据时,
[root@50 bin]# ./mongoimport若库和集合不存在,则先创建库和集合后再导入数据;
若库和集合已存在,则以追加的方式导入数据到集合里;
使用–drop选项可以删除原数据后导入新数据,–headerline 忽略标题
port --host 192.168.4.50 --port 27050 -d userdb -c t2 --type=csv -f user,old /mdb/t1.csv
[root@50 bin]# ./mongoimport --host 192.168.4.50 --port 27050 -d userdb -c t2 --type=csv --headerline /mdb/t1.csv
[root@50 bin]# ./mongoimport --host 192.168.4.50 --port 27050 -d userdb -c t2 --type=csv --headerline --drop /mdb/t1.csv
导入/etc/passwd:
[root@50 bin]# sed -i ‘s/,/g’ /mdb/passwd
[root@50bin]#sed -i ‘1iname,password,uid,gid,comment,homedir,shell’ /mdb/passwd
[root@50 bin]# ./mongoimport --host 192.168.4.50 --port 27050 -d userdb -c t3 --type=csv --headerline /mdb/passwd

数据备份恢复

数据备份:
备份数据所有库到当前目录下的dump目录下
[root@50 bin]./mongodump [ --host ip地址 --port 端口 ]
备份时指定备份的库和备份目录
[root@50 bin]./mongodump [ --host ip地址 --port 端口 ] -d 数据库名 -c 集 合名 -o 目录
查看bson文件内容
[root@50 bin]./bsondump 文件
数据恢复:
[root@50 bin]./mongorestore --host IP地址 --port 端口 -d 数据库名 [ -c 集合名 ] 备份目录名
[root@50 bin]# ./mongorestore --host 192.168.4.50 --port 27050 -d userdb -c t3 /mdb/userdb/
[root@centos2 db]# mongorestore --host 192.168.65.137 --port 27050 -d ttt -c test3 /test3.json/ttt/test1.bson

Mongodb+lnmp

1.搭好lnmp
2.配置php支持mongodb
Yum -y install php
yum -y install autoconf automake php-fpm
yum -y install php-devel-5.4.16-42.el7.x86_64.rpm
[root@51 mongo-1.6.16]# cd mongo-1.6.16/
[root@51 mongo-1.6.16]# phpize
[[email protected]]#./configure --with-php-config=/usr/bin/php-config
[root@51 mongo-1.6.16]# make
[root@51 mongo-1.6.16]# make install
[root@51 mongo-1.6.16]# vim /etc/php.ini
731 extension = “/usr/lib64/php/modules/mongo.so” 加一行
3.重启php-fpm
4.测试
[[email protected]]#vim/usr/local/nginx/html/mongo.php

db3; $c = $db->t1; $data = array("name"=>"bob","age"=>19); $c->insert($data); echo "data ok"; ?>

http://192.168.4.51/mongo.php
在50的mongodb库能看到对应的数据

你可能感兴趣的:(数据库,mongodb,big,data,数据库)