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)

5 Responses

  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/

  2. vurtil opmer说道:

    I would like to thnkx for the efforts you’ve put in writing this web site. I’m hoping the same high-grade blog post from you in the upcoming as well. Actually your creative writing abilities has encouraged me to get my own blog now. Really the blogging is spreading its wings quickly. Your write up is a good example of it.

  3. CBD cream说道:

    Hello are using WordPress for your site platform?

    I’m new to the blog world but I’m trying to get started and set up my own. Do you need any html coding knowledge to make your own blog?

    Any help would be really appreciated!

  4. I have to thank you for the efforts you have put
    in writing this website. I am hoping to view the same high-grade blog posts by you later on as well.
    In fact, your creative writing abilities has encouraged me
    to get my own, personal website now 😉

  5. Royal CBD说道:

    Thanks for sharing such a good thought, piece of writing is
    nice, thats why i have read it completely

    P.S. If you have a minute, would love your feedback on my new website
    re-design. You can find it by searching for «royal cbd» —
    no sweat if you can’t.

    Keep up the good work!

发表评论

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