Memcached — комп'ютерна програма, сервіс кешування даних в оперативній пам'яті на основі парадигми розподіленої хеш-таблиці.

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-трафіку.[2]. Відсутність автентифікації в системі memcached дозволяє зловмисникам використовувати «відкриті» сервери (за оцінками дослідників станом на початок 2018 року було зафіксовано близько 50 тисяч) спочатку для завантаження власних даних, а потім надсилаючи запити на їхнє отримання із підробленою IP-адресою скеровувати відповіді на адресу жертви[3].

Див. також ред.

Примітки ред.

  1. InfoQ: JGroups Implementation of Memcached Supports Failover and JMX
  2. Carlos Morales (5 березня 2018). NETSCOUT Arbor Confirms 1.7 Tbps DDoS Attack; The Terabit Attack Era Is Upon Us. Arbor Netscout. Архів оригіналу за 12 березня 2018. Процитовано 12 березня 2018.
  3. Brian Krebs (2 березня 2018). Powerful New DDoS Method Adds Extortion. KrebsOnSecurity. Архів оригіналу за 29 березня 2018. Процитовано 12 березня 2018.

Посилання ред.