메모리 캐시

Memcached
메모리 캐시
Memcached.svg
개발자단가 인터랙티브
초기 릴리즈2003년 5월 22일(2003-05-22)
안정된 릴리스
2022년 3월 29일 / 1.6.15[1]; 4개월 전 (2022년 3월 29일)
저장소
기입처C
운영 체제크로스 플랫폼
유형분산 메모리 캐시 시스템
면허증.개정 BSD 라이선스[2]
웹 사이트memcached.org Edit this on Wikidata

Memcached(다양한 mem-cash-dee 또는 mem-cashed로 발음)는 범용 분산 메모리 캐시 시스템입니다.RAM에 데이터개체를 캐싱하여 데이터베이스나 API 등의 외부 데이터 소스를 읽어야 하는 횟수를 줄임으로써 동적 데이터베이스 기반 웹 사이트의 속도를 높이기 위해 자주 사용됩니다.Memcached는 개정BSD [2]라이선스에 따라 라이센스가 부여된 무료 오픈 소스 소프트웨어입니다.Memcached는 Unix 계열 운영체제(LinuxMacOS) 및 Microsoft Windows 상에서 실행됩니다.도서관마다 다르죠.

Memcached의 API는 여러 머신에 분산된 매우 큰 해시 테이블을 제공합니다.테이블이 가득 차면 이후의 삽입으로 오래된 데이터가 Last Recently Used([3][4]LRU; 최소 최근 사용) 순서로 삭제됩니다.일반적으로 Memcached를 사용하는 애플리케이션은 데이터베이스와 같은 느린 백업 저장소로 폴백하기 전에 RAM에 대한 요구와 추가를 레이어합니다.

Memcached에는 발생할 수 있는 오류를 추적하는 내부 메커니즘이 없습니다.단, 일부 서드파티 유틸리티는 이 기능을 제공합니다.

Memcached는 2003년 [5][6]5월 22일 Brad Fitzpatrick에 의해 그의 웹사이트 Live Journal을 위해 처음 개발되었습니다.원래 Perl로 작성되었다가 나중에 Anatoly Vorobey에 의해 C로 고쳐졌고, 그 후 Live Journal에 [7]채용되었다.Memcached는 현재 YouTube,[8] Reddit,[9] Facebook,[10][11] Pinterest,[12][13] [14]Twitter, [15]Wikipedia 및 Method [16]Studios를 포함한 많은 다른 시스템에서 사용되고 있습니다.Google App Engine, Google Cloud Platform, Microsoft Azure, IBM Bluemix Amazon Web Services도 [17][18][19][20]API를 통해 Memcached 서비스를 제공합니다.

소프트웨어 아키텍처

시스템은 클라이언트-서버 아키텍처를 사용합니다.서버는 키와 값의 관련 배열을 유지합니다.클라이언트는 이 배열을 채우고 키로 쿼리합니다.키의 길이는 최대 250바이트이며 값의 크기는 최대 1메가바이트입니다.

클라이언트는 클라이언트측 라이브러리를 사용하여 서버에 접속합니다.서버는 기본적으로는 포트 11211에서 서비스를 제공합니다.TCP와 UDP가 모두 지원됩니다.각 클라이언트는 모든 서버를 알고 있으며, 서버 간 통신은 이루어지지 않습니다.클라이언트가 특정 키에 대응하는 값을 설정 또는 읽기를 원하는 경우 클라이언트의 라이브러리는 먼저 키의 해시를 계산하여 사용할 서버를 결정합니다.이를 통해 서버 전체에서 심플한 형태의 샤딩확장성이 뛰어난 Shared-Nothing 아키텍처를 실현할 수 있습니다.서버는 키의 두 번째 해시를 계산하여 대응하는 값을 저장 또는 읽을 위치를 결정합니다.서버는 RAM 값을 유지합니다.서버의 RAM이 부족하면 가장 오래된 값은 폐기됩니다.따라서 클라이언트는 Memcached를 일시적인 캐시로 취급해야 합니다.Memcached에 저장된 데이터가 필요할 때 아직 존재한다고 가정할 수 없습니다.MemcacheDB, Couchbase Server와 같은 다른 데이터베이스는 Memcache 프로토콜 호환성을 유지하면서 영구 스토리지를 제공합니다.

