memcached
Memcached — комп'ютерна програма, сервіс кешування даних в оперативній пам'яті на основі парадигми розподіленої хеш-таблиці.
Тип | memcached |
---|---|
Розробник | Danga Interactive |
Перший випуск | 22 травня 2003 |
Стабільний випуск | 1.4.15 (3 вересня 2012) |
Версії | 1.6.9 (21 листопада 2020)[1] |
Репозиторій | github.com/memcached/memcached |
Операційна система | Незалежне від платформи ПЗ |
Мова програмування | C[2] |
Ліцензія | BSD |
Вебсайт | 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-трафіку.[3]. Відсутність автентифікації в системі memcached дозволяє зловмисникам використовувати «відкриті» сервери (за оцінками дослідників станом на початок 2018 року було зафіксовано близько 50 тисяч) спочатку для завантаження власних даних, а потім надсилаючи запити на їхнє отримання із підробленою IP-адресою скеровувати відповіді на адресу жертви[4].
Див. також
- Amazon ElastiCache
- Aerospike
- Couchbase Server
- Redis
- Mnesia
- MemcacheDB
- Hazelcast
- Cassandra
- Tarantool
- Ehcache
Примітки
- Release 1.6.9 — 2020.
- InfoQ: JGroups Implementation of Memcached Supports Failover and JMX
- Carlos Morales (5 березня 2018). NETSCOUT Arbor Confirms 1.7 Tbps DDoS Attack; The Terabit Attack Era Is Upon Us. Arbor Netscout.
- Brian Krebs (2 березня 2018). Powerful New DDoS Method Adds Extortion. KrebsOnSecurity.