미안하다. 이거 보여주려고 포스트 쌋다.
정말 검색 오픈소스 수준 ㄹㅇ 실화냐, 그 옛날 찐따같던 elasticsearch가 맞냐?
클라우드와 컨테이너 환경의 클러스터 구축 지원 기능 부터 한글 형태소 분석기 official plugin인 nori까지.
mecab플러그인 하나 쓰려고 native 패키지 리눅스에 설치해가면서 이미지 굽던 기억들이 뇌리에 스치면서 가슴이 웅장해진다.
lucene, solr 직접 운영 하고있었다면 elasticsearch함 인덱싱해서 검색해봐라 진짜.. 개발자 몇 십명 갈렸다 ㄹㅇ.
이러다 elastic회사 파산하는거 아니냐.
하.. ㄹㅇ 꼭 한번 써봐라 es version 7.6 이후 부터 한글 형태소 분석기 성능 ㅆㅅㅌㅊ다.

🔍 Elasticsearch

elasticsearch는 정말 잘 만들어진 검색 오픈소스 프로그램이다. 채소가게 MAU 20만 부터 시작해서 MAU 200만까지 아무런 작업 없이, elasticsearch 2.x version을 약 3년간 default 설정으로만 운영을 했었다. 작업이 있어봤자 더 좋은 인스턴스로 scale up하는 정도?

혹시, 읽는 사람중에 elasticsearch를 모른다면 해당 링크의 slideshare를 한번 참고해보자. 45페이지 분량의 굉장히 짧고 간결하게 elasticsearch의 원리에 대해 거시적 설명들이 잘 작성되어있다. 당근마켓의 조용진님 발표자료 이다.

또는 3분.elasticsearch.txt라는 글도 추천한다. 3분만에 elasticsearch를 대강 이해하고 넘어간다는 컨텐츠의 post로 작성해보았다.

ES version upgrade

이렇게 잘 만들어진 elasticsearch cluster도 이제 내가 입사함으로써 새롭게 단장해야하는 때가 되어버린것 이다. 사용자의 유입량이 점점 커지고 그에 따라 직원도 늘어났으며, 새로운 요건들이 요구되기 시작함에 따라 버전 업데이트는 필수적인 요건이 되었었는데, 2.x의 낡은 버전에서 당시 최신의 버전이었던 6.7로 가게된 니즈는 다음과 같다.

  • 클라우드 환경에 클러스터를 쉽게 이루게 도와주는 ec2 zen discovery plugin기능 이용
  • 해외 region의 관리를 위한 cross cluster search 기능 이용 [cross cluster replication은 유료기능이라.. 못써..]
  • alias기능 이용
  • cluster, index관리에 대한 유용한 관리 기능 이용
  • 그동안 못받아왔던 보안패치 적용
  • 그동안 있었던 성능개선에 대한 패치 적용

위의 버전업데이트 태스크를 받자마자 순간 겁이 덜컥났다. 분명 검색에 대한 지식이 없던 나에게 버전업데이트를 해야하는 태스크가 떨어지다니, 미션을 받자마자 정상 작동한다는 테스트(증명)을 어떻게 해야할지 막막하기만 했다. 잠깐 고민해서 이전과 똑같은 검색결과가 나오게 하는것을 목표로 했다.

버전 업데이트 작업에 착수하고 어떤것들이 변하게 되었는지 하나하나 살펴보던 찰나.. 아래와 같은 breaking changes있었다. breaking change들이 좀 파괴적이게 많아서 잠시나마 퇴사를 고려했었다.

2.x => 6.7 버전 변경 사항

  • custom type deprecated, use only single type _doc
  • type대신 alias에 대한 기능강화 alias에 대한 route, filter등등
  • 문서 유사도 알고리즘 추가 BM25 TF-IDF + BM25
  • field string 대신 keyword & text
  • shard allocation이 더 빨라짐
  • 한글형태소분석기 nori 이용 가능
  • DSL쿼리 변경된것들 다수

사실 이런 변경사항은 크게 문제가 되지는 않았다. 코드야 변경하면 되는거고, 코드도 알아서 어련히 모듈로 잘 만들어서 관리 했겠거니와 단순히 설정값만 잘 만져줄 생각이었다 하지만 정말 문제가 되는건 따로 있었으니...

함흥차사 형태소 분석기

채소가게의 형태소 분석기는 mecab plugin을 쓰고 있었다. 때문에 elasticsearch version이 업그레이드 됨에 따라 형태소 분석기 plugin의 버전도 함께 업그레이드 되어야지 쓸 수 있는데, mecab을 관리하는 bitbucket에 들어가보니 분명히 mecab plugin은 5.x까지는 mecab plugin이 지원되고 있었으나... 6.x버전부터는.. 더 이상의 플러그인 빌드가 없었다. 눈에 땀이 나기 시작했다.

mecab plugin을 쓰기위해 6.x를 포기하고 5.x 까지만 올릴지, 아니면 maintain을 포기한 mecab plugin을 버리고 maintain이(유지보수) 될거같은 official plugin nori를 쓸지 고민하다가, 관리 resource를 낭비하기 싫어서 6.7(당시 최신버전)과 nori 형태소 분석기를 쓰기로 결정했다.

형태소 분석기

