현재 만들고 있는 서비스에서는 MariaDB와 연동하여 검색데이터를 색인하고 있습니다. MariaDB에서 변경되는점을 바로 Elasticsearch에서 갱신할 수 없기 때문에 일정시간마다 동기화(?) 해주는 방식으로 운영하고 있습니다.
물론 -_-.. 할수는 있지만… 성능적으로 볼때 잦은 update는 자료 자체가 수정되는게 아닌 키를 변경하고 새로운 데이터가 추가되는 작업으로서 검색성능을 떨어뜨릴 수 있기 때문에 최적의 indx 상태를 유지하기 위해서 새로 생성하는게 좋다고 하더군요… 새로 생성하는데 얼마 걸리지도 않습니다. (쿨럭..)
그러나, 새로 만드는 동안에는 index를 사용할 수 없음으로 기존의 index로 운영하고 있다가 새로 생성된 index의 작업이 완료되면, 교체 해줘야합니다. 이때 index의 이름을 알아야 제대로 쿼리할 수 있는데요….
alias…(별칭)기능을 통해서 구index에서 신index로 alias를 옴겨주는 원리로 서비스에 지장없이 운영할 수 있게 됩니다.
alias 지정하기
_aliases api를 이용해서 지정하거나 제거할 수 있습니다.
index에 별칭을 추가해보면…..
POST /_aliases { "actions" : [ { "add" : { "index" : "my_index_190925102459", "alias" : "my_index" } } ] }
이렇게 해두면 쿼리의 index를 바꾸지 않고 my_index로서 계속해서 쿼리를 할 수 있게됩니다.
같은 이름의 index가 있으면 안되기 때문에 구index의 이름을 제거하고 해야합니다. 이때는 add대신 remove를 줘서 제거할 수 있습니다.
POST /_aliases { "actions" : [ { "remove" : { "index" : "my_index_190925102459", "alias" : "my_index" } } ] }
쿼리의 형태를 보면 , 로 연결하여 여러개가 동시에 처리되도록도 가능합니다.
실제 구현은 PHP로 했습니다.
logstash도 좋지만… 어느정도 컨트롤도 했으면 해서 Elasticsearch-PHP 라이브러리를 이용하여 사용하고 있습니다.
자세한 내용 : https://www.elastic.co/guide/en/elasticsearch/client/php-api/7.0/index.html
<?php use Elasticsearch\ClientBuilder; class ES_Api { var $client; public function __construct(){ ini_set("display_errors","1"); $this->client = ClientBuilder::create()->setHosts(array('my_host'))->build(); } //add alias private function addAlias($index,$alias){ $params = [ 'index' => "{$index}", 'name' => "{$alias}", 'body' => [] ]; $this->client->indices()->putAlias($params); } //index list private function get_index_simular($index){ $ret = array(); $res = $this->client->cat()->indices(); foreach($res as $k => $row){ if(strpos($row['index'],$index) !== false){ $ret[] = $row['index']; } } return $ret; } //작업후 삭제 및 새로운 별칭을 추가 private function change_work_index($alias,$new_index){ $post_fix = "_"; $res = $this->get_index_simular($alias.$post_fix); foreach($res as $k => $index){ if($index != $new_index){ $this->RemoveIndex($index); } } $this->addAlias($new_index,$alias); } }
index명의 alias를 간단한 함수로 변경할수 있게 됩니다. 위 코드는 개념적으로 작성된 것이라 -_-… 함수만 가져다 활용하실 수 있습니다.
오늘은 여기까지 입니다. 다음에는 elasticsearch-php를 좀더 알아봅시다.