После полутора лет разработки увидел свет первый стабильный выпуск новой ветки СУБД MariaDB 10 (10.0.10), в рамках которой развивается ответвление от MySQL, сохраняющее обратную совместимость и отличающееся интеграцией дополнительных движков хранения и расширенных возможностей. Развитие MariaDB курирует независимая организация MariaDB Foundation в соответствии с полностью открытым и прозрачным процессом разработки, не зависящим от отдельных вендоров. MariaDB уже поставляется вместо MySQL в таких дистрибутивах, как RHEL 7, Fedora, openSUSE, Slackware и Arch Linux. Состоятельность проекта и способность обеспечить соответствующую корпоративным стандартам техническую поддержку подтверждены миграцией на MariaDB таких крупных проектов, как Wikipedia, Google Cloud SQL и Nimbuzz.
Выпуск MariaDB 10.0 продолжает развитие кодовой базы MariaDB 5.5 и содержит ряд возможностей, бэкпортированных из ветки MySQL 5.6. Прошлые ветки MariaDB нумеровались синхронно с ветками MySQL, на которых они были основаны, но начиная с представленного выпуска MariaDB уже не является просто набором патчей, применённых поверх MySQL, а содержит достаточно большой набор дополнительных функций и возможностей, реализованных иначе, чем в MySQL (например, пул тредов, поддержка микросекунд и аннотированные запросы). Изменился также и метод синхронизации с кодовой базой MySQL, отныне первичным в разработке является код MariaDB, в который бэкпортируются новшества MySQL. В связи с этим, чтобы более явно обозначить независимость разработки от MySQL было решено присвоить очередному релизу MariaDB номер 10.
Ключевые улучшения MariaDB 10.0:
- Новое хранилище Connect, позволяющее организовать доступ к произвольным локальным или удалённым данным, в виде, как если бы они были сохранены в таблице. Например можно ассоциировать содержимое виртуальной таблицы с данными из файла в определённом формате;
- Новое хранилище Cassandra Storage Engine (SE), добавляющее в MariaDB и MySQL поддержку средств для доступа к данным, хранимым в распределённой БД Apache Cassandra. Используя Cassandra SE разработчики получают возможность обращаться к данным и добавлять данные в БД Cassandra при помощи обычных SQL-запросов. При этом используемая в Cassandra модель хранения данных в виде семейства столбцов (ColumnFamily) отображается в форме свойственных для MariaDB/MySQL таблиц, для которых можно применять стандартные SQL-директивы SELECT, INSERT, DELETE и UPDATE, а также выполнять операции объединения (JOIN) с другими таблицами.
- Интеграция хранилища SPIDER с реализацией системы шардинга, позволяющей разносить большие таблицы на несколько серверов. С точки зрения формирования запросов такие таблицы не отличаются от обычных локальных таблиц, но фактически при использовании SPIDER разные порции данных, составляющих одну таблицу, хранятся на разных серверах. Для обеспечения высокой доступности таблиц, распределённых по серверам при помощи SPIDER, могут применяться новые средства репликации.
- Хранилище Sequence для формирования виртуальных таблиц, заполненных возрастающими или убывающими последовательностями (например, seq_1_to_5 или seq_5_to_1_step_2).
- Улучшенная реализация динамических столбцов, позволяющих получить различный набор "виртуальных столбцов" для каждой строки в таблице. Добавлена поддержка запросов в формате JSON и возможность интеграции с БД Cassandra;
- Многочисленные оптимизации производительности, позволяющие в MariaDB 10 добиться многократного ускорения некоторых операций по сравнению с MySQL и прошлыми ветками MariaDB. Среди ключевых оптимизаций отмечается поддержка параллельной репликации и развитие системы групповых коммитов. Добавлены дополнительные оптимизации выполнения вложенных запросов, например преобразование выражений "NOT EXISTS" в блоки "IN";
- Улучшены средства репликации. Обеспечена защита работы реплицируемых slave-серверов от проблем в случае краха. Добавлена поддержка репликации данных от нескольких master-серверов (multi-source репликации). Из примеров использования multi-source репликации упоминается решение задач сбора в одном месте данных, разнесённых на разные машины, с целью выполнения аналитических запросов или для создания резервной копии;
- Поддержка глобальных идентификаторов транзакций;
- Возможность использования проверки IF (NOT) EXIST для выражений ALTER TABLE;
- Улучшенный вывод сообщений об ошибках. Все числовые номера ошибок теперь сопровождаются пояснительными текстами.
- Поддержка выражения "SHOW EXPLAIN FOR thread_id" для анализа запроса, выполняемого в заданной нити. Так как "SHOW EXPLAIN" учитывает план выполнения оптимизатором реального запроса, он позволяет получить более близкие к реальности показатели, чем выполнение запроса внутри "EXPLAIN";
- В InnoDB добавлены дополнительные оптимизации, позволяющие зметно ускорить выполнения транзакций, не выполняющих операции записи и изменения данных. Для выполнения транзакций в режиме чтения добавлена новая команда "TRANSACTION READ ONLY";
- Оптимизировано выполнение конструкции "LIMIT ... ORDER BY";
- Поддержка автоматического обновления времени (timestamp) в DATETIME;
- Хранимые в памяти таблицы с эффективной поддержкой типов VARCHAR и BLOB;
- Универсальная система накопления статистики об активности и наполнении таблиц для использования оптимизатором запросов, реализованная без привязки к конкретным движкам хранения;
- Поддержка анализа потребления памяти в привязке к отдельной нити;
- Значительное ускорение работы конструкций ALTER TABLE для хранилищ Aria и MyISAM при наличии проверки уникальных ключей;
- Улучшения портированные из MySQL 5.6:
- Обновлённый вариант хранилища InnoDB.
- Поддержка движка PERFORMANCE_SCHEMA и связанной с ним базы performance_schema, предоставляющей низкоуровневые средства для мониторинга за выполнением запросов и различными событиями при работе СУБД;
- Режим только для чтения для транзакций в InnoDB, поддержка выражения "TRANSACTION READ ONLY";
- Оптимизации скорости выполнения запросов вида "ORDER BY ... LIMIT".
- Поддержка "--plugin-load-add";
- Возможность выполнения "ALTER TABLE" на лету;
- Установка привилегий для временных таблиц;
- Расширения, связанные с поддержкой кодировок;
- Выражение "GET DIAGNOSTICS";
- Временные литералы (например, TIME'12:34:56').
Ранее реализованные улучшения, отличающие MariaDB от MySQL:
- Дополнительные движки хранилищ:
- Aria (ранее Maria) - основанное на MyISAM высоконадежное хранилище, отличающееся повышенной устойчивостью и сохранению целостности данных после краха, при полной совместимости с MyISAM. Благодаря ведению лога операций, в случае краха производится откат результатов выполнения текущей операции. Также поддерживается возможность восстановления состояния из любой точки в логе операций (включая поддержку CREATE/DROP/RENAME/TRUNCATE).
- XtraDB - движок основанный на коде InnoDB-plugin и полностью совместимый с ним, но отличающийся заметно более высокой производительностью, благодаря интеграции патчей от компаний Google и Percona. В частности, в XtraDB улучшен механизм работы с памятью, улучшена работа подсистемы ввода/вывода InnoDB, добавлена поддержка нескольких потоков чтения и записи, поддержка управления пропускной способностью, реализация упреждающей выборкой данных (read-ahead), адаптивная установка контрольных точек (adaptive checkpointing), расширены возможности по масштабированию для больших проектов, система организации блокировок адаптирована для работы на системах с большим числом CPU, добавлены дополнительные возможности для накопления и анализа статистики.
- PBXT (PrimeBase XT) - хранилище, разработанное с нуля и поддерживающее мультиверсионный метод организации хранения данных MVCC (multi-version concurrency control), позволяющий избавиться от блокировок при выполнении операций чтения. PBXT поддерживает ACID-совместимые транзакции, быстрый откат транзакций и восстановление после некорректного завершения работы сервера. Имеются средства для обеспечения ссылочной целостности данных, поддержка определения внешних ключей (foreign key), каскадных обновлений и удалений данных. Поддерживается возможность прямого потокового ввода и вывода бинарных данных (BLOB) в БД;
- FederatedX - позиционируется в качестве замены разработанного в Sun Microsystems и уже не поддерживаемого хранилища Federated. FederatedX позволяет организовать обращение к удаленным таблицам как к локальным. Имеется поддержка транзакций, одновременной установки нескольких соединений к удаленной СУБД, использования операций "LIMIT";
- OQGRAPH - хранилище для организации иерархических (древовидных) структур и сложных графов (узлов, имеющих множество связей);
- Sphinx - хранилище для построения поисковых движков. Встроенный Sphinx-клиент позволяет MariaDB обмениваться данными с searchd, выполнять поисковые запросы и получать результаты поиска;
- Интеграция более эффективного аналога коммерческого дополнения "Thread Pool", представляемого в продукте MySQL Enterprise. Thread Pool представляет собой реализацию новой высокомасштабируемой модели многопоточной обработки, нацеленной на сокращение издержек при обслуживании соединений клиентов и при ответвлении выполняющих запросы потоков. Наиболее заметное повышение производительности демонстрируется при выполнении высоконагруженных web-приложений, обслуживающих большое число параллельных запросов, в сочетании с работой на серверах, имеющих 16 и более процессорных ядер;
- Включение в состав библиотеки с реализацией неблокирующего клиенского API. Неблокирующий API позволяет отправить запрос к СУБД и не дожидаясь его завершения сразу перейти к дальнейшим действиям. После того как будет готов результат запроса, приложение будет информировано через callback-вызов. Подобный подход оправдан когда нужно выполнить одновременно несколько независимых запросов к базе, обратиться к нескольким СУБД или сформировать запросы из приложений, изначально написанных в соответствии с неблокирующим стилем разработки, например, использующих libevent или event loop. Новый API реализован исключительно на уровне клиентской библиотеки и не требует от сервера какой-либо дополнительной функциональности, что позволяет использовать неблокирующий API с любыми выпусками MariaDB и MySQL. Библиотека также полностью совместима с уже собранными приложениями на уровне API и ABI;
- Виртуальные столбцы, содержимое которых формируется на основе заданного выражения, рассчитываемого во время выполнения;
- Расширенная статистика об активности клиентов, пользователей, индексов и таблиц;
- Сегментированный кэш MyISAM-ключей - глобальный мьютекс разбит на несколько мьютексов, что дает существенный прирост производительности (до 70%) в системах с большой нагрузкой из параллельных запросов;
- Подключаемые модули аутентификации - возможность реализации плагинов, которые могут добавлять новые методы аутентификации в MariaDB;
- Привязанные к типу хранилищ выражения "CREATE TABLE", дающие возможность определить передаваемые хранилищу дополнительные атрибуты для каждого поля, индекса или таблицы;
- Возможность создания пула потоков, позволяющего использовать заданное число mysql-нитей для обработки всех запросов, вместо механизма "одна нить на одно соединение". В итоге можно значительно увеличить производительность БД, обрабатывающих большое число соединений или имеющих большое число длительно выполняющихся запросов;
- Ликвидация таблиц - новый вид оптимизации операций по объединению таблиц (JOIN), позволяющий исключить обращения к некоторым таблицам, на которые ссылается запрос пользователя;
- HandlerSocket - реализация интерфейса прямого доступа к таблицам InnoDB/XtraDB в стиле NoSQL-систем. Поддерживаются такие операции, как добавление, обновление, чтение и удаление ключа;
- Поддержка динамических столбцов, позволяющих получить различный набор "виртуальных столбцов" для каждой строки в таблице;
- Добавлено множество патчей, созданных компанией Percona и сообществом независимых разработчиков. Например, добавлен патч для выявления узких мест при работе с базой. Кроме отслеживания запросов выполняющихся более заданного времени, поддерживается занесение в лог информации о запросах приводящих к перебору большого числа строк, сложным сортировкам, задействованию временного файла на диске или удовлетворяющих параметрам заданного фильтра (qc_miss, full_scan, full_join, tmp_table, tmp_table_on_disk, filesort, filesort_on_disk). В отличии от стандартного механизма ведения лога медленных запросов, msl оперирует не секундами, с округлением в большую сторону, а отрезками 0.005 сек.
|