Введення в інтерфейс мemcached для mysql innodb

phpMySQLInnoDBMemCache

Введення в інтерфейс мemcached для mysql innodb

В MySQL 5.6 з'явилося memcache-сумісний сховище ключ-значення на базі движка Innodb.

InnoDB Memcache Daemon надає вам стабільність innodb для даних виду ключ-значення, доступ до яких може бути організований через швидший і оптимізований протокол memcached. При використанні даного протоколу будуть пропущені: парсинг запиту, його оптимізація і інші частини обробки, які не потрібні.

За допомогою mysqlnd_memcache, ви можете прозоро направляти ваші запити до такого memcache-сумісного інтерфейсу.

Стандартні пакети MySQL 5.6, які поставляються Ubuntu (Trusty), не включають в себе плагін memcache. Для використання цього плагіна вам буде потрібно встановити його з офіційних apt-репозиторіїв MySQL-я (для Debian 7.x Wheezy, Ubuntu 12.04 Precise і Ubuntu 14.04 Trusty).

Після того як ви встановили MySQL 5.6 (або вище), необхідно увійти в MySQL під суперкористувачем і виконати наступне:

Скрипт innodb_memcached_config.sql робить кілька речей, і перше, що він робить - це створює базу даних innodb_memcache. яка містить три таблиці:

  1. cache_policies. в цій таблиці зберігаються правила, як виконуються команди GET. SET. DELETE і FLUSH.
  2. containers. ця таблиця містить список ваших таблиць, до яких можливий доступ за допомогою memcache
  3. config_options - в цій таблиці зберігаються настройки memcache, а саме - роздільник багатоколоночних значень - separator (за замовчуванням вертикальна риса "|") і роздільник звернення до таблиць table_map_delimiter (за замовчуванням точка ".")

Друге, що виконує скрипт - завантажує сам плагін і запускає memcache демона всередині MySQL.

Тепер все готово, щоб використовувати цей плагін.

Створення memcache сховища

Так як движок memcache встановлює деякі вимоги до таблиць, то не кожна innodb таблиця може бути автоматично використана в якості такого сховища. Для використання ви повинні налаштувати так звану колекцію.

Кожна колекція має назву, яка використовується для звернення до неї через memcache, а також містить ряд стовпців:

  • name. назва для звернення до колекції через memcache
  • db_schema. назва бази даних
  • db_table. назва таблиці
  • key_columns. назва стовпчика, що містить ключ (нехай вас не бентежить множину, це один стовпець)
  • value_columns. назви стовпців, зазначені через кому, які містять значення. У memcache-значенні все значення цих стовпців будуть розділені вертикальною лінією (як зазначено в таблиці config_options)
  • flags. які прапори memcache встановити
  • cas_column. назва стовпчика для CAS-значення, що встановлюється memcache третьому
  • expire_time_column. назва стовпчика, в якому зберігається час "протуханія" (в секундах) або 0 якщо не "протухає" ніколи
  • unique_idx_name_on_key. назва індексу, який накладає обмеження UNIQUE на стовпець ключа. Якщо стовпець ключа є первинним ключем, вкажіть PRIMARY

Для того щоб організувати наше сховище, ми створимо нову базу даних kv_data і таблицю kv_store в ній:

Далі, ми повідомимо плагіну про нашому сховищі, створивши контейнер:

Після того як ви це зробили, вам потрібно трохи почекати, щоб це набуло чинності або перезапустити MySQL.

Використання memcache інтерфейсу

Тепер, коли у вас запущений і працює memcache інтерфейс innodb, ви можете вставляти (insert) дані також як в звичайну таблицю БД або, звичайно ж, за допомогою протоколу memcache, - що можна здійснити за допомогою telnet-а.

При використанні протоколу memcache - за замовчуванням і мінімальне - кількість операцій перед тим, як дані будуть скинуті в innodb, є 32, як зазначено в налаштуванні daemon_memcached_w_batch_size. Це означає, що дані стають видні в MySQL кожні 32 операції. Така плата за продуктивність. Винятком з правил є використання binlog-реплікації, в тому випадку, якщо вона постійно встановлена ​​в 1.

