Jump to content

Мемкеш

Мемкеш
Разработчик(и) Данга Интерактив
Первоначальный выпуск 22 мая 2003 г. ( 22 мая 2003 г. )
Стабильная версия
1.6.29 [1]  Отредактируйте это в Викиданных / 29 июня 2024 г .; 29 дней назад ( 29 июня 2024 г. )
Репозиторий
Написано в С
Операционная система Кросс-платформенный
Тип система кэширования распределенной памяти
Лицензия Пересмотренная лицензия BSD [2]
Веб-сайт кэширование памяти .org  Edit this on Wikidata

Memcached (произносится по-разному: mem-cash-dee или mem-cashed общего назначения ) — это распределенная система кэширования памяти . Он часто используется для ускорения веб-сайтов, управляемых динамическими базами данных , путем кэширования данных и объектов в оперативной памяти , чтобы уменьшить количество операций чтения из внешнего источника данных (например, базы данных или API). Memcached — это бесплатное программное обеспечение с открытым исходным кодом , действующее под лицензией Revised BSD . [2] Memcached работает в Unix-подобных операционных системах ( Linux и macOS ) и Microsoft Windows . Это зависит от библиотеки libevent .

Memcached API-интерфейсы предоставляют очень большую хэш-таблицу, распределенную по нескольким машинам. Когда таблица заполнена, последующие вставки приводят к удалению старых данных в порядке их последнего использования (LRU). [3] [4] Приложения, использующие Memcached, обычно размещают запросы и дополнения в оперативной памяти, а затем переходят к более медленному резервному хранилищу, например базе данных.

Memcached не имеет внутреннего механизма для отслеживания возможных ошибок. Однако некоторые сторонние утилиты предоставляют эту функцию.

Memcached был впервые разработан Брэдом Фицпатриком для его сайта LiveJournal 22 мая 2003 года. [5] [6] Первоначально он был написан на Perl , затем переписан на C Анатолием Воробеем, затем использованным в LiveJournal. [7] Memcached теперь используется многими другими системами, включая YouTube , [8] Реддит , [9] Фейсбук , [10] [11] Пинтерест , [12] [13] Твиттер , [14] Arc.Ask3.Ru , [15] и Студии Метода . [16] Google App Engine , Google Cloud Platform , Microsoft Azure , IBM Bluemix и Amazon Web Services также предлагают сервис Memcached через API. [17] [18] [19] [20]

Архитектура программного обеспечения

[ редактировать ]

В системе используется клиент-серверная архитектура. Серверы поддерживают ассоциативный массив ключ-значение ; клиенты заполняют этот массив и запрашивают его по ключу. Ключи имеют длину до 250 байт, а значений не может превышать 1 мегабайт размер .

Клиенты используют клиентские библиотеки для связи с серверами, которые по умолчанию предоставляют свои услуги через порт 11211. Поддерживаются как TCP, так и UDP. Каждый клиент знает все серверы; серверы не общаются друг с другом. Если клиент желает установить или прочитать значение, соответствующее определенному ключу, библиотека клиента сначала вычисляет хэш ключа, чтобы определить, какой сервер использовать. Это обеспечивает простую форму сегментирования и масштабируемую архитектуру без общего доступа между серверами. Сервер вычисляет второй хэш ключа, чтобы определить, где сохранить или прочитать соответствующее значение. Серверы хранят значения в оперативной памяти; если на сервере заканчивается оперативная память, он отбрасывает самые старые значения. Таким образом, клиенты должны рассматривать Memcached как временный кэш; они не могут предполагать, что данные, хранящиеся в Memcached, все еще будут там, когда они им понадобятся. Другие базы данных, такие как MemcacheDB , Couchbase Server , обеспечивают постоянное хранилище, сохраняя при этом совместимость протокола Memcached.

Если все клиентские библиотеки используют один и тот же алгоритм хеширования для определения серверов, то клиенты смогут читать кэшированные данные друг друга.

