Spec-Zone.ru › MySQL 5.7

14.21.5.4 Управление поведением транзакций плагина InnoDB memcached

В отличие от традиционного memcached, плагин daemon_memcached позволяет управлять долговременностью значений данных, полученных в результате вызовов add, set, incr и т.д. По умолчанию данные, записанные через интерфейс memcached, хранятся на диске, а вызовы get возвращают последнее значение с диска. Несмотря на то, что такое поведение не обеспечивает наилучшую производительность, оно всё же быстро по сравнению с интерфейсом SQL для таблиц InnoDB.

По мере работы с плагином daemon_memcached, можно рассмотреть возможность ослабления параметров долговременности для некритичных типов данных, рискуя потерять некоторые обновлённые значения в случае сбоя или получить данные, которые немного устарели.

Частота коммитов

Компромисс между долговременностью и производительностью заключается в частоте записи новых и изменённых данных. Если данные критически важны, то они должны коммититься немедленно, чтобы гарантировать их безопасность в случае неожиданного завершения работы или сбоя. Если данные менее важны, например, счётчики, которые сбрасываются после неожиданного завершения работы, или данные логов, которые можно потерять, можно предпочесть более высокую пропускную способность, доступную при менее частых коммитах.

Когда операция memcached вставляет, обновляет или удаляет данные в базовой таблице InnoDB, изменение может быть зафиксировано в таблице InnoDB мгновенно (если daemon_memcached_w_batch_size=1) или некоторое время спустя (если значение daemon_memcached_w_batch_size больше 1). В любом случае изменение не может быть отменено. Если увеличить значение daemon_memcached_w_batch_size, чтобы избежать высокой нагрузки на I/O в периоды высокой загрузки, коммиты могут стать редкими, когда рабочая нагрузка снижается. В качестве меры предосторожности фоновый поток автоматически фиксирует изменения, внесённые через API memcached, через регулярные интервалы. Интервал контролируется параметром конфигурации innodb_api_bk_commit_interval, который имеет значение по умолчанию 5 секунд.

Когда операция memcached вставляет или обновляет данные в базовой таблице InnoDB, изменённые данные сразу же видны другим запросам memcached, потому что новое значение сохраняется в кэше памяти, даже если оно ещё не зафиксировано на стороне MySQL.

Изоляция транзакций

Когда операция memcached, например, get или incr, вызывает запрос или операцию DML над базовой таблицей InnoDB, можно контролировать, видит ли операция самые последние данные, записанные в таблицу, только данные, которые были зафиксированы, или другие варианты уровня изоляции. Используйте параметр конфигурации innodb_api_trx_level, чтобы контролировать эту функцию. Числовые значения, указанные для этого параметра, соответствуют уровням изоляции, таким как REPEATABLE READ. См. описание параметра innodb_api_trx_level для получения информации о других настройках.

Строгий уровень изоляции гарантирует, что полученные данные не будут отменены или внезапно изменены, что может привести к возвращению различных значений в последующих запросах. Однако строгие уровни изоляции требуют большей накладных расходов, что может привести к задержкам. Для приложений в стиле NoSQL, которые не используют длительные транзакции, как правило, можно использовать уровень изоляции по умолчанию или переключиться на менее строгий уровень изоляции.

Отключение блокировок строк для операций memcached DML

Параметр innodb_api_disable_rowlock можно использовать для отключения блокировок строк, когда запросы memcached через плагин daemon_memcached вызывают операции DML. По умолчанию innodb_api_disable_rowlock имеет значение OFF, что означает, что запросы memcached блокируют строки для операций get и set. Когда innodb_api_disable_rowlock установлено в значение ON, memcached запросы используют блокировку таблицы вместо блокировки строк.

Параметр innodb_api_disable_rowlock не является динамическим. Его необходимо указать при запуске на командной строке mysqld или в файле конфигурации MySQL.

Разрешение или запрет DDL

По умолчанию можно выполнять операции, такие как ALTER TABLE, на таблицах, используемых плагином daemon_memcached. Чтобы избежать потенциальных замедлений при использовании этих таблиц в приложениях с высокой пропускной способностью, отключите операции DDL на этих таблицах, включив innodb_api_enable_mdl при запуске. Этот параметр менее подходит при доступе к тем же таблицам как через memcached, так и через SQL, потому что он блокирует CREATE INDEX инструкции над таблицами, что может быть важным для выполнения отчётных запросов.

Хранение данных на диске, в памяти или в обоих местах

Таблица innodb_memcache.cache_policies определяет, хранить ли данные, записанные через интерфейс memcached, на диске (innodb_only, по умолчанию); только в памяти, как в традиционном memcached (cache_only); или в обоих местах (caching).

При использовании настройки caching, если memcached не может найти ключ в памяти, он ищет значение в таблице InnoDB. Значения, возвращённые вызовами get при настройке caching, могут быть устаревшими, если значения были обновлены на диске в таблице InnoDB, но ещё не были удалены из кэша памяти.

Политика кэширования может быть установлена независимо для операций get, set (включая incr и decr), delete и flush.

Например, можно разрешить операциям get и set одновременный доступ к запросу или обновлению таблицы и кэшу памяти memcached (настройка caching), а операциям delete, flush или обоим разрешить работать только с копией в памяти (настройка cache_only). Таким образом, удаление или очистка элемента приводит к удалению элемента только из кэша, и в следующий раз при запросе элемента возвращается последнее значение из таблицы InnoDB.

mysql> SELECT * FROM innodb_memcache.cache_policies;
+--------------+-------------+-------------+---------------+--------------+
| policy_name  | get_policy  | set_policy  | delete_policy | flush_policy |
+--------------+-------------+-------------+---------------+--------------+
| cache_policy | innodb_only | innodb_only | innodb_only   | innodb_only  |
+--------------+-------------+-------------+---------------+--------------+

mysql> UPDATE innodb_memcache.cache_policies SET set_policy = 'caching'
       WHERE policy_name = 'cache_policy';

Значения innodb_memcache.cache_policies считываются только при запуске. После изменения значений в этой таблице необходимо удалить и переустановить плагин daemon_memcached, чтобы изменения вступили в силу.

mysql> UNINSTALL PLUGIN daemon_memcached;

mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/innodb-memcached-txn.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API