출처 : http://wiki.heedy.pe.kr/index.php/Memcached

1 서론
2 memcached의 캐쉬 방식
3 memcache의 인스톨
4 memcache의 기동
5 memcache의 동작확인


서론

memcached는 고속의 분산형 Memory Cache이며, 주로 DB에의 참조 결과를 Cache, 웹시스템에 있어서의 성능향상을 위해 많이 사용된다.

  • 웹시스템에 있어서의 부하대책
    1. 서버의 구성을 살펴본다.
      • Scale Out (서버의 수를 늘린다)
      • Scale Up (CPU/Memory 등의 하드웨어를 향상시킨다)
    2. OS/Middleware의 설정을 살펴본다.
    3. 네트워크구성을 살펴본다.
    4. 어플리케이션 로직을 살펴본다.
  • 위의 대책 중에 DB서버에의 대책에는 데이터의 배치, 데이터 액세스방법을 어떻게 구현했는지가 문제가 된다.
    1. DB서버에의 부하를분산 (DB파티션팅 등의 기술을 사용해 Scale Out)
    2. DB서버에 있어서의 쓸때없는 처리를 줄인다. (DB Query를 다시 살펴본다)

바로 memcache가 위의 문제가 될 수 있는 곳의 해결책이 될 수 있을 것 같다.

  • memcached에 의한 성능향상
    1. 파일 입출력 (File I/O)가 줄어듬
      • 파일의 내용을 캐쉬해 둠으로써 파일 입출력에 의한 부하가 줄어든다.
    2. 세션정보의 공유
      • 유져의 세션정보를 캐쉬해 둠으로써, 복수의 아팟치서버사이의 세션정보를 공유한다.

memcached의 캐쉬 방식

  • 분산형

memcache서버 자체에는 분산장치을 가지고 있지않다. 하지만 memcache의 클라이언트 라이브러리가 존재하며, 분산장치는 이를 이용해 클라이언트에서 구현해 주면 된다.

  • 휘발성

memcache는 onmemory 캐쉬서버이므로 데이터를 계속적으로 가지고 있지 못한다. 프로세스가 종료되면 데이터도 모두 없어진다.

  • 키와 값의 매핑

memcache는 hashmap처럼 키와 값의 매핑정보를 보유한다. 키는 250문자까지 공백을 포함하지 않는 텍스트로 지정하고, 값은 1MB 까지의 임의의 데이터를 입력할 수 있다.

  • LRU 와 유효기간에 의한 캐쉬소거

memcache의 캐쉬데이터의 소거 방식은 LRU(Least Recently Used)이다. 즉 캐쉬에 빈자리가 없을 경우는 가장 오래된 순으로 소거된다. 하지만 키별로 유효기간을 정할 수 있으므로 소거 정책을 정할 수 있다.

 

memcache의 인스톨

    * 선행으로 인스톨 되어야 할 라이브러리 : libevent

 

# wget http://www.monkey.org/~provos/libevent-1.4.8-stable.tar.gz
# tar xvfz libevent-1.4.8-stable.tar.gz
# cd libevent-1.4.8-stable
# ./configure
# make
# make install

 

 

    * memcached의 인스톨

 

# wget http://www.danga.com/memcached/dist/memcached-1.2.6.tar.gz
# tar xvfz memcached-1.2.6.tar.gz
# cd memcached-1.2.6
# ./configure
# make
# make install

 

 

memcache의 기동

    * -vv (very verbose) 옵션과 함께 기동, -p 포트, -u root로 실행

 

# memcached -vv -p 11211 -u root &
sh-3.2# memcached -vv -p 11211 -u root
slab class   1: chunk size     88 perslab 11915
slab class   2: chunk size    112 perslab  9362
slab class   3: chunk size    144 perslab  7281
slab class   4: chunk size    184 perslab  5698

 ..중략..

slab class  38: chunk size 391224 perslab     2
slab class  39: chunk size 489032 perslab     2
<4 server listening
<5 server listening
<6 send buffer was 9216, now 7456540
<6 server listening (udp)

 

 

    * -p 옵션으로 복수의 프로세스를 실행 시킬 수 있으며, -d 옵션으로 백그라운드 기동이 가능.

 