Типичное развертывание включает несколько серверов и множество клиентов. Однако Memcached можно использовать на одном компьютере, выступая одновременно в качестве клиента и сервера. Размер его хеш-таблицы часто очень велик. Он ограничен доступной памятью на всех серверах в кластере серверов в центре обработки данных. Там, где этого требуют большие объемы веб-публикаций с широкой аудиторией, объем может достигать многих гигабайт. Memcached может быть одинаково полезен в ситуациях, когда либо количество запросов на контент велико, либо стоимость создания определенного фрагмента контента высока.

Безопасность

[ редактировать ]

Большинство развертываний Memcached происходит в доверенных сетях, где клиенты могут свободно подключаться к любому серверу. Однако иногда Memcached развертывается в ненадежных сетях или там, где администраторы хотят контролировать подключающихся клиентов. Для этой цели Memcached можно скомпилировать с дополнительной SASL поддержкой аутентификации . Для поддержки SASL требуется двоичный протокол.

Презентация на BlackHat USA 2010 показала, что ряд крупных общедоступных веб-сайтов оставили Memcached открытым для проверки, анализа, извлечения и изменения данных. [21]

Даже в доверенной организации модель плоского доверия memcached может иметь последствия для безопасности. Для эффективной простоты все операции Memcached обрабатываются одинаково. Клиенты с действительной потребностью в доступе к записям с низким уровнем безопасности в кэше получают доступ ко всем записям в кэше, даже если они имеют более высокий уровень безопасности и у этого клиента нет оправданной необходимости в них. Если ключ кэша можно предсказать, угадать или найти путем исчерпывающего поиска, его запись в кэше может быть получена.

Некоторые попытки изолировать данные настройки и чтения могут быть предприняты в таких ситуациях, как большие объемы веб-публикаций. Ферма внешних контент-серверов имеет доступ для чтения к memcached, содержащему опубликованные страницы или компоненты страниц, но не имеет доступа для записи. Если публикуется новый контент (и его еще нет в memcached), вместо этого на серверы генерации контента, которые не являются общедоступными, отправляется запрос на создание единицы контента и добавление ее в memcached. Затем контент-сервер повторяет попытку получить его и передать наружу.

Используется в качестве вектора DDoS-атаки.

[ редактировать ]

В феврале 2018 года CloudFlare сообщила, что неправильно настроенные серверы memcached использовались для DDoS-атак . крупномасштабных [22] Протокол memcached через UDP имеет огромный коэффициент усиления , более 51000. [23] Среди жертв DDoS-атак — GitHub , который был затоплен пиковым входящим трафиком 1,35 Тбит/с. [24]

Эта проблема была устранена в версии Memcached 1.5.6, которая по умолчанию отключила протокол UDP. [25]

Пример кода

[ редактировать ]

Обратите внимание, что все функции, описанные на этой странице, представляют собой только псевдокод . Вызовы Memcached и языки программирования могут различаться в зависимости от используемого API.

Преобразовать запросы на создание базы данных или объектов для использования Memcached очень просто. Обычно при использовании прямых запросов к базе данных пример кода выглядит следующим образом:

 function get_foo(int userid)
     data = db_select("SELECT * FROM users WHERE userid = ?", userid)
     return data

После преобразования в Memcached тот же вызов может выглядеть следующим образом.

 function get_foo(int userid)
     /* first try the cache */
     data = memcached_fetch("userrow:" + userid)
     if not data
         /* not found : request database */
         data = db_select("SELECT * FROM users WHERE userid = ?", userid)
         /* then store in cache until next get */
         memcached_add("userrow:" + userid, data)
     end

     return data

Клиент сначала проверит, существует ли значение Memcached с уникальным ключом «userrow:userid», где userid — это некоторое число. Если результат не существует, он будет выбирать из базы данных, как обычно, и устанавливать уникальный ключ с помощью вызова функции добавления Memcached API.

