Группа коммитов Aria
С MariaDB 5.2 движок хранения Aria включает функцию группировки коммитов для ускорения конкурирующих потоков, выполняющих множество вставок в одни и те же или разные таблицы Aria.
По умолчанию группировка коммитов для Aria выключена. Она управляется системными переменными aria_group_commit и aria_group_commit_interval.
Информация о настройке переменных сервера доступна на странице Системные переменные сервера.
Терминология
- Запись
commit— этоflush of logs, за которой следует синхронизация. -
sent to diskозначает запись на диск, но без синхронизации sync(), -
flushedозначает отправку на диск и синхронизацию sync(). -
LSNозначает серийный номер журнала. Он относится к позиции в журнале транзакций.
Логика без группировки коммитов (aria_group_commit="none")
Поток, который первым начал commit, выполняет фактическую запись журналов. Другие потоки устанавливают новую цель (LSN) следующего прохода (если это максимум) и ожидают окончания прохода или просто ожидают окончания прохода.
Это означает, что запись (запись журналов + синхронизация) сохранит все данные для всех потоков/транзакций, которые ожидали с последней записи.
Если включена жёсткая группировка коммитов (aria_group_commit="hard")
Если жёсткий коммит и aria_group_commit_interval=0
Первый поток отправляет все изменённые буферы на диск. Это повторяется до тех пор, пока не появятся новые LSN. Этот процесс не может продолжаться вечно, так как у нас ограниченное количество потоков, и они будут ждать синхронизации данных.
Псевдокод:
do send changed buffers to disk while new_goal sync
Если жёсткий коммит и aria_group_commit_interval > 0
Если прошло меньше microсекунд с момента последней синхронизации, то после отправки буферов на диск ожидается, пока не пройдёт заданное число microсекунд с момента последней синхронизации, выполняется sync() и возвращается значение. Это гарантирует, что если мы вызываем sync() нечасто, то не будет ожидания.
Если включена мягкая группировка коммитов (aria_group_commit="soft")
Обратите внимание, что мягкая группировка коммитов следует использовать только в том случае, если вы можете позволить себе потерять несколько строк, если ваш компьютер внезапно отключится (например, при отключении питания).
Работает так же, как в non group commit', но поток не выполняет реальной синхронизации sync(). Если aria_group_commit_interval не равно нулю, синхронизация sync() будет выполнена сервисным потоком с заданной скоростью при необходимости (появление новых LSN). Если aria_group_commit_interval равно нулю, вызовов sync() не будет.
Код
Код для этого можно найти в storage/maria/ma_loghandler.c::translog_flush()
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/aria-group-commit/