signed

QiShunwang

“诚信为本、客户至上”

windows mongo副本搭建集

2021/5/14 21:11:37   来源:

data目录:
C:/Program Files/MongoDB-master/Server/4.2/data
C:/Program Files/MongoDB-slave1/Server/4.2/data
C:/Program Files/MongoDB-slave2/Server/4.2/data
log目录:
C:/Program Files/MongoDB-master/Server/4.2/log/mongod.log
C:/Program Files/MongoDB-slave1/Server/4.2/log/mongod.log
C:/Program Files/MongoDB-slave2/Server/4.2/log/mongod.log

启动主节点
mongod --port 27018 -dbpath "C:/Program Files/MongoDB-master/Server/4.2/data" -logpath "C:/Program Files/MongoDB-master/Server/4.2/log/mongod.log" --replSet rs0 -logappend 
启动从节点1
mongod --port 27019 -dbpath "C:/Program Files/MongoDB-slave1/Server/4.2/data" -logpath "C:/Program Files/MongoDB-slave1/Server/4.2/log/mongod.log" --replSet rs0 -logappend
启动从节点2
mongod --port 27020 -dbpath "C:/Program Files/MongoDB-slave2/Server/4.2/data" -logpath "C:/Program Files/MongoDB-slave2/Server/4.2/log/mongod.log" --replSet rs0 -logappend

管理员身份进入主节点bin
C:/Program Files/MongoDB-master/Server/4.2/bin
管理员身份进入从节点bin
C:/Program Files/MongoDB-slave1/Server/4.2/bin
管理员身份进入从节点bin
C:/Program Files/MongoDB-slave2/Server/4.2/bin

windows注册mongo服务(管理员打开cmd)
mongod.exe --config "C:\Program Files\MongoDB-master\Server\4.2\bin\mongod.cfg" --serviceName "MongoDB27018" --serviceDisplayName "MongoDB27018" –install
mongod.exe --config "C:\Program Files\MongoDB-slave1\Server\4.2\bin\mongod.cfg" --serviceName "MongoDB27019" --serviceDisplayName "MongoDB27019" –remove
mongod.exe --config "C:\Program Files\MongoDB-slave1\Server\4.2\bin\mongod.cfg" --serviceName "MongoDB27019" --serviceDisplayName "MongoDB27019" –install
mongod.exe --config "C:\Program Files\MongoDB-slave2\Server\4.2\bin\mongod.cfg" --serviceName "MongoDB27020" --serviceDisplayName "MongoDB27020" –install

启动注册的所有服务,cmd连接到三个不同端口的节点
mongo --host ip地址(本机可省略) --port 27018
mongo --port 27018

进入27018主节点,定义初始化变量(副本集配置)
rscongfig={"_id":"rs0",members:[{_id:0,host:"localhost:27018"},{_id:1,host:"localhost:27019"},{_id:2,host:"localhost:27020"}]}
执行初始化
rs.initiate(rscongfig)

新增冲裁节点
rs.addArb("ip:port");

重置副本集配置
cfg2.members[2].priority=0
cfg2.members[2].arbiterOnly=true
rs.reconfig(cfg2)

允许非主节点读取
db.getMongo().setSlaveOk() 或 rs.slaveOk()

副本集开启认证(访问控制/权限认证)
Mongodb的副本集部署在不同的服务器环境,之间通讯需要有权限验证,所以需要用到keyfile。
openssl安装目录:C:\OpenSSL-Win64\bin
以管理员方式进入安装目录,执行以下内容
生成私钥:openssl genrsa -out rsa_private_key.pem 1024 
生成公钥:openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
openssl version:查看版本
各节点key文件配置
主节点:C:\Program Files\MongoDB-master\Server\4.2\keyfile\replicaSet.key
从节点1:C:\Program Files\MongoDB-slave1\Server\4.2\keyfile\replicaSet.key
从节点2:C:\Program Files\MongoDB-slave2\Server\4.2\keyfile\replicaSet.key
1)下载openssl,安装到C盘
2)在DOS命令下,cd 到安装目录,执行语句(openssl rand -base64 666 > mongodb.key),生成keyfile文件
3)将keyfile文件拷贝到各节点手动创建的keyfile目录
4)各节点修改mongod.cfg文件,重命名为replicaSet.key(关联key文件)
security:
  authorization: enabled
  keyFile: C:\Program Files\MongoDB-master\Server\4.2\keyfile\replicaSet.key

security:
  authorization: enabled
  keyFile: C:\Program Files\MongoDB-slave1\Server\4.2\keyfile\replicaSet.key

security:
  authorization: enabled
  keyFile: C:\Program Files\MongoDB-slave2\Server\4.2\keyfile\replicaSet.key

副本集丢失数据测试
1)清空test数据库,往主库插入数据,执行时间比较长
for(var i = 0; i < 100000; i++) { db.test.insert({a: i});};
2)在上述命令执行的过程中,关闭从节点27020的mongodb服务(数据同步一部分)
3)查询主节点27018数据库insert的数据量,为100000.说明已经完全插入
4)关闭主节点27018的Mongodb服务(从节点无法延迟同步)
5)开启从节点27020的MongoDB服务
6)此时从节点27020升级为主节点,此时数据量为14287(14288-100000的数据丢失了)
7)在从节点上使用rs.status()命令查看状态信息,此时原主节点27018显示为"stateStr" : "(not reachable/healthy)"
8)开启原主节点27018的服务,副本集群状态中关于原主节点27018的描述短暂处于 "stateStr" : "ROLLBACK"
9)原主节点27018自动回滚后,状态更新为 "stateStr" : "PRIMARY"
10)查询原主节点27018的数据量,由于优先级设置又恢复为主节点,此时数据量为14287(14288-100000的数据丢失了),这是由于同步了临时主节点27020的数据
11)丢失的数据是否可以找到?
重启原主节点27018的mongodb服务后,在数据目录下新增了一个rollback目录(丢失数据存储在bson文件)

恢复数据使用下面的命令:
>mongorestore.exe -h dbhost -d dbname -directoryperdb dbdirectory -u username -p password
-h:MongoDB所在服务器地址,可以指定端口号:127.0.0.1:27018
-d:需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
--dir:备份数据所在位置,如果是目录,则导入该目录下的所有bson文件,也可以是单个bson文件。
例如:C:\Program Files\MongoDB-master\Server\4.2\data\rollback\test.test
-u:数据库用户名(如果没有设置权限,该参数不要)
-p:数据库密码(如果没有设置权限,该参数不要)

mongorestore.exe -h localhost:27018 -d test --dir C:\Program" "Files\MongoDB-master\Server\4.2\data\rollback\test.test --authenticationDatabase admin -uroot -proot

备份&&恢复
1)mongodump -h dbhost -d dbname -o dbdirectory
-h:
MongDB所在服务器地址,例如:127.0.0.1,可以指定端口号:127.0.0.1:27017
-d:
需要备份的数据库实例,例如:test
-o:
备份数据存放的位置,例如:c:\data\dump,该目录需要提前建立,在备份完成后,系统会自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
2)mongorestore -h <hostname><:port> -d dbname <path>
--host <:port>, -h <:port>:
MongoDB所在服务器地址,默认为: localhost:27017
--db , -d :
需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
--drop:
恢复的时候,先删除当前数据,然后恢复备份的数据。慎用!
<path>:
mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test
不能同时指定 <path> 和 --dir 选项,--dir 也可以设置备份目录
--dir:
指定备份数据的目录(数据来源),不能同时指定 <path> 和 --dir 选项