Skip to content

기술공유 7주차

KyungHoYoon edited this page Dec 13, 2019 · 38 revisions

엘라스틱서치는 Apache Lucene(이하 루씬)을 기반으로 만들었다.
루씬은 역색인(각각의 단어가 어느 문서에 속해있는지 목록을 유지하는 자료구조 생성)을 제공한다.



elastic search os별 제약사항 & 설치 관련

참고자료 : https://tecadmin.net/setup-elasticsearch-on-ubuntu/

  • JAVA 11 이상이 설치된 os에서 동작할 수 있음
  • 환경변수 파일로 network 대역 설정해 줘야 외부에서 접속 가능함.
  • 권한 설정을 위해 환경변수 파일에 cluster와 node에 대한 정보를 명시해야함.


엘라스틱서치와 관계형 데이터베이스
elastic_rdb


elasticSearch 구축 elasticsearch 구축


(1) 사이트에서 정보를 요청한다.
(2) 우선 S3(object storage)에 저장된 요청 정보가 있는지 확인한다. (한번 읽어온 정보는 최대 100MB 공간을 마련해서 S3에서 다시 읽을 필요없도록 저장하고 있는다. 최대 용량 초과 시 참조하지 않는 결과부터 삭제). 원하는 결과가 있을 경우 바로 (5)번으로.
(3) S3에 저장된 결과가 없다면 ES에 직접 쿼리한다.
(4) (3)에서 얻어온 결과를 S3에 저장하고, 메모리에도 저장해둔다.
(5) 검색된 결과를 돌려준다.






A. 실시간으로 데이터 싱크하기

문제 1 - 엘라스틱서치 트래픽 증가

config/elasticsearch.yml 수정

# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
 network.host: 0.0.0.0
#
# Set a custom port for HTTP:
#
# http.port: 9200






logstash 파이프라인 생성

/* logstash.conf */

input {    
    jdbc {        
        jdbc_driver_library => "lib/mysql-connector-java-5.1.33.jar"        
        jdbc_driver_class => "com.mysql.jdbc.Driver"        
        jdbc_connection_string => "jdbc:mysql://localhost:3306/[db-name]"        
        jdbc_user => "[db-user]"        
        jdbc_password => "[password]"        
        statement => "SELECT * FROM [tbl-name]"        
        schedule => "* * * * *"                
    }    
}
output {    
    elasticsearch {        
        hosts => ["localhost:9200"]    
    }    stdout {        
        codec => rubydebug    
    }
}






$ curl -X POST http://ip:9200/test

{  
    "mappings" : {    
        "users" : {      
            "properties" : {        
                "index" : { "type" : "integer" },        
                "email" : { "type" : "string" },        
                "nickName" : { "type" : "string"},        
                "tag" : { "type" : "string"}
            }    
        }  
    }
}






데이터 조회 curl -XGET http://211.249.49.243:9200/netflix-db-server/_search?pretty

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 240,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "netflix-db-server",
        "_type" : "_doc",
        "_id" : "-2UvYTXiaxw",
        "_score" : 1.0,
        "_source" : {
          "index" : 1,
          "likes" : 2377,
          "thumbnail_img_url" : "https://i.ytimg.com/vi/-2UvYTXiaxw/maxresdefault.jpg",
          "streaming_url" : "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/Sintel.mp4",
          "category" : "?좎셿?숇Ъ?숇Ъ",
          "reg_date" : "2007-10-04T00:00:00.000Z",
          "video_id" : "-2UvYTXiaxw",
          "thumbnail_video_url" : "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/Sintel.mp4",
          "name" : "Stuffing Dead Pets | Taboo: Pets"
        }
      }
    }
  ]
}




SQL로 가져오기

select video_id, name, category, likes, reg_date,
thumbnail_img_url, thumbnail_video_url, like_cnt
from videos a,
(
select fk_video_id, count(fk_video_id) as "like_cnt"
from likes
where fk_user_id in(
	select fk_user_id
    from likes
    where fk_video_id=1197
    and fk_user_id not in (2)
)
group by fk_video_id
order by like_cnt desc
) b
where a.video_id = b.fk_video_id
order by like_cnt desc;




DSL QUERY

async function get_search(column, target, order, size){

    return await client.search({
        index: process.env.index,
        type: '_doc',
        sort : [`${column} : ${order}`],
        body: {
            size : size,
            query: {
                match : {
                    [column] : target
                }
                
            
            }
        }
    }).then(function(resp){
        return resp.hits.hits;
    },function(err){
        return err;
    })

};




Clone this wiki locally