Обзор каталогов
Каталоги — это новая функция, которая будет включена в будущей версии MariaDB. Каталоги MariaDB — это функция многопользовательской аренды, где один экземпляр сервера MariaDB обрабатывает несколько независимых арендаторов (клиентов), которые имеют собственных пользователей, схемы и т. д. Подробнее см. MDEV-31542 «Добавление многопользовательских каталогов в MariaDB».
Обзор
Для хостинг-провайдеров распространённым решением для снижения затрат является использование одного сервера MariaDB для поддержки нескольких клиентов путём создания одной именованной схемы для каждого из них.
Однако это имеет множество ограничений:
- Пользователь не может иметь точно такие же схемы в облаке, как у него на локальном сервере.
- Пользователь не может использовать несколько схем.
- Пользователь не может создать резервную копию всех своих данных (даже с помощью mariadb-dump). Это связано с тем, что схема «mysql», которая включает в себя пользователей, хранимые процедуры и т. д., не может быть скопирована, так как её данные разделяются между всеми пользователями сервера.
- Пользователь не может получить доступ к общему или файлу журнала ошибок.
Предлагаемое решение для решения всех вышеперечисленных проблем и создания лучшей многоарендаторной базы данных — добавление поддержки каталогов в MariaDB.
Наличие у каждого пользователя собственного каталога позволит получить практически такой же пользовательский опыт, как если бы у него был собственный сервер MariaDB.
Каталоги позволяют хостинг-провайдерам иметь в 10-100 раз больше пользователей базы данных с невысокой активностью на одном сервере по сравнению с использованием контейнера или сервера MariaDB на каждого клиента (что ограничивает сервер с 192 Гб до примерно 100 клиентов с по 1 Гб буфера InnoDB каждый).
Пользовательский опыт с каталогами
- Каждый пользователю назначается один каталог. Пользователь может указать свой каталог в файле my.cnf или в качестве аргумента клиентам или при подключении к серверу MariaDB.
- Пользователи могут создать mariadb-dump всех своих таблиц (включая базу данных «mysql») и применить его на своем локальном сервере MariaDB или в другом каталоге MariaDB, чтобы дублировать свою конфигурацию.
- Каждый каталог имеет свою систему привилегий. Это позволяет администратору MariaDB создавать пользователей независимо в своём каталоге, не затрагивая пользователей других каталогов. Это также означает, что каталог должен быть частью информации о подключении, иначе сервер не знает, какую таблицу пользователей использовать.
- Если пользователь использует приложения, которые еще не поддерживают каталоги, он может указать каталог как часть базы данных при подключении к серверу («каталог.база данных») или подключиться к определенному порту, связанному с каталогом.
- После входа в систему обычный пользователь может видеть только объекты (базы данных, таблицы, пользователи и т. д.) из своей базы данных. Он не может получить доступ к другим каталогам или изменить их.
- Обычный пользователь не может изменить активный каталог с помощью команды. Он должен выйти из текущего каталога и войти в другой.
Для конечного пользователя сервер MariaDB будет работать как обычный автономный сервер, с следующими отличиями:
- При подключении к серверу обычный пользователь должен указать каталог. Если программное обеспечение соединителя не поддерживает каталоги, каталог должен быть указан в строке базы данных. Если каталог не указан, используется каталог «def».
- LOAD DATA INFILE и SELECT … INTO OUTFILE могут быть настроены таким образом, чтобы они использовались только с каталогом или с каталогом внутри него.
- команда SHUTDOWN предназначена только для «корневых пользователей каталогов».
- Репликация (команды MASTER и SLAVE) предназначены только для «корневых пользователей каталогов».
- Ошибки от фоновых задач (например, ошибки записи) будут записываться в системный журнал ошибок, а не в журнал ошибок каталога.
- SHOW STATUS покажет данные состояния для всего сервера, а не только для активного каталога.
- Сервер будет обрабатывать устаревшие приложения, расширяя базу данных по умолчанию в подключении, чтобы она содержала каталог в формате «каталог/база данных». Подробности см. в Приложении.
- Таблицы, которые считываются только из схемы «def.mysql»:
- плагин
- таблицы help_*
- таблицы time_zone*
- gtid_slave_pos (состояние репликации)
- innodb_index_stats (внутренняя информация InnoDB)
- servers (федерированный)
- transaction_registry (внутренняя информация InnoDB)
- func (UDF)
- performance_schema
Новый «корневой пользователь каталога»
- Каталог «def» предназначен для хранения разрешений «корневых пользователей каталогов», которые могут получить доступ к любому каталогу. * Эти пользователи предназначены для администраторов, которым необходимо выполнять задачи, такие как остановка, обновление, создание/удаление каталогов, управление первичными и вторичными репликами и т. д.
- Только «корневой пользователь каталога» может переключиться на другой каталог с помощью команды «set catalog catalog_name».
- Обычный пользователь может выполнить команду «set catalog current-catalog». Это необходимо, чтобы можно было выполнить mariadb-dump, который включает эту команду.
Новая структура хранения
Сервер MariaDB может работать либо в «исходном режиме», где структура данных точно такая же, как и раньше, либо в режиме «каталога» с новой структурой данных:
При выполнении mariadb-install-db с флагом --use-catalogs, будет создана следующая новая структура данных:
- data_directory/
- системенные файлы данных движка
- системные файлы
- файлы репликации
- general.log
- error.log
- mariadb/
- mysql/
- таблицы привилегий
- catalog1
- general.log
- error.log
- mysql/
- таблицы привилегий
- database1/
- таблицы для database1
- database2/
- таблицы для database2
- catalog2/
- general.log
- error.log
- mysql/
- таблицы привилегий
- database1/
- таблицы для database1
- database2/
- таблицы для database2
Структура диска без использования каталогов:
- data_directory/
- системенные файлы данных движка
- системные файлы
- файлы репликации
- general.log
- error.log
- mysql/
- таблицы привилегий
- database1/
- таблицы для database1
- database2/
- таблицы для database2
Из вышесказанного следует:
- Существует каталог «mariadb», который хранит административных пользователей, которые могут получить доступ ко всем каталогам, останавливать серверы, создавать новые каталоги и т. д. Пользователь «system root» использует его при подключении.
- Каждый каталог имеет своих пользователей, таблицы привилегий, базы данных, журналы ошибок и общие журналы.
Сервер MariaDB автоматически запустится в режиме каталога, если обнаружит новую структуру каталогов.
SQL-команды/функции каталога
- USE CATALOG catalog_name;
- CREATE CATALOG
- DROP CATALOG
- ALTER CATALOG
- SHOW CATALOGS (а также information_schema.catalogs)
- SHOW CREATE CATALOG catalog_name;
- SELECT CATALOG();
Необходимые изменения в кодовой базе MariaDB
Изменения в клиентах:
- Добавление параметра --catalog ко всем стандартным клиентам MariaDB
- Добавление поддержки перебора всех существующих каталогов:
Изменения в mariadb-install-db:
- Возможность одновременного создания нескольких каталогов: -–catalogs=”catalog1,catalog2”
- Инициализация MariaDB с поддержкой каталогов: —use-catalogs
Изменения в mariadb (клиент mysql):
- Добавление поддержки 'USE CATALOG xxx' (и позже 'use database xxx').
Изменения в mysql-test-run:
- Добавление поддержки запуска тестов с каталогами (обычные тесты запускаются без каталогов).
Изменения в сервере MariaDB (см. MDEV-31542):
- Добавление поддержки «каталога» в строке подключения. Для старых клиентов пользователь может указать каталог как часть базы данных. Если каталог не указан, используется каталог «def» (как сейчас).
- Добавление функции CATALOG(), которая возвращает текущий каталог.
- Добавление 'USE CATALOG xxx'
- Добавление 'USE DATABASE xxx'
- Создание глобального объекта CATALOG для хранения всей информации, связанной с каталогом.
- Добавление текущего каталога в объект 'thd'.
- Добавление аргумента каталога ко всем функциям, которые принимают «базу данных» в качестве аргумента.
- Добавление SHOW CATALOGS и information_schema.catalogs
- Перенос всех соответствующих глобальных переменных (пользователи, привилегии, mdl-блокировки(?), открытые файлы журналов) в структуру CATALOG.
- Добавление «привилегии каталога» для «суперпользователей каталогов», чтобы разрешить им доступ к данным в любом каталоге.
- Добавление поддержки доступа к таблицам с помощью 'каталог.схема.таблица' (необходимо для суперпользователей каталога).
- Для обычных пользователей отображаются только процессы текущего каталога в 'show processlist'.
- Добавление циклов по всем каталогам для схемы информации для «корневого пользователя каталога».
- Обновление схемы производительности, чтобы учесть каталоги.
- Работа с внешними соединителями, чтобы они поддерживали подключение с каталогом.
- Проверка/обновление всех движков хранения, чтобы они также работали с каталогами.
Примечания:
- Вызовы обработчика хранения, скорее всего, не будут изменены. Движок хранения получит имя каталога как часть имени базы данных (каталог/база данных).
- Нам не нужна колонка «каталог» для таблиц в схеме «mysql» (например, mysql.proc), так как они хранятся на основе каталога.
Некоторые идеи реализации
- Вместо отправки строки каталога в функцию, используйте указатель на глобальный объект каталога. Сделайте то же самое позже для баз данных. Это позволяет предварительно вычислять такие вещи, как «имя файла» для каталогов и баз данных, и нам не нужно делать это для каждого открытого стола. Это также позволяет нам впоследствии поддерживать информацию об операциях на уровне каталога и базы данных.
- Не блокируйте MDL каталога для каждой таблицы. Блокировка метаданных каталога будет взята, когда пользователь войдёт в систему или изменит каталог.
- Добавьте системные переменные «текущий_каталог» и «текущая_база_данных» и разрешите пользователям изменять их.
- Добавьте поддержку «портов каталога», которые подключены к каталогу. Это позволяет пользователям подключаться к определённому каталогу из любого клиентского программного обеспечения.
Ограничения (в дополнение к ограничениям, перечисленным в «Опыт работы с каталогами»)
- Имена баз данных не могут содержать «.» при подключении с клиентов без нового параметра подключения к каталогу.
- Нельзя ссылаться на другие каталоги в триггерах, хранимых процедурах, событиях и т. д. Это связано с тем, что транзакция не может охватывать каталоги.
- Только пользователь корня каталога может использовать mariadb-backup. Это нормальное ограничение, так как для использования mariadb-backup необходимо быть системным корнем.
- События являются глобальными (для экономии ресурсов). Пользователи каталога могут включать/отключать события для своего каталога.
Этап 2 (не в первом выпуске)
- Поддержка статистики использования по каталогу и всему серверу (последнее — для «пользователя корня каталога»). Это позволяет администратору базы данных видеть количество запросов, тип запросов и т. д. Некоторые статистические данные «системы» и «глобального innodb» будут отображаться только глобально (количество открытых файлов, количество вызовов синхронизации и т. д.).
- Поддержка файла my.cnf в каждом каталоге для обработки уникальных параметров по умолчанию для каталога (клиента).
- Добавление квот на каталог для таблиц и временных файлов.
- Добавление большей поддержки ограничения пользователей от чрезмерного использования ресурсов (CPU, таблиц, баз данных, количества подключений и т. д.).
- Поддержка «удаления каталога». (Эта функция находится на этапе 2, так как могут возникнуть проблемы с удалением уже активных объектов CATALOG)
- Добавление необязательной поддержки каталога для движка S3
- В дальнейшем будут добавлены другие функции.
Этап 3
- Разрешить пользователям управлять собственным потоком репликации (возможно).
- Разрешить пользователям иметь различные параметры для движка S3.
- В дальнейшем будут добавлены другие функции.
Приложение
Поддержка устаревшего соединителя
Тест SQLALchemy:
In [1]: from sqlalchemy.engine import make_url
In [2]: u = make_url('mariadb+mariadbconnector://app_user:Password123!@127.0.0.1:3306/catalog/company')
In [3]: u.database
Out[3]: 'catalog/company'
Следующие тесты гарантировали, что внутри сервера (mysql_change_db) «каталог/тест» был выбран в качестве базы данных.
Тест PHP PDO:
$ php -r '$db = new \PDO("mysql:host=localhost;user=dan;dbname=catalog/test;charset=utf8mb4;unix_socket=/tmp/build-mariadb-server-10.4.sock");'
Тест PHP mysqli:
php -r '$dbcon = mysqli_connect("localhost","dan","nopass","catalog/test",3306,"/tmp/build-mariadb-server-10.4.sock");'
Тест Nodejs:
var mysql = require('mysql')
var con = mysql.createConnection({
socketPath: "/tmp/build-mariadb-server-10.4.sock",
user: "dan",
password: "yourpassword",
database: "catalog/test",
})
con.connect(function(err) {
if (err) throw err;
console.log("Connected!");
})
(необходимо проработать несколько других соединителей, чтобы убедиться в их надлежащей поддержке в этом формате).
Ссылка: https://mariadb.com/kb/en/connection/#handshake-response-packet
Миграция существующего режима MariaDB (оригинальный) к новой структуре каталогов
Так как у хостинг-услуг есть схема именования от user/schema к имени базы данных в MariaDB, для миграции к новой структуре каталогов потребуются следующие шаги:
- Используйте mariadb-dump для создания дампа исходных данных
- На новом сервере выполните:
- mariadb-install-db –catalogs=’catalog_name’
- mariadb –catalog catalog_name < dump_file
Это необходимо, так как InnoDB должен знать местоположение новых файлов.
Миграция одного пользователя каталога на другой сервер MariaDB
Создайте набор инструментов/процедуру миграции, которая выполняет следующие действия:
- Выполните FLUSH TABLES FOR EXPORT для всех таблиц в каталоге.
- Сделайте копию каталога.
- Скопируйте данные в новый каталог каталога на новый сервер.
- Выполните ALTER TABLE ... IMPORT TABLESPACE для каждой таблицы InnoDB.
Обратите внимание, что для разграниченных таблиц процесс будет немного сложнее, см. ссылку выше.
Эта процедура будет немного проще после вносимого изменения в InnoDB, связанного с IMPORT, которое будет запушено. (Должно произойти до начала работы над проектом каталога)
Другие вещи
- По умолчанию Drizzle назывался «local». По умолчанию в MariaDB будет «def», так как это уже значение по умолчанию для каталога в information_schema, в текущих соединителях и других местах.
- Движку CONNECT потребуются тесты на каталоги и, возможно, небольшое изменение кода для поддержки каталогов. Он также может быть способом соединения из одного каталога в другой.
См. также
- MDEV-31542 Добавить многопользовательские каталоги в MariaDB
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/catalogs-overview/