맨위로가기

Memcached

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

Memcached는 2003년 5월 브래드 피츠패트릭이 개발한 분산 메모리 객체 캐싱 시스템이다. 클라이언트-서버 아키텍처를 사용하며, 키-값 연관 배열 형태로 데이터를 저장하여 데이터베이스 쿼리 횟수를 줄여 웹사이트 속도를 향상시키는 데 사용된다. 유튜브, 페이스북, 트위터, 위키백과 등 대규모 사이트에서 활용되며, MySQL, 오라클 코히어런스 등 다양한 데이터베이스에서도 Memcached API를 지원한다.

더 읽어볼만한 페이지

  • 키-값 데이터베이스 - LevelDB
    LevelDB는 구글에서 개발한 오픈 소스 키-값 저장소로, 키와 값을 임의의 바이트 배열로 저장하고 키 순서로 데이터를 정렬하여 관리하며, 쓰기 일괄 처리, 정/역방향 반복, 스내피 압축을 지원하여 구글 크롬, Riak, 비트코인 코어 등 다양한 분야에서 활용되고 마리아DB 10.0에서는 쿼리 가능한 스토리지 엔진을 제공한다.
  • 키-값 데이터베이스 - 파운데이션DB
    파운데이션DB는 키-값 저장소를 기반으로 트랜잭션 및 ACID 속성을 지원하는 분산 데이터베이스 시스템으로, 높은 동시성과 유연성을 제공하며 오픈 소스화되었다.
  • 2003년 소프트웨어 - 사파리 (웹 브라우저)
    사파리는 애플이 개발한 웹 브라우저로, 2003년 처음 출시되어 웹킷 엔진을 기반으로 빠른 속도와 웹 표준 지원을 제공하며, macOS, iOS, iPadOS 등에서 기본 브라우저로 사용된다.
  • 2003년 소프트웨어 - 키노트
    키노트는 스티브 잡스가 맥월드 엑스포에서 사용하기 위해 개발한 애플의 프레젠테이션 소프트웨어이며, 3차원 애니메이션과 전환 효과를 제공하고, iWork 패키지에 통합되어 HD 테마, 3D 그래픽 효과, 다양한 파일 형식 지원 등의 기능을 제공한다.
  • 크로스 플랫폼 소프트웨어 - MSN
    MSN은 1995년 마이크로소프트가 윈도우 95와 함께 출시한 웹 포털이자 관련 서비스 모음으로, 뉴스, 엔터테인먼트, 스포츠, 금융 등 다양한 콘텐츠를 제공하며 주요 온라인 서비스를 통합하는 허브 역할을 수행한다.
  • 크로스 플랫폼 소프트웨어 - 구글 포토
    구글 포토는 사진 및 동영상 저장, 공유, 관리 기능을 제공하는 구글의 클라우드 기반 서비스로, 자동 분류, 얼굴 인식, 검색 기능을 제공하지만 2021년부터 무료 무제한 저장 용량 제공 정책이 변경되었고, 2024년에는 기술의 군사적 이용에 대한 윤리적 논란이 있었다.
Memcached - [IT 관련 정보]에 관한 문서
개요
Memcached 로고
Memcached 로고
개발자Danga Interactive
최초 릴리스2003년 5월 22일
운영 체제크로스 플랫폼
프로그래밍 언어C
장르분산 메모리 캐싱 시스템
라이선스수정 BSD 라이선스

2. 역사

Memcached는 2003년 5월 22일 브래드 피츠패트릭이 자신의 웹사이트 라이브저널을 위해 처음 개발했다.[32][33] 초기에는 로 작성되었으나, 이후 Anatoly Vorobey에 의해 C로 재개발되어 라이브저널에 채용되었다.[34] 현재 Memcached는 유튜브,[35] 레딧,[36] 페이스북,[37][38] 핀터레스트,[39][40] 트위터,[41], 위키백과 등 다양한 시스템에서 사용되고 있다.[42] 구글 앱 엔진, 마이크로소프트 애저, 블루믹스, 아마존 웹 서비스에서도 API를 통해 Memcached 서비스를 제공한다.[43][44][45][46]

