MongoDB集群搭建 —— 主从模式 - 简书

来源: MongoDB集群搭建 —— 主从模式 – 简书

本文为转载,原文: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的一主多从可以支持吗?答案是肯定的。

问题

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

  • 主节点挂了能否自动切换连接?目前需要手工切换。
  • 主节点的写压力过大如何解决?
  • 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大?
  • 就算对从节点路由实施路由访问策略能否做到自动扩展?

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

作者:ChainZhang
链接:https://www.jianshu.com/p/aec4899df434
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