Skip to main content

Elasticsearch 7.3 활용해보기 #7 – index의 갱신

현재 만들고 있는 서비스에서는 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를 좀더 알아봅시다.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.