MongoDB数据库集群的配置与使用
一、数据备份
最流行保险的办法是使用master-slave模式,然后在slave机器上先获得写入锁,让其他不能再写入,然后备份所有数据文件再解锁,这样不会影响master在系统中的使用
一般需要备份的slave的机器可以加上延时同步
二、配置master、slave模式
如果我们要启用Master/Slave模式,而且开启了Auth功能
则需要同时在Master和Slave上的local数据库上增加一名为repl的用户和密码:
use local
db.addUser('repl','password')
在master需要加上oplogSize选项,指定日志大小
--oplogSize命令行参数(与--master一同使用)配置用于存储给从节点可用的更新信息占用的磁盘空间(M为单位),如果不指定这个参数,默认大小为当前可用磁盘空间的5%(64位机器最小值为1G,32位机器为50M)。
1、从机器第一次启动(默认情况下第一次启动系统会自动从master机器复制文件到slave,但是如果数据库很大,会非常耗时)
slave第一次启动时最好是用scp命令把主机器的mongodb的所有目录和文件远程拷贝
到从机器上去,,否则启动从的时候会报错(mongodb ERROR: Client::~Client _context should
be null but is not; client:replslave)
如果出现这个错误, 只需要把数据文件data目录下的所有文件删除,重新启动即可
2、在slave从数据库服务器上查看是否和主机连接配置正确
db.printSlaveReplicationInf
如果成功将会出现以下信息
3、最好不要加--slavedelay延迟,这样的话当插入数据从slave查询时会查不到,如果定义了该值系统可能会延迟的时间不止设置的值
一般是把slave做为延时备份,不需要实时查询时可以使用该参数
4、--autoresync=true
参数会在系统发生意外情况造成主从数据不同步时,可使从节点在不同步情况发生10秒钟之后,自动重启复制操作(从节点在10分钟以内自动重新同步数据的操作只会执行一次)。
(该参数仅能保证在slave down机期间master的所有操作在oplog中都能记录下,如果slave
down机时间太长,oplog里的记录都有给覆盖了___因为oplog是固定大小的,那么就只能进行全量的复制)
如何判断是否需要全部重新同步:
在master机器执行
db.printReplicationInfo()
configured oplog size:
log length start to end: 262641secs (72.96hrs)
oplog first event time:
oplog last event time:
now:
它会显示oplog日志的开始时间,结束时间
在slave机器执行
>db.printReplicationInfo()
this is a slave, printing slave replication info.
source:
它记录slave机器同步的最后时间,如果该时间在master机器的oplog first event time, oplog last
event time范围之内,表示可以通过oplog进行继续同步;否则就只能全量重新同步
5、全量复制
当新加一台slave机器或slave down的时间太久,master中的oplog没有记录下所有的操作时需要进行全部的复制
有下面2种方法
6、该种配置slave机器只能进行读,如果进行写就会出错:
Exception in thread "main" com.mongodb.MongoException: not
master
7、它不能进行故障自动转移,适用于mongodb低版本(<1.6) 在高版本中使用下面的方式进行复制,他能进行故障自动转移
8、典型配置
master的配置
port = 27017
master = true
fork = true
auth = true
journal = true
dbpath = /data/db
logpath = /var/log/mongodb.log
logappend = true
oplogSize = 500
slave的配置
port = 27017
slave = true
source = 10.10.9.116:27017
only = zqc_db
autoresync = true
fastsync=true
fork = true
auth = true
journal = true
dbpath = /data/db
logpath = /var/log/mongodb.log
http://www.mongodb.org/display/DOCS/Replica+Set+Configuration介绍了该种方式的配置详情
数据库自动协调某个时间点上的主从关系。开始的时候,数据库会判断哪个是从哪个是主,一旦主服务器负载过高或down掉,另一台就会自动成为主服务器
启动mongod时需要如下参数
port = 10001
rest=true
replSet=zqc (set集名字)
fork = true
journal = true
dbpath = /data/db_1
logpath = /var/log/mongodb_1.log
logappend = true
在116,117上启动4个mongodb实例,其中三个作为完成数据库,一个作为arbiter,arbiter只参与投票,不存储具体数据
在任意机器上mongo让后初始化
>cfg = { _id: "zqc", members: [
... { _id:0, host:"10.10.9.116:10001" },
... { _id:1, host:"10.10.9.116:10002" },
... { _id:2, host:"10.10.9.117:10001"},
{ _id:3, host:"10.10.9.117:10002",arbiterOnly:true}
... ]}
>rs.initiate(cfg)
通过rs.status()来查看集群状态
> rs.isMaster();
>
> // view existing config
> var c = rs.conf();
{_id: 'foo', members: [
}
>
> // reconfig
> c.members[2].priority = 0;
> c
{_id: 'foo', members: [
}
> rs.reconfig(c);
> // done. to see new config,and new status:
> rs.conf()
> rs.status()
上面是修改一个节点的priority=0 (表示该节点只能作为secondary节点,不能作为primary节点,即使在没有任何primary节点的时候)
可以通过如下方式动态增加、减少节点,增加裁判
rs.addArb("10.10.9.117:27017");//增加仲裁
rs.add("10.10.9.117:27017");增加节点
如果有更多的配置项,按下面方式增加
> // add an arbiter
> rs.add({_id: 3, host: "10.10.9.117:27017", arbiterOnly:
true})
>
> // add a hidden member
> rs.add({_id: 3, host: "10.10.9.117:27017", priority: 0,
hidden: true})
>
> // add a member with tags
> rs.add({_id: 3, host: "10.10.9.117:27017", tags: {dc : "nyc",
rack: "rack1"}})
通过如下链接查看ReplicaSet对应的命令项
http://www.mongodb.org/display/DOCS/Replica+Set+Commands
不要去试图改变每个节点的votes,如果想要设置首选的master,那么通过修改节点的priorities值
不要去修改每个节点的votes值,更好的做法是使用仲裁者
默认情况下,每个members成员拥有1票;必须获得大多数的投票才能成为primary节点;
大多数的定义是memembrs成员数/2+1
比如我配置有3个members,其中2个server,1个arbiter,当其中一个server
down掉后,剩余的1个server+arbiter拥有2票
他们可以把剩下的一个server选为primarty,因为它能达到大多数票数(3/2+1)
如果我配置了4个members,其中3个server,1个arbiter,当其中一个server
down掉后,剩下的能选出primarty ,但是如果有2个server down掉后
只剩下一个server+1个arbiter拥有2票,小于大多数票数的要求(4/2+1)
这时剩下的一个server始终不能成为primary,也就是说这时系统只能读,不能写
一般系统配置是2个server+1个arbiter
13435 not master and slaveok=false
所以在secondary的shell中想运行查询按下面方式运行:
rs.slaveOk(); // enable querying a secondary
db.users.find(...)
客户端使用如下方式进行连接:
四、分片
基础配置,参见"http://www.w3ccollege.org/index/cluster-structures-mongodb-sharding.html"
可以登录mongs,使用sh.help()来查看分片命令信息
使用体验: