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()命令实时查看集群的变化。
- 可以通过客户端连接mongodb,也可以直接在三个节点中选择一个连接mongodb。
如果从库无法读,解决办法
rs.slaveOk(); //从库开启
- ecstore中配置
修改ECstore的config文件
#仲裁节点ip不需要连接,所以这里不用填 define('MONGODB_SERVER_CONFIG', 'mongodb://192.168.51.10:27017,192.168.51.11:27017');