逻辑结构与关系数据库的对比:
关系型数据库 | MongoDb |
---|---|
database(数据库) | database(数据库) |
table (表) | collection( 集合) |
row( 行) | document( BSON 文档) |
column (列) | field (字段) |
index(唯一索引、主键索引) | index (全文索引) |
join (主外键关联) | embedded Document (嵌套文档) |
primary key(指定1至N个列做主键) | primary key (指定_id field做为主键) |
aggreation(groupy) | aggreation (pipeline mapReduce) |
MongoDb安装配置与基础命令
下载地址:https://www.mongodb.com/download-center/community
#下载
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.16.tgz
# 解压
tar -zxvf mongodb-linux-x86_64-4.0.16.tgz
2.mongoDb启动参数说明
mongoDb 由C++编写,下载下来的包可以直接启动
#创建数据库目录
mkdir -p /data/mongo
# 启动mongo
./bin/mongod --dbpath=/data/mongo/
常规参数
参数 | 说明 |
---|---|
dbpath | 数据库目录,默认/data/db |
bind_ip | 监听IP地址,默认全部可以访问 |
port | 监听的端口,默认27017 |
logpath | 日志路径 |
logappend | 是否追加日志 |
auth | 是开启用户密码登陆 |
fork | 是否以后台启动的方式登陆 |
config | 指定配置文件 |
配置文件示例
vim mongo.conf
内容:
dbpath=/data/mongo/
port=27017
bind_ip=0.0.0.0
fork=true
logpath=/data/mongo/mongodb.log
logappend=true
auth=false
以配置文件方式启动
./bin/mongod -f mongo.conf
关闭MongoDB
./bin/mongod --shutdown -f mongo.conf
3.客户端Shell 的使用及参数说明
#启动客户端 连接 本机的地的默认端口
./bin/mongo
# 指定IP和端口
./bin/mongo --host=127.0.0.1 --port=27017
环境变量配置
export PATH=/opt/mongodb/bin:$PATH
MongoDB 用户管理
1、用户管理
为 testdb 添加 bryce 用户
use testdb db.createUser({user:"bryce",pwd:"123",roles:[{ role:"dbAdmin",db:"testd b"}]})
具体角色有
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库 dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在 admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限 readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限 userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限
dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限。
root:只在 admin 数据库中可用。超级账号,超级权限
查看所有用户
db.system.users.find()
和用户管理相关的操作基本都要在 admin 数据库下运行,要先 use admin; 如果在某个单一的数据库下,那只能对当前数据库的权限进行操作;
用户删除操作
db.system.users.remove({user:"bryce"});
查看当前用户权限
db.runCommand({usersInfo:"bryce",showPrivileges:true})
修改密码
use testdb db.changeUserPassword("bryce", "123456")
启用用户
db.auth("bryce","123456")
安全检查 --auth
非 testdb 是不能操作数据库的,启用自己的用户才能访问 非 admin 数据库的用户不能使用数据库命令,admin 数据库中的数据经过认证为管理员用户
MongoDB 高可用方案实战演
详解 RouteServer(路由服务器)、
ConfigServer(配置服务器)、
Replica Set(副本集)、
Shard(切片)、
Chunk(分块)MongDB 启动与关闭
MongoDB副本集搭建
环境:三台服务器。当然也可以使用单台,区分端口即可。
三台分别为:
10.15.55.100:主节点、
10.15.55.101:备节点、
10.15.55.102:仲裁节点
1、配置文件 mongo.conf 三个节点都需如此
dbpath=/data/mongodb/data
port=27017
bind_ip=0.0.0.0
logpath=/data/mongodb/logs/mongodb.log
logappend=true
auth=false
fork=true
replSet=shard002
参数解释:
dbpath:数据存放目录
logpath:日志存放路径
logappend:以追加的方式记录日志
replSet:replica set 的名字
bind_ip:mongodb 所绑定的 ip 地址
port:mongodb 进程所使用的端口号,默认为 27017
fork:以后台方式运行进程
分别启动三个节点
配置主,备,仲裁节点
连接一个节点
mongo 10.15.55.100
#使用admin
>use admin
#定义cfg变量
>cfg={_id:"shard002",members:[{_id:0,host:'10.15.55.100:27017',priority:9},{_id:1,host:'10.15.55.101:27017',priority:1},{_id:2,host:'10.15.55.102:27017',arbiterOnly:true}]};
#使配置生效
>rs.initiate(cfg)
注意:cfg 是相当于设置一个变量,可以是任意的名字,当然最好不要是 mongodb 的关键字,conf, config 都可以。最外层的_id 表示 replica set 的名字,members 里包含的是所有节点的地址以及优 先级。优先级最高的即成为主节点,即这里的 10.15.55.100:27017。特别注意的是,对于仲裁节 点,需要有个特别的配置——arbiterOnly:true。这个千万不能少了,不然主备模式就不能生效。
执行 rs.status() 命令,查看信息:
{
"set" : "shard002",
"date" : ISODate("2020-03-20T00:32:28.950Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1584664342, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1584664342, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1584664342, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1584664342, 1),
"t" : NumberLong(1)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1584664322, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2020-03-20T00:32:01.560Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1584664310, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 2,
"priorityAtElection" : 9,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(0),
"newTermStartDate" : ISODate("2020-03-20T00:32:02.732Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2020-03-20T00:32:03.393Z")
},
"members" : [
{
"_id" : 0,
"name" : "10.15.55.100:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 334,
"optime" : {
"ts" : Timestamp(1584664342, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-03-20T00:32:22Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1584664321, 1),
"electionDate" : ISODate("2020-03-20T00:32:01Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "10.15.55.101:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 38,
"optime" : {
"ts" : Timestamp(1584664342, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1584664342, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-03-20T00:32:22Z"),
"optimeDurableDate" : ISODate("2020-03-20T00:32:22Z"),
"lastHeartbeat" : ISODate("2020-03-20T00:32:27.573Z"),
"lastHeartbeatRecv" : ISODate("2020-03-20T00:32:27.404Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "10.15.55.100:27017",
"syncSourceHost" : "10.15.55.100:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "10.15.55.102:27017",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 38,
"lastHeartbeat" : ISODate("2020-03-20T00:32:27.573Z"),
"lastHeartbeatRecv" : ISODate("2020-03-20T00:32:28.327Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1584664342, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1584664342, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
可以查看每个节点对应的信息 stateStr
备节点无读写权限,如需查看备节点相关数据, 需要执行命令进行读写赋权:
rs.slaveOk()
数据库都需要添加验证,进行权限设置
添加验证:
1.停止节点服务
2.创建keyFile文件,并复制到备节点上
openssl rand -base64 666 > energy-rc.key
设置只读权限
chmod 400 energy-rc.key
发送到备节点:
scp -r energy-rc.key root@10.15.55.101 /soft/mongodb/
主节点及备节点添加如下配置配置文件
#从节点不需要配置auth
auth=true
keyFile=/soft/mongodb-4.0.5/energy-rc.key
启动节点
给创建的root用户赋予权限
db.grantRolesToUser( "root" , [ { role: "dbOwner", db: "admin" },{ "role": "clusterAdmin", "db": "admin" },
{ "role": "userAdminAnyDatabase", "db": "admin" },
{ "role": "dbAdminAnyDatabase", "db": "admin" },
{ role: "root", db: "admin" } ])
MongoDB 备份与恢复
mongodump
在Mongodb中我们使用 mongodump 命令来备份MongoDB数据。
该命令可以导出所有数据到指定目录中。
mongodump命令可以通过参数指定导出的数据量级转存的服务器。
mongodump -h dbhost -d dbname -o dbdirectory
-h:MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:需要备份的数据库实例,例如:test
-o:备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
备份 mongodb_study 数据库中的所有集合到 E:\MongoDB\dump
mongodump -h 127.0.0.1 -d mongodb_study -o E:\MongoDB\dump
不带任何参数,即在当前目录下备份所有数据库实例
mongodump
备份所有MongoDB数据
mongodump --host HOST_NAME --port PORT_NUMBER
// 如
mongodump --host w3cschool.cc --port 27017
备份指定数据库的集合
mongodump --collection COLLECTION_NAME --db DB_NAME
// 如
mongodump --collection mycol --db test
mongorestore
在Mongodb中我们使用 mongorestore 命令来恢复MongoDB数据。
mongorestore -h <hostname><:port> -d dbname <path>
--host <:port>, -h <:port>:MongoDB所在服务器地址,默认为: localhost:27017
--db , -d :需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
--drop:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
<path>:mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。你不能同时指定 <path> 和 --dir 选项,--dir也可以设置备份目录。
--dir:指定备份的目录,你不能同时指定 <path> 和 --dir 选项。
恢复存放在 E:\MongoDB\dump 中的数据库 mongodb_study,恢复前后的数据库名不必相同
mongorestore -h localhost /db mongodb_study /dir E:\MongoDB\dump\mongodb_study
mongoDB内存占用
mongostat --port 27101
如果mongodb占用内存大,在启动时添加参数
wiredtiger.engineConfig.cacheSizeGB