DBmongodb程序员

MongoDB集群搭建 —— 主从模式

2017-09-13  本文已影响244人  ChainZhang

本文为转载,原文:MongoDB集群搭建 —— 主从模式

介绍

在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写、海量数据高效存储、高可扩展性和高可用性这些难题。不过就是因为这些问题Nosql诞生了。

NOSQL有这些优势:

  1. 大数据量,可以通过廉价服务器存储大量的数据,轻松摆脱传统mysql单表存储量级限制。

  2. 高扩展性,Nosql去掉了关系数据库的关系型特性,很容易横向扩展,摆脱了以往老是纵向扩展的诟病。

  3. 高性能,Nosql通过简单的key-value方式获取数据,非常快速。还有NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多。

  4. 灵活的数据模型,NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。

  5. 高可用,NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如mongodb通过mongos、mongo分片就可以快速配置出高可用配置。

mongo在应用中有几种常见的模式,单实例、主从模式、副本集模式、分片。

单实例

这种配置只适合简易开发时使用,生产使用不行,因为单节点挂掉整个数据业务全挂,如下图。


虽然不能生产使用,但这个模式可以快速搭建启动,并且能够用mongodb的命令操作数据库。之前的文章中提到的都是单实例的,这里就不赘述了。

主从模式

采用双机备份后主节点挂掉了后从节点可以接替主机继续服务。所以这种模式比单节点的高可用性要好很多。


主从配置

下面我们将一步一步来搭建主从模式的数据库集群
首先我这边已经准备好两台服务器10.29.240.13, 10.29.240.51,其中10.29.240.13作为主服务器10.29.240.51作为从服务器

主服务器

在主服务器上创建个存放数据的路径:

mkdir -p /data/mongodb/master

然后通过mongo命令启动服务,加上-master参数,这是作为主服务器启动的参数。

mongod –dbpath /data/mongodb/master –master

可以看到我们的数据库已经以主服务器模式启动了。我们可以使用mongo命令登进去看看。

然后依次执行以下命令,创建数据库,创建集合并插入数据:
> use mydb
> db.createCollection("students")
> db.students.insert({
name:"tom",
age:23,
gender:"male"
})

到此,我们主服务器便完成了。

从服务器

在从服务器上创建个存放数据的路径:

mkdir -p /data/mongodb/slave

将数据库以从数据库的模式启动:

mongod -dbpath /data/mongodb/slave -slave -source 10.29.240.13:27017

从结果中我们可以看到我们的数据库是以从数据库方式启动的。
下面我们用mongo命令登录从数据库,看下数据有没有同步进来

报错了,说是not master and slaveOk=false
这是正常的,因为SECONDARY是不允许读写的,如果非要解决,执行以下命令
rs.slaveOk()

从上图中,我们看到执行rs.slaveOk()后,我们就可以读取数据库内容了。我们查询到了主数据插入的数据。

主从复制

通过以上的配置,我们已经实现了主从模式的搭建,下面我们试下再次从主服务器插入数据,从数据库是否能及时更新。
主服务器执行以下命令,插入数据:

db.students.insert({
name:"iris",
age:18,
gender:"female"
})

然后在从服务器继续查询
db.students.find()

我们看到,从数据库已经同步到了主数据库的变化。

那我们在试试在从数据库中写入数据:

db.students.insert({
name:"chain",
age:20,
gender:"male"
})

报错了。原因是在主从模式下,从服务器是不允许写数据的,只能读数据。

故障转移测试

现在两台服务器如果主服务器挂掉了,从服务器可以正常运转吗?
先执行以下命令杀掉原来的mongodb主服务器

kill -3 `ps -ef|grep mongod|grep -v grep|awk '{print $2}'`

测试从服务器能否可写:

db.students.insert({
name:"chain",
age:20,
gender:"male"
})

这个时候还是报not master的错.
看起来从服务器没有自动接替主服务器的功能,只有手工处理了!
停止从服务器,在原数据文件启动并添加主服务器标示。
从服务器上依次执行以下命令:
kill -3 `ps -ef|grep mongod|grep -v grep|awk '{print $2}'`
mongod  --dbpath /data/mongodb/slave --master

这个时候就变成主服务器了,我们再执行下新增和查询命令试下:



读写都正常了。

多个从节点

现在只是一个数据库服务器又提供写又提供读,机器承载会出现瓶颈。大家还记得mysql里的读写分离吗?把20%的写放到主节点,80%的读放到从节点分摊了减少了服务器的负载。但是大部分应用都是读操作带来的压力,一个从节点压力负载不了,可以把一个从节点变成多个节点。那mongodb的一主多从可以支持吗?答案是肯定的。


问题

搭建了这套主从复制系统是不是就很稳健了,其实不然。。。看看这几个问题?

还有这么多问题,有其他解决方案吗?后面的文章我们接着搞。

上一篇下一篇

猜你喜欢

热点阅读