一、获取 MongoDB

cd /data/download
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.16.tgz
/* 5x版本下载地址:
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.12.tgz
*/

二、安装 MongoDB

2.1 上传软件并解压

[root@node01 nosql]# mkdir -p /data/mongodb && cd /data/mongodb
[root@node01 nosql]# cd /data/download
[root@node01 nosql]# tar zxvf mongodb-linux-x86_64-rhel70-6.0.16.tgz
[root@node01 nosql]# mv /data/download/mongodb-linux-x86_64-rhel70-6.0.16 /data/mongodb/mongodb60

关闭 THP

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

把配置加入开机自启动,root用户下

vi /etc/rc.local 最后添加如下代码

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi

if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
  echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
[root@node01 app]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

[root@node01 app]# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

其他系统关闭参照官方文档:https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/

为什么要关闭?

Transparent Huge Pages (THP) is a Linux memory management system that reduces the overhead of Translation Lookaside Buffer (TLB)

lookups on machines with large amounts of memory by using larger memory pages. However, database workloads often perform poorly with THP,

because they tend to have sparse rather than contiguous memory access patterns. You should disable THP on Linux machines to ensure best performance with MongoDB.

2.2 环境准备

(1) 创建所需用户和组

useradd mongodb

(2) 创建 mongodb所需目录结构

cd /data/mongodb/mongodb60
mkdir -p {auth,conf,shard1_27017/{data,log}}

(3) 修改权限

chown -R mongodb:mongodb /data/mongodb

(4) 切换用户并设置环境变量

#给 root用户添加环境变量
cat  >> /etc/profile <<EOF
export MONGODB_HOME=/data/mongodb/mongodb60
export PATH=$MONGODB_HOME/bin:$PATH
EOF

#使其生效
source /etc/profile

#给 mongodb用户添加环境变量
su - mongodb
cat  >> ~/.bash_profile <<EOF
export MONGODB_HOME=/data/mongodb/mongodb60
export PATH=$MONGODB_HOME/bin:$PATH
EOF

#使其生效
source ~/.bash_profile

2.3 使用配置文件

2.3.1 生成配置文件

cat > /data/mongodb/mongodb60/conf/mongodb.conf <<EOF
#系统日志有关
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/mongodb60/shard1_27017/log/shard1.log

#数据存储有关
storage:
  dbPath: /data/mongodb/mongodb60/shard1_27017/data
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
      directoryForIndexes: true
      configString : cache_size=1G

processManagement:
  fork: true  # fork and run in background
  pidFilePath: /data/mongodb/mongodb60/shard1_27017/log/shard1.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27017
  bindIp: 0.0.0.0
  maxIncomingConnections: 1000
  unixDomainSocket:
    enabled: true
    pathPrefix: /data/mongodb/mongodb60/shard1_27017/data
    filePermissions: 0700

#security:
#  keyFile: /data/mongodb/mongodb60/auth/keyfile.key
#  authorization: enabled

EOF

2.3.2 配置文件说明

-- 系统日志有关
systemLog:
  destination: file
  path: <string>      -- 日志位置
  logAppend: true     -- 日志以追加模式记录

-- 数据存储有关
storage:
  journal:
    enabled: true
  dbPath: <string>     -- 数据路径的位置

-- 进程控制
processManagement:
  fork: true        -- 后台守护进程
  pidFilePath: <string>   -- pid文件的位置,一般不用配置,可以去掉这行,自动生成到 data中

-- 网络配置有关
net:
  bindIp: <ip>       -- 监听地址,如果不配置这行是监听在 0.0.0.0
  port: <port>             -- 端口号,默认不配置端口号,是 27017

-- 安全验证有关配置
security:
  authorization: enabled        -- 是否打开用户名密码验证

----------------以下是复制集与分片集群有关----------------------
replication:
  oplogSizeMB: <NUM>
  replSetName: "<REPSETNAME>"
  secondaryIndexPrefetch: "all"

