逻辑结构与关系数据库的对比:

关系型数据库

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