非关系型数据库MongoDB:(二)副本集部署说明、数据迁移、限制内存、启用mongo认证

目录

一:mongo副本集部署说明

1.1单节点部署

1.2多节点部署

二:mongoDB数据迁移(mongodump方式)

2.1数据导出

2.2数据传输

2.3数据导入

三:限制MongoDB内存使用(RHEL7)

3.1修改mongoDB配置文件

3.2配置MongoDB使用systemctl启动

3.3限制MongoDB内存使用

3.4启动MongoDB

四:启用mongo认证

4.1登录mongDB,在admin库下创建管理员账号

4.2修改MongoDB配置文件,开启用户认证(添加最后两行),重启MongoDB

4.3登录管理员账号,创建业务用户

前言:先熟悉了解mongoDB数据库的特性、优点、部署、基础命令看非关系型数据库MongoDB:(一)认识、优点、搭建、基础命令
 


一:mongo副本集部署说明

1.1单节点部署

此部分的前提是你已经下载并且安装好了MongoDB,并能够正常运行。单节点上运行一个副本集,只能作为开发和测试使用,不能作为生产环境。

下面我们建立一个以rs0为名称的副本集。其中配置环境为ubuntu 12.10和MongoDB 2.4。

步骤:

1. 用下面的命令建立三个文件夹

mkdir -p /srv/mongodb/rs0-0 /srv/mongodb/rs0-1 /srv/mongodb/rs0-2

2. 启动三个mongod进程,注意端口号不能相同,且未被占用。你可以使用三个终端来连接同一台Linux,然后分别在每个终端运行一条命令,一次来模拟使用的是三台服务器。

以下是启动三个mongod进程的命令:

mongod --port 27017 --dbpath /srv/mongodb/rs0-0 --replSet rs0 --smallfiles --oplogSize 128 --logpath /var/log/mongod1.log --fork
mongod --port 27018 --dbpath /srv/mongodb/rs0-1 --replSet rs0 --smallfiles --oplogSize 128--logpath /var/log/mongod2.log --fork
mongod --port 27019 --dbpath /srv/mongodb/rs0-2 --replSet rs0 --smallfiles --oplogSize 128--logpath /var/log/mongod3.log --fork

replSet参数后面跟着的是副本集名称;

smallfilesoplogSize是为了降低磁盘的占用率,在这里仅用于测试,生产环境并不推荐;

logpath参数指定的是日志保存的路径;

--fork是指将这个进程作为后台进程运行。

3. 现在启动一个mongo进程,连接上刚才启动的那三个进程的其中一个:

mongo --port 27017

4. 建立一个副本集的配置对象,用于初始化副本集。对象内容如下所示:

rsconf = {
_id: "rs0",
members: [
{
_id: 0,
host: "<hostname>:27017"
}
]
}

其中hostname是指你的服务器名称,或者ip地址。因为是本地,所以可以用localhost。

5. 用rs.initiate()这个方法来初始化副本集:

rs.initiate( rsconf )

6. 运行上条命令后会提示稍等一段时间才能够看到结果。现在用rs.conf()查看副本集群信息:

rs.conf()

你会发现只有一个节点成员,这就是你当前操作的节点。

7. 现在再用rs.add()命令把剩下的两个mongod进程添加到副本集中:

rs.add("<hostname>:27018")
rs.add("<hostname>:27019")

注意要将hostname替换成你的服务器名称。稍等片刻。

然后用rs.status()查看当前的副本集群信息,会发现现在副本集成员有三个了。至此单节点副本集就部署完成了。

你可以尝试先插入一些测试数据,然后关掉其中一个mongod进程,模拟节点故障。然后用mongo连接到新的主节点,再尝试往数据库插入或读取信息,看是否能正常读写。

1.2多节点部署

多节点的生产环境与单节点的测试开发环境部署相差不大,只是mongod运行在不同的服务器上,但需确保在每个节点能够用名称解析。为了防止每次运行mongod的时候要添加繁多的参数,可以将参数保存到一个文件中,启动时用--config指定配置文件即可。

步骤

1. 首先指定三台服务器的名字,并将其加入到hostname文件中。其中服务器的IP地址和名称可以根据自己的实际环境进行修改。

服务器1:mdb1,10.6.12.79

服务器2:mdb2,10.6.12.80

服务器3:mdb3,10.6.12.81

服务器4:mdb4,10.6.12.82

配置好以后,用ping命令来相互测试是否能够解析服务器名称。

2. 编辑测试文件,文件名自定,这里命名为config.conf。内容如下:

port = 27017
#需要监听的客户端IP地址,即只接受来自这部分的IP连接,提高了安全性。(默认为接受所有的IP请求)
bind_ip = 10.6.12.79
dbpath = /srv/mongodb
fork = true
replSet = rs0

3. 将配置文件用scp命令复制到其他的两台服务器,并使用如下命令启动mongod进程:

