Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

2015. 09. 05 도커 서울 밋업 4번째(Open Container Korea 주최).

elasticsearch에 은전한닢 한국어 형태소 분석기를 적용하고 운영한 사례 발표.

- 사용자 사전별로 이미지를 만들기
- nginx를 이용해 http basic auth 적용하기

  • Be the first to comment

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

  1. 1. 형태소 분석기를 적용한 elasticsearch 운영 Docker Seoul Meetup #4, 2015 1
  2. 2. N42 @seapy Docker Seoul Meetup #4, 2015 2
  3. 3. elasticsearch 클러스터를 AWS에서 Docker로 운영하면서 얻은 경험을 공유 Docker Seoul Meetup #4, 2015 3
  4. 4. 하려고 했으나... 서버 한대로도 충분한 트래픽 ㅜㅜ Docker Seoul Meetup #4, 2015 4
  5. 5. 판교장터 검색 트래픽이 많아져서 더 좋은 경험을 하게되면 또 공유할게요 오늘은 elasticsearch, 형태소 분석기 예전의 클러스터 운영 경험 Docker Seoul Meetup #4, 2015 5
  6. 6. 검색이 필요해요 Docker Seoul Meetup #4, 2015 6
  7. 7. ! elasticsearch Docker Seoul Meetup #4, 2015 7
  8. 8. 한국어 검색이 필요해요 Docker Seoul Meetup #4, 2015 8
  9. 9. ! elasticsearch + ! 한국어 형태소 분석기 Docker Seoul Meetup #4, 2015 9
  10. 10. 한국어 형태소 분석기 !은전한닢1 1 http://eunjeon.blogspot.kr/ Docker Seoul Meetup #4, 2015 10
  11. 11. 은전한닢 설치하기2 • mecab-ko : 형태소 분석기 • mecab-ko-dic : 한국어 사전 • mecab-java : 메모리 누수가 해결된 버전 • elasticsearch mecab-ko 플러그인 2 엘라스틱서치(elasticsearch)에 한글 형태소 분석기 은전한잎(eunjeon) 적용하기 - nacyot의 프로그래밍 이야 기 Docker Seoul Meetup #4, 2015 11
  12. 12. $ 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
  13. 13. • automake 버전 문제로 설치 도중 에러가 나는 경우, 다음과 같이 할 수 있습니다. • libmecab.so.2를 찾을 수 없는 에러가 나는 경우, 다 음과 같이 할 수 있습니다. !Docker Seoul Meetup #4, 2015 13
  14. 14. elasticsearch 인덱스에 한국어 analyzer 적용하니 한국어 검색 된다! Docker Seoul Meetup #4, 2015 14
  15. 15. ! 맥북에어 검색했더니 이상한것들이 나와요 Docker Seoul Meetup #4, 2015 15
  16. 16. '에어'라는 단어를 사용자 사전에 등록 에어,,,,NNP,*,F,에어,*,*,*,* Docker Seoul Meetup #4, 2015 16
  17. 17. mecab-ko-dic 다시 빌드 Docker Seoul Meetup #4, 2015 17
  18. 18. 단어 추가 버전업 서버이전 or 확장Docker Seoul Meetup #4, 2015 18
  19. 19. 문서화 단어 추가하는 방법 버전업 하는 방법 서버 설치 방법 Docker Seoul Meetup #4, 2015 19
  20. 20. 문서를 못찾거나, 달라져 있거나 Docker Seoul Meetup #4, 2015 20
  21. 21. 예상 했듯이 Docker Docker Seoul Meetup #4, 2015 21
  22. 22. 판교장터에 사용하고 있는 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
  23. 23. 접근제어head, kopf 같은 플러그인 확인하고 싶은경우 보안이 문제 Docker Seoul Meetup #4, 2015 23
  24. 24. Shield Security for Elasticsearch 유료 Docker Seoul Meetup #4, 2015 24
  25. 25. 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
  26. 26. 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
  27. 27. Docker Compose nginx, elasticsearch 실행을 한번에 Docker Seoul Meetup #4, 2015 27
  28. 28. docker-compose.yml elasticsearch: image: n42corp/elasticsearch volumes: - /home/data:/data nginx: 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
  29. 29. $ docker-compose up -d $ curl -XGET http://username:password@192.168.99.100/ { "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
  30. 30. Production 환경에 적용하는건 아직 비추 https://github.com/docker/compose Docker Seoul Meetup #4, 2015 30
  31. 31. 서비스별로 다른 사용자 사전 Docker Seoul Meetup #4, 2015 31
  32. 32. Docker Seoul Meetup #4, 2015 32
  33. 33. ONBUILD n42corp/elastcisearch Dockerfile #... 생략 # 사용자 사전 설치 ONBUILD COPY servicecustom.csv /opt/mecab-ko-dic-2.0.1-20150707/user-dic/servicecustom.csv ONBUILD 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
  34. 34. 서비스별 이미지 빌드 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
  35. 35. elasticsearch 클러스터 Docker Seoul Meetup #4, 2015 35
  36. 36. 여러대의 서버를 클러스터로 구성 장애대응이나 성능향상의 목적 Docker Seoul Meetup #4, 2015 36
  37. 37. es 클러스터 설정은 쉽다 같은 네트워크라면 알아서 연결 Docker Seoul Meetup #4, 2015 37
  38. 38. 하지만 Docker 라면 어떨까? 서로 다른 Docker 호스트 끼리는 서로 찾지 못해요 Docker Seoul Meetup #4, 2015 38
  39. 39. 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
  40. 40. 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
  41. 41. 배포 고민 Docker Seoul Meetup #4, 2015 41
  42. 42. 서버에 직접 접근해서 실행 • 서버마다 일일이 접근해야 된다 • 환경변수, 볼륨 등 실행 옵션을 스크립트로 만들고 백업 • 서비스 중단 시간이 발생되므로 haproxy, nginx, ELB등을 구성할 필요가 있다 • 작은 규모에서는 현실적인 대안이라고 생각 Docker Seoul Meetup #4, 2015 42
  43. 43. AWS ECS • ECS 사용요금이 별도로 없다 • ELB와 연동해서 무중단 배포를 실현 • ECS 인스턴스용 OS를 사용해야되서 서버 한대로 기 존 서비스와 ECS를 동시에 사용하지 못하는것에서 요 금 발생 + kubenertes, fleet • 한대 정도 실행하고 싶은데 쓰기에는 부담 Docker Seoul Meetup #4, 2015 43
  44. 44. docker-machine & docker-compose • 개발 컴퓨터에서 원격의 서버에 접근(docker- machine) • 미리 정의된 yaml 파일로 실행(docker-compose) • docker-compose가 production 에서 아직 비추 • 무중단 배포를 위해 어떻게 구성 해야할지 고민 Docker Seoul Meetup #4, 2015 44
  45. 45. 한가지 더 Docker Seoul Meetup #4, 2015 45
  46. 46. 형태소분석기를 API로 사용하고 싶다 Docker Seoul Meetup #4, 2015 46
  47. 47. 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
  48. 48. { "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
  49. 49. RORLab 서버에서 실행중 curl -XGET 'http://rorla2.rorlab.org:4567/morpheme' -d 'text=눈 마사지기 사요&posids=150,151' 너무 많이 요청하면 중단될수도 있으니 테스트용으로만 써주세요 Docker Seoul Meetup #4, 2015 49
  50. 50. 끝.Docker Seoul Meetup #4, 2015 50

×