sharding:
  clusterRole: <string>
  archiveMovedChunks: <boolean>

--- for mongos only
replication:
  localPingThresholdMs: <int>

sharding:
  configDB: <string>

2.3.3 生成 keyfile

#随机生成 keyFile或者手动写入,key的⻓度必须是 6-1024 的 base64字符,unix下必须相同组权限,windows下不需要
openssl rand -base64 512 > /data/mongodb/mongodb60/auth/keyfile.key

cd /data/mongodb/mongodb60/auth

# 或者手动生成
echo "mongodb123456" > /data/mongodb/mongodb60/auth/keyfile.key

# 修改权限
chmod 600 /data/mongodb/mongodb60/auth/keyfile.key

2.4 启动数据库并设置密码

(1) 使用配置文件启动数据库

/data/mongodb/mongodb60/bin/mongod -f /data/mongodb/mongodb60/conf/mongodb.conf

(2) 查看 mongo进程

$ netstat -tnlp |grep mongo

tcp     0    0 0.0.0.0:27017      0.0.0.0:*        LISTEN
21748/mongod

$ ps -ef|grep mongo

mongodb  21748    1  3 21:25 ?     00:00:00 /data/mongodb/mongodb60/bin/mongod -f /data/mongodb/mongodb60/conf/mongodb.conf

(3) 登录数据库并设置密码

mongo --port=27017
use admin
db.createUser(
  {
    user: "root",
    pwd: "000000",
    roles: [ { role: "root", db: "admin" } ]
  }
)

(4) 关闭数据库

db.shutdownServer()

或者

/data/mongodb/mongodb60/bin/mongod -f /data/mongodb/mongodb60/conf/mongodb.conf --shutdown

(5) 修改配置文件,将 security的注释去掉

vim /data/mongodb/mongodb60/conf/mongodb.conf

(6) 重启启动数据库

/data/mongodb/mongodb60/bin/mongod -f /data/mongodb/mongodb60/conf/mongodb.conf

(7) 使用密码登录数据库

mongo --port=27017
use admin
# 验证用户管理员权限
db.auth('root','000000')  1  # 返回 1:代表成功, 0:代表失败
show dbs

admin  0.000GB
config  0.000GB
local  0.000GB

2.5 用户基本管理

MongoDB 提供了各种特性,比如身份验证、访问控制、加密,以确保 MongoDB 的部署安全。只要涉及安全一般考虑如下两个方面:

权限管理 = 认证(Authentication) + 授权(Authorization)

认证:就是身份验证,验证输入的账号和密码对不对,核查系统注册过这个用户没

授权:通过认证的用户在系统中的是什么⻆色(如业务管理员、账务管理员、日志管理员、普通用户、VIP 用户等),

该⻆色在系统中有哪些权限

授权方式:Mongodb 是使用⻆色的方式进行授权

2.5.1 注意事项

验证库,建立用户时 use 到的库,在使用用户时,要加上验证库才能登陆。

对于管理员用户,必须在 admin 下创建。

1、建用户时,use 到的库,就是此用户的验证库 2、登录时,必须明确指定验证库才能登录 3、通常,管理员用的验证库是 admin,普通用户的验证库一般是所管理的库设置为验证库 4、如果直接登录到数据库,不进行 use,默认的验证库是 test,不是我们生产建议的

2.5.2 基本语法

1、语法

db.createUser(
{
  user: "<name>",
  pwd: "<cleartext password>",
  roles: [
    { role: "<role>",db: "<database>" } | "<role>",
    ...
  ]
}
)

2、基本语法说明:

user:用户名

pwd:密码

roles:

role:⻆色名

db:作用对象

role:rootreadWriteread

3、验证数据库:

mongo -u root -p000000 192.168.1.153:27017/admin
mongo --host 192.168.1.153 --port 27017 -uroot -p000000 admin
mongo --host 192.168.1.153 --port 27017 -uroot -p000000 --authenticationDatabase='admin'

