什么是MongoDB副本集
副本集是一组mongod维护相同数据集的实例。
它提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,
并可以保证数据的安全性;还允许您从硬件故障和服务中断中恢复数据;实现自动故障转移,还可以采用分布式方式读取数据。
副本集的原理
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。mongodb各个节点常见的搭配方式为:一主一从、一主多从。
主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
通过在不同数据库服务器上提供多个数据副本,复制可提供一定级别的容错功能,以防止丢失单个数据库服务器。
配置流程
新建目录
新建一个副本集数据目录。可以将下面的内容保存为 .bat 文件
1 2 3 4 5 6 cd D:\Scoop\persist\mongodb\current\datamkdir replicaSet cd replicaSetmkdir -p confs,key,log,replSet1,replSet2,replSet3
生成密钥
利用 openssl 生成密钥。可以使用 scoop
安装 openssl。
1 2 cd keyopenssl rand -base64 756 > rs-key
修改配置文件
在 confs
目录新建下列文件:
1 2 3 4 5 cd ../confs// 新建下列 3 个文件 echo "# mongodb config" > mongodb27018.confecho "# mongodb config" > mongodb27019.confecho "# mongodb config" > mongodb27020.conf
以下列文件内容为模板,分别修改其副本集配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 storage: dbPath: D:\Program Files\Scoop\apps\mongodb\current\data\rs\replSet1 journal: enabled: true systemLog: destination: file logAppend: true path: D:\Program Files\Scoop\apps\mongodb\current\data\rs\log\replSet1.log net: port: 27018 bindIp: 127.0 .0 .1 security: authorization: enabled keyFile: D:\Program Files\Scoop\apps\mongodb\current\data\rs\key\rs-key replication: oplogSizeMB: 2048 replSetName: rs_auth
安装服务
使用管理员打开 PowerShell
,运行如下指令:
1 2 3 4 5 6 7 8 cd ..\..\..\bin\./mongod.exe --config "D:\Program Files\Scoop\apps\mongodb\current\data\rs\confs\mongodb27018.conf" --serviceName mongodb27018 --install ./mongod.exe --config "D:\Program Files\Scoop\apps\mongodb\current\data\rs\confs\mongodb27019.conf" --serviceName mongodb27019 --install ./mongod.exe --config "D:\Program Files\Scoop\apps\mongodb\current\data\rs\confs\mongodb27020.conf" --serviceName mongodb27020 --install
注意 :
要用管理员身份运行命令
提示
Error parsing command line: Multiple occurrences of option "--config
错误
这种情况是使用了 mongod
命令导致的,一定要跳转到
mongod.exe
目录执行 mongod
命令
--config 后面的路径要全路径
在命令行中,路径中有空格时,一定要加引号
启动服务
1 2 3 net start mongodb27018 net start mongodb27019 net start mongodb27020
若三个服务不能启动,请检查配置文件中的 dbPath
是否重复
初始化副本集
使用 PowerShell 连接 mongoDB,连接任意一个端口即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 mongo --host 127.0 .0.1 --port 27018 use admin rsconf = { _id: "rs_share" , members: [ { _id : 0 , host : "192.168.23.1:27018" }, { _id : 1 , host : "192.168.23.1:27019" }, { _id : 2 , host : "192.168.23.1:27020" } ] } rs.initiate(rsconf)
当出现如下提示时,说明成功了:
1 2 { "ok" : 1 } rs_auth:SECONDARY>
新建用户
继上述 Shell 进行操作,新建用户:
1 db.createUser({user:"root" ,pwd :"root8888" ,roles:[{role :"userAdminAnyDatabase" ,db :"admin" }]})
如果需要改密码,可以:
1 2 3 4 5 6 mongo --host 127.0 .0.1 --port 27018 -u root -p root8888 use admin db.changeUserPassword('root' ,'newpassword' ) db.auth('username' ,'password' )
新建账号后,需要重新连接 mongo:
1 2 3 4 5 6 7 8 9 exit mongo --host 127.0 .0.1 --port 27018 -u root -p root8888 use admin db.grantRolesToUser("root" , ["clusterAdmin" ]) db.grantRolesToUser("root" , [{role : "read" , db : 'mongodbshare' }]) db.grantRolesToUser("root" , [{role : "root" , db : 'admin' }])
事务超时设置
这种方式在数据库重启后,会重置设置,需要在配置文件中定义。
1 2 3 4 5 db.adminCommand( { getParameter: 1 , transactionLifetimeLimitSeconds: 1 } ) db.adminCommand( { getParameter: 1 , maxTransactionLockRequestTimeoutMillis: 1 } ) db.adminCommand( { setParameter: 1 , transactionLifetimeLimitSeconds: 300 } ) db.adminCommand( { setParameter: 1 , maxTransactionLockRequestTimeoutMillis: 20 } )
操作时,要连接主节点
Mongoose 连接副本集
mongoose 中 url 的连接语句如下:
1 2 3 { url : 'mongodb://root:[email protected] :27026,127.0.0.1:27027,127.0.0.1:27028/iepAuth?authSource=admin&replicaSet=rs_auth' , }
备份与还原
备份与还原需要 mongodump
程序,该程序可由
scoop
安装。
dump:
1 mongodump -h localhost:27017 -d databaseName -u test -p testpwd -o D:\dump --authenticationDatabase admin
-h
地址
-d
数据库名称
-u
用户名
-p
密码
-o
输出地址
--authenticationDatabase admin
验证账户的数据库
restore :
1 mongorestore -h localhost:27018 -u root -p whfy8888 --authenticationDatabase admin --objcheck --nsInclude =swcooperation.* --dir D:\dump
修改 rs 中的 config
假如要修改 rs 中 config 里面第一个 mongodb 实例的 host
值,配置方式如下:
1 2 3 4 5 6 7 mongo --host 127.0 .0.1 --port 27018 -u root -p root8888 use admin var config = rs.config() config.members[0 ].host = "yourdomain.com" rs.reconfig(config)
修改密码
1 2 3 4 5 6 7 8 mongo --host 127.0 .0.1 --port 27018 -u root -p root8888 use admin db.changeUserPassword("root" ,"newPassword" )
参考
MongoDB
逻辑还原工具mongorestore
How
to manage users and authentication in MongoDB