본문 바로가기
서버 및 보안

Memcached

by 다움위키 2023. 12. 25.

Memcached(mem-cash-dee 또는 mem-cashed로 다양하게 발음됨)는 범용 분산 메모리-캐싱 시스템입니다. 그것은 외부 데이터 소스 (예를 들어 데이터베이스 또는 API)를 읽어야 하는 횟수를 줄이기 위해 RAM에 데이터와 객체를 캐싱함으로써 동적 데이터베이스-기반 웹사이트의 속도를 높이기 위해 자주 사용됩니다. Memcached는 개정된 BSD 라이선스 아래에서 라이선스가 부여된 자유와 오픈-소스 소프트웨어입니다. Memcached는 유닉스-계열 운영 시스템 (리눅스macOS)와 마이크로소프트 윈도우에서 실행됩니다. 그것은 libevent 라이브러리에 의존합니다.

Memcached의 API는 여러 시스템에 분산된 매우 큰 해시 테이블을 제공합니다. 테이블이 가득 찼을 때, 후속 삽입은 이전 데이터에 최소 최근 사용 (LRU) 순서로 제거되는 원인이 됩니다. Memcached를 사용하는 응용 프로그램은 전형적으로 데이터베이스와 같은 느린 백업 저장소로 폴백하기 전에 RAM에 요청과 추가를 계층화합니다.

Memcached는 발생할 수 있는 누락을 추적하는 내부 메커니즘을 가지지 않습니다. 어쨌든, 일부 타사 유틸리티는 이 기능을 제공합니다.

Memcached는 2003년 5월 22일 Brad Fitzpatrick에 의해 자신의 웹사이트 LiveJournal을 위해 처음 개발되었습니다. 그것은 원래 Perl로 작성되었고, 나중에 Anatoly Vorobey에 의해 C로 다시 작성되었고, 그런-다음 LiveJournal에 의해 채택되었습니다. Memcached는 현재 YouTube, Reddit, Facebook, Pinterest, Twitter, Wikipedia, 및 Method Studios를 비롯한 많은 다른 시스템에서 사용됩니다. Google App Engine, Google Cloud Platform, Microsoft Azure, IBM BluemixAmazon Web Services는 역시 API를 통해 Memcached 서비스를 제공합니다.

Memcached 프록그램 자체가 메모리에 적재되는 데에 적어도 80M의 RAM이 든다고 알려져 있습니다. 더구나 캐시를 위해서 별도의 메모리를 사용하게 되므로, 메모리가 많은 시스템에서만 사용해야겠습니다.

Installation

최신 버전을 사용하기 위해 PHP로 가셔서 ondrej 저장소를 등록합니다:

  • sudo apt install memcached php8.1-memcached

php-memcached vs. php-memcache

패키지를 보시면 이름이 거의 비슷한데 2가지가 있습니다. 이 중에서 php-memcached가 새롭게 쓰인 것이고, 좀 더 빠르다고 알려져 있습니다.

설치 확인

다음 내용의 test.php를 웹의 루트에 만들어서 접근합니다.

<?php
    phpinfo();
?>

브라우저를 열어서 http://localhost/test.php 로 접근을 합니다. 아래쪽으로 내리면 목록에 memcached라는 부분을 볼 수 있습니다.

또한 memcached 서비스가 제대로 동작하고 있는지 확인할 수도 있습니다.

  • ps aux | grep memcached
memcache 28972  0.0  0.2 340852 18160 ?        Ssl  11:54   0:00 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1
user   31349  0.0  0.0  15516   936 pts/0    SN+  12:02   0:00 grep --color=auto memcached
  • echo "stats settings" | nc localhost 11211
STAT maxbytes 67108864
STAT maxconns 1024
STAT tcpport 11211
STAT udpport 11211
STAT inter 127.0.0.1
...

Test Whether Memcached can Cache Data

이제 memcached가 제대로 동작하는지 확인해 볼 차례입니다. 아래 파일을 웹 루트 아랭에 cache_test.php로 만듭니다.

