О FederatedX
Двигатель хранения FederatedX — это вилка движка хранения Federated MySQL, который больше не развивается компанией Oracle. Первоначальная цель FederatedX — продолжать развитие этого движка хранения, добавляя новые функции и исправляя старые ошибки.
С MariaDB 10.0, движок хранения CONNECT также позволяет получить доступ к удалённой базе данных через подключение MySQL или ODBC (типы таблиц: MYSQL, ODBC). Однако в текущей реализации существует несколько ограничений.
Что такое движок хранения FederatedX?
Движок хранения FederatedX работает как с MariaDB, так и с MySQL. В то время как другие движки хранения построены как интерфейсы к хранилищам данных на основе файлов, FederatedX использует libmysql для связи с источником данных, являющимся удалённой СУБД. В настоящее время, так как FederatedX использует только libmysql, он может взаимодействовать только с другой СУБД MySQL. Планируется, конечно, возможность использования других систем СУБД в качестве источника данных. Существует существующий проект Federated ODBC, который смог использовать PostgreSQL в качестве удалённого источника данных, и именно такая функциональность будет добавлена в FederatedX в последующих версиях.
История
История FederatedX основана на истории Federated. Компании Cisco потребовался движок хранения MySQL, который позволил бы им объединить удалённые таблицы на каком-либо маршрутизирующем устройстве, позволяя взаимодействовать с этими удалёнными таблицами так, как будто они находятся локально на устройстве, но фактически не на нём, так как маршрутизирующее устройство имело ограниченное пространство для хранения. Первый прототип движка хранения Federated был разработан JD (нужно проверить это - Brian Aker может подтвердить) с использованием интерфейса HANDLER. Brian передал код Patrick Galbraith и объяснил, как он должен работать, и благодаря руководству Brian и Monty, Patrick разработал работающий движок хранения Federated с MySQL 5.0. В конечном итоге Federated был выпущен в открытый доступ в релизе MySQL 5.0.
Когда MySQL 5.1 стал производственным релизом MySQL, в Federated были добавлены новые функции и усовершенствования, а именно:
- Добавлен новый сервер Federated в парсер. Это было необходимо Cisco, что позволило изменить параметры подключения для нескольких таблиц Federated одновременно без необходимости изменения или повторного создания таблиц Federated.
- Основная поддержка транзакций для поддержки удалённых транзакционных таблиц
- Различные исправления ошибок, возникшие в MySQL 5.0
- Возможность плагинов
В MariaDB 10.0.2 FederatedX получил поддержку вспомогательного обнаружения таблиц.
Установка плагина
Несмотря на то, что общая библиотека плагина по умолчанию распространяется с MariaDB, сам плагин по умолчанию не устанавливается MariaDB. Существует два метода установки плагина с MariaDB.
Первый метод можно использовать для установки плагина без перезапуска сервера. Вы можете установить плагин динамически, выполнив INSTALL SONAME или INSTALL PLUGIN. Например:
INSTALL SONAME 'ha_federatedx';
Второй метод можно использовать для указания серверу загрузить плагин при запуске. Плагин можно установить таким образом, указав --plugin-load или --plugin-load-add опции. Это можно указать в качестве аргумента командной строки для mysqld или в соответствующей группе параметров сервера в файле параметров группы параметров в файле параметров. Например:
[mariadb] ... plugin_load_add = ha_federatedx
Удаление плагина
Вы можете удалить плагин динамически, выполнив UNINSTALL SONAME или UNINSTALL PLUGIN. Например:
UNINSTALL SONAME 'ha_federatedx';
Если вы установили плагин, указав --plugin-load или --plugin-load-add опции в соответствующей группе параметров сервера в файле параметров группы параметров в файле параметров, то эти опции должны быть удалены, чтобы предотвратить загрузку плагина при следующем перезапуске сервера.
Как работает FederatedX
Каждый движок хранения должен реализовывать производные стандартные методы API обработчика, чтобы он работал. FederatedX ничем не отличается в этом отношении. Основное отличие заключается в том, что FederatedX должен реализовывать эти методы обработчика таким образом, чтобы строить SQL-запросы для выполнения на удалённом сервере, и если есть набор результатов, обрабатывать этот набор результатов в внутренний формат обработчика, чтобы результат был возвращён пользователю.
Внутренняя работа FederatedX
Нормальные файлы базы данных являются локальными и, следовательно: Вы создаёте таблицу под названием 'users', создаётся файл, например, 'users.MYD'. Обработчик считывает, вставляет, удаляет, обновляет данные в этом файле. Данные хранятся в определённом формате, поэтому для чтения данные должны быть распарсены в поля, для записи поля должны быть сохранены в этом формате, чтобы записать в этот файл данных.
С движком хранения FederatedX не будет локальных файлов для данных каждой таблицы (например, .MYD). Данные, которые обычно хранились бы в этом файле, будут храниться в внешней базе данных. Это потребует использования API клиента MySQL для чтения, удаления, обновления, вставки этих данных. Данные необходимо будет получить с помощью SQL-запроса "SELECT * FROM users
". Затем, для чтения этих данных, необходимо будет извлечь их с помощью mysql_fetch_row
по одной строке за раз, а затем преобразовать из столбца в этом запросе в формат, ожидаемый обработчиком.
Основная функциональность работы FederatedX:
- Пользователь вводит SQL-запрос к локальной таблице FederatedX. Этот запрос парсится в дерево элементов
- FederatedX использует API обработчика mysql для реализации различных методов, необходимых для движка хранения. Он имеет доступ к дереву элементов для SQL-запроса, выпущенного, а также к объекту таблицы и каждому из его членов поля. В
- Используя эту информацию, FederatedX строит SQL-запрос
- Сформированный SQL-запрос отправляется в удалённый источник данных через libmysql с помощью API клиента mysql
- Удалённая база данных обрабатывает SQL-запрос и возвращает результат обратно через API клиента mysql в исходное место
- Если исходный SQL-запрос возвращает набор результатов из удалённого источника данных, движок хранения FederatedX итерируется по набору результатов и преобразует каждую строку и столбец во внутренний формат обработчика
- Если исходный SQL-запрос возвращает только количество возвращённых строк (affected_rows), это число добавляется в статистику таблицы, что приводит к отображению пользователю количества затронутых строк.
Создание таблиц FederatedX
Создание таблицы просто создаст файл .frm, и в SQL-запросе CREATE TABLE
должен быть один из следующих:
connection=scheme://username:password@hostname:port/database/tablename connection=scheme://username@hostname/database/tablename connection=scheme://username:password@hostname/database/tablename connection=scheme://username:password@hostname/database/tablename
Или используя синтаксис, введённый в MySQL версии 5.1 для сервера Federated (Спецификация SQL/MED xxxx)
connection="connection_one" connection="connection_one/table_foo"
Пример строки подключения, указывающей все параметры подключения:
connection=mysql://username:password@hostname:port/database/tablename
Или, используя сервер Federated, сначала создаётся сервер:
create server 'server_one' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db1', USER 'root', PASSWORD '', PORT 3306, SOCKET '', OWNER 'root');
Затем таблица FederatedX создаётся, указывая недавно созданный сервер Federated:
CREATE TABLE federatedx.t1 ( `id` int(20) NOT NULL, `name` varchar(64) NOT NULL default '' ) ENGINE="FEDERATED" DEFAULT CHARSET=latin1 CONNECTION='server_one';
(Обратите внимание, что в MariaDB оригинальный движок хранения Federated заменяется новым движком хранения FederatedX. А для обратной совместимости старое имя "FEDERATED" используется в операторе create table. Так что в MariaDB тип движка должен быть указан как "FEDERATED" без дополнительного "X", а не "FEDERATEDX").
Эквивалент вышеизложенного, если указаны все параметры подключения
CONNECTION="mysql://root@127.0.0.1:3306/db1/t1"
Вы также можете изменить сервер, чтобы он указывал на новую схему:
ALTER SERVER 'server_one' options(DATABASE 'db2');
Все последующие вызовы любой таблицы FederatedX, использующие 'server_one', теперь будут обращаться к db2.t1! Представьте себе? Вам больше не нужно выполнять alter table, чтобы направить одну или несколько таблиц FederatedX на новый сервер!
Это connection="connection string" необходимо для того, чтобы обработчик смог подключиться к удалённому серверу, либо по URL, либо по имени сервера.
Вызовы методов
Один из способов увидеть, как работает движок хранения FederatedX, — это скомпилировать отладочную версию MariaDB и включить журнал отслеживания. Используя таблицу из двух столбцов с одной записью, следующие SQL-запросы, показанные ниже, можно проанализировать, какие внутренние методы они вызывают.
SELECT
Если запрос, например, "SELECT * FROM foo
", то основные методы, которые вы увидите с включённым отладчиком, будут сначала:
ha_federatedx::info ha_federatedx::scan_time: ha_federatedx::rnd_init: share->select_query SELECT * FROM foo ha_federatedx::extra
Затем для каждой строки данных, полученных из удалённой базы данных в наборе результатов:
ha_federatedx::rnd_next ha_federatedx::convert_row_to_internal_format ha_federatedx::rnd_next
После всех строк данных, которые были получены, вы увидите:
ha_federatedx::rnd_end ha_federatedx::extra ha_federatedx::reset
INSERT
Если запрос был "INSERT INTO foo (id, ts) VALUES (2, now());
", то трассировка будет такой:
ha_federatedx::write_row ha_federatedx::reset
UPDATE
Если запрос был "UPDATE foo SET ts = now() WHERE id = 1;
", то полученная трассировка будет такой:
ha_federatedx::index_init ha_federatedx::index_read ha_federatedx::index_read_idx ha_federatedx::rnd_next ha_federatedx::convert_row_to_internal_format ha_federatedx::update_row ha_federatedx::extra ha_federatedx::extra ha_federatedx::extra ha_federatedx::external_lock ha_federatedx::reset
Возможности и ограничения FederatedX
- ТАБЛИЦЫ ДОЛЖНЫ быть созданы на удалённом сервере до любого действия с этими таблицами через обработчик, первая версия. ВАЖНО: ЕСЛИ ВЫ ДОЛЖНЫ использовать тип движка хранения FederatedX на удалённом конце, убедитесь, что таблица, к которой вы подключаетесь, НЕ ссылается на вашу ИСХОДНУЮ таблицу! Вы знаете и слышали скрип шумового обратного канала? Вы знаете, как два зеркала друг напротив друга создают бесконечное отражение? Ну, разве нужно что-то говорить?
- Обработчик не может определить, изменилась ли удалённая база данных или таблица. Причина в том, что эта база данных должна работать как файл данных, который никогда не будет изменён ничем, кроме самой базы данных. Целостность данных в локальной таблице может быть нарушена, если произойдут какие-либо изменения в удалённой базе данных.
- Поддержка SELECT, INSERT, UPDATE, DELETE индексов.
- Нет ALTER TABLE, DROP TABLE или других вызовов языка определения данных.
- Подготовленные запросы не будут использоваться в первой реализации, пока неясно, поддерживает ли ограниченный подмножество API клиента для сервера эту возможность.
- Используются SELECT, INSERT, UPDATE, DELETE, а не HANDLER.
- Это не будет работать с кэшем запросов.
- FederatedX не поддерживает типы GEOMETRY. Такие таблицы не могут быть явно созданы или обнаружены.
Как использовать FederatedX?
Для использования этого обработчика очень просто. У вас должны быть запущены две базы данных, либо обе на одном хосте, либо на разных.
Сначала в внешней базе данных создайте таблицу, например:
CREATE TABLE test_table ( id int(20) NOT NULL auto_increment, name varchar(32) NOT NULL default '', other int(20) NOT NULL default '0', PRIMARY KEY (id), KEY name (name), KEY other_key (other)) DEFAULT CHARSET=latin1;
Затем на сервере, который будет подключаться к внешнему хосту (клиент), создайте федеративную таблицу без указания структуры таблицы:
CREATE TABLE test_table ENGINE=FEDERATED CONNECTION='mysql://root@127.0.0.1:9306/federatedx/test_federatedx';
Обратите внимание на поля «ENGINE» и «CONNECTION»? Здесь вы соответственно задаёте тип движка, «FEDERATED», и информацию о внешнем хосте, являющуюся базой данных, к которой база данных «клиента» будет подключаться и использовать в качестве «файла данных». Очевидно, что внешняя база данных запущена на порту 9306, поэтому вы должны запустить другую базу данных таким образом, чтобы она действительно работала на порту 9306, а база данных FederatedX на порту, отличном от этого. В моей настройке я использую порт 5554 для FederatedX и порт 5555 для внешней базы данных.
В качестве альтернативы (или если вы используете MariaDB версии ниже 10.0.2) вы можете явно указать структуру федеративной таблицы:
CREATE TABLE test_table ( id int(20) NOT NULL auto_increment, name varchar(32) NOT NULL default '', other int(20) NOT NULL default '0', PRIMARY KEY (id), KEY name (name), KEY other_key (other)) ENGINE=FEDERATED DEFAULT CHARSET=latin1 CONNECTION='mysql://root@127.0.0.1:9306/federatedx/test_federatedx';
В этом случае структура таблицы должна точно соответствовать структуре таблицы на внешнем сервере.
Как увидеть работу хранилища
При разработке этого обработчика я скомпилировал базу данных FederatedX с отладкой:
./configure --with-federatedx-storage-engine \ --prefix=/home/mysql/mysql-build/federatedx/ --with-debug
После компиляции я выполнил команду 'make install' (не для установки двоичного файла, а для установки всех файлов, ожидаемых двоичным файлом в каталоге, указанном мной при сборке с
--prefix=/home/code-dev/maria
Затем я запустил внешний сервер:
/usr/local/mysql/bin/mysqld_safe \ --user=mysql --log=/tmp/mysqld.5555.log -P 5555
Затем я вернулся в каталог, содержащий только что скомпилированный mysqld <builddir>/sql/, запустил gdb:
gdb ./mysqld
Затем в командной строке (gdb):
(gdb) run --gdb --port=5554 --socket=/tmp/mysqld.5554 --skip-innodb --debug
Далее, я открываю несколько окон для каждого:
- Отслеживание отладочного трассировки: tail -f /tmp/mysqld.trace|grep ha_fed
- Отслеживание SQL-запросов к внешней базе данных: tail -f /tmp/mysqld.5555.log
- Окно с открытым клиентом на сервере federatedx по порту 5554
- Окно с открытым клиентом на сервере federatedx по порту 5555
Я создал таблицу на клиенте, подключенном к внешнему серверу на порту 5555, а затем к серверу FederatedX на порту 5554. В этот момент я запускаю любые необходимые запросы на сервере FederatedX, всегда помня, что любые изменения, которые я хотел внести в таблицу, или если я создавал новые таблицы, я должен был сделать это на внешнем сервере.
Еще одна вещь, на которую нужно обратить внимание, это «show variables», чтобы увидеть, что у вас есть поддержка поддержки обработчика FederatedX:
show variables like '%federat%'
и:
show storage engines;
Оба должны отображать обработчик хранилища federatedx.
Как создать федеративный сервер?
Федеративный сервер — это способ определения внешнего источника данных — со всеми параметрами подключения — так что вам не придётся явно указывать параметры подключения в строке.
Например, если вы хотели создать таблицу t1, вы бы указали
connection="mysql://patg@192.168.1.123/first_db/t1"
Вместо этого вы можете создать её с помощью сервера:
create server 'server_one' foreign data wrapper 'mysql' options (HOST '192.168.1.123', DATABASE 'first_db', USER 'patg', PASSWORD '', PORT 3306, SOCKET '', OWNER 'root');
Теперь вы можете указать сервер вместо полной строки подключения URL
connect="server_one"
Чем FederatedX отличается от старого федеративного движка?
FederatedX с точки зрения пользователя в основном одинаков. Что отличается в FederatedX и Federated:
- Переработка основного кода Federated из одного файла ha_federated.cc в три основные абстрагированные компонента:
- ha_federatedx.cc - Основная реализация FederatedX
- federated_io.cc - Базовый класс подключения, который необходимо переопределить для каждого RDBMS/библиотеки клиента
- federatated_io_<driver>.cc - производный класс federated_io для данного RDBMS
- federated_txn.cc - Новая поддержка использования транзакционных движков на внешнем сервере с использованием опроса подключения
- Исправлено множество ошибок (нужно изучить открытые ошибки для Federated)
Где получить FederatedX?
FederatedX является частью MariaDB 5.1 и более поздних версий. MariaDB объединила последнюю версию FederatedX при необходимости исправить ошибку. Вы можете получить последний код/следовать/участвовать в проекте на странице домашней странице FederatedX.
Какие планы на FederatedX?
- Поддержка других поставщиков RDBMS с использованием ODBC
- Поддержка условий pushdown
- Возможность ограничивать размеры наборов результатов
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/about-federatedx/