2019年7月26日

MongoDB 安装

Centos 环境下安装 MongoDB

步骤如下:
1. 官网下载安装包
2. 创建数据库目录
3. 创建配置文件
4. 加入环境变量
5. 启动 MongoDB

步骤1:官网下载安装包

MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包。
下载地址:https://www.mongodb.com/download-center/community

# 下载
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.10.tgz
# 解压缩
tar -zxvf mongodb-linux-x86_64-rhel70-4.0.10

步骤2:创建数据库目录

MongoDB的数据存储在data目录的db目录下,但是这个目录在安装过程不会自动创建,所以你需要手动创建data目录,并在data目录中创建db目录。

mv mongodb-linux-x86_64-rhel70-4.0.10/ /usr/local/mongodb
# 创建数据库目录和配置文件目录
cd /usr/local/mangodb/bin 
mkdir -p data/db 
mkdir -p data/logs

步骤3:创建配置文件

创建配置文件 mongodb.conf:

vim mongodb.conf

在 mongodb.conf 写入如下内容:

# 设置数据文件的存放目录
dbpath = /usr/local/mongodb/bin/data/db
# 设置日志文件的存放目录及其日志文件名
logpath = /usr/local/mongodb/bin/data/logs/mongodb.log
# 设置端口号(默认的端口号是 27017)
port = 27017
# 设置为以守护进程的方式运行,即在后台运行
fork = true

步骤4:加入环境变量

MongoDB 的可执行文件位于 bin 目录下,所以可以将其添加到 PATH 路径中:

vi /etc/profile
# 末尾添加如下内容
export PATH=<mongodb-install-directory>/bin:$PATH
# 马上生效
source /etc/profile

为你 MongoDB 的安装路径。如本文的 /usr/local/mongodb 。

export PATH=/usr/local/mongodb/bin:$PATH

步骤5:启动 MongoDB

mongod -f /usr/local/mongodb/bin/mongodb.conf

生产环境部署MongoDB副本集(带keyfile安全认证以及用户权限)

步骤如下:
1. 在集群每个节点上安装一份MongoDB;
2. 配置副本集;
3. 配置副本集的用户、密码;
4. 配置副本集的 KeyFile安全鉴权
5. 配置开机自启动

步骤1:每个节点安装 MongoDB

mongodb目录结构如下:

mongodb
├── bin         #可执行文件
├── data        #存放数据库文件
├── keyfile     #存放Keyfile
├── logs        #存放系统日志
├── mongo.conf  #配置文件

配置文件 mongo.conf 配置如下:

#日志文件位置:改为实际路径
logpath=/root/mongodb/logs/mongo.log
#以追加的方式写日志
logappend=true
#端口
port=27018
#是否以守护进程的方式运行
fork=true
#数据库存储位置:改为实际路径
dbpath=/root/mongodb/data/
#是否以安装认证方式运行
#auth=true
#副本集名字
replSet=replSet
#KeyFile鉴权文件:改为实际路径
#keyFile=/root/mongodb/keyfile

分别启动mongodb

/root/mongodb/bin/mongod -f /root/mongodb/mongo.conf

步骤2:组建副本集

  1. 随便连接任意节点
/root/mongodb/bin/mongo --port 27017
  1. 配置副本集
> config = {_id: 'replSet', members: [{_id: 0, host: '172.17.0.3:27018'},{_id: 1, host: '172.17.0.4:27018'},{_id: 2, host:'172.17.0.5:27018'}]}
{    "_id" : "replSet",    "members" : [
        {            "_id" : 0,            "host" : "172.17.0.3:27018"
        },
        {            "_id" : 1,            "host" : "172.17.0.4:27018"
        },
        {            "_id" : 2,            "host" : "172.17.0.5:27018"
        }
    ]
}

> rs.initiate(config)   #初始化副本集{ "ok" : 1 }

> rs.status()           #查看副本集状态,找到private节点的IP

步骤3:创建账号密码

1、在主节点上,用客户端连接,创建用户权限(主节点,可以用 rs.status() 查看)

