MongoDB 主从配置


MongoDB 主从配置

https://www.jianshu.com/p/675f4712bf3a

Amazon Linux 2 AMI 下 MongoDB 3.2 主从配置

  • 配置鉴权
1
2
3
4
5
mongo

use admin;

db.createUser({user:"dba",pwd:"yourpassword",roles:[{role:"root",db:"admin"},{role:"userAdminAnyDatabase",db:"admin"}]});
  • 秘钥 (主从间的同步需要安全机制)
1
openssl rand -base64 753 > yourKeyFile

将yourKeyFile放到MongoDB的数据存储路径下,也就是上面配置文件中的dbPath,上面的例子为/var/lib/mongo,并授权,注意你的秘钥存放路径

1
chmod 600 yourKeyFile

拷贝yourKeyFile分别放到其他mongo服务器的数据存储路径下,也需要上面的600授权

  • 配置复制集和鉴权

节点为security和replication,机器都需要配置

1
2
3
4
5
6
7
8
9
10
security:
# 启用鉴权
authorization: enabled
# 你的keyFile存放路径
keyFile: /var/lib/mongo/yourKeyfile
replication:
# oplogSize的大小,单位为M,建议空闲磁盘的5%
oplogSizeMB: 1024
# 复制集的名称,需要记住
replSetName: myReplSet
  • 重启MongoDB服务,并进入master节点

连接后,由于开启了鉴权,所以需要认证

1
2
3
4
# 使用admin
use admin;
# 鉴权
db.auth('dba','yourpassword');

输入配置,这里的第一个_id需要和配置里面的replSetName一致

1
2
3
4
5
6
7
8
9
10
myReplSet_conf={
_id: "myReplSet",
members: [{
_id: 0,
host: "192.168.1.207:27017"
}, {
_id: 1,
host: "192.168.1.245:27017"
}]
};

初始化

1
rs.initiate(myReplSet_conf);

若出现{ “ok” : 1}则表示配置成功

==遇到了”has data already, cannot initiate set”的问题==

1
2
3
4
5
6
7
8
9
10
11
排错步骤:
1、把从配置文件主从配置去掉
2、重启服务
3、在从上use xxx 执行 db.dropDatabase(),清空所有的数据库,一个也不要留,直到show dbs为空

> show dbs
test 0.078GB
> use test
switched to db test
> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
  • 退出再重启则可以看到PRIMARY标识,在192.168.1.245登录,则看到的是SECONDARY

查看状态:

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
> rs.status()

{
"set" : "myReplSet",
"date" : ISODate("2018-05-25T09:46:12.137Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1527241561, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1527241561, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1527241561, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.1.207:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1403,
"optime" : {
"ts" : Timestamp(1527241561, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-05-25T09:46:01Z"),
"electionTime" : Timestamp(1527240420, 1),
"electionDate" : ISODate("2018-05-25T09:27:00Z"),
"configVersion" : 2,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.1.245:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1162,
"optime" : {
"ts" : Timestamp(1527241561, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1527241561, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-05-25T09:46:01Z"),
"optimeDurableDate" : ISODate("2018-05-25T09:46:01Z"),
"lastHeartbeat" : ISODate("2018-05-25T09:46:11.898Z"),
"lastHeartbeatRecv" : ISODate("2018-05-25T09:46:11.913Z"),
"pingMs" : NumberLong(0),
"configVersion" : 2
}
],
"ok" : 1
}

==“not master and slaveok=false”错误及解决方法==

1
2
3
因为SECONDARY是不允许读写的,如果非要解决,方法如下:

> rs.slaveOk();

==从机器上登录查询报错:”errmsg” : “node is not in primary or recovering state”==

1
2
3
4
5
6
查看状态发现从机器是:
"state" : 5,
"stateStr" : "STARTUP2",

由于主库有100G数据,从库正在同步数据中,所以查询报错。
mongodb的整个的启动和副本集初始化过程 STARTUP 是其中的一个阶段
  • 测试是否能够自动切换master

先关闭master服务,然后进入原先secondary的服务,查看是否被提升成master,如果是,则测试成功。