Однако если бы был изменен только этот вызов API, сервер в конечном итоге получил бы неверные данные после любых действий по обновлению базы данных: «представление» данных в Memcached устарело бы. Следовательно, помимо создания вызова «добавить», также потребуется вызов обновления с использованием функции установки Memcached.

 function update_foo(int userid, string dbUpdateString)
     /* first update database */
     result = db_execute(dbUpdateString)
     if result
         /* database update successful : fetch data to be stored in cache */
         data = db_select("SELECT * FROM users WHERE userid = ?", userid)
         /* the previous line could also look like data = createDataFromDBString(dbUpdateString) */
         /* then store in cache until next get */
         memcached_set("userrow:" + userid, data)

Этот вызов обновит текущие кэшированные данные, чтобы они соответствовали новым данным в базе данных, при условии, что запрос к базе данных будет успешным. Альтернативный подход — сделать кеш недействительным с помощью функции удаления Memcached, чтобы последующие выборки приводили к промаху кеша. Аналогичные действия необходимо будет предпринять при удалении записей базы данных, чтобы сохранить правильный или неполный кэш.

Альтернативная стратегия аннулирования кэша состоит в том, чтобы сохранить случайное число в согласованной записи кэша и включить это число во все ключи, которые используются для хранения определенного типа записи. Чтобы сделать недействительными все такие записи одновременно, измените случайное число. Существующие записи (которые были сохранены под старым номером) больше не будут использоваться, и поэтому в конечном итоге срок их действия истечет или они будут переработаны.

  function store_xyz_entry(int key, string value)
      /* Retrieve the random number - use zero if none exists yet.
      *  The key-name used here is arbitrary. */ 
      seed = memcached_fetch(":xyz_seed:")
      if not seed
          seed = 0
      /* Build the key used to store the entry and store it.
      *  The key-name used here is also arbitrary. Notice that the "seed" and the user's "key"
      *  are stored as separate parts of the constructed hashKey string: ":xyz_data:(seed):(key)." 
      *  This is not mandatory, but is recommended. */
      string hashKey = sprintf(":xyz_data:%d:%d", seed, key)
      memcached_set(hashKey, value)

  /* "fetch_entry," not shown, follows identical logic to the above. */

  function invalidate_xyz_cache()
      existing_seed = memcached_fetch(":xyz_seed:")
      /* Coin a different random seed */
      do
          seed = rand()
      until seed != existing_seed
      /* Now store it in the agreed-upon place. All future requests will use this number. 
      *  Therefore, all existing entries become un-referenced and will eventually expire. */
      memcached_set(":xyz_seed:", seed)

Использование

[ редактировать ]
  • MySQL — напрямую поддерживает API Memcached начиная с версии 5.6. [26]
  • Oracle Coherence — напрямую поддерживает API Memcached начиная с версии 12.1.3. [27]
  • Infinispan — напрямую поддерживает Memcached. [28]

См. также