# memcached -p 11211 -d -u root
# memcached -p 11212 -d -u root
# memcached -p 11213 -d -u root

 

memcache의 동작확인

    * 접속확인

 

# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.

 

 

    * 상태확인 (telnet 상태에서)

 

stats
STAT pid 13041
STAT uptime 171
STAT time 1225958288
STAT version 1.2.6
STAT pointer_size 32
STAT rusage_user 0.001480
STAT rusage_system 0.002299
STAT curr_items 0
STAT total_items 0
STAT bytes 0
STAT curr_connections 3
STAT total_connections 4
STAT connection_structures 4
STAT cmd_get 0
STAT cmd_set 0
STAT get_hits 0
STAT get_misses 0
STAT evictions 0
STAT bytes_read 7
STAT bytes_written 0
STAT limit_maxbytes 67108864
STAT threads 1
END

    * get/set 동작확인 (telnet 상태에서)

set key1 0 0 6
Hello!
STORED
get key1
VALUE key1 0 6
Hello!
END

[출처] memcached|작성자 루키엔젤

'OS > LINUX' 카테고리의 다른 글

chkconfig  (0) 2011.06.21
사용자 프로그램 부팅시 자동 실행  (0) 2011.06.21
mutt 커맨드라인 첨부 메일 보내기  (0) 2011.06.17
/etc/sysconfig / 시스템 설정 정보  (0) 2011.06.16
IPTABLES 사용법 예제로 정리  (0) 2011.06.16
Memcached 데몬
사이트 : http://www.danga.com/memcached/
다운로드 : http://memcached.googlecode.com/files/memcached-1.2.8.tar.gz

Memcached PHP Extension
사이트 : http://pecl.php.net/package/memcache
다운로드 : http://pecl.php.net/get/memcache-2.2.5.tgz

LibEvent
사이트 : http://monkey.org/~provos/libevent/
다운로드 : http://monkey.org/~provos/libevent-1.4.11-stable.tar.gz

 

Memcached 는 데이터를 메모리에 저장하여 이용할 수 있는 데몬이다. 분산처리가 가능하고 매우 빠른 성능을 지닌 캐시 이다.
(편의상 root로 작업)

 

1. Memcached 설치

우선 Memcached 를 적당한 디렉토리 (/usr/local/src) 등에 다운로드를 받는다.
# tar zxvf memcached-1.2.8.tar.gz
# cd memcached-1.2.8
# configure --prefix=/usr/local/memcached
* checking for libevent directory... configure: error: libevent is required 메세지가 나오면 libevent 라이블러리를 설치를 해줘야 한다.

# make
# make install

 

1-1 memcached 실행
# cd /usr/local/memcached (configure 에서 지정한 prefix로 이동)
# bin/memcached -u [실행될 사용자] &
* 실행될 사용자는 memcached 데몬이 -u 옵션으로 지정된 사용자로 실행이 된다 (root로 지정하면 안됨)
# netstat -na | grep 11211
->
tcp        0      0 0.0.0.0:11211               0.0.0.0:*                   LISTEN     
tcp        0      0 :::11211                          :::*                            LISTEN

포트를 확인한다.

 

2. Memcache PHP Extension
# tar zxvf memcache-2.2.5.tgz
# cd memcache-2.2.5
# phpize
# ./configure
# make
# cp .libs/memcache.so /(php 익스텐션 디렉토리) php.ini에서 지정한 extension_dir 에서 설정한 디렉토리
# php -m | grep memcache 로 모듈 확인
# /etc/init.d/httpd restart 또는 /usr/local/apache/bin/apachectl restart 로 Apache 재시작

PHP info 확인

 

3. Libevent 설치 (옵션)
* Memcache Configure 중 libevent 가 필요하다는 메세지를 보내고 중단이 되었을때 설치를 한다.

libevent 를 다운로드 받는다.
# tar zxvf libevent-1.4.11-stable.tar.gz
# cd libevent-1.4.11-stable
# ./configure
# make
# make install (/usr/local/lib 에 libevent.so 파일이 존재하는지 확인한다.)
# ldconfig (vi /etc/ld.so.conf 에 /usr/local/lib 추가를 한다.