3. 소프트웨어 아키텍처

Memcached는 클라이언트-서버 아키텍처를 사용한다. 서버는 키-값 연관 배열을 유지하고, 클라이언트는 이 배열을 채우고 키를 사용하여 질의한다. 키는 최대 250바이트, 값은 최대 1메가바이트까지 가능하다.[28]

클라이언트는 클라이언트 측 라이브러리를 사용하여 서버에 연결하며, 기본적으로 포트 11211에서 서비스를 제공한다. TCP와 UDP를 모두 지원한다. 각 클라이언트는 모든 서버를 알고 있으며, 서버는 서로 통신하지 않는다. 클라이언트가 특정 키에 해당하는 값을 설정하거나 읽으려면, 클라이언트 라이브러리가 먼저 키의 해시를 계산하여 사용할 서버를 결정한다. 서버는 값을 RAM에 유지하며, RAM이 부족해지면 LRU 알고리즘에 따라 가장 오래된 값을 삭제한다. 따라서 클라이언트는 Memcached를 임시 캐시로 취급해야 하며, Memcached에 저장된 데이터가 필요할 때에도 여전히 존재한다고 가정할 수 없다. MemcacheDB, Couchbase Server와 같은 데이터베이스는 Memcached 프로토콜 호환성을 유지하면서 영구 스토리지를 제공한다.[28]

일반적으로 Memcached는 여러 서버와 많은 클라이언트로 구성되지만, 단일 컴퓨터에서 클라이언트와 서버 역할을 동시에 수행할 수도 있다. 해시 테이블의 크기는 데이터 센터의 서버 클러스터 전체에서 사용 가능한 메모리로 제한되며, 대규모 웹 서비스에서는 수 기가바이트까지 확장될 수 있다. Memcached는 콘텐츠 요청이 많거나 콘텐츠 생성 비용이 높은 상황에서 유용하다.[28]

Memcached는 원래 Danga Interactive에서 LiveJournal 서비스를 위해 개발되었으나, 현재는 YouTube[29], LiveJournal, Wikipedia, SourceForge, Facebook, Digg, Fotolog 등 여러 사이트에서 사용되고 있다.[30] Memcached는 데이터와 객체를 메모리에 캐싱하여 데이터베이스에서 읽어오는 횟수를 줄임으로써 데이터베이스를 사용하는 웹 사이트의 속도를 높이는 데 사용된다. Memcached는 퍼미시브 라이선스인 BSD 라이선스로 배포된다.[28]

3. 1. 보안

Memcached는 기본적으로 신뢰할 수 있는 네트워크 내에서 배포된다. 신뢰할 수 없는 네트워크에 배포되거나 클라이언트 제어가 필요한 경우에는 선택적으로 SASL 인증을 지원한다. (바이너리 프로토콜 필요)[20]

BlackHat USA 2010에서 Memcached가 열려 있을 때 데이터 검사, 분석, 검색 및 수정이 가능하다는 보고가 있었다.[20] Memcached의 플랫 신뢰 모델은 모든 Memcached 작업을 동일하게 처리하여 보안에 영향을 미칠 수 있다.

2018년 2월, CloudFlare는 잘못 구성된 Memcached 서버가 대규모 DDoS 공격에 사용된 사례를 보고했다.[21] UDP를 통한 Memcached 프로토콜은 증폭 계수가 51,000 이상이다.[22] DDoS 공격의 피해자에는 최대 1.35Tbit/s의 수신 트래픽으로 공격받은 GitHub가 포함된다.[23]

Memcached 버전 1.5.6부터 기본적으로 UDP 프로토콜이 비활성화되어 DDoS 공격 문제가 완화되었다.[24]

4. 활용