<?php
$mem = new Memcached();
$mem->addServer("127.0.0.1", 11211);

$result = $mem->get("blah");

if ($result) {
    echo $result;
} else {
    echo "No matching key found.  I'll add that now!";
    $mem->set("blah", "I am data!  I am held in memcached!") or die("Couldn't save anything to memcached...");
}
?>

브라우저를 열어서 http://localhost/cache_test.php 로 접근을 합니다.

처음 실행 때에는 No matching key found. I'll add that now!라는 메시지를 볼 수 있을 것입니다.

리플래쉬를 하시면 I am data! I am held in memcached!라는 메시지를 볼 수 있습니다.

Test Temporarily Caching Database Values

데이터베이스에 자료를 입력하고 캐싱이 제대로 되는지 확인해 보겠습니다.

  • sudo mysql -u root -p
MariaDB [(none)]> CREATE DATABASE mem_test;
MariaDB [(none)]> USE mem_test;
MariaDB [mem_test]> GRANT ALL ON mem_test.* TO test@localhost IDENTIFIED BY 'testing123';
ariaDB [mem_test]> CREATE TABLE sample_data (id int, name varchar(30));
ariaDB [mem_test]> INSERT INTO sample_data VALUES (1, "some_data");
ariaDB [mem_test]> exit

웹에서 결과를 보기 위해서, 웹 루트에 database_cahce.php를 만듭니다.

<?php
$mem = new Memcached();
$mem->addServer("127.0.0.1", 11211);

mysql_connect("localhost", "test", "testing123") or die(mysql_error());
mysql_select_db("mem_test") or die(mysql_error());

$query = "SELECT name FROM sample_data WHERE id = 1";
$querykey = "KEY" . md5($query);

$result = $mem->get($querykey);

if ($result) {
    print "<p>Data was: " . $result[0] . "</p>";
    print "<p>Caching success!</p><p>Retrieved data from memcached!</p>";
} else {
    $result = mysql_fetch_array(mysql_query($query)) or die(mysql_error());
    $mem->set($querykey, $result, 10);
    print "<p>Data was: " . $result[0] . "</p>";
    print "<p>Data not found in memcached.</p><p>Data retrieved from MySQL and stored in memcached for next time.</p>";
}
?>

브라우저를 열어서 http://localhost/database_cache.php 로 접근을 하시면 Data not found in memcached. ...을 볼 수 있습니다.

리플래쉬를 하시면, Data was: some_data ...로 캐싱된 메시지를 볼 수 있습니다.

MediaWiki configuration

미디어위키 설정 LocalSettings.php에 이전에 사용하던 캐시를 주석처리하고 추가합니다.

#$wgMainCacheType = CACHE_ACCEL;    #apc or xcache 사용할 때 설정
#$wgMemCachedServers = array();
$wgMainCacheType = CACHE_MEMCACHED;
$wgParserCacheType = CACHE_MEMCACHED; # optional
$wgMessageCacheType = CACHE_MEMCACHED; # optional
$wgMemCachedServers = array( "127.0.0.1:11211" );
$wgSessionsInObjectCache = true; # optional
$wgSessionCacheType = CACHE_MEMCACHED; # optional

Performance tuning

리눅스 계열에서는 사용하는 초기 캐시의 양이 32M~256M 사이를 이용하는 것으로 보입니다. 물론 이 값은 배포판마다 다릅니다. 어쨌든 영문 위키피디아와 처럼, 다움 위키에서도 생각보다 많은 템플릿을 사용함으로, 초기의 캐시 사용량을 RAM의 크기를 고려하여 높일 필요가 있습니다. 주로 2G 이상을 사용할 것을 권합니다. 즉, /etc/memcached.conf에서 -m 64-m 2048처럼 바꿉니다.

현재 상태를 확인하기 위해서는

  • telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

위와 같이 출력이 되면 접근이 된 것입니다. 여기서 stats를 입력하면, 현재 상태를 확인할 수 있습니다. 종료하고 싶을 때에는 quit을 입력합니다.

External Resources