PHP memcache 사용은 다음편에서 다루도록 하겠습니다 ^^


원본 : http://mcpicdtl.blogspot.com/2010/04/memcached.html

 

Memcached 는 데이터를 메모리에 저장하며 분산처리가 가능하고 매우 빠른 성능을 지닌 캐시 입니다.

- libevent 설치
Memcached 는 libevent 를 필요로 하므로 먼저 설치를 진행하겠습니다.

http://monkey.org/~provos/libevent/

[root@yongobk ~]# cd /usr/local/src
[root@yongobk ~]# wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz
[root@yongobk ~]# tar xzvf libevent-1.4.13-stable.tar.gz
[root@yongobk ~]# cd libevent-1.4.13-stable
[root@yongobk ~]# ./configure
[root@yongobk ~]# make ; make install


- Memcached 설치
아래 주소에서 최신버전을 다운로드 하고 설치를 진행합니다.

http://code.google.com/p/memcached/downloads/list

[root@yongobk ~]# cd /usr/local/src
[root@yongbok ~]# wget http://memcached.googlecode.com/files/memcached-1.4.4.tar.gz
[root@yongbok ~]# tar xzvf memcached-1.4.4.tar.gz
[root@yongbok ~]# cd memcached-1.4.4
[root@yongbok ~]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local
[root@yongbok ~]# make ; make install

-> 추가

libevent 라이브러리를 memcached에 인식 시키기

[]# whereis libevent를 실행해서 라이브러리 위치 확인

[]# ldd /usr/local/memcached/bin/memcached

linux-gate.so.1 =>  (0x001b0000)
libevent-1.4.so.2 => /usr/local/lib/libevent-1.4.so.2 (0x007a3000) --이렇게 출력되어야 함. 만약 not found가 나오는 경우 아래 명령을 실행
libpthread.so.0 => /lib/libpthread.so.0 (0x00aa1000)
libc.so.6 => /lib/libc.so.6 (0x0092c000)
libnsl.so.1 => /lib/libnsl.so.1 (0x00c10000)
librt.so.1 => /lib/librt.so.1 (0x00b31000)
libresolv.so.2 => /lib/libresolv.so.2 (0x00c37000)
/lib/ld-linux.so.2 (0x0090e000)

[]# echo "/usr/local/lib" >> /etc/ld.so.conf

[]# ldconfig /etc/ld.so.con

[]# ldd /usr/local/memcached/bin/memcached를 실행해서 라이브러리 로드를 확인한다.

 

- Memcached 실행
[root@yongbok ~]# /usr/local/memcached/bin/memcached -u nobody &
- Memcached PHP Extension 설치

http://pecl.php.net/package/memcache

[root@yongobk ~]# cd /usr/local/src
[root@yongbok ~]# wget http://pecl.php.net/get/memcache-2.2.5.tgz
[root@yongbok ~]# tar xzvf memcache-2.2.5.tgz
[root@yongbok ~]# cd memcache-2.2.5
[root@yongbok ~]# /usr/local/php5/bin/phpize
[root@yongbok ~]# ./configure --with-php-config=/usr/local/php5/bin/php-config
[root@yongbok ~]# make ; make install

Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/


php.ini 파일에 아래 내용 추가 합니다.

[root@yongbok ~]# vi /usr/local/apache2/conf/php.ini

[memcache]
extension_dir=/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/
extension=memcache.so
memcache.allow_failover=1
memcache.max_failover_attempts=100
memcache.chunk_size=32768
memcache.default_port=11211


- Apache 재시작

[root@yongbok ~]# /usr/local/apache2/bin/apachectl restart


- PHP 에 Memcached 가 적용 되어 있는지 확인

[root@yongbok ~]# echo '<?php phpinfo(); ?>' > /var/www/phpinfo.php





참고
http://www.ibm.com/developerworks/kr/library/os-php-fastapps3/

[세션을 메모리캐싱을 사용할 경우 주의 사항 ]
memcache를 사용하는 중 세션 정보가 유지되지 않아 그것을 해결하는데
많은 시간을 소비하였습니다. 저의 경우 모델자체를 세션에 저장하였었는데 그것의 데이터가 많아지면 저절로 기존 데이터가 사라지는 것이었습니다. 그래서 필요한 데이터만 저장하니까 그러한 문제는 발생되지 않았습니다

