2013-07-29 2 views
1

하루에 약 250,000 개의 인서트를받는 특정 테이블을 모니터링하는 것에 대한 조언을 찾고 있습니다. 방대한 규모는 아니지만 빠르게 성장하고 있으며 현재와 같이 계속 작업 할 수 없습니다.RoR 자주 업데이트되는 테이블의 변경 사항보기

주요 응용 프로그램은 MySQL 데이터베이스가있는 RoR4를 사용합니다. 데이터는 여러 개의 반경 서버에서 곧바로 데이터베이스로 스트리밍됩니다.

if column == xxx 
    venue = Venue.find_by(bar: foo) 
    if venue.is_monitored? 
    do some other shizzle 
    end 
end 

위치 테이블 중 하나 사소한 크기가 아니다, 그래서 나는보고 싶지 않은 :

우리는 간단한 모양을 특정 값에 대해 특정 열을 모니터링 한 후 수행해야 무언가가 발생할 때마다 수십만 개의 행을 통해

누구든지 빠르고 효율적인 방법을 추천 할 수 있습니까? 현재 각 인서트를 검사하는 것은 Rails에서 우스운 것처럼 보입니다. 우리는 또한 60 초마다 백그라운드에서 작업을 처리하려고 시도했지만 오래된 것 같습니다.

지금까지 가장 좋은 해결책은 삽입시 가치를 지켜보고 Redis에 게시하고 노드 서버를 사용하여 이벤트를 수신하는 것이 었습니다. 그런 다음 레일스로 다시 밀어 넣습니다.

죄송합니다. 주관적이거나 요점이 맞지 않으면 미안하지만, 저에게 맛있는 방법을 가르쳐 주시기를 정말 바랍니다.

답변

1

모니터링을 MySQL로 전송하는 방법은 무엇입니까?

모니터링중인 테이블의 UPDATE 및 INSERT에서 실행되는 트리거를 사용할 수 있습니다.

  • 풀 방법을 (여러 가능성) :이 트리거는 검증을 수행 할 수 있고 조건이 충족되는 경우는 할 수있는 임시 테이블에 생성 된 업데이트 된 기록 /의 ID를 삽입 한 다음 한 번에 한 동안 Rails 응용 프로그램은이 임시 테이블에서 ID를 가져 와서 비우고 특정 레코드에 필요한 작업을 수행 할 수 있습니다.
  • 푸시 방식 : 트리거는 MySQL의 sys_exec()을 사용하여 필요한 작업을 수행하는 루비/레일 스크립트 중 하나를 호출합니다.

트리거 실행 직후와 Rails 앱 실행 직전에 레코드가 수정 된 경우가 발생할 수 있으므로 레일스 앱에서 모든 조건이 충족되는지 확인해야합니다. 받은 기록.

편집

하기는 신중하게 계획해야합니다. 푸시는 자원을 저장하고 작업이 즉각적이기 때문에 매력적일 수 있지만 MySQL 트리거는 "슛 및 포기"합니다. 그래서 어떻게 든 sys_exec()가 레일 스크립트에 도달 할 수 없다면 어떻게 될까요? (시스템 크래시, 뭐든), 그래서 레코드가 수신되지 않고 Rails 앱에서 보지 못할 수도 있습니다.

관련 레코드의 ID가 임시 테이블에 보관되고 Rails를 추가하는 항목이 나중에 해당 레코드를 찾을 수 있기 때문에 끌어 오기가 더 안전합니다. 그러나 행동은 수 초 만에 지연됩니다 (항상 받아 들일만한 상황은 아닙니다). 그리고 더 많은 자원을 필요로합니다.

귀하의 선택은 귀하의 요구 사항에 달려 있습니다.에서 레코드의 ID를 저장

  1. 트리거 : 당신이 솔루션을 복잡하게 좋아하거나 동시에 데이터의 보안 및 즉각적인 조치를 필요로 간단 경우 경우

    또한, 당신은 두 솔루션의 혼합을 구현할 수 임시 테이블을 만들고 sys_exec()를 통해 스크립트를 호출하십시오.

  2. sys_exec 호출을 통해 Rails는 필요한 조치를 수행하고 조치가 완료되고 더 이상 필요하지 않으므로 임시 테이블에서 해당 레코드를 삭제합니다.
  3. 가끔씩 Rails는 임시 테이블을 검사하여 누락 된 레코드가 없는지 확인하고, 임시 테이블에 레코드가 남아있는 경우 여전히 해당 테이블에서 작업을 수행 할 수 있습니다.

리소스를 적게 사용하고 즉각적인 응답을 받고 예측할 수없는 상황을 복구합니다. 나는 "임시 테이블"이라는 용어를 사용하지만, 나는 그것이 더 나은의 메모리 테이블 정도 같은 SQL 어휘에서 "일시적으로"의미하지 않는다 :

주 - 그러나

을 구현하는 것이 더 어렵다 시스템 고장으로부터 시스템을 보호하기 위해 실제 디스크 기반 테이블을 보유하고 있어야합니다.

+0

Ive는 트리거를 빠르게보고 있었고 Rails에서 cron을 실행하는 것보다 낫지 않을지 확신하지 못했습니다. 데이터를 꺼내는 것은 '실시간'으로는 충분하지 않지만 sys_exec 메서드가 작동 할 수 있습니다. 나는 루비 스크립트 오버 헤드를 조사해야 할 것이다. 매초마다 레이크를 돌리면 서버를 죽일 수 있습니다. – simonmorley

+0

편집 내 대답 – Benj

+0

Redis에서 우리는 많은 술집 sub를 사용하고, 무엇인가 놓친 경우에 대비하여 테이블을 점검해야합니다. 당신의 아이디어는 너무 복잡하게 들리지 않습니다. 결정을 내리기 전에 트리거를 읽어야합니다. 기복과 함께 오는 데이터에 대한 로그를 분석하는 것을 살펴 보았습니다. 둘 다 생각처럼 ... – simonmorley

관련 문제