--host:指定连接的 MongoDB 服务器 IP 地址 --port:指定连接的 MongoDB 服务器端口 -u:数据库用户名 -p:数据库密码 --authenticationDatabase:登录认证的数据库名(创建用户的数据库)

2.5.3 用户实例

(1) 创建超级管理员:管理所有数据库(必须 use admin 再去创建)

mongo --port=27017
use admin

db.createUser(
  {
    user: "root",
    pwd: "000000",
    roles: [ { role: "root", db: "admin" } ]
  }
)

use admin
db.auth('root','000000')

配置文件中,加入以下配置

security:
  authorization: enabled

(2) 查看用户:

use admin
db.system.users.find().pretty()

(3) 创建对 app 数据库,读、写权限的用户 app01

1、超级管理员用户登陆

mongo -uroot -p000000 admin

2、选择一个验证库

use app

(3) 创建用户

db.createUser(
  {
    user: "app01",
    pwd: "app01",
    roles: [ { role: "readWrite" , db: "app" } ]
  }
)

(4) 登录验证

mongo -uapp01 -papp01 app

(4) 创建 app 数据库读写权限的用户 app03,并对 test 数据库具有读权限

mongo -uroot -p000000 admin
use app

db.createUser(
{
  user: "app03",
  pwd: "app03",
  roles: [ { role: "readWrite", db: "app" }, { role: "read", db: "test" } ]
}
)

(5) 创建 app 数据库读写权限的用户 app02,并限制登录 mongo 的客户端

mongo -uroot -p000000 admin
use app

db.createUser(
  {
    user: "app02",
    pwd: "app02",
    roles: [ { role: "readWrite" , db: "app" } ],
    authenticationRestrictions: [ {clientSource: [ "192.168.1.105", "192.168.1.106"] } ]
  }
)

(6) 更新用户密码

use app
db.changeUserPassword("app01","app01_000000")

(7) 添加用户⻆色

mongo -uroot -p000000 admin
use app
db.grantRolesToUser("app01",[ { role: "read", db: "test" }])
use admin
db.system.users.find({"_id" : "app.app01"})

(8) 删除用户⻆色

use app
db.revokeRolesFromUser("app01",[{ role: "read", db: "test" }])
use admin
db.system.users.find({"_id" : "app.app01"})

(9) 修改用户的客户端 ip限制

use app

db.updateUser("app02",
  {
    authenticationRestrictions: [
      {clientSource: [ "172.21.0.0/16", "192.168.1.0/24" ]}
    ]
  }
)

use admin
db.system.users.find({"_id" : "app.app02"})

(10) 删除用户(root身份登录,use 到验证库)

mongo -uroot -p000000 admin
use app
db.dropUser("app03")

2.5.4 ⻆色关系

1、内建的⻆色

(1) 数据库用户⻆色:readreadWrite (2) 数据库管理⻆色:dbAdmindbOwneruserAdmin (3) 集群管理⻆色:clusterAdminclusterManagerclusterMonitorhostManager (4) 备份恢复⻆色:backuprestore (5) 全局管理⻆色:readAnyDatabasereadWriteAnyDatabaseuserAdminAnyDatabasedbAdminAnyDatabase (6) 超级用户⻆色:root // 这里还有几个⻆色间接或直接提供了系统超级用户的访问(dbOwneruserAdminuserAdminAnyDatabase) (7) 内部⻆色:__system:提供数据库所有对象任何操作的权限,不能分配给用户,非常危险

2、⻆色说明:

Read:允许用户读取指定数据库

readWrite:允许用户读写指定数据库

dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profile

userAdmin:允许用户向 system.users 集合写入,可以在指定数据库里创建、删除和管理用户

clusterAdmin:只在 admin 数据库中可用,赋予用户所有分片和复制集相关函数的管理权限

readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限

readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限

userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限

dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限

root:只在 admin 数据库中可用。超级账号,超级权限