• 非关系型数据库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进程的命令:

    1. mongod --port 27017 --dbpath /srv/mongodb/rs0-0 --replSet rs0 --smallfiles --oplogSize 128 --logpath /var/log/mongod1.log --fork
    2. mongod --port 27018 --dbpath /srv/mongodb/rs0-1 --replSet rs0 --smallfiles --oplogSize 128--logpath /var/log/mongod2.log --fork
    3. 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. 建立一个副本集的配置对象,用于初始化副本集。对象内容如下所示:

    1. rsconf = {
    2. _id: "rs0",
    3. members: [
    4. {
    5. _id: 0,
    6. host: ":27017"
    7. }
    8. ]
    9. }

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

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

    rs.initiate( rsconf )

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

    rs.conf()

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

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

    1. rs.add(":27018")
    2. rs.add(":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。内容如下:

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

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

    mongod --config /src/config.conf 

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

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

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

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

    1. > rs.conf()
    2. {
    3. "_id" : "rs0",
    4. "version" : 1,
    5. "members" : [
    6. {
    7. "_id" : 0,
    8. "host" : "mdb2:27017"
    9. }
    10. ]
    11. }

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

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

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

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

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

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


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

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

    2.1数据导出

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

    1. /opt/lxxn/services/mongodb/bin/mongo --port 27017
    2. 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后面的参数,然后执行多次即可,如:

    1. sudo /opt/xxin/services/mongodb/bin/mongodump --host=localhost --port=27017 -d orgcontact -o='/tmp/dumpfiles/'
    2. sudo /opt/lxxn/services/mongodb/bin/mongodump --host=localhost --port=27017 -d zjjq-lanxin -o='/tmp/dumpfiles/'
    3. 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客户端工具即可

    1. sudo /opt/xxx/mongo/bin/mongorestore --host=localhost --port=27017 -d orgcontact --drop /tmp/dumpfiles/orgcontact
    2. sudo /opt/xxxx/mongo/bin/mongorestore --host=localhost --port=27017 -d xxx --drop /tmp/dumpfiles/zjjq-lanxin
    3. 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

    1. systemLog:
    2. destination: file
    3. path: "/opt/logs/mongo/mongo_standalone.log"
    4. logAppend: true
    5. storage:
    6. dbPath: "/opt/db/mongo/mongo_standalone"
    7. journal:
    8. enabled: true
    9. engine: wiredTiger
    10. wiredTiger:
    11. engineConfig:
    12. cacheSizeGB: 14
    13. processManagement:
    14. fork: true
    15. pidFilePath: "/opt/run/mongo/mongo_standalone.pid"
    16. net:
    17. bindIp: 0.0.0.0
    18. port: 27017

    3.2配置MongoDB使用systemctl启动

    添加mongodb.service文件:

    1. vim /etc/systemd/system/mongodb.service
    2. [Unit]
    3. Description=MongoDB_standalone
    4. After=network.target remote-fs.target nss-lookup.target
    5. [Service]
    6. Type=forking
    7. PIDFile=/opt/xxxx/run/mongo/mongo_standalone.pid
    8. ExecStart=/opt/xxxx/init.d/mongo start
    9. ExecReload=/bin/kill -s HUP $MAINPID
    10. ExecStop=/opt/xxxx/init.d/mongo stop
    11. #ExecStop=/bin/kill -s QUIT $MAINPID
    12. #ExecStop=/opt/bxixxx/mongodb/bin/mongod --shutdown --config /opt/bxxxix/conf/mongo/mongo_standalone.conf
    13. PrivateTmp=true
    14. [Install]
    15. WantedBy=multi-user.target

    3.3限制MongoDB内存使用

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

    1. cat /etc/systemd/system/mongodb.service
    2. [Unit]
    3. Description=MongoDB_standalone
    4. After=network.target remote-fs.target nss-lookup.target
    5. [Service]
    6. Type=forking
    7. PIDFile=/opt/xxx/run/mongo/mongo_standalone.pid
    8. ExecStart=/opt/bxxxxix/init.d/mongo start
    9. ExecReload=/bin/kill -s HUP $MAINPID
    10. ExecStop=/opt/xxxx/init.d/mongo stop
    11. PrivateTmp=true
    12. MemoryLimit=20G
    13. [Install]
    14. WantedBy=multi-user.target

    3.4启动MongoDB

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

    1. # systemctl daemon-reload
    2. # systemctl start mongodb.service
    3. # systemctl status mongodb
    4. ● mongodb.service - MongoDB_standalone
    5. Loaded: loaded (/etc/systemd/system/mongodb.service; disabled; vendor preset: disabled)
    6. Active: active (running) since Mon 2019-04-01 10:00:54 CST; 3 days ago
    7. Process: 29132 ExecStart=/opt/xxxeix/init.d/mongo start (code=exited, status=0/SUCCESS)
    8. Main PID: 29139 (mongod)
    9. Memory: 18.0G (limit: 20.0G)
    10. CGroup: /system.slice/mongodb.service
    11. └─29139 /opt/bxxxx/mongo/bin/mongod --config /opt/xxxix/conf/mongo/mongo_standalone.conf
    12. Apr 01 10:00:53 shcp-bdu04 systemd[1]: Starting MongoDB_standalone...
    13. Apr 01 10:00:53 shcp-bdu04 runuser[29135]: pam_unix(runuser:session): session opened for user xxxeset by (uid=0)
    14. Apr 01 10:00:53 shcp-bdu04 mongo[29132]: about to fork child process, waiting until server is ready for connections.
    15. Apr 01 10:00:53 shcp-bdu04 mongo[29132]: forked process: 29139
    16. Apr 01 10:00:54 shcp-bdu04 mongo[29132]: child process started successfully, parent exiting
    17. Apr 01 10:00:54 shcp-bdu04 runuser[29135]: pam_unix(runuser:session): session closed for user bxxxeset
    18. Apr 01 10:00:54 shcp-bdu04 mongo[29132]: [45B blob data]
    19. Apr 01 10:00:54 shcp-bdu04 systemd[1]: Started MongoDB_standalone.

    四:启用mongo认证

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

    1. use admin
    2. db.createUser(
    3. {
    4. user: "xxxadmin",
    5. pwd: "xxx",
    6. roles: [ { role: "root", db: "admin" } ]
    7. }
    8. )

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

    1. # cat /opt/xxix/conf/mongo/mongo_standalone.conf
    2. systemLog:
    3. destination: file
    4. path: "/opt/xeixx/logs/mongo/mongo_standalone.log"
    5. logAppend: true
    6. storage:
    7. dbPath: "/opt/xxix/db/mongo/mongo_standalone"
    8. journal:
    9. enabled: true
    10. processManagement:
    11. fork: true
    12. pidFilePath: "/opt/xix/run/mongo/mongo_standalone.pid"
    13. net:
    14. bindIp: 0.0.0.0
    15. port: 27017
    16. security:
    17. authorization: enabled

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

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

    1. mongo --port 27017 -u "xxx_admin" -p "xxx" --authenticationDatabase "admin"
    2. use admin
    3. db.auth("xxx_admin", "xxx" )

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

    1. use dbdb
    2. db.createUser(
    3. {
    4. user: "xxx",
    5. pwd: "xxx",
    6. roles: [ { role: "readWrite", db: "dbdb" },
    7. { role: "dbAdmin", db: "dbdbv" } ]
    8. }
    9. )
    10. use logdb
    11. db.createUser(
    12. {
    13. user: "xxxn",
    14. pwd: "xxxLlnxxf",
    15. roles: [ { role: "readWrite", db: "logdb" },
    16. { role: "dbAdmin", db: "logdb" } ]
    17. }
    18. )
    19. use ondtact
    20. db.createUser(
    21. {
    22. user: "xxxxn",
    23. pwd: "xxxxnfxx",
    24. roles: [ { role: "readWrite", db: "ondtact" },
    25. { role: "dbAdmin", db: "ondtact" } ]

  • 相关阅读:
    如何解决跨域问题
    7. CSS 网格布局
    大学刚毕业,如何才能拿到月薪10K+的offer?
    深入了解网络流量清洗--使用免费的雷池社区版进行防护
    100ms的延迟让亚马逊损失1%销量,如何快速降低网站延迟?
    为什么开源在线表单工具能做好数据管理?
    【智能电网随机调度】智能电网的双层模型时间尺度随机优化调度(Matlab代码实现)
    医院安全(不良)事件管理系统源代码(B/S架构):事件全程监管 质量持续改进
    Docker入门
    华清 Qt day4 9月20
  • 原文地址:https://blog.csdn.net/ver_mouth__/article/details/126226028