2012-06-20 3 views
1

나는 MongoDB에 연결하기 위해 Doctrine ODM을 사용하고있다. 나는 3 개의 노드 복제본 세트를 가지고있다 : 2 개의 fulls와 하나의 arbiter. 복제는 고 가용성을 전제로하므로 노드간에 읽기를 분산시키려는 것이 아닙니다. 내 응용 프로그램은 not master and slaveok=false 메시지를 자주 사용하여 MongoCursorException을 로깅합니다. mongodb 로그에서 장애 조치 이벤트가 발생했고 주 서버가 변경되지 않았다는 어떠한 증거도 보이지 않습니다. 수정 : 페일 오버가 실제로 발생 했음, 그러나 not master and slaveok=false의 예외가 자주 나타나며 새 기본 노드가 성공적으로 선출 된 후 6 시간 후에도 나타납니다.Doctrine ODM/MongoDB가 쿼리를 다시 시도하지 않습니까?

어떻게해야합니까? doctrine-mongodb의 버전은 (experimental?) retry functionality이 포함되어 있지만 사용을 설정하는 쉬운 방법은 없습니다.

중요한지 확실하지 않지만 Symfony2 (v2.0) 앱입니다.

https://groups.google.com/d/topic/mongodb-user/6p710Rdycpg/discussion 우리가 재시도 (강조 광산)가 필요합니다 것을 의미한다 :

응용 프로그램이 이 있기 때문에 다시 시도/재 연결을 작성해야합니다

처럼 많이 올 수 과도 (네트워크) 오류의 수 정상 작업 중 롤링 업그레이드 프로세스.

Mongo PHP extension docs이를 설명하는 것 : 첫 번째 시도가 어떤 이유로 실패 할 경우

드라이버가 자동으로 "일반"쿼리 (안 명령) 몇 번을 다시 시도합니다. 이는 복제 세트 페일 오버 중에 예외를 거의 발생시키지 않지만 (일부는 여전히 처리해야하지만) 일시적인 네트워크 문제를 해결합니다.

doctrine-mongodb 나는 실제로 mongod와 대화하기 위해 PHP 확장을 사용했다고 생각했습니다. 그래서 나는 이든이든 재시도 구성에 대해 걱정해야하는지 여부에 조금 혼란스러워합니다.

문제의 일부를 해결했다고 생각합니다. this advice from Kristina Chodorow 다음 연결 문자열에서 제거했습니다. 더 이상 MongoCursorException이 표시되지 않으며 메시지는 not master and slaveok=false입니다. 나는 https://jira.mongodb.org/browse/PHP-392을 치고 있을지도 모른다.

그러나 페일 오버 중에 couldn't determine master 메시지와 함께 여전히 약간의 MongoCursorException이 발생합니다. 예를 들어, 나는 장애 복구를 수행했다. mongod 로그를 기반으로 몇 초 후에 새로운 기본 서버가 선출되었지만 웹 응용 프로그램은 5 분 후에도 해당 예외를 throw합니다.

답변

6

DoctrineMongoDBBundle의 2.0 분기에 해당하는 태그 중 하나 (현재 최대 2.2.1 개)를 사용하고 있다고 가정합니다. Symfony 2.1+ 호환성은 태그 버전 3 이상의 번들에 있습니다.

구성 클래스는 문서 관리자 수준에서 retry_queryretry_connect 옵션을 기본적으로 0으로 표시합니다. 나는이가 bundle documentation에서 언급되지 않았다 실현

doctrine_mongodb: 
    # Other proxy, hydrator and connection configuration options 

    default_document_manager: dm1 

    document_managers: 
     dm1: 
      retry_query: 1 
      retry_connect: 1 
      # Other mapping, metadata and DM options follow 

, 그래서 난 그냥 this commit에에 섹션을 추가 : 같은 YML에서 구성이 보일 것이다.

+0

고맙습니다. 문서에서 권장하는 버전으로 번들을 업그레이드했습니다. 새 설정을 테스트하려면 내 dev 환경에서 복제본 세트를 설정하고 장애 조치 (failover)를 시뮬레이트해야합니다. 내일은 그렇게 할 것입니다. 두 가지 질문. 1)'retry_query'와'retry_connect' 둘 다에 1을 사용할 것을 권장합니까? 2) 새로운 번들과 함께, 매핑 된 PHP 객체에서 필드에 접근 할 때 BSON 문서 ('_id : "141"')의 문자열 id가 정수가되는 문제가 발생했습니다. PHP와 같은 특별한 문자열을 사용해야하므로 익숙하지 않은가? –

+0

Jon Wage에게 OpenSky에서 재시도 옵션을 사용하는 것에 대해 물어 보는 것이 좋습니다. 옳은 대답은 유스 케이스에 따라 다를 수 있습니다. 재시도 시도로 요청을 지연시키는 것과 단순히 오류를 포착하고 거기에서 계속 이동하는 것의 절충이 있기 때문에 적절합니다. 귀하의 두 번째 질문에 대해서는 실패한 테스트 케이스와 함께 [pull request] (https://github.com/doctrine/mongodb-odm/pull/444)를 열었습니다. 테스트에서 귀하의 상황을 설명해 주시면 알려주십시오. – jmikola

+0

좋아, 재시도 옵션에 대해 Jon에게 묻습니다. 그렇습니다, 그 당기는 요구는 머리에 못을 명중한다. –

1

MongoDB에서 지정된 복제 세트를 가리 키도록 replicaSet 옵션을 구성 했습니까? 하단의 전체 구성에서

Symfony DoctrineMongoDBBundle Docs

봐. 지금까지 내가 아는 한은 서버 설정 라인에있는 모든 서버의 이름을 의 옵션 섹션에 replicaSet으로 지정해야합니다. 그 페이지에있는 문서는 그렇게 명확하지 않습니다.

코드를 살펴보면.재시도 시스템을 설정하여 구성해야합니다.

retryConnect 
retryQuery 

데이터베이스 이름과 동일한 수준입니다.

이것은 내 젠드 프레임 워크 구성의 본질적으로 똑같은 예입니다.

; Database details 
resources.odm.configuration.defaultDB = "test" 
resources.odm.connection.options.replicaSet = "test-replica-set" 
resources.odm.connection.server = "mongodb://rs1a.testing.com:27017,rs1b.testing.com:27017,rs1c.testing.com:27017" 
resources.odm.configuration.retryConnect = 3 
resources.odm.configuration.retryQuery = 3 

replicaSet을 구성하지 않았을 때 비슷한 오류가 발생했습니다.

+0

나는'doctrine_mongodb.connections.default.options.replicaSet = true'와'doctrine_mongodb.connections.default.server = mongodb : // localhost : 27017, localhost : 27018, localhost : 27019'를 설정했다. ('localhost '실제 호스트/IP/포트 용) (Symfony2 config는 Zend와 약간 다릅니다). –

+0

재시도 시스템에 맞는 라인을 포함하도록 답변을 업데이트했습니다. 여전히 옳지 않다면 설치 프로그램에서 제대로 시도 할 때까지 대답을 삭제할 것입니다. –

+0

감사합니다. Jamie! doctrine-mongodb 코드에서 이러한 재시도 설정을 볼 수 있지만 Symfony2는 Doctrine MongoDBBundle과 함께 Doctrine MongoDB 구성을 래핑하므로 Symfony2에서 쉽게 설정할 수 없습니다. –

관련 문제