Для того щоб MySQL зміни були відразу доступні через memcache, ви повинні виконати:

Для використання memcache інтерфейсу за допомогою telnet, використовуйте його в такий спосіб:

Використання декількох колекцій

За замовчуванням дані зберігаються або в колекції під назвою default або, якщо вона не існує, в першу колекцію в таблиці колекцій.

Для доступу до даних іншого колекції у вас є два варіанти:

Перший найбільш близький до MySQL-евского оператору USE. Ви просто звертаєтеся до самої колекції і далі будь-які запити оперують з цією колекцією, поки вона не буде змінена на іншу.

Перед ім'ям колекції, для відмінності від ключів, ставиться префікс - два знака @:

Другий - це використовувати повне ім'я. У цьому випадку якраз вступає в гру table_map_delimeter. за допомогою чого ми просто ставимо перед колекцією префікс @@ collection і після table_map_delimeter. Таким чином, звернення до test.key стає @@ kv_data.test.key

Я рекомендую завжди використовувати такий синтаксис, т. К. Ви можете випадково змінити колекцію в якомусь викликаному ділянці коду без повернення до попередньої колекції.

Використання плагіна mysqlnd_memcache

Тепер ви можете просто звертатися до ваших даних через інтерфейс memcache, використовуючи PHP розширення memcached або memcache (memcached extension. Memcache extension). В тому числі, ви можете налаштувати ваш обробник сесій використовувати цей підхід. А також ви можете використовувати звичайні SQL запити. Однак, з плагіном mysqlnd_memcache ви можете прозоро перенаправляти SQL запити на memcache інтерфейс, коли це необхідно.

За замовчуванням запити зіставляються з регулярним виразом, зазначеному в константі MYSQLND_MEMCACHE_DEFAULT_REGEXP:

Якщо запит відповідає, далі плагін перевіряє, що в налаштуваннях колекції перераховані тільки поля з таблиці і що в секції WHERE тільки одна умова з простим порівнянням по ключу.

Для нашого прикладу цій умові буде відповідати ось такий запит:

Однак жоден з таких не буде:

Такі запити можуть бути виконані за допомогою механізмів одного з розширень: mysql, mysqli або pdo, і будуть перехоплені непомітно для вас.

Плагін mysqlnd_memcacheне обробляє запити на запис.

Незважаючи на це обмеження, його використання може виразно поліпшити ваш код (тим, що вам не потрібно реалізовувати звернення до memcache / memcached API) і отримати великий виграш в продуктивності при незначних змінах.

Запис, Реплікація і пул Memcache

Memcached відомий своєю простою настройкою пулу memcached-ів для балансування навантаження і відмовостійкості, але як йдуть справи з memcache-інтерфейсом для InnoDB? У деякому роді схожий обробник присутній в MySQL реплікації, тим, що кожен слейв може бути використаний як сервер Memcache-а в режимі тільки-для-читання, втім, ті ж правила для поділу читання і запису застосовні і при роботі з Memcache третьому.

Ви повинні переконатися, що ви використовуєте тільки плагін mysqlnd_memcache для доступу до вашого пулу і зв'язати його з плагіном mysqlnd_ms для організації поділу читання і запису. Однак це означає, що ви пропустіть можливість скористатися високо продуктивним іінтерфейсом Memcache-а на запис.

Так як немає способу вказати memcache (d) розширення, що сервера використовуються в режимі тільки-на-читання, то неможливо використовувати стандартну топологію реплікації master + slaves як пулу memcached-ів.

висновок

Memcached інтерфейс для InnoDB - це набагато більш швидкий спосіб використання MySQL для простих сховищ ключ-значення, але при цьому має всі переваги чудового движка InnoDB.

Хоча він і не є настільки швидким, як сам memcached, він дозволяє вам усунути "ще один шарнір" у вашій інфраструктурі, при цьому будучи простою заміною для memcached.

У наступній статті цієї серії ми розглянемо кешування запитів для подальшого підвищення продуктивності.