모든 클라이언트 라이브러리가 동일한 해시 알고리즘을 사용하여 서버를 결정하는 경우, 클라이언트는 서로의 캐시된 데이터를 읽을 수 있습니다.

일반적인 전개에는, 복수의 서버와 다수의 클라이언트가 있습니다.단, Memcached는 클라이언트와 서버 역할을 동시에 하는 단일 컴퓨터에서 사용할 수 있습니다.해시 테이블의 크기가 매우 큰 경우가 많습니다.데이터센터 내 서버 클러스터 내의 모든 서버에서 사용 가능한 메모리로 제한됩니다.대량의 와이드 오디오 Web 퍼블리싱이 필요한 경우, 이 용량은 수 기가바이트에 이를 수 있습니다.memcached는 콘텐츠에 대한 요청 수가 많거나 특정 콘텐츠 생성 비용이 높은 상황에서 동일하게 유용합니다.

보안.

Memcached의 전개의 대부분은 클라이언트가 임의의 서버에 자유롭게 접속할 수 있는 신뢰할 수 있는 네트워크 내에 있습니다.단, Memcached가 신뢰할 수 없는 네트워크에 배치되거나 관리자가 접속하고 있는 클라이언트에 대한 제어를 실행하는 경우가 있습니다.이를 위해 옵션의 SASL 인증 지원을 사용하여 Memcached를 컴파일할 수 있습니다.SASL을 지원하려면 바이너리 프로토콜이 필요합니다.

BlackHat USA 2010에서의 프레젠테이션에서는 다수의 대규모 공개 웹사이트가 Memcached를 데이터 [21]검사, 분석, 검색 및 수정에 개방하고 있는 것으로 나타났습니다.

신뢰할 수 있는 조직 내에서도 memcached의 플랫 신뢰 모델은 보안에 영향을 미칠 수 있습니다.효율적인 단순화를 위해 모든 Memcached 작업은 동일하게 취급됩니다.캐시 내에서 보안이 낮은 엔트리에 대한 액세스가 유효한 클라이언트는 보안이 높은 엔트리에 대한 정당한 요구가 없는 경우에도 캐시 내의 모든 엔트리에 액세스할 수 있습니다.캐시 키가 예측, 추측 또는 철저한 검색을 통해 발견될 수 있는 경우 캐시 엔트리를 검색할 수 있습니다.

대량의 Web 퍼블리싱과 같은 상황에서 설정 및 데이터 읽기를 분리하려는 시도가 있을 수 있습니다.외향 콘텐츠서버 팜은 공개된 페이지 또는 페이지컴포넌트를 포함한 memcached에 대한 읽기 액세스는 있지만 쓰기 액세스는 없습니다.새로운 콘텐츠가 퍼블리시된 경우(및 아직 memcached되지 않은 경우), 대신 콘텐츠 유닛을 생성하여 memcached에 추가하기 위한 요구가 공개되지 않은 콘텐츠 생성 서버로 전송됩니다.그런 다음 콘텐츠 서버는 콘텐츠 검색을 재시도하여 외부로 전달합니다.

DDoS 공격 벡터로 사용

2018년 2월 CloudFlareDDoS 공격[22]대규모로 시작하기 위해 잘못 구성된 memcached 서버가 사용되었다고 보고했습니다.UDP를 통한 memcached 프로토콜은 51000 이상의 엄청난 [23]증폭 계수를 가집니다.디도스 공격의 피해자는 1.35 Tbit/s의 피크 착신 [24]트래픽으로 범람한 GitHub입니다.

이 문제는 Memcached 버전 1.5.6에서 완화되어 기본적으로 [25]UDP 프로토콜을 사용하지 않도록 설정되었습니다.

코드 예시

이 페이지에 기재되어 있는 기능은 모두 의사 코드뿐입니다.memcached 콜과 프로그래밍 언어는 사용되는 API에 따라 다를 수 있습니다.

데이터베이스 또는 오브젝트 작성 쿼리를 Memcached를 사용하도록 변환하는 것은 간단합니다.일반적으로 스트레이트 데이터베이스 쿼리를 사용하는 경우 코드 예는 다음과 같습니다.

 기능. get_foo(인트 사용자 ID)      데이터. = db_select("SELECT * FROM 사용자 WHERE 사용자 ID =?", 사용자 ID)      돌아가다 데이터. 

