mongodb 配置副本集

什么是MongoDB副本集

副本集是一组mongod维护相同数据集的实例。

它提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性;还允许您从硬件故障和服务中断中恢复数据;实现自动故障转移,还可以采用分布式方式读取数据。

副本集的原理

mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。mongodb各个节点常见的搭配方式为:一主一从、一主多从。

主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。

通过在不同数据库服务器上提供多个数据副本,复制可提供一定级别的容错功能,以防止丢失单个数据库服务器。

配置流程

新建目录

新建一个副本集数据目录。可以将下面的内容保存为 .bat 文件

1
2
3
4
5
6
cd D:\Scoop\persist\mongodb\current\data
# 创建副本集目录
mkdir replicaSet
cd replicaSet
# 创建分级目录
mkdir -p confs,key,log,replSet1,replSet2,replSet3

生成密钥

利用 openssl 生成密钥。可以使用 scoop 安装 openssl。

1
2
cd key
openssl rand -base64 756 > rs-key

修改配置文件

confs 目录新建下列文件:

1
2
3
4
5
cd ../confs
// 新建下列 3 个文件
echo "# mongodb config" > mongodb27018.conf
echo "# mongodb config" > mongodb27019.conf
echo "# 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
# mongod.conf

# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
dbPath: D:\Program Files\Scoop\apps\mongodb\current\data\rs\replSet1
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:

# where to write logging data.
systemLog:
destination: file
logAppend: true
path: D:\Program Files\Scoop\apps\mongodb\current\data\rs\log\replSet1.log

# network interfaces
net:
port: 27018
bindIp: 127.0.0.1
# 如果需要局域网访问,上述 bindIp 应为 0.0.0.0


#processManagement:

#security:
security:
authorization: enabled
keyFile: D:\Program Files\Scoop\apps\mongodb\current\data\rs\key\rs-key

#operationProfiling:

#replication:
replication:
oplogSizeMB: 2048
replSetName: rs_auth

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

安装服务

使用管理员打开 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

注意

  1. 要用管理员身份运行命令

  2. 提示 Error parsing command line: Multiple occurrences of option "--config 错误

    这种情况是使用了 mongod 命令导致的,一定要跳转到 mongod.exe 目录执行 mongod 命令

  3. --config 后面的路径要全路径

  4. 在命令行中,路径中有空格时,一定要加引号

启动服务

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

# 切换到 admin
use admin

# 定义配置文件
# 配置中的 host 必须是本机的 ip,不能是 127.0.0.1,否则局域网无法访问
# 如果要通过域名访问,则必须是域名
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"])

# 将数据库 mongodbshare 权限赋予 root
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 } )  # 默认是60
db.adminCommand( { getParameter: 1, maxTransactionLockRequestTimeoutMillis: 1 } ) # 默认是5

db.adminCommand( { setParameter: 1, transactionLifetimeLimitSeconds: 300 } ) # 修改事务超时时间为5分钟开启事务支持
db.adminCommand( { setParameter: 1, maxTransactionLockRequestTimeoutMillis: 20 } ) # 修改事务获取锁的等待时间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

# 切换到 admin
use admin

# 修改密码
db.changeUserPassword("root","newPassword")

参考

  1. MongoDB 逻辑还原工具mongorestore
  2. How to manage users and authentication in MongoDB