美文网首页DBmongodb程序员
MongoDB集群搭建 —— 主从模式

MongoDB集群搭建 —— 主从模式

作者: ChainZhang | 来源:发表于2017-09-13 18:14 被阅读244次

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


    问题

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

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

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

    相关文章

      网友评论

        本文标题:MongoDB集群搭建 —— 主从模式

        本文链接:https://www.haomeiwen.com/subject/tpslsxtx.html