mongodb 集群方案

mongodb集群方案

Mongodb的三种集群方式的搭建:Replica Set / Sharding / MasterSlaver。

本文档只说明副本集集群搭建方式,其他方案请自行搜索。

mongodb的安装请参考其他文档

Replica Set(副本集)

  • 可以实现自动的failover和自动的recovery,。
  • 由两个或者更多的节点组成,实现彼此的复制。
  • 自动选择primary节点,没有一个节点是固定的primary。
  • 解决单点失效的问题
  • mongos会自动发现一个replica set的primary节点发生变化,并将写操作发送给这个新的primary节点。

官方文档 http://docs.mongodb.org/manual/core/replication-introduction/

如下图:


  • Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。
  • 主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。
  • 默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。
  • 但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上,这个设置叫做Read Preference Modes。
  • 仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。
  • 这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。
  • 如果启用的mongodb服务器是偶数台服务器,则有必要增加一个仲裁节点,否则主节点出问题了不能重新选择某个服务器作为新的主节点,。

Replica Set(副本集) 搭建

  • 建立数据文件夹

    一般情况下不会把数据目录建立在mongodb的解压目录下,不过这里方便起见,就建在mongodb解压目录下吧。

    mkdir -p /usr/local/webserver/mongodb/data/
    mkdir -p /usr/local/webserver/mongodb/data/
    mkdir -p /usr/local/webserver/mongodb/data/
    #三个目录分别对应主,备,仲裁节点
    

  • 建立配置文件

    由于配置比较多,所以我们将配置写到文件里。

    #ip:192.168.51.10
    #config:/usr/local/webserver/mongodb/mongo.conf  
    dbpath=/usr/local/webserver/mongodb/data/                  #数据存放目录
    logpath=/usr/local/webserver/mongodb/data/mongodb_logs.log #日志文件路径,这个不是目录哦
    pidfilepath=/var/run/mongo.pid     #进程文件
    directoryperdb=true                #每个数据库单独存放在一个目录
    logappend=true                     #以追加的方式记录日志
    replSet=repmongo                   #Replicate set 的名字(随意)
    bind_ip=192.168.51.10,127.0.0.1    #监听地址
    port=27017                         #监听端口
    oplogSize=1000                     #oplog文件的大小,单位Mb,默认为磁盘剩余的5%,后期修改较为麻烦,建议根据业务读写比例,做合理修改
    fork=true                          #以后台方式运行进程
    
    #ip:192.168.51.11
    #config:/usr/local/webserver/mongodb/mongo.conf  
    dbpath=/usr/local/webserver/mongodb/data/                  #数据存放目录
    logpath=/usr/local/webserver/mongodb/data/mongodb_logs.log #日志文件路径,这个不是目录哦
    pidfilepath=/var/run/mongo.pid     #进程文件
    directoryperdb=true                #每个数据库单独存放在一个目录
    logappend=true                     #以追加的方式记录日志
    replSet=repmongo                   #Replicate set 的名字(随意)
    bind_ip=192.168.51.11,127.0.0.1    #监听地址
    port=27017                         #监听端口
    oplogSize=1000                     #oplog文件的大小,单位Mb,默认为磁盘剩余的5%,后期修改较为麻烦,建议根据业务读写比例,做合理修改
    fork=true                          #以后台方式运行进程
    
    #ip:192.168.51.12
    #config:/usr/local/webserver/mongodb/mongo.conf  
    dbpath=/usr/local/webserver/mongodb/data/                  #数据存放目录
    logpath=/usr/local/webserver/mongodb/data/mongodb_logs.log #日志文件路径,这个不是目录哦
    pidfilepath=/var/run/mongo.pid     #进程文件
    directoryperdb=true                #每个数据库单独存放在一个目录
    logappend=true                     #以追加的方式记录日志
    replSet=repmongo                   #Replicate set 的名字(随意)
    bind_ip=192.168.51.12,127.0.0.1    #监听地址
    port=27017                         #监听端口
    oplogSize=1000                     #oplog文件的大小,单位Mb,默认为磁盘剩余的5%,后期修改较为麻烦,建议根据业务读写比例,做合理修改
    fork=true                          #以后台方式运行进程
    noprealloc=true                    #不预先分配存储
    

  • 启动mongodb

    ip:192.168.51.10

    /usr/local/webserver/mongodb/bin/mongo -f /usr/local/webserver/mongodb/mongo.conf  
    
    ip:192.168.51.11
    /usr/local/webserver/mongodb/bin/mongo -f /usr/local/webserver/mongodb/mongo.conf  
    
    ip:192.168.51.12
    /usr/local/webserver/mongodb/bin/mongo -f /usr/local/webserver/mongodb/mongo.conf  
    
    注意配置文件的路径一定要保证正确,可以是相对路径也可以是绝对路径。

  • 配置主,备,仲裁节点
    • 可以通过客户端连接mongodb,也可以直接在三个节点中选择一个连接mongodb。
      /usr/local/webserver/mongodb/bin/mongo 192.168.51.10:27017   #ip和port是某个节点的地址  
      >use admin  
      >config={ _id:"repmongo", members:[ {_id:0,host:'192.168.51.10:27017',priority:2}, {_id:1,host:'192.168.51.10:27017',priority:1},   
      {_id:2,host:'192.168.51.10:27017',arbiterOnly:true}] };  
      >rs.initiate(config)             #使配置生效  
      
    • config 是可以任意的名字,当然最好不要是mongodb的关键字,conf,config都可以。
    • 最外层的_id表示replica set的名字,members里包含的是所有节点的地址以及优先级。
    • 优先级最高的即成为主节点,即这里的192.168.51.10:27017。特别注意的是,对于仲裁节点,需要有个特别的配置——arbiterOnly:true。
    • 这个千万不能少了,不然主备模式就不能生效。
    • 配置的生效时间根据不同的机器配置会有长有短,配置不错的话基本上十几秒内就能生效,有的配置需要一两分钟。
    • 如果生效了,执行rs.status()命令会看到如下信息:
      {  
              "set" : "repmongo",  
              "date" : ISODate("2013-01-05T02:44:43Z"),  
              "myState" : 1,  
              "members" : [  
                      {  
                              "_id" : 0,  
                              "name" : "192.168.51.10:27017",  
                              "health" : 1,  
                              "state" : 1,  
                              "stateStr" : "PRIMARY",  
                              "uptime" : 200,  
                              "optime" : Timestamp(1357285565000, 1),  
                              "optimeDate" : ISODate("2013-01-04T07:46:05Z"),  
                              "self" : true  
                      },  
                      {  
                              "_id" : 1,  
                              "name" : "192.168.51.11:27017",  
                              "health" : 1,  
                              "state" : 2,  
                              "stateStr" : "SECONDARY",  
                              "uptime" : 200,  
                              "optime" : Timestamp(1357285565000, 1),  
                              "optimeDate" : ISODate("2013-01-04T07:46:05Z"),  
                              "lastHeartbeat" : ISODate("2013-01-05T02:44:42Z"),  
                              "pingMs" : 0  
                      },  
                      {  
                              "_id" : 2,  
                              "name" : "192.168.51.12:27017",  
                              "health" : 1,  
                              "state" : 7,  
                              "stateStr" : "ARBITER",  
                              "uptime" : 200,  
                              "lastHeartbeat" : ISODate("2013-01-05T02:44:42Z"),  
                              "pingMs" : 0  
                      }  
              ],  
              "ok" : 1  
      }  
      

      如果配置正在生效,其中会包含如下信息:

      "stateStr" : "RECOVERING"  
      
    • 同时可以查看对应节点的日志,发现正在等待别的节点生效或者正在分配数据文件。
    • 现在基本上已经完成了集群的所有搭建工作。至于测试工作,可以留给大家自己试试。
    • 一个是往主节点插入数据,能从备节点查到之前插入的数据(查询备节点可能会遇到某个问题,可以自己去网上查查看)。
    • 二是停掉主节点,备节点能变成主节点提供服务。
    • 三是恢复主节点,备节点也能恢复其备的角色,而不是继续充当主的角色。
    • 二和三都可以通过rs.status()命令实时查看集群的变化。

如果从库无法读,解决办法

rs.slaveOk();       //从库开启

  • ecstore中配置

    修改ecstore2.0的config文件

    #仲裁节点ip不需要连接,所以这里不用填
    define('MONGODB_SERVER_CONFIG', 'mongodb://192.168.51.10:27017,192.168.51.11:27017');
    

內容目录

上一个主题

三机方案

下一个主题

ecstore2.0部署文档

快速搜索

输入相关的模块,术语,类或者函数名称进行搜索