Sangmun

ubuntu elasticsearch, kibana 설치 본문

개발/Elasticsearch

ubuntu elasticsearch, kibana 설치

상상2 2023. 1. 18. 13:47

프로젝트 간 elastic search를 이용한 검색 및 간단한 시각화 기능이 필요해서 elastic search와 kibana를 ubuntu에 설치를 해보았다.

 

1.  Elasticsearch 설치

# sudo 설치
apt-get update && apt-get -y install sudo

# 패키지 색인을 업데이트
sudo apt update
# HTTPS를 통해 리포지토리에 액세스하는 데 필요한 apt-transport-https 패키지를 설치
sudo apt install apt-transport-https

# OpenJDK 8 설치
sudo apt install openjdk-8-jdk
java -version  # openjdk version "1.8.0_191"

# OpenPGP 암호화 툴 설치
apt-get install -y gnupg2

# Elasticsearch 저장소의 GPG key를 사용해 설치 (GPG key를 암호화/복호화 프로그램이라고 이해하고 넘김)
# 리눅스 배포판에는 기본적으로 GPG가 설치되어 있음
# OK가 반환되어야 함 (맨 뒤 add까지 명령어로 입력해야 함)
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -  

# Elasticsearch 저장소를 시스템에 추가
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list

# 이제 진짜 elasticsearch 설치
sudo apt update
sudo apt install elasticsearch  # elasticsearch 7.10.0 설치됨(7.x 버전이면 작동할듯)

# elasticsearch 시작(설치 완료 후 자동으로 시작되지 않음)
service elasticsearch start

# 경로 이동해서 nori 형태소분석기 설치
cd /usr/share/elasticsearch
bin/elasticsearch-plugin install analysis-nori

# elasticsearch 재시작 (형태소분석기 설치 후 재시작이 필수적!)
service elasticsearch restart

# curl 명령어 설치
sudo install curl

# Elasticsearch가 실행 중인지 확인
curl "localhost:9200"

# Python Elasticsearch Client 설치
pip install elasticsearch

검색을 실시할때는 nori tokenizer로 분할된 형태에서 유사도를 측정하여 검색을 할 예정임으로 nori tokenizer를 설치해 주었다.

Elastic Search는 default값으로 localhost:9200으로 서비스가 시작된고, 이후 제대로 설치되고 서비스가 정상 실행 중인지 확인하기 위해 해당 주소로 curl 명령어를 실행해 주면 아래와 같은 json 파일이 return 되고 정상실행 중이라는 것을 확인할 수 있다.

{
  "name" : "c40a65c93723",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "DPTI7y_jTeyG-AMngZaHDw",
  "version" : {
    "number" : "7.17.8",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "120eabe1c8a0cb2ae87cffc109a5b65d213e9df1",
    "build_date" : "2022-12-02T17:33:09.727072865Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

 

2. python으로 elasticsearch에 index 생성, 삽입, 검색

파이썬으로 elasticsearch를 사용할때 기본적으로 사용해야 할 함수들이다.

from elasticsearch import Elasticsearch

# elasticsearch instance 생성
es = Elasticsearch("http://localhost:9200", request_timeout=30, max_retries=10, retry_on_timeout=True)

# index_name 설정 및 index의 setting load
index_name = 'sample_index'
with open('setting.json', "r") as f:
            setting = json.load(f)

# index 생성
es.indices.create(index=index_name, body=setting)
                        
# index에 한개의 데이터를 삽입
# title과 description은 사용자 정의 항목
doc = {"title": 'sample_title', "description": 'sample_description'}
es.index(index=self.index_name, body=doc)

 

위 항목에서 사용한 setting.json 파일은 아래와 같다.

{
    "settings": {
        "analysis": {
            "filter": {
                "my_shingle": {
                    "type": "shingle"
                }
            },
            "analyzer": {
                "my_analyzer": {
                    "type": "custom",
                    "tokenizer": "nori_tokenizer",
                    "decompound_mode": "mixed",
                    "filter": ["my_shingle"]
                }
            },
            "similairty": {
                "my_similarity": {
                    "type": "BM25"
                }
            }
        }
    },

    "mappings": {
        "properties": {
            "document_text": {
                "type": "text",
                "analyzer": "my_analyzer"
            }
        }
    }
}

 

이제 index에서 원하는 항목을 찾고 싶을때는 아래와 같은 간단한 함수로 query를 날릴  수 있다.

# elasticsearch에 query_doc 형식으로 query를 한다
# description항목에서 your_query에 해당하는 row들을 찾아서 반환해준다.
query_doc = {
            "bool": {
                "must": [
                    {"match": {"description": your_query}},
                ]
            },
        }
es.search(index=index_name, query=query_doc, size=topk)

Elastic Search에서 index들의 용량을 체크하는 방법

curl -XGET 'http://localhost:9200/_cat/allocation?v'

위의 명령어를 사용하면 아래와 같이 현재 사용중인 용량과 가능한 용량을 알려준다.

shards disk.indices disk.used disk.avail disk.total disk.percent host      ip        node
    11      411.4mb    32.8gb     65.4gb     98.3gb           33 127.0.0.1 127.0.0.1 c40a65c93723
     1                                                                               UNASSIGNED

 

3. Kibana 설치 및 설정

Kibana는 elasticsearch에 저장되어 있는 데이터들을 web에서 시각화해서 볼 수 있는 툴이다,

원래는 데이터를 모아오는 역할을 하는 Logstash까지 합해서 ELK stack이라고 불리는데 나는 해당 프로젝트에서 Logstash는 사용은 안 했다.

 

* 키바나 설치

sudo apt-get install kibana

* 키바나 구성

sudo vi /etc/kibana/kibana.yml

위의 yml의 파일을 보면 3가지 구성할 항목이 있고 우선은 #으로 주석처리가 되어있지만 제거하면서 활성화를 해주면 된다.

# default port는 5601, 서버의 환경에 따라서 포트를 변경해주면된다.
server.port: 5601

# 나의 경우에는 도메인은 없고 외부로 서빙이 필요한 상태라 0.0.0.0으로 설정했다.
server.hostname: "your-hostname"

# 서버내에서 elasticsearch가 오픈되어있는 주소와 포트
elasticsearch.hosts: ["http://localhost:9200"]

 

 

* 키바나 서비스 시작

# Kibana 서비스 실행
$ sudo systemctl start kibana.service

# Kibana 서비스 부팅 시 시작되도록 활성화
$ sudo systemctl enable kibana.service

# 추가적으로 방화벽이 설정되어있으면 해제가 필요하다.
$ sudo ufw allow 5601/tcp

 

아래는 kibana 메인페이지에서 discover 기능으로 진입한 화면이다. 해당 인덱스에서 굉장히 직관적으로 데이터들을 관찰할 수 있다. 기본적인 검색 기능과 필터링 기능이 있으며 Canvas 탭에서 데이터들을 바탕으로 시각화도 가능하다.

딱히 매뉴얼을 보지 않아도 바로바로 알 수 있을 만큼 굉장히 기능들이 직관적이다.

kibana discover 화면

4. elasticsearch, kibana 보안설정

TODO

Comments