Memcached - Memcached
Разработчики) | Danga Interactive |
---|---|
изначальный выпуск | 22 мая 2003 г. |
Стабильный выпуск | 1.6.8[1] / 27 октября 2020 |
Репозиторий | |
Написано в | C |
Операционная система | Кроссплатформенность |
Тип | система кэширования распределенной памяти |
Лицензия | Пересмотренная лицензия BSD[2] |
Интернет сайт | memcached |
Memcached (произносится по-разному мем-кэш-ди или же обналиченный) является распределенным универсальным кэширование памяти система. Часто используется для ускорения динамических база данных веб-сайты, кэширующие данные и объекты в баран чтобы уменьшить количество раз, когда необходимо читать внешний источник данных (например, базу данных или API). Memcached - это бесплатное программное обеспечение с открытым исходным кодом, под лицензией Пересмотренная лицензия BSD.[2] Memcached работает на Unix-подобный операционные системы (Linux и OS X ) и дальше Майкрософт Виндоус. Это зависит от Libevent библиотека.
Memcached's API предоставить очень большой хеш-таблица распределены по нескольким машинам. Когда таблица заполнена, последующие вставки приводят к удалению старых данных в наименее недавно использованный (LRU) заказ.[3][4] Приложения, использующие Memcached, обычно помещают запросы и дополнения в оперативную память, прежде чем откатиться к более медленному резервному хранилищу, например базе данных.
Memcached не имеет внутреннего механизма для отслеживания возможных промахов. Однако некоторые сторонние утилиты предоставляют эту функцию.
Memcached был впервые разработан Брэд Фицпатрик для своего сайта LiveJournal, 22 мая 2003 г.[5][6] Первоначально он был написан на Perl, а затем переписан на C к Анатолий Воробей, затем нанятый LiveJournal.[7] Memcached сейчас используется многими другими системами, в том числе YouTube,[8] Reddit,[9] Facebook,[10][11] Pinterest,[12][13] Twitter,[14] Википедия,[15] и Студии методов.[16] Google App Engine, Облачная платформа Google, Microsoft Azure, IBM Bluemix и Веб-сервисы Amazon также предлагают сервис Memcached через API.[17][18][19][20]
Архитектура программного обеспечения
В системе используется клиент – сервер архитектура. Серверы поддерживают ключ-значение ассоциативный массив; клиенты заполняют этот массив и запрашивают его по ключу. Ключи имеют длину до 250 байт, а значения могут быть не более 1 мегабайт по размеру.
Клиенты используют клиентские библиотеки для связи с серверами, которые по умолчанию предоставляют свои услуги в порт 11211. Поддерживаются как TCP, так и UDP. Каждый клиент знает все серверы; серверы не общаются друг с другом. Если клиент желает установить или прочитать значение, соответствующее определенному ключу, клиентская библиотека сначала вычисляет хэш ключа, чтобы определить, какой сервер использовать. Это дает простую форму шардинг и масштабируемый архитектура без совместного использования ресурсов через серверы. Сервер вычисляет второй хэш ключа, чтобы определить, где сохранить или прочитать соответствующее значение. Серверы хранят значения в ОЗУ; если на сервере заканчивается ОЗУ, он отбрасывает самые старые значения. Следовательно, клиенты должны рассматривать Memcached как временный кэш; они не могут предположить, что данные, хранящиеся в Memcached, все еще там, когда они им нужны. Другие базы данных, например MemcacheDB, Couchbase Сервер, обеспечить постоянное хранилище при сохранении совместимости с протоколом 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 очень просто. Обычно при использовании прямых запросов к базе данных пример кода выглядит следующим образом:
функция get_foo(int ID пользователя) данные = db_select("ВЫБРАТЬ * ИЗ пользователей WHERE userid =?", ID пользователя) возвращаться данные
После преобразования в Memcached этот же вызов может выглядеть следующим образом
функция get_foo(int ID пользователя) / * сначала пробуем кеш * / данные = memcached_fetch("userrow:" + ID пользователя) если нет данные / * не найдено: запросить базу данных * / данные = db_select("ВЫБРАТЬ * ИЗ пользователей WHERE userid =?", ID пользователя) / * затем сохраняем в кеше до следующего получения * / memcached_add("userrow:" + ID пользователя, данные) конец возвращаться данные
Сначала клиент проверяет, существует ли значение Memcached с уникальным ключом «userrow: userid», где userid - это некоторое число. Если результат не существует, он будет выбирать из базы данных как обычно и устанавливать уникальный ключ с помощью вызова функции добавления Memcached API.
Однако, если бы был изменен только этот вызов API, сервер в конечном итоге получал бы неверные данные после любых действий по обновлению базы данных: "представление" данных Memcached устарело. Следовательно, помимо создания вызова «добавить», также потребуется вызов обновления с использованием функции набора Memcached.
функция update_foo(int ID пользователя, нить dbUpdateString) / * первое обновление базы данных * / результат = db_execute(dbUpdateString) если результат / * обновление базы данных выполнено успешно: выборка данных для хранения в кеше * / данные = db_select("ВЫБРАТЬ * ИЗ пользователей WHERE userid =?", ID пользователя) / * предыдущая строка также может выглядеть как data = createDataFromDBString (dbUpdateString) * / / * затем сохраняем в кеше до следующего получения * / memcached_set("userrow:" + ID пользователя, данные)
Этот вызов обновит текущие кэшированные данные, чтобы они соответствовали новым данным в базе данных, если запрос базы данных завершится успешно. Альтернативный подход состоял бы в том, чтобы сделать кеш недействительным с помощью функции удаления Memcached, чтобы последующие выборки приводили к пропуску кеша. Аналогичные действия необходимо будет предпринять при удалении записей базы данных, чтобы поддерживать правильный или неполный кеш.
Альтернативная стратегия аннулирования кэша состоит в том, чтобы сохранить случайное число в согласованной записи кэша и включить это число во все ключи, которые используются для хранения определенного вида записи. Чтобы аннулировать все такие записи сразу, измените случайное число. На существующие записи (которые были сохранены под старым номером) больше не будут ссылаться, и поэтому в конечном итоге они истекут или будут переработаны.
функция store_xyz_entry(int ключ, нить ценить) / * Получить случайное число - использовать ноль, если его еще нет. * Используемое здесь имя ключа произвольно. * / семя = memcached_fetch(": xyz_seed:") если нет семя семя = 0 / * Создаем ключ, используемый для хранения записи, и сохраняем ее. * Используемое здесь имя ключа также произвольно. Обратите внимание, что «начальное число» и «ключ» пользователя * хранятся как отдельные части построенной строки hashKey: ": xyz_data: (seed) :( key)." * Это не обязательно, но рекомендуется. * / нить hashKey = спринт(": xyz_data:% d:% d", семя, ключ) memcached_set(hashKey, ценить) / * "fetch_entry", не показан, следует той же логике, что и выше. * / функция invalidate_xyz_cache() existing_seed = memcached_fetch(": xyz_seed:") / * Монеты другого случайного числа * / делать семя = ранд() до того как семя != existing_seed / * Теперь сохраняем в оговоренном месте. Все будущие запросы будут использовать этот номер. * Таким образом, все существующие записи теряют ссылки и в конечном итоге истекают. * / memcached_set(": xyz_seed:", семя)
использование
- MySQL - напрямую поддерживает Memcached API начиная с версии 5.6.[26]
- Oracle Coherence - напрямую поддерживает Memcached API начиная с версии 12.1.3.[27]
- GigaSpaces XAP - поддержка Memcached с высокой доступностью, поддержка транзакций[28]
Смотрите также
Рекомендации
- ^ «Релиз 1.6.8». 27 Октябрь 2020. Получено 15 ноября 2020.
- ^ а б «Лицензия Memcached». GitHub. Получено 2014-06-27.
- ^ "Архив Google Code - долгосрочное хранилище для хостинга проектов Google Code". Code.google.com. Получено 2017-06-25.
- ^ "Архив Google Code - долгосрочное хранилище для хостинга проектов Google Code". Code.google.com. Получено 2017-06-25.
- ^ [1]. Community.livejournal.com (22 мая 2003 г.). Проверено 18 сентября 2013.
- ^ [2]. Community.livejournal.com (27 мая 2003 г.). Проверено 18 сентября 2013.
- ^ "lj_dev: memcached". 2013-02-25. Архивировано из оригинал на 2013-02-25. Получено 2017-06-25.
- ^ Куонг До Куонг (технический директор YouTube / Google) (23 июня 2007 г.). Сиэтлская конференция по масштабируемости: масштабируемость YouTube (Интернет-видео - 26-я минута). Сиэтл: Google Tech Talks.
- ^ Уитакер, Кейр (17 мая 2010 г.). «Стив Хаффман об уроках, извлеченных на Reddit | Carsonified». Архивировано из оригинал на 2010-05-17. Получено 2017-06-25.
- ^ «Масштабирование memcached в Facebook». Facebook.com. 2008-12-12. Получено 2017-06-25.
- ^ «Масштабирование Memcache в Facebook». USENIX. Получено 2017-06-25.
- ^ «Создание Pinterest в облаке». Pinterest.com. 2013-06-19. Получено 2018-03-09.
- ^ «Комплексный, быстрый клиент memcached на чистом Python». Github.com. 2018-01-08. Получено 2018-03-09.
- ^ «Это не ракетостроение, это наша работа». Blog.twitter.com. 2008-06-01. Получено 2017-06-25.
- ^ "memcached". MediaWiki. Получено 2017-06-25.
- ^ Rez BoF, SIGGRAPH 2019, получено 2019-08-09
- ^ "Примеры Memcache | Стандартная среда App Engine для Python | Google Cloud Platform". Code.google.com. 2017-03-22. Получено 2017-06-25.
- ^ «О ролевом кэше для кэша Azure». Msdn.microsoft.com. 2015-08-25. Получено 2017-06-25.
- ^ Верж, Джейсон (23 сентября 2014 г.). «Redis Labs: у нас 3000 платящих клиентов NoSQL в оперативной памяти». Знание центра обработки данных. Получено 2016-09-10.
- ^ «AWS | Amazon ElastiCache - хранилище и кэш данных в памяти». Aws.amazon.com. Получено 2017-06-25.
- ^ «Архивная копия». Архивировано из оригинал на 2018-12-21. Получено 2016-09-02.CS1 maint: заархивированная копия как заголовок (связь)
- ^ "Memcrashed - Основные атаки усиления с UDP-порта 11211". CloudFlare. 27 февраля 2018 г.. Получено 3 марта 2018.
- ^ Джеффри, Кэл (1 марта 2018 г.). «GitHub стал жертвой крупнейшей из когда-либо зарегистрированных DDoS-атак».
- ^ "Отчет об инциденте DDoS 28 февраля". 1 марта 2018 г.. Получено 3 марта 2018.
- ^ «Примечания к выпуску Memcached 1.5.6». 2018-02-27. Получено 3 марта 2018.
- ^ «Speedy MySQL 5.6 нацелен на NoSQL, MariaDB». Theregister.co.uk. Получено 2017-06-25.
- ^ Дэвид Фелси (13.08.2014). «Начало работы с адаптером Coherence Memcached | Блог Oracle Coherence». Blogs.oracle.com. Получено 2017-06-25.
- ^ «Обработка транзакций XAP в реальном времени». Gigaspaces.com. Получено 2017-06-25.