새소식

Welcome to the tech blog of Junior Backend Developer Myoungji Kim!

Development/Cache

[Cache] PHP 에서 Memcached(멤캐시) 사용하기

  • -

🐳 들어가기 전

작년부터 우선 순위를 가장 높여 처리하고 있는 업무가 하나 있다.

바로 DB 접속 정보 보관 장소를 옮기는 것!

 

기존에는 웹서버 내 database.yml 내에 DB 접속 정보가 평문으로 노출되어 있었다.

이는 해킹 등의 보안 이슈를 야기할 수 있는 원인이 되었기 때문에

작년부터 모든 상점의 DB 접속 정보를 Vault로 옮기는 작업을 하고 있다.

 

솔루션에서는 Vault에 직접 접근하여 DB 접속 정보를 가져오지는 않고,

중개 API에서 상점별 DB 접속 정보를 읽어와 로컬 캐시, Memcached에 저장하여 사용하는 방식을 택했다.

 

현재까지 솔루션에서 Memcached를 쓰고 있지 않았기에 새로 도입했어야 했다. 

그 과정에서 Memcached 와 관련하여 겪었던 내용들을 정리해보고자 한다 !


✅ Memcached 설치

🚀 Docker 컨테이너 내 설치 및 데몬 실행

우리 서비스는 전체 도커라이징 되어 있기 때문에, 필요한 패키지들은 모두 도커 컨테이너 내에 설치해야 한다.

RUN apt-get update \
    && apt-get install -y \
    memcached \
    libmemcached-dev

RUN pecl install \
    memcached

service memcached start

 

 

dockerfile 내 멤캐시 관련 패키지를 설치하고,

컨테이너 실행시 멤캐시 데몬을 띄워주는 작업도 같이 추가해주었다.

 

🚀 Memcached 설치 확인

1. 도커 이미지 빌드

$ docker-compose up --build

 

2. 멤캐시 설치 여부 확인

➜  service git:(feature/0000) ✗ docker exec -it (image) bash
root@*:/var/www/html# pecl list
Installed packages, channel pecl.php.net:
=========================================
Package   Version State
apcu      5.1.22  stable
gearman   2.1.0   stable
memcached 3.2.0   stable
redis     5.3.7   stable
xdebug    2.8.1   stable

 

도커 컨테이너 내 접속하여 pecl 설치된 리스트를 확인하면, memcached 3.2.0 버전으로 추가된 걸 확인할 수 있다!

(참고로 symfony cache를 사용하기 위해서는 2.2.0 이상의 버전인 memcached가 필요했다)

사실 그냥 phpinfo() 찍어서 봐도 되지만

리얼 라이브 환경에서 phpinfo() 페이지를 임의로 만들어둘 순 없으니 cli에서 확인하는게 제일 마음 편한 것 같다

 

3. 멤캐시 실행 여부 확인

[+] Running 1/1
 ✔ Container service  Created                                                                                                                                                                                                       3.8s 
Attaching to service

service  | Starting memcached: memcached.

 

 

도커 실행 시에 나오는 콘솔 로그로도 멤캐시 실행 여부를 확인할 수 있다.

 

✅ 개발하기: PSR-16, SimpleCache 

🚀 Cache 라이브러리

https://packagist.org/packages/symfony/cache

symfony cache 라이브러리를 사용했다

<?php

namespace Symfony\Component\Cache\Simple;

use Symfony\Component\Cache\Traits\MemcachedTrait;

class MemcachedCache extends AbstractCache {}

🚀 구현 방법

https://www.php-fig.org/psr/psr-16/

psr-16에 맞춰 SimpleCache 인터페이스를 기반으로 개발했다.

모든 종류의 캐시에 대하여 공통적인 메서드를 공유하고 있다는 점에서 개발하기 더 편했다.

(이미 Redis 도입으로 SimpleCache를 구축해둔 사람이 있었기에.. 크게 어렵지 않았다!)

🚀 사용 예제

<?php

use Framework\SimpleCache\SimpleCache;

function example()
{
    $cacheKey = "(CACHE_KEY)";
    $cacheValue = "(CACHE_VALUE)";
    $ttl = 86400;

    // cache set (return type: bool)
    SimpleCache::init(SimpleCache::MEMCACHED)->set($cacheKey, $cacheValue, $ttl);

    // cache get (return type: mixed)
    SimpleCache::init(SimpleCache::MEMCACHED)->get($cacheKey);

    // cache has (return type: bool)
    SimpleCache::init(SimpleCache::MEMCACHED)->has($cacheKey);

    // cache delete (return type: bool)
    SimpleCache::init(SimpleCache::MEMCACHED)->delete($cacheKey);
}

 

✅ 멤캐시 서버에 접속하여 캐시 모니터링하기

🚀 호스트에서 멤캐시 서버 접속하기

$ telnet 127.0.0.1 11211

🚀 캐시 정보 조회하기

[rentalsu@0-0-0-web-origin ~]$ telnet 127.0.0.1 11211
-bash: fc: history specification out of range
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

우리 서비스의 PHP 도커 컨테이너는 호스트(Host) 네트워크 모드를 사용하고 있어,
컨테이너 접속 및 별도의 포트 포워딩 없이도 호스트에서 바로 telnet으로 멤캐시에 접속하였다.

 

🔗 [Linux] Telnet으로 Memcached 정보 조회하기 - velog

조회에 필요한 명령어는 위 포스팅 및 이것저것..을 참고하며 했다!

 

주로 아래 4가지를 제일 많이 썼다.

  • stats items
  • stats slabs
  • stats cachedump (slab number) 0
  • get (cache key)
ITEM cache_deliveryInfo [6 b; 1705026403 s]

 

메모를 하나 하자면,, cachedump 시 위와 같이 크기 및 유효시간이 나오는데

오른쪽은 s != second 가 아니라, 유닉스 시간이다

그것도 모르고 고객 서버에서 ttl이 왜이래..? 했다가 잠시 머쓱했달까.. 😅


지금까지는 Memcached 도입을 위한 과정을 기록했는데,

아직은 카나리 배포로 특정 서버에만 배포가 나간 상황이라 멤캐시 부하 등의 다양한 요소에 대해서는 경험해보지 못했다.

얼른 전 서버로 배포를 내보내서 보다 다양한 기록을 남길 수 있게 되었으면 좋겠다 :)

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.