[ редактировать ]
  1. ^ «Выпуск 1.6.29» . 29 июня 2024 г. Проверено 23 июля 2024 г.
  2. ^ Перейти обратно: а б «Лицензия Memcached» . Гитхаб . Проверено 27 июня 2014 г.
  3. ^ «Архив кода Google — долгосрочное хранилище для хостинга проектов Google Code» . Code.google.com . Проверено 25 июня 2017 г.
  4. ^ «Архив кода Google — долгосрочное хранилище для хостинга проектов Google Code» . Code.google.com . Проверено 25 июня 2017 г.
  5. ^ [1] . Community.livejournal.com (22 мая 2003 г.). Проверено 18 сентября 2013 г.
  6. ^ [2] . Community.livejournal.com (27 мая 2003 г.). Проверено 18 сентября 2013 г.
  7. ^ «lj_dev: memcached» . 25 февраля 2013 г. Архивировано из оригинала 25 февраля 2013 г. Проверено 25 июня 2017 г.
  8. ^ Куонг До Куонг (технический менеджер YouTube/Google) (23 июня 2007 г.). Сиэтлская конференция по масштабируемости: масштабируемость YouTube (онлайн-видео — 26-я минута). Сиэтл: Google Tech Talks.
  9. ^ Уитакер, Кейр (17 мая 2010 г.). «Стив Хаффман об уроках, извлеченных на Reddit | Carsonified» . Архивировано из оригинала 17 мая 2010 г. Проверено 25 июня 2017 г.
  10. ^ «Масштабирование memcached в Facebook» . Facebook.com . 12 декабря 2008 г. Проверено 25 июня 2017 г.
  11. ^ Масштабирование Memcache в Facebook . УСЕНИКС. 2002. ISBN  9781931971003 . Проверено 25 июня 2017 г.
  12. ^ «Создание Pinterest в облаке» . Карьера в Pinterest . 19 июня 2013 г. Проверено 9 марта 2018 г.
  13. ^ «Комплексный, быстрый клиент memcached на чистом Python» . Гитхаб.com . 08.01.2018 . Проверено 9 марта 2018 г.
  14. ^ «Это не ракетостроение, а наша работа» . Блог.twitter.com . 01.06.2008 . Проверено 25 июня 2017 г.
  15. ^ «мемкеш» . МедиаВики . Проверено 25 июня 2017 г.
  16. ^ Рез БоФ, SIGGRAPH 2019 , заархивировано из оригинала 12 декабря 2021 г. , получено 9 августа 2019 г.
  17. ^ «Примеры Memcache | Стандартная среда App Engine для Python | Google Cloud Platform» . Code.google.com . 22 марта 2017 г. Проверено 25 июня 2017 г.
  18. ^ «О внутриролевом кэше для кэша Azure» . Msdn.microsoft.com . 25 августа 2015 г. Проверено 25 июня 2017 г.
  19. ^ Вердж, Джейсон (23 сентября 2014 г.). «Redis Labs: у нас 3000 платящих клиентов Cloud In-Memory NoSQL» . Знание дата-центра . Проверено 10 сентября 2016 г.
  20. ^ «AWS | Amazon ElastiCache — хранилище и кеш данных в памяти» . Aws.amazon.com . Проверено 25 июня 2017 г.
  21. ^ «SensePost | Рецензия на Blackhat: Go-derper и майнинг кэшей памяти» . Архивировано из оригинала 21 декабря 2018 г. Проверено 2 сентября 2016 г.
  22. ^ «Memcrashed — крупные атаки с усилением с UDP-порта 11211» . CloudFlare. 27 февраля 2018 г. Проверено 3 марта 2018 г.
  23. ^ Джеффри, Кэл (1 марта 2018 г.). «GitHub стал жертвой крупнейшей когда-либо зарегистрированной DDoS-атаки» .
  24. ^ «Отчет об DDoS-инциденте 28 февраля» . 1 марта 2018 года . Проверено 3 марта 2018 г.
  25. ^ «Примечания к выпуску Memcached 1.5.6» . Гитхаб . 27 февраля 2018 г. Проверено 3 марта 2018 г.
  26. ^ «Speedy MySQL 5.6 нацелен на NoSQL, MariaDB» . Thereregister.co.uk . Проверено 25 июня 2017 г.
  27. ^ Дэвид Фелси (13 августа 2014 г.). «Начало работы с адаптером Memcached Coherence | Блог Oracle Coherence» . Блоги.oracle.com . Архивировано из оригинала 23 февраля 2017 г. Проверено 25 июня 2017 г.
  28. ^ «Использование конечной точки протокола Memcached с Infinispan» . infinispan.org . Проверено 19 апреля 2022 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: e0cb7a31579d31766bc6a80f73332732__1714071060
URL1:https://arc.ask3.ru/arc/aa/e0/32/e0cb7a31579d31766bc6a80f73332732.html
Заголовок, (Title) документа по адресу, URL1:
Memcached - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)