2010-12-17 7 views
4

MongoDB를 복제본 설정에서 시험 해보고 확장/수행/대응 방법을 살펴 보았습니다.Morphia로 MongoDB 클러스터링 테스트하기

나는 10,000 개의 간단한 무작위 문서를 하나의 컬렉션에 저장하기 위해 Morphia (Mongo's Java drivers 위의 POJO 매핑 레이어)을 사용했습니다. 나는 @Entity(concern="REPLICAS_SAFE") 어노테이션으로 나의 POJO (아래 주석에) 주석을 달았으며, 데이터베이스로 보내진 데이터가 안전하게 지속될 수 있기를 바랍니다.

내 POJO는 ObjectId 필드 (몽고의 기본 키 타입), 임의의 길이 (최대 20 자)의 임의의 문자의 StringRandom.nextLong()를 사용하여 생성 된 long들로 구성되었다.

내 코드는 다음과 같은 : 내가 시작 후, 네 개 노드 복제-설정 클러스터를 설정 위의 프로그램을 실행하고,

for (int i=0;i<10000;i++) { 
    final MyData data = new MyData(); 

    boolean written = false; 
    do { 
     try { 
     ds.save(data); //ds is of type DataStore 
     written=true; 
     } catch (Exception e) { 
      continue; 
     } 
    } 
    while (!written); 
} 

은유 적으로 무슨 일이 있었는지보기 위해 케이블을 잡아 당겨.

원하는 결과는 모든 문서를 데이터베이스에 성공적으로 유지할 때까지 실행되는 프로그램입니다.

  • 자바는 10,000 항목을 저지른하지만 데이터베이스는 10,000
  • 자바가 < 10K 데이터베이스를 저지른보고 <을 가진보고 : 몇 간다 후

    실제 결과는, 중 하나였다 백업 가져 있었다 같은 값 또는 더 적은

  • 다 잘

한 경우 작업 노드 중 하나를보고 실제로 PRIMARY 노드를 따라갈 수 없으며 삭제 된 데이터베이스로 처음부터 시작되어야했습니다. 이것은 opfile 매개 변수가 2 기가로 증가 했음에도 불구하고 매우 단순한 데이터 10,000 개를 재생할 수있을 것이라고 생각했을 것입니다. 당신이 알아야 할

다른 것들 :

이 모든 단일 하드웨어에서 실행되는
  1. (2 기가 펜티엄 D!) 128 메가 두 개의 32 비트 우분투 서버 버추얼 인스턴스에서 실행되는 클러스터 Windows XP 호스트에서 실행되는 Java 클라이언트와 각각의 RAM이 필요합니다. 2 개의 mongod 프로세스가 각 가상 컴퓨터에서 실행되었고, 하나의 가상 컴퓨터에서도 실행중인 arbiter이 실행되었습니다.
  2. 두 개의 가상화 된 컴퓨터의 시계가 몇 초 만에 꺼졌습니다 (이 문제를 해결하기 위해 VirtualBox Guest Additions를 설치해야 함). 그러나 큰 금액은 아닙니다. 10gen은 클러스터링에 시간 문제가 있어서는 안된다고 말합니다. 나는 그것을 언급 할 것이라고 생각했다.

내가 32 비트 시스템에서 몽고와 2 기가 제한을 알고, other people 레코드 사라지고 있었다, 나는 기계가 내가 테스트를하고 있어요 알고 있어요 사실은 정확히하지 않습니다에 상위 500 개 (왜 내가 선택한 데이터가 작 았던 지)에 있지만 내 테스트가 작동하면 잘 작동합니다.

아직 몽고가 아직 준비가되지 않았다는 증거가 있습니까? 아니면 본질적으로 잘못된 것을하고 있습니까?

저는 1.6.5를 사용하고 있습니다.

통찰력, 힌트, 팁, 설명, 비평 등 크게 감사드립니다!

ps : 나는 비틀 거리고 있지 않습니다. 좋은 데이터 유형을위한 NoSQL에 대한 아이디어가 정말 좋기 때문에 실제로 작동시키고 싶습니다. 그러나 지금까지는별로 운이 없었습니다!

답변

2

MongoDB는 현재 많은 장소에서 "황금 시간대에"확실히 사용되고 있습니다. 따라서 여기에서 어떤 일이 벌어 질지 살펴볼 가치가 있습니다.

그래서 여기 스타터 몇 가지 질문은 :

  1. 방법 "새의 MyData()"작동합니까? 기존 ID를 망치는 것이 가능합니까?
  2. 과정 중에 복제본 세트가 "가동 중"입니까? 오류가 발생하면 "계속"하고 있으므로 오류 처리 방법을 잘 모릅니다. Morphia가 정확하게 오류를 버블 링합니까?

"테스트 케이스"를 작성하고 작성해 주셔서 감사 드리며, 사례를 통해 한 단계 더 깊이 파고들 필요가 있다고 생각합니다. 다음 두 가지를 시도해 볼 수 있습니까?

  1. iMyData_id을 설정합니다. 이 방법으로 을 볼 수 있습니다. 여기서 당신은 죽어 가고있는 과정에서입니다.
  2. 오류가 발생할 때마다 console.write이나 그와 동등한 작업을 수행하십시오. 데이터가 실제로 어디로 갔는지 파악할 수 없는지 확인하십시오.
  3. 동일한 조치를 취하면 성공적으로 저장 될 때마다 console.write을 수행하십시오. 이 단계를 수행하면

, 당신은 무슨 일이 일어나고 있는지의 로그를 얻을 것이다 당신은 또는 저장하고, DB에있는 데이터가 비교되지 않는 것을 볼 수 있습니다.

나는 이것이 약간 지루하다고 생각하지만 두 가지 문제 중 하나가 있다고 생각합니다.이 단계를 수행하면이 문제를 해결하는 데 도움이됩니다.

어느 1. 모르핀이 오류를 제대로보고하지 않는 당신은 복제와 실제 문제를 발견하고 2 (제대로 처리되지는) 3. 당신은 "최종 일관성"에 의해 체포 당하고을 설정합니다.

어느 쪽이든 자세한 내용은 문제를 해결할 수 있어야합니다.

+1

답장을 보내 주셔서 감사 드리며 일찍 답장을 보내지 않으 셨다가 죄송합니다. 그 다음 휴일이 다가오고 있습니다. 새해에도이 사실을 잘 알고 있습니다. – Rich

+0

안녕하세요, 저는 휴일에 대해 알고 있습니다. 이 테스트가 비교적 간단하다면 다른 사람들이 자신이하는 일을 재현 할 수있게하는 몇 가지 요점을 게시 해 볼 수도 있습니다. 시작 프로세스를 보여주는 스크립트 하나와 업데이트/테스트 사례를 보여주기위한 또 다른 스크립트가 있어야합니다. –