[입 컨설팅] 오일나우에서의 Redis 사용 방법 개선하기 – PART #1

다음 블로그는 Open Up의 도움을 받아서 작성되었습니다.

오일나우는 운전자에게 필요한 정보를 제공하는 서비스를 제공하는 스타트업입니다. 오일나우는 다음과 같은 정보들을 제공하고 있습니다.

오일나우Oilnow
운전자에게 딱 맞는 유용한 정보를 추천해드립니다.
– 알고리즘 적용을 통해 내 위치 인근 가장 가까우면서도 저렴한 주유소를 자동 추천해드립니다.
– 주유 패턴 분석을 통해 유류비 절감을 도와 드립니다.
– 주유비 할인 카드 및 자동차 보험 정보를 비롯해 다양한 금융 상품 정보들을 추천해드립니다.

오일나우의 자세한 정보는 오일나우 팀 블로그에서 확인하실 수 있습니다.

Open Up의 지원을 받아서 해당 오일나우라는 회사에서 Redis 를 쓰는 데 있어서 이슈가 될 만한 부분을 확인하고 개선 방향을 조언하는 시간을 가졌습니다.

일단 오일나우에서는 Redis를 주유소 정보를 확인하기 위해서 Geo Query를 사용하는 형태로 많이 사용하고 있었습니다. Redis 는 Geo Query를 지원하는데 반경 N 킬로미터 이 내의 정보등을 쉽게 구현할 수 있습니다.

Redis 에서 지원하는 Geo Query 관련 Command 는 다음과 같습니다. 보통 GEOADD로 데이터를 추가하고 GEORADIUS 함수를 통해서 관련 정보를 찾을 수 가 있습니다.

예제는 다음과 같습니다.

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEORADIUS Sicily 15 37 200 km WITHDIST
1) 1) "Palermo"
   2) "190.4424"
2) 1) "Catania"
   2) "56.4413"
redis> GEORADIUS Sicily 15 37 200 km WITHCOORD
1) 1) "Palermo"
   2) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) 1) "15.08726745843887329"
      2) "37.50266842333162032"
redis> GEORADIUS Sicily 15 37 200 km WITHDIST WITHCOORD
1) 1) "Palermo"
   2) "190.4424"
   3) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) "56.4413"
   3) 1) "15.08726745843887329"
      2) "37.50266842333162032"
redis> 

그런데 Redis 6.2.0 부터는 GEORADIUS 관련 함수들이 Deprecated 될지도 모르기 때문에 GEOSEARCH나 GEOSEARCHSTORE 함수로 변경하는 것을 권장합니다.

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEOADD Sicily 12.758489 38.788135 "edge1" 17.241510 38.788135 "edge2"
(integer) 2
redis> GEOSEARCH Sicily FROMLONLAT 15 37 BYRADIUS 200 km ASC
1) "Catania"
2) "Palermo"
redis> GEOSEARCH Sicily FROMLONLAT 15 37 BYBOX 400 400 km ASC WITHCOORD WITHDIST
1) 1) "Catania"
   2) "56.4413"
   3) 1) "15.08726745843887329"
      2) "37.50266842333162032"
2) 1) "Palermo"
   2) "190.4424"
   3) 1) "13.36138933897018433"
      2) "38.11555639549629859"
3) 1) "edge2"
   2) "279.7403"
   3) 1) "17.24151045083999634"
      2) "38.78813451624225195"
4) 1) "edge1"
   2) "279.7405"
   3) 1) "12.7584877610206604"
      2) "38.78813451624225195"
redis> 

오일 나우에서 크게 문제되는 부분은 없었지만, 차후에 문제가 될만한 부분이 KEYS 명령의 사용 개수가 지속적으로 증가하는 것을 발견했습니다. Redis 모니터링을 위해서 KEYS 명령이 사용되고 있었고, 현재는 그렇게까지 많은 정보가 들어가 있지 않았기 때문에, 많은 시간이 걸리지 않았지만, KEYS 명령의 usec_per_call 값이 17811 으로 굉장히 높은 수치였습니다. Redis 에서의 명령의 시간의 측정은 마이크로초 단위인데 즉 1/100000 초입니다. 즉 자주 사용하는 GEORADIUS가 206.43 마이크로 초 인것에 비해서 그거보다 거의 80~90배 정도 느린 속도입니다. 마이크로 초 단위이므로 GEORADIUS는 현재 1초에 500개 정도를 처리할 수 있지만, KEYS는 1초에 5개 밖에 사용할 수 업습니다. 즉, 전체적으로 RADIUS 성능을 떨어뜨리고 있었습니다. 그래서 이를 SCAN으로 변경하도록 가이드를 해서 해당 이슈를 해결 하도록 하였습니다.

그 외에 오일 나우에서 관심을 가지던 부분은 보안 관련 부분이었는데, AWS 의 ElastiCache를 사용하고 있기 때문에, 기본적으로 해당 서비스가 외부에 노출되지 않아서 큰 문제는 없었습니다. 일부의 사용자들이 Redis를 EC2에 바로 돌리면서 해당 포트를 외부에 노출하는 경우가 많은데, Redis의 경우 6.x 부터는 ACL을 지원하기는 하지만, Store 형태의 모든 서비스는 직접적으로 외부에 노출되는 것은 굉장히 보안에 취약합니다. 오일나우에서는 ElastiCache를 사용함으로써 처음부터 이런 보안 이슈를 피하고 있었습니다.

1편은 여기까지 적고 다음 내용들은 2편에서 추가하도록 하겠습니다.