Transcript
Page 1: 형태소 분석기를 적용한 elasticsearch 운영

형태소 분석기를 적용한 elasticsearch 운영

Docker Seoul Meetup #4, 2015 1

Page 2: 형태소 분석기를 적용한 elasticsearch 운영

N42@seapy

Docker Seoul Meetup #4, 2015 2

Page 3: 형태소 분석기를 적용한 elasticsearch 운영

elasticsearch 클러스터를 AWS에서 Docker로 운영하면서

얻은 경험을 공유

Docker Seoul Meetup #4, 2015 3

Page 4: 형태소 분석기를 적용한 elasticsearch 운영

하려고 했으나...서버 한대로도 충분한 트래픽 ㅜㅜ

Docker Seoul Meetup #4, 2015 4

Page 5: 형태소 분석기를 적용한 elasticsearch 운영

판교장터 검색 트래픽이 많아져서더 좋은 경험을 하게되면 또 공유할게요

오늘은

elasticsearch, 형태소 분석기예전의 클러스터 운영 경험

Docker Seoul Meetup #4, 2015 5

Page 6: 형태소 분석기를 적용한 elasticsearch 운영

검색이 필요해요

Docker Seoul Meetup #4, 2015 6

Page 7: 형태소 분석기를 적용한 elasticsearch 운영

! elasticsearch

Docker Seoul Meetup #4, 2015 7

Page 8: 형태소 분석기를 적용한 elasticsearch 운영

한국어 검색이 필요해요

Docker Seoul Meetup #4, 2015 8

Page 9: 형태소 분석기를 적용한 elasticsearch 운영

! elasticsearch+

! 한국어 형태소 분석기

Docker Seoul Meetup #4, 2015 9

Page 10: 형태소 분석기를 적용한 elasticsearch 운영

한국어 형태소 분석기

!은전한닢1

1 http://eunjeon.blogspot.kr/

Docker Seoul Meetup #4, 2015 10

Page 11: 형태소 분석기를 적용한 elasticsearch 운영

은전한닢 설치하기2

• mecab-ko : 형태소 분석기

• mecab-ko-dic : 한국어 사전

• mecab-java : 메모리 누수가 해결된 버전

• elasticsearch mecab-ko 플러그인

2 엘라스틱서치(elasticsearch)에 한글 형태소 분석기 은전한잎(eunjeon) 적용하기 - nacyot의 프로그래밍 이야기

Docker Seoul Meetup #4, 2015 11

Page 12: 형태소 분석기를 적용한 elasticsearch 운영

$ tar zxfv mecab-ko-XX.tar.gz$ cd mecab-ko-XX$ ./configure && make && make check$ sudo make install

$ tar zxfv mecab-ko-dic-XX.tar.gz$ cd mecab-ko-dic-XX$ ./configure && make$ sudo make install

#... 생략

자세한 설치는 관련문서2 참고 2 엘라스틱서치(elasticsearch)에 한글 형태소 분석기 은전한잎(eunjeon) 적용하기 - nacyot의 프로그래밍 이야기

Docker Seoul Meetup #4, 2015 12

Page 13: 형태소 분석기를 적용한 elasticsearch 운영

• automake 버전 문제로 설치 도중 에러가 나는 경우, 다음과 같이 할 수 있습니다.

• libmecab.so.2를 찾을 수 없는 에러가 나는 경우, 다음과 같이 할 수 있습니다.

!Docker Seoul Meetup #4, 2015 13

Page 14: 형태소 분석기를 적용한 elasticsearch 운영

elasticsearch 인덱스에 한국어 analyzer 적용하니

한국어 검색 된다!

Docker Seoul Meetup #4, 2015 14

Page 15: 형태소 분석기를 적용한 elasticsearch 운영

!맥북에어 검색했더니 이상한것들이 나와요

Docker Seoul Meetup #4, 2015 15

Page 16: 형태소 분석기를 적용한 elasticsearch 운영

'에어'라는 단어를 사용자 사전에 등록

에어,,,,NNP,*,F,에어,*,*,*,*

Docker Seoul Meetup #4, 2015 16

Page 17: 형태소 분석기를 적용한 elasticsearch 운영

mecab-ko-dic 다시 빌드

Docker Seoul Meetup #4, 2015 17

Page 18: 형태소 분석기를 적용한 elasticsearch 운영

단어 추가버전업서버이전 or 확장Docker Seoul Meetup #4, 2015 18

Page 19: 형태소 분석기를 적용한 elasticsearch 운영

문서화단어 추가하는 방법버전업 하는 방법서버 설치 방법

Docker Seoul Meetup #4, 2015 19

Page 20: 형태소 분석기를 적용한 elasticsearch 운영

문서를 못찾거나, 달라져 있거나

Docker Seoul Meetup #4, 2015 20

Page 21: 형태소 분석기를 적용한 elasticsearch 운영

예상 했듯이 Docker

Docker Seoul Meetup #4, 2015 21

Page 22: 형태소 분석기를 적용한 elasticsearch 운영