Memcached는 데이터베이스 부하를 줄이고 웹 애플리케이션의 속도를 높이는 데 사용된다. 데이터와 객체를 메모리에 캐싱하여 데이터베이스 접근 횟수를 줄인다.[30] 유튜브,[35] 레딧,[36] 페이스북,[37][38] 핀터레스트,[39][40] 트위터,[41] 위키백과[42] 등 많은 시스템에서 사용되고 있으며, 구글 앱 엔진, 마이크로소프트 애저, 블루믹스, 아마존 웹 서비스 또한 API를 통해 Memcached 서비스를 제공한다.[43][44][45][46]

Memcached는 클라이언트-서버 아키텍처를 사용하며, 서버는 키-값 연관 배열을 유지하고 클라이언트는 이 배열을 채우고 쿼리한다. 키는 최대 250바이트, 값은 최대 1메가바이트까지 가능하다. 클라이언트는 클라이언트 측 라이브러리를 사용하여 서버에 연결하며, 기본적으로 포트 11211에서 TCP와 UDP를 모두 지원한다.

클라이언트 라이브러리는 키의 해시를 계산하여 사용할 서버를 결정하며, 서버는 값을 RAM에 유지한다. RAM이 부족하면 가장 오래된 값을 삭제하므로, Memcached는 임시 캐시로 취급해야 하며 저장된 데이터가 항상 존재한다고 가정할 수 없다. MemcacheDB, Couchbase Server와 같은 다른 데이터베이스는 Memcached 프로토콜 호환성을 유지하면서 영구 스토리지를 제공한다.

4. 1. 사용 예시


  • MySQL - 버전 5.6부터 Memcached API를 직접 지원한다.[47][25]
  • 오라클 코히어런스 - 버전 12.1.3 기준으로 Memcached API를 직접 지원한다.[48][26]
  • GigaSpaces XAP - 고가용성, 트랜잭션 지원과 함께 Memcached를 지원한다.[49]
  • Infinispan - Memcached를 직접 지원한다.[27]

5. 예제 코드

데이터베이스나 객체 생성 쿼리를 Memcached를 사용하도록 변환하는 것은 간단하다.

일반적인 데이터베이스 쿼리를 사용하는 경우, 예제 코드는 다음과 같다. (다음 예시는 모두 의사 코드이다. Memcached 호출 및 프로그래밍 언어는 사용된 API에 따라 다를 수 있다.)

```

function get_foo(int userid)

data = db_select("SELECT * FROM users WHERE userid = ?", userid)

return data

```

Memcached를 사용하도록 변환하면, 동일한 호출은 다음과 같이 보일 수 있다.

```

function get_foo(int userid)

/* 먼저 캐시를 시도합니다 */

data = memcached_fetch("userrow:" + userid)

if not data

/* 찾을 수 없음: 데이터베이스 요청 */

data = db_select("SELECT * FROM users WHERE userid = ?", userid)

/* 다음 가져오기까지 캐시에 저장합니다 */

memcached_add("userrow:" + userid, data)

end

return data

```

클라이언트는 먼저 고유 키 "userrow:userid"를 가진 Memcached 값이 있는지 확인한다. 여기서 userid는 숫자이다. 결과가 존재하지 않으면 평소와 같이 데이터베이스에서 선택하고 Memcached API 추가 함수 호출을 사용하여 고유 키를 설정한다.

그러나 이 API 호출만 수정하면 서버는 데이터베이스 업데이트 작업 후 잘못된 데이터를 가져오게 된다. Memcached의 데이터 "보기"가 오래된 상태가 된다. 따라서 "add" 호출을 생성하는 것 외에도 Memcached set 함수를 사용하여 업데이트 호출도 필요하다.

```

function update_foo(int userid, string dbUpdateString)

/* 먼저 데이터베이스 업데이트 */

result = db_execute(dbUpdateString)

if result

/* 데이터베이스 업데이트 성공: 캐시에 저장할 데이터 가져오기 */

data = db_select("SELECT * FROM users WHERE userid = ?", userid)

/* 이전 줄은 data = createDataFromDBString(dbUpdateString)과 같이 보일 수도 있습니다 */

/* 다음 가져오기까지 캐시에 저장합니다 */

memcached_set("userrow:" + userid, data)

```

