2014-01-21 2 views
2

MySQL 데이터베이스를 업데이트하기 위해 ElasticSearch 용 JDBC 플러그인을 사용하고 있습니다. 새 레코드와 변경된 레코드를 선택하지만 MySQL에서 제거 된 레코드는 삭제하지 않습니다. 그들은 색인에 남아 있습니다. OSX 마운틴 라이온, 오류나 문제에 사제를 통해 ElasticSearch 설치ElasticSearch river JDBC MySQL이 레코드를 삭제하지 않습니다.

curl -XPUT 'localhost:9200/_river/account_river/_meta' -d '{ 
    "type" : "jdbc", 
    "jdbc" : { 
     "driver" : "com.mysql.jdbc.Driver", 
     "url" : "jdbc:mysql://localhost:3306/test", 
     "user" : "test_user", 
     "password" : "test_pass", 
     "sql" : "SELECT `account`.`id` as `_id`, `account`.`id`, `account`.`reference`, `account`.`company_name`, `account`.`also_known_as` from `account` WHERE NOT `account`.`deleted`", 
     "strategy" : "simple", 
     "poll" : "5s", 
     "versioning" : true, 
     "digesting" : false, 
     "autocommit" : true, 
     "index" : "headphones", 
     "type" : "Account" 
    } 
}' 

예상대로 모든 응답 :

내가 강을 만드는 데 사용하는 코드입니다. 권한 OK, 로그에 오류가 없습니다.

제가 생각할 수있는 autocommit, versioningdigesting의 모든 조합을 제거하고 포함 (true 및 false로 설정)했습니다. 그것은 dev 데이터베이스이므로 레코드가 완전히 삭제되고 캐시되지 않고 소프트 삭제되지 않았 음을 확신합니다. 모든 레코드를 삭제하면 (즉, 강을 그대로두고 ES에서 색인 된 내용을 삭제하면) 강을 다음에 업데이트하면 레코드가 다시 추가되지 않으므로 버전 관리 및 삭제와 관련하여 무언가를 놓쳤다는 것을 알게됩니다 .

참고 _id 열을 지정하는 데 여러 가지 방법을 시도했으며 호출시 JSON을 통해 값이 있는지 확인했습니다.

건배.

+2

업데이트가 우리에게 결코 만족스럽지 못하고 다른 접근 방식을 취할 수있었습니다. 우리 시스템은 이벤트를 사용하여 개별 레코드의 변경 사항을 파악하고 ElasticSearch를 직접 업데이트합니다. 이를 통해 우리는 무엇이 진행될 것인지를 대단히 세밀하게 제어 할 수 있으며 시스템에서 다시 색인을 다시 시작할 수 있습니다. 아무도 대답을 찾지 못해서 미안해. –

답변

0

저는 여전히 비교적 신축성이 뛰어나며 프로젝트에 jdbc river를 사용하고있었습니다. 내가 반드시 경우가 될 수 없다, 이는 제대로 이해하면이 어떻게 작동하는지입니다 :

  1. 이 데이터베이스에서 (강에서 SQL 문에 의해 지정된) 모든 행을 꺼냅니다.
  2. 은 가져온 모든 행의 ID (유형, 색인)에서 다이제스트를 계산합니다 (새 행이 추가되거나 행이 삭제 된 경우 으로 변경해야 함).
  3. 모든 행에 대해 문서의 색인을 다시 생성합니다. 그러면 자동으로 각 문서의 버전이 증가합니다. _river 인덱스에 저장된 강
  4. 증분 버전 (주문)
  5. 경우 계산 # 3 다음 _river 인덱스에 저장되어있는 하나 이상의 다른 다이제스트 :
    • 저장 위치
    • 하우스 키핑 기능을 실행합니다 (버전 번호가 낮은 모든 문서를 삭제합니다).

그래서 당신은 당신이 버전은 true로 설정하고, 이후이 digesting이뿐만 아니라 true로 설정해야한다는 것을 의미 가질 필요가 실행하는 가사를 갖고 싶어한다고 생각.

