MongoDB复制集群的搭建

前言

MongoDB是专为可扩展性,高性能和高可用性而设计的数据库。它可以从单服务器部署扩展到大型、复杂的多数据中心架构。利用内存计算的优势,MongoDB能够提供高性能的数据读写操作。 MongoDB的本地复制和自动故障转移功能使您的应用程序具有企业级的可靠性和操作灵活性。

介绍

复制是在多台服务器间同步数据的过程,提供冗余,增加了数据可用性,数据在不同服务器上的多份副本提供了容错性。在某些场合,复制增加了读能力,因为可以把用户的读请求分发到不同的服务器上。利用复制的特性可以用在灾难恢复,报告,备份等场景中。

MongoDB的复制功能主要有两种类型:

  • Master/Slave :主从复制
  • Replica Set :复制集

目前比较常用的是复制集类型,主从复制类型很少有人使用。

在使用复制集时,最好使用三个(含)以上节点,并且节点数量应该为奇数,这点与我们的高可用集群类似,并且可以设定一个仲裁节点用于在出现网络分区时,参与选举一个从节点提升为主节点。

MongoDB 复制集是一组 mongod 实例,它们维护着同样的数据集。复制集的成员有以下几种:主节点,从节点,投票节点。

MongoDB-Replication

配置复制集群

为了简单的演示效果,这里就不介绍如何配置仲裁节点了,架构如图所示:

MongoDB-Replication

各节点信息如下所示:
主机列表 功能描述 IP地址
node5.magedu.org Primary 172.16.100.5
node6.magedu.org Secondary 172.16.100.6
node7.magedu.org Secondary 172.16.100.7
安装MongoDB

MongoDB在epel源中有提供,直接安装即可。

[root@node5 ~]# yum install mongodb mongodb-server -y
[root@node6 ~]# yum install mongodb mongodb-server -y
[root@node7 ~]# yum install mongodb mongodb-server -y

编辑配置文件

[root@node5 ~]# vim /etc/mongod.conf

修改以下两项即可

1
2
bind_ip = 0.0.0.0	#设置监听在所有地址
replSet = MyDB #设置复制集的名称

将配置文件复制到其它节点

[root@node5 ~]# scp /etc/mongod.conf node6:/etc/
[root@node5 ~]# scp /etc/mongod.conf node7:/etc/

所有节点启动服务

[root@node5 ~]# systemctl start mongod
[root@node6 ~]# systemctl start mongod
[root@node7 ~]# systemctl start mongod

选择一个节点为主节点,进行初始化操作,并将其它节点添加集群

[root@node5 ~]# mongo

1
2
3
> rs.initiate() #初始化操作,左边出现“MyDB:PRIMARY”,表示成功
MyDB:PRIMARY> rs.add("172.16.100.6") #添加Node6
MyDB:PRIMARY> rs.add("172.16.100.7") #添加Node7

在其它节点上开启同步

Node6

MyDB:SECONDARY> rs.slaveOk()

Node7

MyDB:SECONDARY> rs.slaveOk()

查看集群状态

在任意节点均可查看

MyDB:SECONDARY> rs.status()

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
{
"set" : "MyDB",
"date" : ISODate("2016-08-04T11:51:03Z"),
"myState" : 2,
"syncingTo" : "node5.magedu.org:27017",
"members" : [
{
"_id" : 0,
"name" : "node5.magedu.org:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 272,
"optime" : Timestamp(1470311192, 1),
"optimeDate" : ISODate("2016-08-04T11:46:32Z"),
"lastHeartbeat" : ISODate("2016-08-04T11:51:02Z"),
"lastHeartbeatRecv" : ISODate("2016-08-04T11:51:01Z"),
"pingMs" : 1,
"electionTime" : Timestamp(1470311101, 1),
"electionDate" : ISODate("2016-08-04T11:45:01Z")
},
{
"_id" : 1,
"name" : "172.16.100.6:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 272,
"optime" : Timestamp(1470311192, 1),
"optimeDate" : ISODate("2016-08-04T11:46:32Z"),
"lastHeartbeat" : ISODate("2016-08-04T11:51:02Z"),
"lastHeartbeatRecv" : ISODate("2016-08-04T11:51:03Z"),
"pingMs" : 1,
"syncingTo" : "node5.magedu.org:27017"
},
{
"_id" : 2,
"name" : "172.16.100.7:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 499,
"optime" : Timestamp(1470311192, 1),
"optimeDate" : ISODate("2016-08-04T11:46:32Z"),
"self" : true
}
],
"ok" : 1
}
在主节点上创建数据进行测试

Node5

1
2
3
4
5
> MyDB:PRIMARY> use mydb
MyDB:PRIMARY> db.test.insert({Name: "Tonny",Age: 18,Gender: "M"})
MyDB:PRIMARY> db.test.insert({Name: "Jerry",Age: 25,Gender: "M"})
MyDB:PRIMARY> db.test.insert({Name: "Tom",Age: 39,Gender: "F"})
写入三条数据

查看从节点

Node6

1
2
3
4
5
6
7
8
9
10
11
MyDB:SECONDARY> show dbs #查看数据库
admin (empty)
local 1.078GB
mydb 0.078GB #数据库已经同步过来
MyDB:SECONDARY> use mydb
MyDB:SECONDARY> db.test.find().count() #查看数据同步了多少条
3
MyDB:SECONDARY> db.test.find() #可以看到三条数据全部同步了过来
{ "_id" : ObjectId("57a32e19076ba6e7693bbb29"), "Name" : "Tonny", "Age" : 18, "Gender" : "M" }
{ "_id" : ObjectId("57a32e24076ba6e7693bbb2a"), "Name" : "Jerry", "Age" : 25, "Gender" : "M" }
{ "_id" : ObjectId("57a32e2f076ba6e7693bbb2b"), "Name" : "Tom", "Age" : 39, "Gender" : "F" }

Node7

1
2
3
4
5
6
7
8
9
10
11
MyDB:SECONDARY> show dbs
admin (empty)
local 1.078GB
mydb 0.078GB
MyDB:SECONDARY> use mydb
MyDB:SECONDARY> db.test.find().count()
3
MyDB:SECONDARY> db.test.find()
{ "_id" : ObjectId("57a32e19076ba6e7693bbb29"), "Name" : "Tonny", "Age" : 18, "Gender" : "M" }
{ "_id" : ObjectId("57a32e24076ba6e7693bbb2a"), "Name" : "Jerry", "Age" : 25, "Gender" : "M" }
{ "_id" : ObjectId("57a32e2f076ba6e7693bbb2b"), "Name" : "Tom", "Age" : 39, "Gender" : "F" }
这样,一个简单的MongoDB复制集群就搭建完成,更加深入的内容将在后面的博文中写出,敬请期待。
分享到 评论