Memcached로 변환한 후 동일한 콜이 다음과 같이 표시될 수 있습니다.

 기능. get_foo(인트 사용자 ID)      /* 먼저 캐시를 시도합니다 */      데이터. = memcached_mempledge("사용자:" + 사용자 ID)      한다면 것은 아니다. 데이터.          /*를 찾을 수 없습니다: 데이터베이스 요청 */          데이터. = db_select("SELECT * FROM 사용자 WHERE 사용자 ID =?", 사용자 ID)          /* 다음에 가져올 때까지 캐시에 저장 */          memcached_add("사용자:" + 사용자 ID, 데이터.)      끝.       돌아가다 데이터. 

클라이언트는 먼저 고유 키 "userrow:userid"를 가진 Memcached 값이 존재하는지 확인합니다.여기서 userid는 어떤 숫자입니다.결과가 존재하지 않으면 통상대로 데이터베이스에서 선택하고 Memcached API add 함수 호출을 사용하여 원하는 키를 설정합니다.

단, 이 API 호출만 변경되면 데이터베이스 업데이트액션에 따라 서버가 잘못된 데이터를 취득하게 됩니다.데이터의 Memcached "뷰"는 오래된 것이 됩니다.따라서 "추가" 콜 작성과 더불어 Memcached set 함수를 사용하여 갱신 콜도 필요합니다.

 기능. update_foo(인트 사용자 ID, 스트링 dbUpdateString)      /* 첫 번째 데이터베이스 업데이트 */      결과 = db_module(dbUpdateString)      한다면 결과          /* 데이터베이스 업데이트 성공: 캐시에 저장할 데이터를 가져옵니다 */          데이터. = db_select("SELECT * FROM 사용자 WHERE 사용자 ID =?", 사용자 ID)          /* 이전 행은 데이터 = createDataFromDBString(dbUpdateString)*/와 같을 수도 있습니다.          /* 다음에 가져올 때까지 캐시에 저장 */          memcached_set("사용자:" + 사용자 ID, 데이터.) 

이 호출은 데이터베이스 쿼리가 성공했다고 가정하고 현재 캐시된 데이터를 데이터베이스 내의 새로운 데이터와 일치하도록 업데이트합니다.대체 접근법은 Memcached delete 함수로 캐시를 비활성화하여 후속 페치가 캐시 누락이 발생하도록 하는 것입니다.데이터베이스 레코드가 삭제되었을 때 올바른 캐시 또는 불완전한 캐시를 유지하기 위해 동일한 액션을 수행해야 합니다.

대체 캐시 비활성화 전략은 합의된 캐시 엔트리에 난수를 저장하고 이 번호를 특정 종류의 엔트리를 저장하기 위해 사용되는 모든 키에 통합하는 것입니다.이러한 모든 엔트리를 동시에 무효로 하려면 , 랜덤 번호를 변경합니다.(이전 번호를 사용하여 저장된) 기존 엔트리는 더 이상 참조되지 않으므로 결국 만료되거나 재활용됩니다.

  기능. store_xyz_entry(인트 열쇠, 스트링 가치)       /* 난수 검색 - 아직 존재하지 않는 경우 0을 사용합니다. * 여기서 사용하는 키 이름은 임의입니다.*/        씨를 뿌리다 = memcached_mempledge(":xyz_seed:")       한다면 것은 아니다. 씨를 뿌리다           씨를 뿌리다 = 0       /* 엔트리 저장 및 저장에 사용되는 키를 작성합니다. * 여기서 사용하는 키 이름도 임의입니다.「시드」와 유저의 「키」에 주의해 주세요. * 는 생성된 hashKey 문자열의 개별 부분으로 저장됩니다: ":xyz_data:(시드):(키)." * 필수는 아니지만 권장됩니다.*/       스트링 해시 키 = 스프린트(":xyz_data:%d:%d", 씨를 뿌리다, 열쇠)       memcached_set(해시 키, 가치)    /* "display_entry" (표시되지 않음)는 위와 동일한 논리를 따릅니다.*/    기능. invalidate_xyz_cache()       existing_seed = memcached_mempledge(":xyz_seed:")       /* 다른 랜덤 시드 코인 */       하다           씨를 뿌리다 = 랜드()       까지 씨를 뿌리다 != existing_seed       /* 합의된 장소에 보관합니다.이후의 모든 요청에는 이 번호가 사용됩니다.  * 따라서 기존 엔트리는 모두 참조되지 않고 최종적으로 만료됩니다.*/       memcached_set(":xyz_seed:", 씨를 뿌리다) 

