Введение
Программное обеспечение, которое кэширует строки в компьютерной памяти и часто используется для веб-сайтов.
Memcached (произносится по-разному: mem cash dee или mem cashed) — это распределённая система кэширования данных в памяти общего назначения. Она часто используется для ускорения работы динамических веб-сайтов, использующих базы данных, путём кэширования данных и объектов в оперативной памяти, что снижает количество обращений к внешним источникам данных (таким как базы данных или API). Memcached — это бесплатное программное обеспечение с открытым исходным кодом, распространяемое по пересмотренной лицензии BSD. Приложения, использующие Memcached, обычно сначала помещают запросы и данные в оперативную память, а затем, при необходимости, обращаются к более медленному основному хранилищу, например, к базе данных. Memcached не имеет встроенного механизма для отслеживания промахов кэша, однако некоторые сторонние утилиты предоставляют такую функциональность. Memcached был впервые разработан Брэдом Фицпатриком для своего сайта LiveJournal 22 мая 2003 года. Изначально он был написан на Perl, а затем переписан на C Анатолием Воробеем, который работал в LiveJournal. В настоящее время Memcached используется многими другими системами, включая YouTube, Reddit, Facebook, Pinterest, Twitter, Wikipedia и Method Studios. Google App Engine, Google Cloud Platform, Microsoft Azure, IBM Bluemix и Amazon Web Services также предлагают сервис Memcached через API.
Архитектура программного обеспечения
Система использует архитектуру клиент-сервер. Серверы поддерживают ассоциативный массив ключ-значение; клиенты заполняют этот массив и выполняют запросы к нему по ключу. Ключи могут быть длиной до 250 байт, а значения – не более 1 мегабайта. Клиенты используют клиентские библиотеки для связи с серверами, которые по умолчанию предоставляют свои услуги на порту 11211. Поддерживаются протоколы TCP и UDP. Каждый клиент знает все серверы; серверы между собой не взаимодействуют. Если клиент хочет установить или прочитать значение, соответствующее определенному ключу, клиентская библиотека сначала вычисляет хеш ключа, чтобы определить, какой сервер использовать. Это обеспечивает простую форму шардинга и масштабируемую архитектуру "ничего общего" между серверами. Сервер вычисляет второй хеш ключа, чтобы определить место хранения или чтения соответствующего значения. Серверы хранят значения в оперативной памяти; если серверу не хватает оперативной памяти, он удаляет самые старые значения. Поэтому клиенты должны рассматривать Memcached как временный кэш; они не могут полагаться на то, что данные, хранящиеся в Memcached, останутся там к моменту необходимости. Другие базы данных, такие как MemcacheDB и Couchbase Server, обеспечивают постоянное хранение, сохраняя при этом совместимость с протоколом Memcached. Если все клиентские библиотеки используют один и тот же алгоритм хеширования для определения серверов, клиенты смогут читать кэшированные данные друг друга. Типичная установка включает несколько серверов и множество клиентов. Однако Memcached можно использовать и на одном компьютере, выступающем одновременно в роли клиента и сервера. Размер его хеш-таблицы часто очень велик и ограничен доступной памятью на всех серверах в кластере в центре обработки данных. В случаях, когда требуется публикация большого объема контента для широкой аудитории, этот объем может достигать многих гигабайт. Memcached может быть одинаково полезен как в ситуациях с высоким количеством запросов к контенту, так и в ситуациях, когда стоимость генерации определенного контента высока.
Безопасность
Большинство развертываний Memcached происходит в доверенных сетях, где клиенты могут свободно подключаться к любому серверу. Однако иногда Memcached развертывается в ненадежных сетях или в ситуациях, когда администраторы хотят контролировать подключающихся клиентов. Для этого Memcached может быть скомпилирован с опциональной поддержкой аутентификации SASL. Поддержка SASL требует использования бинарного протокола. Презентация на BlackHat USA 2010 показала, что ряд крупных публичных веб-сайтов оставили Memcached открытым для инспекции, анализа, извлечения и модификации данных. Даже в пределах доверенной организации, плоская модель доверия Memcached может иметь последствия для безопасности. Для обеспечения эффективности и простоты, все операции Memcached обрабатываются одинаково. Клиенты, имеющие обоснованную потребность в доступе к данным с низким уровнем безопасности в кэше, получают доступ ко всем данным в кэше, даже к тем, которые имеют более высокий уровень безопасности, и в которых у данного клиента нет обоснованной потребности. Если ключ кэша может быть предсказан, угадан или найден путем полного перебора, его содержимое может быть извлечено. В ситуациях, таких как публикация больших объемов веб-контента, могут быть предприняты попытки изолировать операции записи и чтения данных. Ферма серверов контента, ориентированных наружу, имеет доступ на чтение к Memcached, содержащему опубликованные страницы или компоненты страниц, но не имеет доступа на запись. Когда публикуется новый контент (и он еще не находится в Memcached), запрос вместо этого отправляется на серверы генерации контента, которые недоступны публично, для создания блока контента и добавления его в Memcached. Затем сервер контента повторно пытается получить его и предоставить наружу.
Используется в качестве вектора DDoS-атаки
В феврале 2018 года Cloudflare сообщила, что некорректно настроенные серверы memcached использовались для осуществления DDoS-атак в крупном масштабе. Протокол memcached поверх UDP обладает огромным коэффициентом усиления, превышающим 51000. Среди жертв DDoS-атак оказался GitHub, который подвергся атаке с пиковой входящей скоростью трафика в 1,35 Тбит/с. Данная проблема была устранена в Memcached версии 1.5.6, где протокол UDP был отключен по умолчанию.
Использование
MySQL напрямую поддерживает API Memcached, начиная с версии 5.6. Oracle Coherence напрямую поддерживает API Memcached, начиная с версии 12.1.3. Infinispan напрямую поддерживает Memcached.