目录
4.2修改MongoDB配置文件,开启用户认证(添加最后两行),重启MongoDB
前言:先熟悉了解mongoDB数据库的特性、优点、部署、基础命令看非关系型数据库MongoDB:(一)认识、优点、搭建、基础命令

此部分的前提是你已经下载并且安装好了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参数后面跟着的是副本集名称;
smallfiles和oplogSize是为了降低磁盘的占用率,在这里仅用于测试,生产环境并不推荐;
logpath参数指定的是日志保存的路径;
--fork是指将这个进程作为后台进程运行。
3. 现在启动一个mongo进程,连接上刚才启动的那三个进程的其中一个:
mongo --port 27017
4. 建立一个副本集的配置对象,用于初始化副本集。对象内容如下所示:
- rsconf = {
- _id: "rs0",
- members: [
- {
- _id: 0,
- host: "
:27017" - }
- ]
- }
其中hostname是指你的服务器名称,或者ip地址。因为是本地,所以可以用localhost。
5. 用rs.initiate()这个方法来初始化副本集:
rs.initiate( rsconf )
6. 运行上条命令后会提示稍等一段时间才能够看到结果。现在用rs.conf()查看副本集群信息:
rs.conf()
你会发现只有一个节点成员,这就是你当前操作的节点。
7. 现在再用rs.add()命令把剩下的两个mongod进程添加到副本集中:
- rs.add("
:27018" ) - rs.add("
:27019" )
注意要将hostname替换成你的服务器名称。稍等片刻。
然后用rs.status()查看当前的副本集群信息,会发现现在副本集成员有三个了。至此单节点副本集就部署完成了。
你可以尝试先插入一些测试数据,然后关掉其中一个mongod进程,模拟节点故障。然后用mongo连接到新的主节点,再尝试往数据库插入或读取信息,看是否能正常读写。
多节点的生产环境与单节点的测试开发环境部署相差不大,只是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,当添加了一个成员后这个节点就成为主节点了,这其实也说明你添加的节点已经成功加入到了这个副本集中。
至此集群节点部署完成。但在实际应用中,因为需要在不同的服务器上来回操作,所以建议使用脚本来自动启动部署过程。
登录原集群环境lx-mgodb映射的机器
此示例以ZJJQ项目为例,其他环境操作流程与之相同,注意参数的替换
检查一下要导出的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/'
将/tmp/dumpfiles(根据自己定义的导出参数值来定)
打包传输到指定要执行导入的服务器上(服务器上需要安装mongodb的客户端工具)
新环境导入数据,自行替换-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 参数制定认证数据库
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
添加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
/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
重新加载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.
- use admin
- db.createUser(
- {
- user: "xxxadmin",
- pwd: "xxx",
- roles: [ { role: "root", db: "admin" } ]
- }
- )
- # 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
两种登录方式,登录时验证或者无认证登录后再验证:
- 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" } ]