판교장터에 사용하고 있는 Docker 이미지$ docker run -d --name elasticsearch \ -v /home/data-xxx:/data \ -p 9200:9200 n42corp/elasticsearch-n42

• 한국어 형태소 분석기 + elasticsearch 3

• 한국어 검색용 사용자사전/동의어 목록4

• 몇개 안되지만 판교장터에서 사용하는것 그대로

4 https://github.com/n42corp/search-ko-dic

3 https://github.com/nacyot/elasticsearch

Docker Seoul Meetup #4, 2015 22

Page 23: 형태소 분석기를 적용한 elasticsearch 운영

접근제어head, kopf 같은 플러그인 확인하고 싶은경우 보안이 문제

Docker Seoul Meetup #4, 2015 23

Page 24: 형태소 분석기를 적용한 elasticsearch 운영

ShieldSecurity for Elasticsearch

유료

Docker Seoul Meetup #4, 2015 24

Page 25: 형태소 분석기를 적용한 elasticsearch 운영

Nginx무료

server { listen *:80;

location / { auth_basic "ElasticSearch"; auth_basic_user_file /etc/nginx/search.htpasswd;

try_files @elasticsearch @elasticsearch; }

location @elasticsearch { proxy_pass http://xxxx.com:9200; }}

Docker Seoul Meetup #4, 2015 25

Page 26: 형태소 분석기를 적용한 elasticsearch 운영

Dockerizing

$ docker run -d -p 80:80 \ --link elasticsearch \ -e SEARCH_USER='xxx' \ -e SEARCH_PASSWORD_ENCRYPTED='encrypted password' \ n42corp/elasticsearch-proxy-nginx$ curl -XGET http://xxx:passwd@localhost

Docker Seoul Meetup #4, 2015 26

Page 27: 형태소 분석기를 적용한 elasticsearch 운영

Docker Composenginx, elasticsearch 실행을 한번에

Docker Seoul Meetup #4, 2015 27

Page 28: 형태소 분석기를 적용한 elasticsearch 운영

docker-compose.ymlelasticsearch: image: n42corp/elasticsearch volumes: - /home/data:/datanginx: image: n42corp/elasticsearch-proxy-nginx links: - elasticsearch ports: - "80:80" environment: - SEARCH_USER=username - SEARCH_PASSWORD_ENCRYPTED=$apr1$o2nD6/0t$U6DaCfEqLaIZptGKYw84Y.

Docker Seoul Meetup #4, 2015 28

Page 29: 형태소 분석기를 적용한 elasticsearch 운영

$ docker-compose up -d$ curl -XGET http://username:[email protected]/

{ "status" : 200, "name" : "Fusion", "cluster_name" : "elasticsearch", "version" : { "number" : "1.7.0", "build_hash" : "929b9739cae115e73c346cb5f9a6f24ba735a743", "build_timestamp" : "2015-07-16T14:31:07Z", "build_snapshot" : false, "lucene_version" : "4.10.4" }, "tagline" : "You Know, for Search"}$ docker-compose stop

Docker Seoul Meetup #4, 2015 29

Page 30: 형태소 분석기를 적용한 elasticsearch 운영

Production 환경에 적용하는건 아직 비추

https://github.com/docker/compose

Docker Seoul Meetup #4, 2015 30

Page 31: 형태소 분석기를 적용한 elasticsearch 운영

서비스별로 다른 사용자 사전

Docker Seoul Meetup #4, 2015 31

Page 32: 형태소 분석기를 적용한 elasticsearch 운영

Docker Seoul Meetup #4, 2015 32

Page 33: 형태소 분석기를 적용한 elasticsearch 운영

ONBUILDn42corp/elastcisearch Dockerfile

#... 생략# 사용자 사전 설치ONBUILD COPY servicecustom.csv /opt/mecab-ko-dic-2.0.1-20150707/user-dic/servicecustom.csvONBUILD RUN cd /opt/mecab-ko-dic-2.0.1-20150707 &&\ tools/add-userdic.sh &&\ make install

# 유의어 추가ONBUILD COPY synonym.txt /elasticsearch/config/synonym.txt#... 생략

Docker Seoul Meetup #4, 2015 33

Page 34: 형태소 분석기를 적용한 elasticsearch 운영

서비스별 이미지 빌드Dockerfile 생성후 사용자사전(servicecustom.csv), 유의어(synonym.txt)를4 Dockerfile과 같은 폴더에 복사

FROM n42corp/elasticsearch

$ docker build -t n42corp/elasticsearch-n42 .

4 https://github.com/n42corp/search-ko-dic

Docker Seoul Meetup #4, 2015 34

Page 35: 형태소 분석기를 적용한 elasticsearch 운영

elasticsearch

클러스터Docker Seoul Meetup #4, 2015 35

Page 36: 형태소 분석기를 적용한 elasticsearch 운영

여러대의 서버를 클러스터로 구성장애대응이나 성능향상의 목적

Docker Seoul Meetup #4, 2015 36

Page 37: 형태소 분석기를 적용한 elasticsearch 운영

es 클러스터 설정은 쉽다같은 네트워크라면 알아서 연결

Docker Seoul Meetup #4, 2015 37

Page 38: 형태소 분석기를 적용한 elasticsearch 운영

하지만 Docker 라면 어떨까?서로 다른 Docker 호스트 끼리는 서로 찾지 못해요

Docker Seoul Meetup #4, 2015 38

Page 39: 형태소 분석기를 적용한 elasticsearch 운영

IP를 직접 설정

$ docker run -d -p 9200:9200 -p 9300:9300 \ -v /home/data-xxx:/data \ n42corp/elasticsearch \ --cluster.name=pangyo_market \ --node.name=$(hostname) \ --network.publish_host=$(hostname -i) \ --discovery.zen.ping.multicast.enabled=false \ --discovery.zen.ping.unicast.hosts=x.x.x.x:9300,y.y.y.y:9300

Docker Seoul Meetup #4, 2015 39

Page 40: 형태소 분석기를 적용한 elasticsearch 운영

AWS를 사용한다면5

$ docker run -d --name elasticsearch \ -v /home/data-xxx:/data \ -e AWS_ACCESS_KEY_ID=xxxx \ -e AWS_SECRET_KEY=yyyy \ -p 9200:9200 \ n42corp/elasticsearch \ --cluster.name=pangyo_market \ --node.name=$(hostname) \ --discovery.type=ec2

잘 안되네요 ㅜㅜ5 https://github.com/elastic/elasticsearch-cloud-aws

Docker Seoul Meetup #4, 2015 40

Page 41: 형태소 분석기를 적용한 elasticsearch 운영

배포 고민Docker Seoul Meetup #4, 2015 41

Page 42: 형태소 분석기를 적용한 elasticsearch 운영

서버에 직접 접근해서 실행

• 서버마다 일일이 접근해야 된다

• 환경변수, 볼륨 등 실행 옵션을 스크립트로 만들고 백업

• 서비스 중단 시간이 발생되므로 haproxy, nginx, ELB등을 구성할 필요가 있다

• 작은 규모에서는 현실적인 대안이라고 생각

Docker Seoul Meetup #4, 2015 42

Page 43: 형태소 분석기를 적용한 elasticsearch 운영

AWS ECS

• ECS 사용요금이 별도로 없다

• ELB와 연동해서 무중단 배포를 실현

• ECS 인스턴스용 OS를 사용해야되서 서버 한대로 기존 서비스와 ECS를 동시에 사용하지 못하는것에서 요금 발생

+ kubenertes, fleet

• 한대 정도 실행하고 싶은데 쓰기에는 부담Docker Seoul Meetup #4, 2015 43

Page 44: 형태소 분석기를 적용한 elasticsearch 운영

docker-machine & docker-compose

• 개발 컴퓨터에서 원격의 서버에 접근(docker-machine)

• 미리 정의된 yaml 파일로 실행(docker-compose)

• docker-compose가 production 에서 아직 비추

• 무중단 배포를 위해 어떻게 구성 해야할지 고민

Docker Seoul Meetup #4, 2015 44

Page 45: 형태소 분석기를 적용한 elasticsearch 운영

한가지 더Docker Seoul Meetup #4, 2015 45

Page 46: 형태소 분석기를 적용한 elasticsearch 운영

형태소분석기를API로 사용하고 싶다

Docker Seoul Meetup #4, 2015 46

Page 47: 형태소 분석기를 적용한 elasticsearch 운영

sinatra 이용해서 만든후 dockerizing-

$ docker run -d -p 4567:4567 \ n42corp/korean-morpheme-sinatra

# posids 150(일반명사),151(고유명사)에 해당하는 형태소만 반환$ curl -XGET 'http://192.168.59.103:4567/morpheme' \ -d 'text=눈 마사지기 사요&posids=150,151'

- https://github.com/n42corp/dockerfiles/tree/master/korean-morpheme-sinatra

Docker Seoul Meetup #4, 2015 47

Page 48: 형태소 분석기를 적용한 elasticsearch 운영

{ "morps": [ { "surface": "눈", "posid": 150, "desc": "일반 명사", "feature": "NNG,*,T,눈,*,*,*,*" }, { "surface": "마사지기", "posid": 151, "desc": "고유 명사", "feature": "NNP,*,F,마사지기,*,*,*,*" }, { "surface": "사요", "posid": 150, "desc": "일반 명사", "feature": "NNG,*,F,사요,*,*,*,*" } ]}

Docker Seoul Meetup #4, 2015 48

Page 49: 형태소 분석기를 적용한 elasticsearch 운영

RORLab 서버에서 실행중

curl -XGET 'http://rorla2.rorlab.org:4567/morpheme' \ -d 'text=눈 마사지기 사요&posids=150,151'

너무 많이 요청하면 중단될수도 있으니 테스트용으로만 써주세요

Docker Seoul Meetup #4, 2015 49

Page 50: 형태소 분석기를 적용한 elasticsearch 운영

끝.Docker Seoul Meetup #4, 2015 50


Top Related