사용.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "Release 1.6.15". 30 March 2022. Retrieved 29 April 2022.
  2. ^ a b "Memcached license". GitHub. Retrieved 2014-06-27.
  3. ^ "Google Code Archive - Long-term storage for Google Code Project Hosting". Code.google.com. Retrieved 2017-06-25.
  4. ^ "Google Code Archive - Long-term storage for Google Code Project Hosting". Code.google.com. Retrieved 2017-06-25.
  5. ^ [1] Community.livejournal.com (2003-05-22)2013-09-18에 회수.
  6. ^ [2] Community.livejournal.com (2003-05-27)2013-09-18에 회수.
  7. ^ "lj_dev: memcached". 2013-02-25. Archived from the original on 2013-02-25. Retrieved 2017-06-25.
  8. ^ Cuong Do Cuong (Engineering manager at YouTube/Google) (June 23, 2007). Seattle Conference on Scalability: YouTube Scalability (Online Video - 26th minute). Seattle: Google Tech Talks.
  9. ^ Whitaker, Keir (2010-05-17). "Steve Huffman on Lessons Learned at Reddit Carsonified". Archived from the original on 2010-05-17. Retrieved 2017-06-25.
  10. ^ "Scaling memcached at Facebook". Facebook.com. 2008-12-12. Retrieved 2017-06-25.
  11. ^ "Scaling Memcache at Facebook". USENIX. Retrieved 2017-06-25.
  12. ^ "Building Pinterest in the cloud". Pinterest.com. 2013-06-19. Retrieved 2018-03-09.
  13. ^ "A comprehensive, fast, pure-Python memcached client". Github.com. 2018-01-08. Retrieved 2018-03-09.
  14. ^ "It's Not Rocket Science, But It's Our Work". Blog.twitter.com. 2008-06-01. Retrieved 2017-06-25.
  15. ^ "memcached". MediaWiki. Retrieved 2017-06-25.
  16. ^ Rez BoF, SIGGRAPH 2019, archived from the original on 2021-12-12, retrieved 2019-08-09
  17. ^ "Memcache Examples App Engine standard environment for Python Google Cloud Platform". Code.google.com. 2017-03-22. Retrieved 2017-06-25.
  18. ^ "About In-Role Cache for Azure Cache". Msdn.microsoft.com. 2015-08-25. Retrieved 2017-06-25.
  19. ^ Verge, Jason (2014-09-23). "Redis Labs: We Have 3,000 Paying Cloud In-Memory NoSQL Customers". Data Center Knowledge. Retrieved 2016-09-10.
  20. ^ "AWS Amazon ElastiCache – in-memory data store and cache". Aws.amazon.com. Retrieved 2017-06-25.
  21. ^ "Archived copy". Archived from the original on 2018-12-21. Retrieved 2016-09-02.{{cite web}}: CS1 maint: 제목으로 아카이브된 복사(링크)
  22. ^ "Memcrashed - Major amplification attacks from UDP port 11211". CloudFlare. 27 Feb 2018. Retrieved 3 March 2018.
  23. ^ Jeffrey, Cal (Mar 1, 2018). "GitHub falls victim to largest DDoS attack ever recorded".
  24. ^ "February 28th DDoS Incident Report". March 1, 2018. Retrieved 3 March 2018.
  25. ^ "Memcached 1.5.6 Release Notes". 2018-02-27. Retrieved 3 March 2018.
  26. ^ "Speedy MySQL 5.6 takes aim at NoSQL, MariaDB". Theregister.co.uk. Retrieved 2017-06-25.
  27. ^ David Felcey (2014-08-13). "Getting Started With The Coherence Memcached Adaptor Oracle Coherence Blog". Blogs.oracle.com. Retrieved 2017-06-25.
  28. ^ "Using the Memcached protocol endpoint with Infinispan". infinispan.org. Retrieved 2022-04-19.

외부 링크