이 호출은 데이터베이스 쿼리가 성공한다고 가정하고 현재 캐시된 데이터를 데이터베이스의 새 데이터와 일치하도록 업데이트한다. 대안은 Memcached delete 함수로 캐시를 무효화하여 후속 가져오기에서 캐시 미스가 발생하도록 하는 것이다. 데이터베이스 레코드가 삭제될 때에도 유사한 조치를 취하여 정확하거나 불완전한 캐시를 유지해야 한다.

대안적인 캐시 무효화 전략은 합의된 캐시 항목에 임의의 숫자를 저장하고 이 숫자를 특정 종류의 항목을 저장하는 데 사용되는 모든 키에 통합하는 것이다. 이러한 모든 항목을 한 번에 무효화하려면 임의의 숫자를 변경한다. 기존 항목(이전 숫자를 사용하여 저장된 항목)은 더 이상 참조되지 않으므로 결국 만료되거나 재활용된다.

```

function store_xyz_entry(int key, string value)

/* 임의의 숫자 검색 - 아직 없으면 0 사용.


  • 여기서 사용된 키 이름은 임의적입니다. */

seed = memcached_fetch(":xyz_seed:")

if not seed

seed = 0

/* 항목을 저장하는 데 사용되는 키를 구축하고 저장합니다.

  • 여기서 사용된 키 이름도 임의적입니다. "seed"와 사용자의 "key"가
  • 구성된 hashKey 문자열의 별도 부분으로 저장된다는 점에 유의하십시오: ":xyz_data:(seed):(key)."
  • 이것은 필수는 아니지만 권장됩니다. */

string hashKey = sprintf(":xyz_data:%d:%d", seed, key)

memcached_set(hashKey, value)

/* "fetch_entry"는 표시되지 않았지만 위와 동일한 논리를 따릅니다. */

function invalidate_xyz_cache()

existing_seed = memcached_fetch(":xyz_seed:")

/* 다른 임의의 시드 생성 */

do

seed = rand()

until seed != existing_seed

/* 이제 합의된 장소에 저장합니다. 모든 향후 요청은 이 숫자를 사용합니다.

  • 따라서 모든 기존 항목은 참조되지 않으며 결국 만료됩니다. */

memcached_set(":xyz_seed:", seed)

참조

[1] 웹사이트 Memcached license https://github.com/m[...] GitHub 2014-06-27
[2] 웹사이트 Google Code Archive - Long-term storage for Google Code Project Hosting http://code.google.c[...] 2017-06-25
[3] 웹사이트 Google Code Archive - Long-term storage for Google Code Project Hosting http://code.google.c[...] 2017-06-25
[4] 뉴스 http://community.liv[...] Community.livejournal.com 2003-05-22
[5] 뉴스 http://community.liv[...] Community.livejournal.com 2003-05-27
[6] 웹사이트 lj_dev: memcached https://web.archive.[...] 2013-02-25
[7] Youtube Seattle Conference on Scalability: YouTube Scalability http://video.google.[...] Google Tech Talks 2007-06-23
[8] 웹사이트 Steve Huffman on Lessons Learned at Reddit | Carsonified https://web.archive.[...] 2010-05-17
[9] 웹사이트 Scaling memcached at Facebook http://www.facebook.[...] 2008-12-12
[10] 서적 Scaling Memcache at Facebook https://www.usenix.o[...] USENIX
[11] 뉴스 Building Pinterest in the cloud https://engineering.[...] 2013-06-19
[12] 웹사이트 A comprehensive, fast, pure-Python memcached client https://github.com/p[...] 2018-01-08
[13] 웹사이트 It's Not Rocket Science, But It's Our Work http://blog.twitter.[...] 2008-06-01
[14] 웹사이트 memcached https://www.mediawik[...] MediaWiki 2017-06-25
[15] Citation Rez BoF, SIGGRAPH 2019 https://www.youtube.[...] 2019-08-09
[16] 웹사이트 Memcache Examples | App Engine standard environment for Python | Google Cloud Platform http://code.google.c[...] 2017-03-22
[17] 웹사이트 About In-Role Cache for Azure Cache http://msdn.microsof[...] 2015-08-25
[18] 웹사이트 Redis Labs: We Have 3,000 Paying Cloud In-Memory NoSQL Customers http://www.datacente[...] 2014-09-23
[19] 웹사이트 AWS | Amazon ElastiCache – in-memory data store and cache http://aws.amazon.co[...]
[20] 웹사이트 SensePost | Blackhat write-up: Go-derper and mining memcaches https://web.archive.[...] 2016-09-02
[21] 웹사이트 Memcrashed - Major amplification attacks from UDP port 11211 https://blog.cloudfl[...] CloudFlare 2018-03-03
[22] 뉴스 GitHub falls victim to largest DDoS attack ever recorded https://www.techspot[...] 2018-03-01
[23] 웹사이트 February 28th DDoS Incident Report https://githubengine[...] 2018-03-03
[24] 웹사이트 Memcached 1.5.6 Release Notes https://github.com/m[...] 2018-03-03
[25] 웹사이트 Speedy MySQL 5.6 takes aim at NoSQL, MariaDB https://www.theregis[...] 2017-06-25
[26] 웹사이트 Getting Started With The Coherence Memcached Adaptor | Oracle Coherence Blog https://web.archive.[...] 2017-06-25
[27] 웹사이트 Using the Memcached protocol endpoint with Infinispan https://infinispan.o[...] 2022-04-19
[28] 웹사이트 Licence of memcached http://code.sixapart[...] 2008-04-13
[29] Youtube Seattle Conference on Scalability: YouTube Scalability https://www.youtube.[...] Google Tech Talks 2007-06-23
[30] 문서 Who's using memcached? http://www.danga.com[...]
[31] 웹인용 Memcached license https://github.com/m[...] 깃허브 2014-06-27
[32] 뉴스 http://community.liv[...] Community.livejournal.com 2003-05-22
[33] 뉴스 http://community.liv[...] Community.livejournal.com 2003-05-27
[34] 웹인용 lj_dev: memcached https://web.archive.[...] 2013-02-25
[35] 영상 인용 Seattle Conference on Scalability: YouTube Scalability http://video.google.[...] Google Tech Talks 2007-06-23
[36] 웹인용 Steve Huffman on Lessons Learned at Reddit | Carsonified https://web.archive.[...] 2010-05-17
[37] 웹인용 Scaling memcached at Facebook https://www.facebook[...] 2008-12-12
[38] 웹인용 Scaling Memcache at Facebook https://www.usenix.o[...] USENIX null
[39] 웹인용 Building Pinterest in the cloud https://engineering.[...] 2013-06-19
[40] 웹인용 A comprehensive, fast, pure-Python memcached client https://github.com/p[...] 2018-01-08
[41] 웹인용 It's Not Rocket Science, But It's Our Work http://blog.twitter.[...] 2008-06-01
[42] 웹인용 memcached https://www.mediawik[...] MediaWiki null
[43] 웹인용 Memcache Examples | App Engine standard environment for Python | Google Cloud Platform http://code.google.c[...] 2017-03-22
[44] 웹인용 About In-Role Cache for Azure Cache http://msdn.microsof[...] 2015-08-25
[45] 웹인용 Redis Labs: We Have 3,000 Paying Cloud In-Memory NoSQL Customers http://www.datacente[...] 2014-09-23
[46] 웹인용 AWS | Amazon ElastiCache – in-memory data store and cache http://aws.amazon.co[...] null
[47] 웹인용 Speedy MySQL 5.6 takes aim at NoSQL, MariaDB https://www.theregis[...]
[48] 웹인용 Getting Started With The Coherence Memcached Adaptor | Oracle Coherence Blog https://blogs.oracle[...] 2014-08-13
[49] 웹인용 XAP Real Time Transaction Processing http://www.gigaspace[...] null



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com