2013-03-05 1 views
1

나는 타이어와 함께 ElasticSearch를 사용 중이며 Heroku에서 내 앱을 호스팅하고 있습니다.분재 서버가 고장 났을 때 어떻게해야합니까?

지난 밤, 분재 서버가 고장 났을 때 내 앱이 모두 추락했습니다. 내가 Heroku가 앱을 배포했을 때 은 타이어 연결하고 인덱스를 만들려고하고, 오류를 던졌다, 그래서 나는 unless 문에 모든 모델에서 내 Tire 코드를 이동했다 : 코스 I의

unless ENV['ES_DISABLED'] 
    # Elastic Search 
    # 
    include Tire::Model::Search 
    include Tire::Model::Callbacks 
    index_name INDEX_NAME 

    tire.mapping do 
    indexes :id, :type => 'string', :index => :not_analyzed 
    indexes :content, analyzer: 'snowball', boost: 100 
    end 
end 

Heroku에서 ES_DISABLED 상수를 true으로 설정하십시오.

앞으로 비슷한 오류가 발생할 수 있습니다. 그들을 피할 수있는 더 좋은 방법이 있습니까?

+0

코드를 배포하거나 앱을 부팅 할 때 색인을 만드는 것이 기본이라고 생각하지 않습니다. 이게 네가 함축 한 것이 아니라고 확신 할 수 있니? – phoet

+0

heroku에 배포하는 동안 문제가 발생합니다. 그래서 아마 heroku 트리거 인덱스를 재생할 수 있습니다. – tomekfranek

+0

@phoet 타이어가 실제로 그것을 수행하지만 연결 문제를 처리하려고 시도합니다 – karmi

답변

1

Nick with Bonsai.io 여기에 있습니다. 내 앱에 영향을 미친 정전에 대한 저의 사과. 우리의 블로그에서 내 full post-mortem을 찾을 수 있습니다.

내가 잘못하지 않는 한, 타이어가 tire.mapping 메서드 호출을 실행하면 인덱스가 생성되고 Rails는 모델 클래스를 평가하고로드하는 것으로 나타납니다.

그것은 부분적으로 ECONNREFUSED 문제에 대한 Issue #180commit (0df58dce)에서 해결 된 이런 종류의 시나리오처럼 보인다, 그러나 그것은 우리의 클러스터가 경험처럼, 더 큰 클러스터에서 분리 된 노드에서 503 오류 응답을 포함하지 않을 것입니다.

아마도 이것은 Tire가 인덱스 존재 여부를 테스트하거나 인덱스 및 매핑을 만들려고 시도 할 때 유사하게 50x 오류를 구할 수있는 좋은 요청이 될 것입니까?

번갈아 말하면 tire.mapping 전화를 begin/rescue으로 마무리 할 수도 있습니다.

+0

내가 링크 된 문제와이 오류 사이에 연결이 표시되지 않습니까? 두 경우 모두 ** 응용 프로그램 ** 코드에는 "Elasticsearch is down"상황을 처리하기위한 사용자 친화적 인 방법이 있어야합니다. – karmi

+0

편집 : 그럼, 네트워크 관련 오류를 피하는 것이 좋습니다. – karmi

2

음, 이상합니다. 타이어는 실제로 존재하지 않을 때 모델에 대한 인덱스를 만들려고 시도하지만 응용 프로그램을 쏘지는 않습니다. 내가이 일을 할 수있어

주의 :

$ ps aux | grep java 
121:karmi   7197 0.0 0.0 2432768 472 s003 R+ 7:37PM 0:00.00 grep java 

$ bundle exec rails console 
Loading development environment (Rails 3.2.11) 
Article 
Skipping index creation, cannot connect to Elasticsearch 
(The original exception was: #<Errno::ECONNREFUSED: Connection refused - connect(2)>) 
=> Article(id: integer, title: string, content: text, author: string, published_on: date, created_at: datetime, updated_at: datetime) 
Article.search '*' 
Errno::ECONNREFUSED: Connection refused - connect(2) 
    from /Users/karmi/.rbenv/versions/1.9.3-p0/lib/ruby/1.9.1/net/http.rb:762:in `initialize' 
    ... 
    from /Users/karmi/Playground/ElasticSearch/Tire/tire/lib/tire/search.rb:35:in `results' 

당신 /구조 시작에 mapping 등의 정의를 바꿈되지해야 - 대신, 당신은 응용 프로그램 내 rescue_from 또는 다른 수단을 가져야한다 검색 기능이 작동하지 않는다는 것을 사용자에게 알리는 코드.

+0

타이어가 Errno :: ECONNREFUSED를 포착하고'false'를 반환 할 때 rescue_from을 사용할 수있는 것처럼 보이지 않습니다. 내가 잘못? – brupm

+0

색인 생성과 관련하여 필자는 정확한 것으로 보이지만 다른 곳에서는 Errno : ECONNREFUSED를 구제 할 수 있습니다. – brupm

+0

나는이 질문이 ECONNREFUSED보다 50x 에러에 관한 것이라고 생각한다. 예를 들어, 나머지 클러스터에 참여하지 못한 노드로 요청이 전송됩니다. –