형태소 분석기가 함흥차사랬는데, 형태소 분석기는 뭐하는녀석일까? 궁금해 할 까봐 TMI를 해보자면.. 말 그대로 문자열을 품사별로 분리(Tokenizing) 해 주는 녀석이다. 이는 검색엔진에서 검색되어지는 단어를 문장으로 부터 추출하는데에 사용되는데, 이게 있어야 자연스러운 한글 검색기능이 만들어진다. 이것의 분리 능력에 따라 검색품질이 크게 좌우되기도 한다. 형태소분석기는 나중에 한번 포스트로 자세히 다뤄보겠다. 포스트 두 개를 싸질러도 부족한 분량일태지만 말이다.

그래서 형태소 분석기

그래서 이렇게 중요한 형태소 분석기의 선택을 버전업데이트와 동시에 같이 진행하기로 하였다. 형태소분석기에서 중요한것은 당연히, 잘 분석해내는지에 대한 여부가 가장 중요한데, 당시 나는 이것이 어떻게 나와야 잘 분석한건지 잘 모르고 있었다. 그래서 일단 보고? 공유?는 했지만 큰 문제로 삼진 않으셨다.

일단 당시에는 작은 규모의 스타트업 팀이었으니.. 빠르게 반영하고 빠르게 개선하기로 했고 일단 테스트는 최소한 버그가 안날정도로만 작업해두었다. 꼴에 테스트코드라고 버그 안나는 테스트 코드만 작성해두었고.. 검색퀄리티에 대한 것은 어떻게 관리해야할지 감이 잘 안잡혔었다.

migration 이전에는 이런 클러스터

migration이전에는 아래 이미지와 같은 클러스터 였었는데

실제로 서비스를 하고 있는 스타트업이라면 절대로 이런 형태의 클러스터는 하지 말길 바란다. 차라리 나에게 DM을 줘라, 수고롭겠지만, 꽁짜로 직접 가이드 해주겠다. 말 몇 마디면 끝날꺼.. 마라탕 사주면 된다.

알 사람들은 알겠지만 위 클러스터는 elasticsearch 초기 버전인 0.x ~ 2.x? 의 default설정으로 primary shard가 5개 여서 dataNode를 5대를 올리느라 저런 구조인거지 절대 절대 권장사항이 아니다.

elasticsearch cluster 는 대강 이런 도구로 만들었다.

작업동안 사용한 도구들.. terraform, ansible, packer, vagrant, docker, AWS friends..., rails, bash, bash bash bash.it 채소가게에 와서 AWS, docker, bash빼고 다 처음써봤다.

클러스터는 아래와 같이 구성해놓았다.

배포전략 blue green deploy

소싯적에 elasticsearch를 좀 다뤄봤다 하는 경력아재들은 알것이다.

"version update 까지꺼 'rolling update'해주면 되는거 아니요?!"

이 뜻은 cluster recovery능력이 좋은 elasticsearch를 믿고서 노드 하나씩 껏다가 새로운 버전으로 설치 후 다시 키라는 이야기인데, 이게.. 2.x 로 만든 data file을 가지고서는 6.x로 가는게 불가능하며, 2.x => 5.x => 6.x 도 통하지 않는다고 해서 이렇게 클러스터 교체 방법을 이용하게 되었다. 짧은경력인 @drakejin 에게도 다 계획이 있었답니다. 선배님덜ㅋㅎ

version upgrade작업의 총 작업 목록들을 뽑아보면 다음과 같다.

  • 작업소요기간 2달..? 2달 반?
  • elasticsearch 6.7 AMI 굽기
  • elasticsearch mornitoring agent 추가
  • 각 개발자들의 docker-compose 환경에 사용할 수 있는 6.7버전의 docker contaienr build
  • elasticsearch 운영, 사전업데이트 스크립트 추가
  • elasticsearch cluster terraform code 작성
  • elasticsearch kibana ECS deploy
  • rails 서버 package elasticsearch-rails 2.x버전 6.x로 패키지 업데이트와 그에 따른 코드 변경
  • 증분 차분 sync script작성
  • migration 시나리오 수행 script작성
    1. 2.x의 index 6.7로 데이터 _reindex기능을 이용한 migration
    2. 작성한 debugging test code(최소한의 버그검증 테스트 코드) 수행
    3. 6.7 cluster의 host주소로 rails서버 환경변수 변경(blue, green deploy)
    4. 1번 2번 migration time동안 발생한 데이터의 증분 차분 sync script수행

다음편..

Version Upgrade성공..?

은 개뿔 개 망했다. 정말 개 망해버렸다. 이렇게 version 업데이트를 해버리다니. 정말 미친짓거리를 했다. 사실, rollback하기도 굉장히 애매해서 어찌 할 방법이 없었다. 나는 정말 채소가게에서 "우리의 인연은 여기까지였나봐요. 다른곳에서도 꼭 성공(실패)하시기 바랍니다." 라는 소리를 들을준비를 하면서 출근했었다. 다음은 검색퀄리티에 중요한 형태소 분석기에 대한 이야기를 해보려 한다.

profile
그냥 재밌는것만 개발하고 놀고싶어요

2개의 댓글

comment-user-thumbnail
2020년 7월 23일

다음 연재 기다리겠습니다 ㅎㅎㅎ

답글 달기
comment-user-thumbnail
2020년 11월 22일

재미있네요. 검색 새내기로서 공감되는게 많습니다.. ㅎㅎ

답글 달기