mongodb replica sets搭建及使用

由于机器紧张,没办法搞分片(sharding),而只是用了复制集这个功能,一下介绍下自己这几天的实验。

 

环境:

目录结构

mongo_data

|--conf

|--config.js

|--rs0.cnf

|--rs1.cnf

|--rs2.cnf

|--data

|--r0

|--r1

|--r2

|--key

|--r0

|--r1

|--r2

|--log

|--r0.log

|--r1.log

|--r2.log

|--run

|--run_config.sh

|--run_rs0.sh

|--run_rs1.sh

|--run_rs2.sh

 

举几个文件,其他类似:

rs0.cnf:

 

replSet=rs1 keyFile=/home/madding/output/mongodb/replica_set/key/r0 dbpath=/home/madding/output/mongodb/replica_set/data/r0 logpath=/home/madding/output/mongodb/replica_set/log/r0.log port=10240

 

config.js:

 

var config_rs1={ _id:'rs1', members:[ {_id:0, host:'127.0.0.1:10240', priority:1}, {_id:1, host:'127.0.0.1:11240'}, {_id:2, host:'127.0.0.1:12240'}] } rs.initiate(config_rs1); rs.slaveOk(); printjson('status info:'); printjson(rs.status()); printjson('result info: '); printjson(rs.isMaster());

 

r0:

 

ANKDIUOJHKJDLKFJHDOUDOJFKLDJ

 

随便复杂,保证r0,r1,r2一致即可

 

run_config.sh:

 

!/bin/bash MONGODB_HOME=/usr/mytools/mongodb $MONGODB_HOME/bin/mongo ../conf/config.js --port 10240 --quiet exit

 

run_rs0.sh:

 

#!/bin/bash MONGODB_HOME=/usr/mytools/mongodb $MONGODB_HOME/bin/mongod -f ../conf/rs0.cnf --logappend --fork exit

 

运行顺序:

1.分别启动run_rs0.sh,run_rs1.sh,run_rs2.sh,ps看下进程是否都启动成功

2.运行run_config.sh,如果信息显示正常,说明已经建立成功。

 

 

测试场景:

1.kill r0进程:

mongo客户端:

自动切换primary;

r0客户端可查询,不可插入;

java驱动:

采用集群连接,发现可正常查询,插入,业务不受影响

说明:如果是kill -9方式,可能会导致mongo对应实例下的lock文件还在,删除掉后才能重启,要不然会重启失败

 

2.恢复r0进程:

r0 mongod数据同步

r0没有切换为primary ,主从维持在kill时的水平


3.当两个mongod实例(包括SECONDARY和PRIMARY组合)挂掉,是否可对外提供服务:

mongo客户端:指定端口的可以连接,但是由于两个挂了导致没办法把SECONDARY切换到PRIMARY,只能查询不能修改

java驱动:根据现象提示

 

Exception in thread "main" com.mongodb.MongoException: can't find a master at com.mongodb.DBTCPConnector.checkMaster(DBTCPConnector.java:436) at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:211) at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:305) at com.mongodb.DBCursor._check(DBCursor.java:369) at com.mongodb.DBCursor._hasNext(DBCursor.java:504) at com.mongodb.DBCursor.hasNext(DBCursor.java:529) at ReplicaSets.main(ReplicaSets.java:57) 也就是此时没办法对外提供服务,虽然还有一个SECONDARY存活

 

注:如果最后一个保留下来的是PRIMARY,虽然短暂提供服务,但是一会儿后就自动切换为SECONDARY。

 

4.当两个实例挂掉,重启一个实例,是否可对外提供服务:

mongo客户端:此时自动切换一台为PRIMARY,查询操作正常

java驱动:只要设置自动重连,等待几秒即可恢复正常

注:发现在一台机器中操作,过程中出现一个实例把两一个socket端口占用现象,主要是因为web监控的端口,1000间隔。

建议启动是先启动初始的PRIMARY最后启动

 

5.两个mongo实例是否可构建replica sets:

基于以上分析,虽然两个能构建复制集,但是由于一个挂掉,另一个自动切换为SECONDARY,做不到热备,因此没有价值。

 

6.三台同时挂掉,重启是否正常:

三台挂掉,重启后,会出现其中一台recovering,但是之后三台状态就能恢复正常,一个primary,两个secondary

 

 

------
author: madding.lip

date: 2012.02.09

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值