mongod --config /src/config.conf 

其中/src/config.conf为配置文件的路径。

4. 用mongo连接到其中一台的mongod进程,并用rs.initiate()来初始化副本集:

> rs.initiate()
{
	"info2" : "no configuration explicitly specified -- making one",
	"me" : "mdb2:27017",
	"info" : "Config now saved locally.  Should come online in about a minute.",
	"ok" : 1
}

5. 用rs.conf()查看当前状况:

> rs.conf()
{
	"_id" : "rs0",
	"version" : 1,
	"members" : [
		{
			"_id" : 0,
			"host" : "mdb2:27017"
		}
	]
}

6. 用rs.add()来添加其他的三个节点到副本集中:

> rs.add("mdb1:27017")
{ "ok" : 1 }
rs0:PRIMARY> rs.add("mdb3:27017")
{ "ok" : 1 }

同时再添加一台仲裁节点:

rs0:PRIMARY> rs.addArb("mdb4:27017")
{ "ok" : 1 }

从上面的内容中可以看到,开始的时候没有出现rs0:PRIMARY,当添加了一个成员后这个节点就成为主节点了,这其实也说明你添加的节点已经成功加入到了这个副本集中。

至此集群节点部署完成。但在实际应用中,因为需要在不同的服务器上来回操作,所以建议使用脚本来自动启动部署过程。


二:mongoDB数据迁移(mongodump方式)

登录原集群环境lx-mgodb映射的机器 
此示例以ZJJQ项目为例,其他环境操作流程与之相同,注意参数的替换

2.1数据导出

检查一下要导出的db的列表

/opt/lxxn/services/mongodb/bin/mongo --port 27017
show dbs;

将显示的列表中除了local以外的其他的db名称代入以下导出命令中的-d 后面的参数中,同时可以自行定义-o的参数值,此参数值为导出文件所在的目录/tmp/dumpfiles,需要这个目录存在,

样例:

sudo /opt/lxxn/services/mongodb/bin/mongodump --host=localhost --port=27017 -d orgcontact -o='/tmp/dumpfiles/'

参数解释:
–host: 服务器名称或IP:PORT
-u: 用户名
-p: 密码
-d: 数据库dbname
-o:导出文件的存放路径

–authenticationDatabase admin: 添加–authenticationDatabase admin 参数制定认证数据库

如果是多个db,则修改-d后面的参数,然后执行多次即可,如:

sudo /opt/xxin/services/mongodb/bin/mongodump --host=localhost --port=27017 -d orgcontact -o='/tmp/dumpfiles/'
sudo /opt/lxxn/services/mongodb/bin/mongodump --host=localhost --port=27017 -d zjjq-lanxin -o='/tmp/dumpfiles/'
sudo /opt/laxx/services/mongodb/bin/mongodump --host=localhost --port=27017 -d logdb -o='/tmp/dumpfiles/'

2.2数据传输

将/tmp/dumpfiles(根据自己定义的导出参数值来定)
打包传输到指定要执行导入的服务器上(服务器上需要安装mongodb的客户端工具)

2.3数据导入

新环境导入数据,自行替换-d 后面的参数值和 最后一个参数值所描述的绝对路径,同时–host指向导入的mongodb服务器的ip,执行导入的服务器要求安装mongodb客户端工具即可

sudo /opt/xxx/mongo/bin/mongorestore --host=localhost --port=27017 -d orgcontact --drop /tmp/dumpfiles/orgcontact
sudo /opt/xxxx/mongo/bin/mongorestore --host=localhost --port=27017 -d xxx --drop /tmp/dumpfiles/zjjq-lanxin
sudo /opt/xx/mxxongo/bin/mongorestore --host=localhost --port=27017 -d logdb --drop /tmp/dumpfiles/logdb

数据恢复(数据库)

命令:mongorestore -h localhost -u root -p root123 --db admin dump/test_jia/ --authenticationDatabase admin
-h: 服务器名称或IP:PORT
-u: 用户名
-p: 密码
–db: 数据库dbname,需要恢复的数据库名称
dump/test_jia/:恢复文件的存储路径
–authenticationDatabase admin: 添加–authenticationDatabase admin 参数制定认证数据库


三:限制MongoDB内存使用(RHEL7)

3.1修改mongoDB配置文件

vim /opt/xx/conf/mongo/mongo_standalone.conf

添加MongoDB参数:storage.wiredTiger.engineConfig.cacheSizeGB

systemLog:
   destination: file
   path: "/opt/logs/mongo/mongo_standalone.log"
   logAppend: true
storage:
   dbPath: "/opt/db/mongo/mongo_standalone"
   journal:
      enabled: true
   engine: wiredTiger
   wiredTiger:
      engineConfig:
         cacheSizeGB: 14
processManagement:
   fork: true
   pidFilePath: "/opt/run/mongo/mongo_standalone.pid"
net:
   bindIp: 0.0.0.0
   port: 27017

3.2配置MongoDB使用systemctl启动

添加mongodb.service文件:

vim /etc/systemd/system/mongodb.service 
[Unit]
Description=MongoDB_standalone
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/opt/xxxx/run/mongo/mongo_standalone.pid
ExecStart=/opt/xxxx/init.d/mongo start
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/opt/xxxx/init.d/mongo stop
#ExecStop=/bin/kill -s QUIT $MAINPID
#ExecStop=/opt/bxixxx/mongodb/bin/mongod --shutdown --config /opt/bxxxix/conf/mongo/mongo_standalone.conf 
PrivateTmp=true

[Install]
WantedBy=multi-user.target

3.3限制MongoDB内存使用

/etc/systemd/system/mongodb.service文件中,[Service]部分,添加MemoryLimit(蓝色部分)

cat /etc/systemd/system/mongodb.service 
[Unit]
Description=MongoDB_standalone
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/opt/xxx/run/mongo/mongo_standalone.pid
ExecStart=/opt/bxxxxix/init.d/mongo start
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/opt/xxxx/init.d/mongo stop
PrivateTmp=true
MemoryLimit=20G

[Install]
WantedBy=multi-user.target

3.4启动MongoDB

重新加载systemctl,并用systemctl 启动MongoDB:

# systemctl daemon-reload 

# systemctl start mongodb.service

# systemctl status mongodb
● mongodb.service - MongoDB_standalone
Loaded: loaded (/etc/systemd/system/mongodb.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2019-04-01 10:00:54 CST; 3 days ago
Process: 29132 ExecStart=/opt/xxxeix/init.d/mongo start (code=exited, status=0/SUCCESS)
Main PID: 29139 (mongod)
Memory: 18.0G (limit: 20.0G)
CGroup: /system.slice/mongodb.service
└─29139 /opt/bxxxx/mongo/bin/mongod --config /opt/xxxix/conf/mongo/mongo_standalone.conf

Apr 01 10:00:53 shcp-bdu04 systemd[1]: Starting MongoDB_standalone...
Apr 01 10:00:53 shcp-bdu04 runuser[29135]: pam_unix(runuser:session): session opened for user xxxeset by (uid=0)
Apr 01 10:00:53 shcp-bdu04 mongo[29132]: about to fork child process, waiting until server is ready for connections.
Apr 01 10:00:53 shcp-bdu04 mongo[29132]: forked process: 29139
Apr 01 10:00:54 shcp-bdu04 mongo[29132]: child process started successfully, parent exiting
Apr 01 10:00:54 shcp-bdu04 runuser[29135]: pam_unix(runuser:session): session closed for user bxxxeset
Apr 01 10:00:54 shcp-bdu04 mongo[29132]: [45B blob data]
Apr 01 10:00:54 shcp-bdu04 systemd[1]: Started MongoDB_standalone.

四:启用mongo认证

4.1登录mongDB,在admin库下创建管理员账号

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

4.2修改MongoDB配置文件,开启用户认证(添加最后两行),重启MongoDB

# cat /opt/xxix/conf/mongo/mongo_standalone.conf
systemLog:
   destination: file
   path: "/opt/xeixx/logs/mongo/mongo_standalone.log"
   logAppend: true
storage:
   dbPath: "/opt/xxix/db/mongo/mongo_standalone"
   journal:
      enabled: true
processManagement:
   fork: true
   pidFilePath: "/opt/xix/run/mongo/mongo_standalone.pid"
net:
   bindIp: 0.0.0.0
   port: 27017
security:
   authorization: enabled 

4.3登录管理员账号,创建业务用户

两种登录方式,登录时验证或者无认证登录后再验证:

mongo --port 27017 -u "xxx_admin" -p "xxx" --authenticationDatabase "admin"

或

use admin
db.auth("xxx_admin", "xxx" ) 

创建业务库账号,当前情况是3个库的用户名密码一致,实际是3个用户(MongoDB的权限设置是以库为单位的,必选要先选择库):

use dbdb
db.createUser(
{
    user: "xxx",
    pwd: "xxx",
    roles: [ { role: "readWrite", db: "dbdb" },
               { role: "dbAdmin", db: "dbdbv" } ]
}
) 

use logdb
db.createUser(
{
    user: "xxxn",
    pwd: "xxxLlnxxf",
    roles: [ { role: "readWrite", db: "logdb" },
               { role: "dbAdmin", db: "logdb" } ]
}
) 

use ondtact
db.createUser(
{
    user: "xxxxn",
    pwd: "xxxxnfxx",
    roles: [ { role: "readWrite", db: "ondtact" },
               { role: "dbAdmin", db: "ondtact" } ]

猜你喜欢

转载自blog.csdn.net/ver_mouth__/article/details/126226028