memcached + Session Database
- memcached의 원래 목적이 데이터베이스나 파일 데이터를 캐시하는 것임

- 세션 데이터를 데이터베이스로 만들어 넣고, session handler 부분에서 memcached를 호출하게 만들면 될 듯.

- 데이터베이스를 사용하는 안정성 + 세션 공유 문제 해결 + memcached에 의한 성능 향상까지 기대할 수 있지 않을까?

- 이 부분은, 좀더 생각해보면서, 방법을 찾아봐야 할 듯...
<- 곰곰히 생각해보니, 약간 부정적. 세션 데이터는 read보다는 update가 압도적으로 많음. 따라서, 캐시 효과는 작음.



Memcache & MySQL PHP Session Handler PHP code for session db + memcached
http://www.softwareprojects.com/resources/programming/t-php-sessionsave_handler-and-database-sessions-debu-1797.html
http://www.softwareprojects.com/resources/programming/t-memcached-for-php-sessions-1654.html



Cache사용을 자주 할 일이 없기에, 간혹 사용하더라도 ibatis 캐쉬를 쓰곤했다.

사용할 일이 있어 이참에 적극적(?)으로 사용하고자 memcache를 도입하려하다

linux 서버에 memcache deamon을 띄우는 설치/실행 절차를 정리해본다.


1) libevent 설치

 - memcached를 설치하기 위해선 기본적으로 libevent library가 필요하다.

 - http://monkey.org/~provos/libevent/ 에서 필요한 버젼을 받는다.

$ wget http://monkey.org/~provos/libevent-1.4.8-stable.tar.gz

$ tar -xvzf libevent-1.4.8-stable.tar.gz

$ cd libevent-1.4.8-stable

$ ./configure

$ make

$ make install

 - /usr/local/lib 하위에 library가 설치됨을 확인할 수 있다.



2) memcached 설치

 - http://memcached.org/latest 에서 최신 버젼을 다운 받아서 설치한다.

wget http://memcached.org/latest

$ tar -xvzf memcached-1.4.5.tar.gz 

$ cd memcached-1.4.5

$ ./configure (--prefix=/myprogram/memcached-1.4.5 --with-libevent=/usr/local/lib/  ) 생략가능

$ make

$ make install


 - configure 할때 위에서 설치된 libevent의 경로를 간혹 못 찾는 경우가 있는 듯하다.

   memcache 실행시 libevent를 못찾는다면 option을 추가한다.




3) 실행

$ ./memcached -p 11211 -d -u lkflower

 - configure 옵션을 주었지만 path를 못 찾는경우가 있는데;;; 아래 오류와 같이 뜨면서..

./memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory

$ ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/ 

처럼 symbolic 으로 처리하면 되겠다.


4) 확인

memcache가 잘 되는지 확인하기 위해 telnet으로 접속하여 stats 명령으로 확인해 본다. 

접속 포트는 위의 memcache 데몬을 올린 포트와 동일하다.

$ telnet 127.0.0.1 11211

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

stats

STAT pid 16129

STAT uptime 166

STAT time 1297756494

STAT version 1.4.5

STAT pointer_size 32

STAT rusage_user 0.001999

STAT rusage_system 0.001999

STAT curr_connections 10

STAT total_connections 11

STAT connection_structures 11

STAT cmd_get 0

STAT cmd_set 0

STAT cmd_flush 0

STAT get_hits 0

STAT get_misses 0

STAT delete_misses 0

STAT delete_hits 0

STAT incr_misses 0

STAT incr_hits 0

STAT decr_misses 0

STAT decr_hits 0

STAT cas_misses 0

STAT cas_hits 0

STAT cas_badval 0

STAT auth_cmds 0

STAT auth_errors 0

STAT bytes_read 7

STAT bytes_written 0

STAT limit_maxbytes 67108864

STAT accepting_conns 1

STAT listen_disabled_num 0

STAT threads 4

STAT conn_yields 0

STAT bytes 0

STAT curr_items 0

STAT total_items 0

STAT evictions 0

STAT reclaimed 0

END




+ Recent posts