MongoDB Replica Set的部署配置以及遇到的问题 linux
2013-06-20 10:32
519 查看
本文介绍了MongoDB Replica Set 服务节点的的部署和配置过程,提供了部署脚本和测试代码。并就特定版本说明了使用中遇到的问题。
1.Replica Set介绍
Replica Set是mongoDB将在1.6版本中推出的一项新功能,用来替代已有的Replica Pair,支持多于两个节点的自动的故障恢复,目前这个功能处于发布前的阶段。在它的1.5.7(1.6-rc2)版本中提供了一个Replica Set的测试版本,这个版本在2010年7月30日刚刚发布,本文内容全部基于这个版本。
2.服务部署和配置
为了测试,在一台服务器上启动3个mongodb节点,建立目录如下:
Java代码
cd /opt/programs/mongodb
mkdir data
mkdir data/20
mkdir data/21
mkdir data/22
启动脚本如下:
Java代码
##########start20.sh
#!/bin/sh
MONGO_HOME=/opt/programs/mongodb
MONGO_DATA=$MONGO_HOME/data
$MONGO_HOME/bin/mongod --port 27020 --replSet rep/rscat:27021 --dbpath $MONGO_DATA/20/ --oplogSize 2048
Java代码
##########start21.sh
#!/bin/sh
MONGO_HOME=/opt/programs/mongodb
MONGO_DATA=$MONGO_HOME/data
$MONGO_HOME/bin/mongod --port 27021 --replSet rep/rscat:27020 --dbpath $MONGO_DATA/21/ --oplogSize 2048
Java代码
##########start22.sh
#!/bin/sh
MONGO_HOME=/opt/programs/mongodb
MONGO_DATA=$MONGO_HOME/data
$MONGO_HOME/bin/mongod --port 27022 --replSet rep/rscat:27020 --dbpath $MONGO_DATA/22/ --oplogSize 2048
在3个不同的控制台中执行上述脚本,启动3个服务节点,从log日志可以看到,三个节点相互协商出一个节点作为Primary,另外两个自动作为Secondary节点。
打开客户端,并按照以下执行:
Java代码
bin/mongo --port 27020
MongoDB shell version: 1.5.6
connecting to: rscat:27020/test
> use admin
switched to db admin
> cfg = {
... _id: 'rep',
... members: [
... { _id: 0, host: 'rscat:27020' },
... { _id: 1, host: 'rscat:27021' },
... { _id: 2, host: 'rscat:27022' }
... ]
... }
> rs.initiate(cfg)
{
"info" : "Config now saved locally. Should come online in about a
minute.",
"ok" : 1
}
至此,Replica Set配置完成,下面可以进行测试了。
3.用MongoDB自带客户端mongo进行测试
在控制台中用Ctrl-C杀死Primary服务,从服务器的log日志,以及从客户端查询都可以看到,另外两个节点会协商出其中的一个节点作为Primary。
执行启动脚本,启动刚刚杀死的服务。
查看replica set状态的命令: rs.status()
查看replica set配置的命令: rs.conf()
查看服务节点是否为Primary的命令: db.isMaster();
4.java代码测试
写这篇文章的时间是2010年8月2日,mongoDB java驱动的正式版本是2.0,尚不支持Replica Set的访问,
查看官网,发现即将发布的2.1版是支持Replica Set的。下载其java driver的源代码,自己编译生成驱动的jar(暂命名为mongo-driver.jar),用刚生成的jar替换测试工程中的mongodb驱动。
测试代码如下:
Java代码
package test;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertEquals;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.mongodb.ServerAddress;
public class TestReplicaSet {
private int count = 10;
private Mongo mongo = null ;
@Before
public void setUp(){
List<ServerAddress> setList = new ArrayList<ServerAddress>();
try {
setList.add(new ServerAddress("192.168.0.48", 27020));
setList.add(new ServerAddress("192.168.0.48", 27021));
setList.add(new ServerAddress("192.168.0.48", 27022));
} catch (UnknownHostException e) {
e.printStackTrace();
}
mongo = new Mongo(setList);
}
@Test
public void testInsertAndGet(){
DB db = mongo.getDB("A");
DBCollection col = db.getCollection("B");
col.drop();
for(int i = 1; i <= count; i++){
try{
col.insert(new BasicDBObject("seq", i+""));
}catch(MongoException e){
}
// System.out.println("i=" + i);
}
DBCursor cursor = col.find();
int j = 0;
while(cursor.hasNext()){
DBObject o = cursor.next();
j++;
assertNotNull(o.keySet());
}
assertEquals(j, 10);
}
}
执行上述单元测试,成功。
把上述代码稍作改变:
Java代码
@Test
public void testInsertAndGet(){
DB db = mongo.getDB("A");
DBCollection col = db.getCollection("B");
col.drop();
for(int i = 1; i <= count; i++){
try{
col.insert(new BasicDBObject("seq", i+""));
}catch(MongoException e){
}
if(i == 500){
System.out.println("i=" + i);
try {
Thread.sleep(12000);
} catch (InterruptedException e) {
}
}
}
DBCursor cursor = col.find();
int j = 0;
while(cursor.hasNext()){
DBObject o = cursor.next();
j++;
assertNotNull(o.keySet());
}
// assertEquals(j, count);
}
在insert执行到一半(500个)的时候,让程序暂时睡眠。在睡眠的12秒中之内,杀死Primary的服务,此时剩余的两个服务会迅速的自动选出一个作为Primary。
12秒的睡眠结束之后,程序继续运行,但驱动却不能找到新的Primary服务,剩余的insert无法继续执行,失败。发生问题服务器版本1.5.7 java驱动版本(2.0+2.1)/2!!!
5.结论:
截至目前,mongodb的replica set还在开发之中,虽然核心的功能已经基本完成,但很多外围的比如驱动等尚待完善。
6.参考文章
http://osdir.com/ml/mongodb-user/2010-07/msg01519.html (2010.8.2)
1.Replica Set介绍
Replica Set是mongoDB将在1.6版本中推出的一项新功能,用来替代已有的Replica Pair,支持多于两个节点的自动的故障恢复,目前这个功能处于发布前的阶段。在它的1.5.7(1.6-rc2)版本中提供了一个Replica Set的测试版本,这个版本在2010年7月30日刚刚发布,本文内容全部基于这个版本。
2.服务部署和配置
为了测试,在一台服务器上启动3个mongodb节点,建立目录如下:
Java代码
cd /opt/programs/mongodb
mkdir data
mkdir data/20
mkdir data/21
mkdir data/22
启动脚本如下:
Java代码
##########start20.sh
#!/bin/sh
MONGO_HOME=/opt/programs/mongodb
MONGO_DATA=$MONGO_HOME/data
$MONGO_HOME/bin/mongod --port 27020 --replSet rep/rscat:27021 --dbpath $MONGO_DATA/20/ --oplogSize 2048
Java代码
##########start21.sh
#!/bin/sh
MONGO_HOME=/opt/programs/mongodb
MONGO_DATA=$MONGO_HOME/data
$MONGO_HOME/bin/mongod --port 27021 --replSet rep/rscat:27020 --dbpath $MONGO_DATA/21/ --oplogSize 2048
Java代码
##########start22.sh
#!/bin/sh
MONGO_HOME=/opt/programs/mongodb
MONGO_DATA=$MONGO_HOME/data
$MONGO_HOME/bin/mongod --port 27022 --replSet rep/rscat:27020 --dbpath $MONGO_DATA/22/ --oplogSize 2048
在3个不同的控制台中执行上述脚本,启动3个服务节点,从log日志可以看到,三个节点相互协商出一个节点作为Primary,另外两个自动作为Secondary节点。
打开客户端,并按照以下执行:
Java代码
bin/mongo --port 27020
MongoDB shell version: 1.5.6
connecting to: rscat:27020/test
> use admin
switched to db admin
> cfg = {
... _id: 'rep',
... members: [
... { _id: 0, host: 'rscat:27020' },
... { _id: 1, host: 'rscat:27021' },
... { _id: 2, host: 'rscat:27022' }
... ]
... }
> rs.initiate(cfg)
{
"info" : "Config now saved locally. Should come online in about a
minute.",
"ok" : 1
}
至此,Replica Set配置完成,下面可以进行测试了。
3.用MongoDB自带客户端mongo进行测试
在控制台中用Ctrl-C杀死Primary服务,从服务器的log日志,以及从客户端查询都可以看到,另外两个节点会协商出其中的一个节点作为Primary。
执行启动脚本,启动刚刚杀死的服务。
查看replica set状态的命令: rs.status()
查看replica set配置的命令: rs.conf()
查看服务节点是否为Primary的命令: db.isMaster();
4.java代码测试
写这篇文章的时间是2010年8月2日,mongoDB java驱动的正式版本是2.0,尚不支持Replica Set的访问,
查看官网,发现即将发布的2.1版是支持Replica Set的。下载其java driver的源代码,自己编译生成驱动的jar(暂命名为mongo-driver.jar),用刚生成的jar替换测试工程中的mongodb驱动。
测试代码如下:
Java代码
package test;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertEquals;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.mongodb.ServerAddress;
public class TestReplicaSet {
private int count = 10;
private Mongo mongo = null ;
@Before
public void setUp(){
List<ServerAddress> setList = new ArrayList<ServerAddress>();
try {
setList.add(new ServerAddress("192.168.0.48", 27020));
setList.add(new ServerAddress("192.168.0.48", 27021));
setList.add(new ServerAddress("192.168.0.48", 27022));
} catch (UnknownHostException e) {
e.printStackTrace();
}
mongo = new Mongo(setList);
}
@Test
public void testInsertAndGet(){
DB db = mongo.getDB("A");
DBCollection col = db.getCollection("B");
col.drop();
for(int i = 1; i <= count; i++){
try{
col.insert(new BasicDBObject("seq", i+""));
}catch(MongoException e){
}
// System.out.println("i=" + i);
}
DBCursor cursor = col.find();
int j = 0;
while(cursor.hasNext()){
DBObject o = cursor.next();
j++;
assertNotNull(o.keySet());
}
assertEquals(j, 10);
}
}
执行上述单元测试,成功。
把上述代码稍作改变:
Java代码
@Test
public void testInsertAndGet(){
DB db = mongo.getDB("A");
DBCollection col = db.getCollection("B");
col.drop();
for(int i = 1; i <= count; i++){
try{
col.insert(new BasicDBObject("seq", i+""));
}catch(MongoException e){
}
if(i == 500){
System.out.println("i=" + i);
try {
Thread.sleep(12000);
} catch (InterruptedException e) {
}
}
}
DBCursor cursor = col.find();
int j = 0;
while(cursor.hasNext()){
DBObject o = cursor.next();
j++;
assertNotNull(o.keySet());
}
// assertEquals(j, count);
}
在insert执行到一半(500个)的时候,让程序暂时睡眠。在睡眠的12秒中之内,杀死Primary的服务,此时剩余的两个服务会迅速的自动选出一个作为Primary。
12秒的睡眠结束之后,程序继续运行,但驱动却不能找到新的Primary服务,剩余的insert无法继续执行,失败。发生问题服务器版本1.5.7 java驱动版本(2.0+2.1)/2!!!
5.结论:
截至目前,mongodb的replica set还在开发之中,虽然核心的功能已经基本完成,但很多外围的比如驱动等尚待完善。
6.参考文章
http://osdir.com/ml/mongodb-user/2010-07/msg01519.html (2010.8.2)
相关文章推荐
- 配置arm-linux-gcc教程以及可能遇到的问题
- 在Linux(CentOS6.2)服务器上配置hadoop时遇到的一些问题以及一些解决办法
- Linux安装与配置samb服务器的过程以及遇到的问题
- Linux 服务器下 tomcat9的安装部署(SSL证书部署)以及遇到的问题解决
- Nginx在Linux下的安装与配置,以及遇到问题的解决整理
- linux下xampp(apache)中配置域名访问,以及遇到的问题
- MongoDB Replica Set 配置 linux
- mongodb在Windows安装配置及遇到的问题、java连接测试
- ubuntu 配置anaconda以及遇到的问题
- [MongoDB] 安装MongoDB配置Replica Set
- 笔记本电脑上面安装linux网络配置以及ping通问题
- linux以及vim配置问题积累
- linux 编辑memcahed以及memcahed+php扩展遇到的问题
- 使用Linux过程中遇到的问题以及解决方案
- 20170724Linux下安装GDB以及调试时候遇到的问题延伸
- Windows下配置mysql5.7.17以及遇到的问题
- linux 下安装配置jboss as7以及部署应用
- java调用linux top命令的方法,以及遇到的一个问题
- s3c2410 linux 与主机telnet连接缓慢 以及ping通外网中遇到的问题
- weblogic 9.2 linux 安装部署遇到的一些问题