[root@c43bfab6f744 ~]# mongo --port 27018
replSet:PRIMARY> use admin
switched to db admin
#创建分配用户权限的帐户:admin
replSet:PRIMARY> db.createUser({user:"admin", pwd:"admin", roles:[{role: "userAdminAnyDatabase", db:"admin" }]})
Successfully added user: {    "user" : "admin",    "roles" : [
        {            "role" : "userAdminAnyDatabase",            "db" : "admin"
        }
    ]
}
#创建普通数据库、用户replSet:PRIMARY> db.auth("admin","admin")
replSet:PRIMARY> use mytest  
#创建mytest数据库
switched to db mytest
replSet:PRIMARY> db.createUser({user:"mytest",pwd:"mytest",roles:[{role:"dbOwner",db:"mytest"}]})
Successfully added user: {    "user" : "mytest",    "roles" : [
        {            "role" : "dbOwner",            "db" : "mytest"
        }
    ]
}

步骤4:创建副本集认证key文件

1、创建key文件: 注意,三个节点必须要用同一份keyfile,在一台机器生成,拷贝到另外两台,并且修改成 600 的文件属性

[root@c43bfab6f744 ~]# openssl rand -base64 90 -out ./keyfile
[root@c43bfab6f744 ~]# cp keyfile mongodb/keyfile/
[root@c43bfab6f744 ~]# chmod 600 mongodb/keyfile/keyfile

2、关闭副本集:分别关闭每个节点的mongod

[root@c43bfab6f744 ~]# mongo --port 27017
replSet:PRIMARY> use admin
replSet:PRIMARY> db.shutdownServer()

3、修改每个节点的配置文件mongo.conf中的下面项:

#是否以安装认证方式运行
auth=true
#KeyFile鉴权文件:改为实际路径
keyFile=/root/mongodb/keyfile/keyfile

4、重新启动副本集

[root@c43bfab6f744 ~]# mongod -f mongodb/mongo.conf #机器A
[root@c43bfab6f744 ~]# mongod -f mongodb/mongo.conf #机器B
[root@c43bfab6f744 ~]# mongod -f mongodb/mongo.conf #机器C

步骤5:设置MongoDB开机自启动

[root@c43bfab6f744 ~]# vi /etc/rc.d/rc.local 
#加入下面的自启动脚本 
/root/mongodb/bin/mongod -f /root/mongodb/mongo.conf

附录

1、创建数据库的用户角色:

role角色

角色类型 配置
数据库用户角色 read、readWrite
数据库管理角色 dbAdmin、dbOwner、userAdmin
集群管理角色 clusterAdmin、clusterManager、clusterMonitor、hostManager
备份恢复角色 backup、restore
所有数据库角色 readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色 root
内部角色 __system

角色说明

类型 说明
read 允许用户读取指定数据库
readWrite 允许用户读写指定数据库
dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root 只在admin数据库中可用。超级账号,超级权限
dbOwner readWrite + dbAdmin + dbAdmin

oplog读权限(ElasticSearch同步需要该权限)

Oplog是一种特殊的Capped collections,特殊之处在于它是系统级Collection,记录了数据库的所有操作,集群之间依靠Oplog进行数据同步。Oplog的全名是local.oplog.rs,位于local数据下。由于local数据不允许创建用户,如果要访问Oplog需要借助其它数据库的用户,并且赋予该用户访问local数据库的权限:

1)修改现有用户,使其具有oplog的读权限:
> db.grantRolesToUser("azui",[{role:"read",db:"local"}])

Python创建数据库并添加权限认证

  1. 使用具有 readWriteAnyDatabase 权限的用户创建数据库

示例代码

def create_database():

    db = mongo_client.get_database("admin")
    db.authenticate("aaa", "aaa")

    # 创建新数据库
    new_db = mongo_client.get_database("aaaa")
    new_collection = new_db.get_collection("aaa")
    # 需要插入一条数据才能创建成功
    new_collection.insert({'a':"a"})
  1. 为创建的数据库添加用户权限,需要使用具有 userAdminAnyDatabase 权限的用户认证才能添加用户

示例代码:

def add_new_database_user():
    db = mongo_client.get_database("admin")
    db.authenticate("bbb", "bbb")
    roles = [{"role": "readWrite", "db": "aaaa"}]
    new_db.add_user(name="project_backup", password="1qaz@WSX", roles=roles)

1 Response

  1. Luciana说道:

    Hi, very nice website, cheers!
    ——————————————————
    Need cheap and reliable hosting? Our shared plans start at $10 for an year and VPS plans for $6/Mo.
    ——————————————————
    Check here: https://www.good-webhosting.com/

发表评论

电子邮件地址不会被公开。 必填项已用*标注