curl -XPUT 'localhost:9200/_river/account_river/_meta' -d '{ 
    "type" : "jdbc", 
    "jdbc" : { 
     "driver" : "com.mysql.jdbc.Driver", 
     "url" : "jdbc:mysql://localhost:3306/test", 
     "user" : "test_user", 
     "password" : "test_pass", 
     "sql" : "SELECT `account`.`id` as `_id`, `account`.`id`, `account`.`reference`, `account`.`company_name`, `account`.`also_known_as` from `account` WHERE NOT `account`.`deleted`", 
     "strategy" : "simple", 
     "poll" : "5s", 
     "autocommit" : true, 
     "index": { 
      "index" : "headphones", 
      "type" : "Account", 
      "versioning" : true, 
      "digesting" : true 
     } 
    } 
}' 

참고 versioningdigestingindex 정의의 일부가 아닌 jdbc 정의

+0

위의 코드는 제가 실행중인 것에 대해 작동하지 않습니다. 색인을 하위 객체로 갖는 것은 색인/유형을 무시한다는 것을 의미합니다. 나는 "take"를 버저 닝 및 소화 할 때 몇 가지 사항을 살펴 보았습니다. 강에서 세 번째 문서가 있으며, 모든 설문을 변경하는 버전을 보여줍니다. 그러나, 나는 아직 실제 문서 자체에서 버전을 보지 못했고, 이는 하우스 키핑이 아무런 트러블을 일으키지 않는다고 믿게한다. –

3

해야한다는이 질문에 요구 되었기 때문에, 매개 변수 :

은 그래서 강은 다음과 같이해야한다고 말했다 데 크게 바뀌 었습니다. 버전 및 소화 기능이 더 이상 사용되지 않고 설문 조사가 일정으로 교체되었습니다. 강의를 다시 실행하는 빈도 (아래 5 분마다 실행 예정)에 대한 cron 표현이 적용됩니다.

curl -XPUT 'localhost:9200/_river/account_river/_meta' -d '{ 
     "type" : "jdbc", 
     "jdbc" : { 
      "driver" : "com.mysql.jdbc.Driver", 
      "url" : "jdbc:mysql://localhost:3306/test", 
      "user" : "test_user", 
      "password" : "test_pass", 
      "sql" : "SELECT `account`.`id` as `_id`, `account`.`id`, `account`.`reference`, `account`.`company_name`, `account`.`also_known_as` from `account` WHERE NOT `account`.`deleted`", 
      "strategy" : "simple", 
      "schedule": "0 0/5 * * * ?" , 
      "autocommit" : true, 
      "index" : "headphones", 
      "type" : "Account" 
     } 
    }' 

그러나 주요 질문에 대한, 내가 개발자로부터 얻은 대답은 더 이상 감지 행이 https://github.com/jprante/elasticsearch-river-jdbc/issues/213

삭제입니다.

버전 관리를 사용하여 하우스 키핑을 시도했지만이 작업은 증분 업데이트 및 행 추가와 함께 잘 수행되지 않았습니다.

좋은 방법은 윈도우 인덱싱입니다. 각 시간대 (하루에 에 한 번) 강에 대한 새 색인이 만들어지고 별칭에 이 추가됩니다. 오래된 색인은 잠시 후에 삭제됩니다. 이 유지 관리는 logstash 색인 생성과 비슷하지만 강의 범위가 입니다.

현재 내가 연구 앨리어싱으로 사용하는 방법은 색인과 강을 야간에 다시 작성하고 강을 몇 시간마다 실행하도록 예약합니다. 그것은 새로운 데이터가 그날 색인 될 것이며, 삭제는 매 24 시간마다 반영된다는 것을 보장합니다.

+0

사이드 노트에서 강은 단순히 "_id"필드를 사용하여 기존 레코드를 대체합니까? 즉, SQL 문이 매우 큰 결과 집합을 반환하면 삽입/업데이트의 영향을받는 행이 거의 없더라도 강이 실행되는 데 시간이 오래 걸릴 것입니까? 아니면 마지막으로 실행 된 이후로 변경된 내용을 어떻게 든 모니터링하고 해당 새 행만 삽입/업데이트합니다. – Yamcha

+0

나는 대답이 '아니오'라고 믿는다. 정확히 같은 _id를 가진 문서의 중복을 만든다. 원본을 삭제해야한다. –

+0

나는 틀렸다는 것을 믿는다. 내 실험에서, 그것은 그것을 대체합니다. 나는 또한 이것이 어딘가에있는 것을 읽었다. – Yamcha

관련 문제