`
mousehouse
  • 浏览: 30587 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MongoDB Replica Set的部署配置以及遇到的问题

阅读更多

本文介绍了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节点,建立目录如下:

cd /opt/programs/mongodb
mkdir data
mkdir data/20
mkdir data/21
mkdir data/22

 

 

启动脚本如下:

##########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

 

##########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

 

 ##########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节点。

 


打开客户端,并按照以下执行:

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驱动。


测试代码如下:

 

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);
 }
}

 执行上述单元测试,成功。

 

 

把上述代码稍作改变:

@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)

分享到:
评论
5 楼 bosh 2012-11-15  
现在的驱动貌似可以了,我刚照你这个跑了一遍,成功了
4 楼 diyunpeng 2012-10-03  
我测试了一下,Java的驱动应该是在内部抓住类似的异常处理了。
3 楼 liuxuejin 2012-06-08  
你确认你的这个配置用到线上方案??? 连认证都没有哦?
2 楼 mousehouse 2011-03-02  
谢谢你的回复,请仔细关注我代码中下面的一段:

6.  for(int i = 1; i <= count; i++){  
7.   try{  
8.    col.insert(new BasicDBObject("seq", i+""));  
9.   }catch(MongoException e){  
10. 
11.   }  

这里我已经捕获了insert可能抛出的异常。

你在Python里面正常,那么可能就是Java的驱动的问题了。
1 楼 hellotoy 2010-11-04  
貌似是你程序本身有问题, 文档里提到在这种情况下连接会发生异常,需要捕获异常以后重连才可以连上. 至少我在python里测试是ok的

相关推荐

    MongoDB的replica set的部署,检测优化,

    MongoDB的复制集(Replica Set)是一种高可用性架构,用于确保数据的冗余和容错性。在MongoDB中,复制集是由多个具有相同数据副本的节点组成,其中一个是主节点(Primary),其余是次级节点(Secondary)。主节点...

    k8s 安装 mongodb 分片(Sharding)+ 副本集(Replica Set)

    在部署 MongoDB 分片(Sharding)和副本集(Replica Set)后,我们需要配置 MongoDB 的配置文件,以便 MongoDB 可以连接到 Kubernetes 集群并使用持久存储。 本解决方案的优点主要包括: * 高可用性:MongoDB 分片...

    mongodb Replica Sets +Sharding高可用集群搭建

    在大型分布式系统中,为了实现高可用性和水平扩展,MongoDB提供了两种关键特性:副本集(Replica Sets)和分片(Sharding)。这篇博客将探讨如何搭建MongoDB的副本集和分片集群。 首先,我们来理解一下MongoDB的...

    mongodb replica set 配置高性能多服务器详解

    配置MongoDB Replica Set的基本步骤如下: 1. **创建数据目录**:为每个成员创建独立的数据库目录,如在示例中创建了`/var/lib/mongodb_2`和`/var/lib/mongodb_3`。 2. **配置文件**:编写配置文件,如`/etc/...

    C#开发的Mongodb集群自动部署工具

    4. MongoDB Replica Set 自动部署.exe和MongDB Replica Set 自动部署.pdb:这是实际的自动部署程序和其对应的调试信息文件。exe文件是可执行程序,可以直接运行在Windows环境下,通过SSH连接到Linux服务器并执行部署...

    K8s 部署 MongoDB(副本集)

    mongodb的集群搭建方式主要有三种,主从模式,Replica set模式,sharding模式, 三种模式各有优劣,适用于不同的场合,属Replica set应用最为广泛,主从模式现在用的较少,sharding模式最为完备,但配置维护较为复杂 ...

    Mongodb_集群分片部署

    Mongodb_集群分片部署 Mongodb_集群分片部署 Mongodb_集群分片部署

    mongodb的大型分布式部署

    - **路由器(Router)**:作为客户端与分片集群之间的桥梁,它负责接收客户端的请求,然后根据请求的内容以及配置服务器中的元数据信息,将请求转发到正确的分片上执行。 ##### 1.4 客户端的角色 - **客户端**:...

    高可用的MongoDB集群部署实践

    在部署过程中,需要遵循MongoDB官方提供的最佳实践,如确保每个分片都配置为Replica Set以保证数据的高可用性和一致性。同时,需要为数据集合指定合适的shardkey,以便MongoDB可以智能地分配数据到不同的分片上。 ...

    mongoDB集群部署文档借鉴.pdf

    随着数据量的增长,单台服务器的存储能力和处理能力将面临极大的挑战,MongoDB 的集群部署模式可以满足大规模应用的需求。本文档将详细介绍 MongoDB 集群部署的架构、配置和部署步骤。 架构介绍 MongoDB 集群部署...

    Mongodb的ReplicaSets+Sharding架构(window篇)

    MongoDB的Replica Sets+Sharding架构是大数据时代下应对高可用性和可扩展性需求的重要解决方案。本篇文章将深入探讨这两个关键特性在Windows环境下的应用。 **副本集(Replica Sets)** MongoDB的副本集是一种高可用...

    MongoDB复制集集群配置文件.rar

    1. `replicaSet`:设置复制集的名称。 2. `net`:网络设置,如端口、绑定IP等。 3. `storage`:数据存储配置,如日志路径、数据文件位置等。 4. `systemLog`:日志记录配置,如日志级别、输出位置等。 5. `security`...

    mongodb分布式安装部署

    本文将详细介绍MongoDB的分布式安装部署过程,以及如何进行复制集的配置与测试。 一、MongoDB的安装与配置 1. 下载安装:首先,你需要从MongoDB官网下载适合你操作系统的安装包。在Windows、Linux或macOS上,根据...

    MongoDB集群部署文档.docx

    MongoDB 集群部署指南 MongoDB 集群是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建 MongoDB 系统。要构建一个 MongoDB Sharding Cluster,需要三种角色:Shard Server、...

    mongodb高可用所需yaml

    5. **Replica Set**:MongoDB的高可用性通常通过副本集(Replica Set)实现,每个副本集包含多个数据节点,每个节点都有自己的数据副本。副本集可以容忍单点故障,保持数据一致性,并提供读写分离的能力。 6. **...

    mongodb集群配置文档

    - **复制集**(Replica Set):为确保数据的高可用性,每个分片可以配置成一个复制集。 #### 三、分片与集群的部署步骤 **1. Mongodb的安装** 首先需要在各台服务器上安装MongoDB。根据提供的部分内容,可以看到...

    mongoDB集群部署文档

    在部署 MongoDB 集群前,你需要确保软件安装到位,防火墙关闭(以避免可能的通信问题)。然后,为每个 mongod 实例创建数据目录,并配置副本集。 配置副本集的步骤如下: 1. 在 Server1、Server2 和 Server3 上启动...

    mongodb主从结构的配置

    在实际应用中,主从复制只是MongoDB高可用方案的一种,还有更复杂的副本集(Replica Set)方式,它提供了更高级别的数据安全性和自动故障恢复功能。但无论选择哪种方式,理解和掌握主从结构配置是迈入MongoDB高可用...

    单台windows搭建mongoDb主从集群

    4. **配置复制集**:在每个节点(包括主节点和从节点)上,需要在配置文件中启用复制集模式,并设置replicaSet参数,如`replicaSet=myReplicaSet`。还需要指定每个节点的角色,如`hidden=true`(隐藏从节点,只用于...

Global site tag (gtag.js) - Google Analytics