Memcached — комп'ютерна програма, сервіс кешування даних в оперативній пам'яті на основі парадигми розподіленої хеш-таблиці.
Тип | memcached |
---|---|
Розробник | Danga Interactive |
Перший випуск | 22 травня 2003 |
Стабільний випуск | 1.4.15 (3 вересня 2012) |
Операційна система | Незалежне від платформи ПЗ |
Мова програмування | C[1] |
Ліцензія | BSD |
Репозиторій | github.com/memcached/memcached |
Вебсайт | memcached.org/ |
З допомогою клієнтської бібліотеки (для Perl, PHP, Python, Java та ін.) дозволяє кешувати дані в ОЗП одного або декількох серверів. Розподіл даних реалізується по значенню хеш ключа. Використовуючи ключ даних, клієнтська бібліотека визначає його хеш і використовує його для вибору відповідного сервера. Ситуація збою сервера трактується як промах кешу. Це дозволяє, зокрема, проводити гарячу заміну серверів.
В API memcached є тільки базові функції: вибір сервера, установка з'єднання, додання, видалення, оновлення і отримання об'єкта. Для кожного об'єкта встановлюється час актуальності, починаючи з 1 секунди до нескінченності. При переповненні пам'яті застарілі об'єкти кешу автоматично знищуються.
Сервер memcached було розроблено для сайту LiveJournal з метою зниження навантаження на сервери баз даних.
Приклад коду
Зверніть увагу, що всі функції, описані в цьому розділі, написані на псевдокоді. Синтаксис виклику Memcached може відрізнятися в залежності від мови програмування і API.
Запит до бази даних (без використання memcached) може виглядати як в наступному прикладі:
function get_foo(int userid) { result = db_select( "SELECT * FROM users WHERE userid = ? ", userid) ; return result; }
З використанням memcached, цей ж виклик може виглядати наступним чином:
function get_foo(int userid) { /* спочатку перевірити кеш */ data = memcached_fetch("userrow:" + userid) ; if ( !data) { /* не знайдено: запросити БД */ data = db_select("SELECT * FROM users WHERE userid = ? ", userid) ; /* зберегти в кеші для майбутніх запитів */ memcached_add("userrow:" + userid, data) ; } return data; }
Сервер спочатку перевірить, чи зберігає Memcached значення з унікальним ключем «userrow:userid», де userid є деяким числом. Якщо кеш не містить такі дані, сервер зробить запит до БД, як звичайно, і встановить унікальний ключ, використовуючи виклик до memcached API.
Однак, якщо використовувати тільки цей виклик до API, сервер може повернути некоректні дані після будь-якого оновлення БД: Memcached буде зберігати і повертати застарілі дані . Тому, на додаток до виклику на занесення даних в кеш, також необхідно і оновлення:
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, щоб наступний виклик не знайшов дані в кеші і запросив їх в базі даних. Аналогічні дії потрібні і в разі видалення даних з бази даних, щоб кеш залишався коректним або частково незаповненим.
Уразливості
Наприкінці лютого, початку березня 2018 року було зафіксовано дві надпотужні D-DoS атаки з піковою потужністю 1,3 Тб/с проти Github та 1,7 Тб/c проти не названого вебресурсу в США. Зловмисники скористались особливістю протоколу системи Memcached для мультиплікації UDP-трафіку.. Відсутність автентифікації в системі memcached дозволяє зловмисникам використовувати «відкриті» сервери (за оцінками дослідників станом на початок 2018 року було зафіксовано близько 50 тисяч) спочатку для завантаження власних даних, а потім надсилаючи запити на їхнє отримання із (підробленою IP-адресою) скеровувати відповіді на адресу жертви.
Див. також
- [en]
- (Aerospike)
- (Couchbase Server)
- (Redis)
- [en]
- [en]
- (Hazelcast)
- (Cassandra)
- [en]
Примітки
- InfoQ: JGroups Implementation of Memcached Supports Failover and JMX
- Carlos Morales (5 березня 2018). . Arbor Netscout. Архів оригіналу за 12 березня 2018. Процитовано 12 березня 2018.
- Brian Krebs (2 березня 2018). . KrebsOnSecurity. Архів оригіналу за 29 березня 2018. Процитовано 12 березня 2018.
Посилання
- Сайт проекту [ 28 січня 2021 у Wayback Machine.]
- Сайт розробника [ 22 січня 2004 у Wayback Machine.]
- Distributed Caching with Memcached by Brad Fitzpatrick [ 7 березня 2012 у Wayback Machine.]
- Memcached для windows [ 26 лютого 2012 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет