本文为转载,原文:MongoDB集群搭建 —— 主从模式
介绍
在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写、海量数据高效存储、高可扩展性和高可用性这些难题。不过就是因为这些问题Nosql诞生了。
NOSQL有这些优势:
-
大数据量
,可以通过廉价服务器存储大量的数据,轻松摆脱传统mysql单表存储量级限制。 -
高扩展性
,Nosql去掉了关系数据库的关系型特性,很容易横向扩展,摆脱了以往老是纵向扩展的诟病。 -
高性能
,Nosql通过简单的key-value方式获取数据,非常快速。还有NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多。 -
灵活的数据模型
,NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。 -
高可用
,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的一主多从可以支持吗?答案是肯定的。
问题
搭建了这套主从复制系统是不是就很稳健了,其实不然。。。看看这几个问题?
- 主节点挂了能否自动切换连接?目前需要手工切换。
- 主节点的写压力过大如何解决?
- 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大?
- 就算对从节点路由实施路由访问策略能否做到自动扩展?
还有这么多问题,有其他解决方案吗?后面的文章我们接着搞。
网友评论