Spider — это механизм хранения для платформы MariaDB, который позволяет создавать распределенные базы данных из стандартной установки MariaDB. Технология не сложная, хотя реализация есть. Этот блог расскажет, как работает механизм хранения Spider, что он делает, а также покажет некоторые варианты использования.
Двигатели хранения MariaDB
Прежде чем мы рассмотрим механизм хранения Spider, давайте кратко рассмотрим концепцию механизма хранения. Механизм хранения — это реализация кода, который управляет низким уровнем доступа к данным в MariaDB. Механизм хранения обрабатывает такие вещи, как чтение и запись данных, блокировку на уровне строк, если поддерживается, мульти-управление версиями и управление транзакциями, среди прочего.
Механизмы хранения определяются для ENGINE
каждой таблицы отдельно, и после того, как таблица создана и определена для использования определенного механизма хранения (с использованием атрибута Table), она, как правило, обрабатывается так же, как и любые другие таблицы. Таблицы, использующие разные механизмы, после их создания обрабатываются как равные, и их можно объединять, выбирать данные из одной в другую и т. Д. В таблицах также может быть изменен механизм хранения после создания таблицы.
Вы также можете наслаждаться: Состояние механизма хранения
Паук с высокого уровня
В первую очередь Spider предоставляет способ доступа к таблице на одном сервере MariaDB с другого сервера MariaDB. На сервере MariaDB, который содержит фактические данные таблицы, вообще нет никакого специального кода Spider; это обычный сервер MariaDB. Сервер MariaDB, настроенный для доступа к этим данным, затем использует механизм хранения Spider для доступа к данным на другом сервере, используя обычный протокол MariaDB.
Как видно, Spider активен только на ссылающемся узле; на целевом узле не нужно устанавливать Spider. Создание «таблицы пауков» означает, что мы определяем таблицу, которая содержит те же столбцы в целевой таблице или подмножество столбцов и ссылается на целевой сервер.
Также обратите внимание, что для этих таблиц нет данных на «узле паука» и нет дублирования данных, все данные находятся на целевом узле.
Установка Spider Storage Engine
Spider включен в MariaDB Server, а также есть сценарий установки, который устанавливает движок Spider, а также некоторые утилиты поддерживают объекты, и рекомендуется устанавливать spider с помощью этого сценария. Если вы установили MariaDB в качестве RPM, этот скрипт установки паука находится в / usr / share / mysql и называется install_spider.sql. Для его запуска используйте инструмент командной строки MariaDB MySQL и используйте команду source, например:
Оболочка
1
$ mysql -u root
2
Welcome to the MariaDB monitor. Commands end with ; or \g.
3
Your MariaDB connection id is 2835
4
Server version: 10.4.6-MariaDB-log MariaDB Server
5
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
7
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
9
MariaDB> source /usr/share/mysql/install_spider.sql
После запуска скрипта проверьте, установлен ли Spider с помощью SHOW ENGINES
команды:
Оболочка
xxxxxxxxxx
1
MariaDB> SHOW ENGINES;
2
+--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+
3
| Engine | Support | Comment | Transactions | XA | Savepoints |
4
+--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+
5
| SPIDER | YES | Spider storage engine | YES | YES | NO |
6
| MRG_MyISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
7
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
8
| Aria | YES | Crash-safe tables with MyISAM heritage. Used for internal temporary tables and privilege tables | NO | NO | NO |
9
| MyISAM | YES | Non-transactional engine with good performance and small data footprint | NO | NO | NO |
10
| SEQUENCE | YES | Generated tables filled with sequential values | YES | NO | YES |
11
| InnoDB | DEFAULT | Supports transactions, row-level locking, foreign keys and encryption for tables | YES | YES | YES |
12
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
13
| CSV | YES | Stores tables as CSV files | NO | NO | NO |
14
+--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+
15
9 rows in set (0.001 sec)
Теперь мы готовы начать использовать движок Spider.
Ссылка на одну таблицу с пауком
Давайте посмотрим на пример, очень простой. На «целевом» сервере мы создаем таблицу. Обратите внимание, что на этом сервере Spider не нужен; это требуется только на сервере, который обращается к удаленным данным, и мы перейдем к этому дальше. Итак, теперь мы создаем таблицу на «целевом» сервере, давайте назовем это «Сервер 2:»
Оболочка
xxxxxxxxxx
1
$ mysql -u root -S /tmp/mariadb2.sock -u root
2
Welcome to the MariaDB monitor. Commands end with ; or \g.
3
Your MariaDB connection id is 11
4
Server version: 10.4.8-MariaDB MariaDB Server
5
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
7
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
9
MariaDB [(none)]> CREATE DATABASE spidertest;
11
Query OK, 1 row affected (0.001 sec)
12
MariaDB [(none)]> use spidertest;
14
Database changed
15
MariaDB [spidertest]> CREATE TABLE customer(
16
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
17
name VARCHAR(200) NOT NULL,
18
address VARCHAR(255) NOT NULL);
19
Query OK, 0 rows affected (0.539 sec)
После этого давайте вставим некоторые данные в эту таблицу:
MySQL
xxxxxxxxxx
1
MariaDB [spidertest]> INSERT INTO customer VALUES(NULL, 'John Doe', '1 Main Street');
2
Query OK, 1 row affected (0.309 sec)
3
MariaDB [spidertest]> INSERT INTO customer VALUES(NULL, 'Bob Smith', '45 Elm Street');
5
Query OK, 1 row affected (0.092 sec)
6
MariaDB [spidertest]> INSERT INTO customer VALUES(NULL, 'Jane Jones',
8
'18 Second Street');
9
Query OK, 1 row affected (0.094 sec)
Я признаю, что это был не самый захватывающий эксперимент с тех пор, как Мария Кюри изобрела радий, но мы еще не закончили. Теперь мы собираемся получить доступ к этой таблице из другого экземпляра сервера MariaDB. Поскольку Spider подключается к удаленному серверу как обычный пользователь, нам нужно создать пользователя и предоставить ему некоторый доступ к таблице, которую мы создали выше, на том же экземпляре сервера MariaDB, что и выше:
MySQL
xxxxxxxxxx
1
MariaDB [spidertest]> CREATE USER 'spider'@'192.168.0.11' IDENTIFIED BY 'spider';
2
Query OK, 0 rows affected (0.236 sec)
3
MariaDB [spidertest]> GRANT ALL ON spidertest.* TO 'spider'@'192.168.0.11';
5
Query OK, 0 rows affected (0.238 sec)
6
MariaDB [spidertest]> GRANT ALL ON mysql.* TO 'spider'@'192.168.0.11';
8
Query OK, 0 rows affected (0.238 sec)
Следующим шагом является создание SERVER
. Если вы не использовали Spider, вы, вероятно, не использовали команду раньше, но она определяет параметры, которые используются для подключения к другому экземпляру сервера MariaDB, поэтому сервер определяется на экземпляре сервера MariaDB, который должен получить доступ к таблице, которую мы создали выше (давайте назовем это Server1).
Оболочка
xxxxxxxxxx
1
r$ mysql -u root -S /tmp/mariadb1.sock -u root
2
Welcome to the MariaDB monitor. Commands end with ; or \g.
3
Your MariaDB connection id is 12
4
Server version: 10.4.8-MariaDB MariaDB Server
5
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
7
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
9
MariaDB [none]> CREATE SERVER Server2 FOREIGN DATA WRAPPER mysql
11
OPTIONS(HOST '192.168.0.11', DATABASE 'spidertest', PORT 10482,
12
USER 'spider', PASSWORD 'spider');
13
Query OK, 0 rows affected (0.233 sec)
Имея это в виду, давайте создадим ссылку, используя Spider от Server1 до Server2. Обратите внимание, что нам не нужно использовать все поля в целевой таблице.
Оболочка
xxxxxxxxxx
1
$ mysql -u root -S /tmp/mariadb1.sock -u root
2
Welcome to the MariaDB monitor. Commands end with ; or \g.
3
Your MariaDB connection id is 33
4
Server version: 10.4.8-MariaDB MariaDB Server
5
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
7
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
9
MariaDB [(none)]> DROP DATABASE IF EXISTS spidertest;
11
Query OK, 0 rows affected, 1 warning (0.000 sec)
12
MariaDB [(none)]> CREATE DATABASE spidertest;
14
Query OK, 1 row affected (0.001 sec)
15
MariaDB [(none)]> use spidertest;
17
Database changed
18
MariaDB [spidertest]> CREATE TABLE customer(
19
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
20
name VARCHAR(200) NOT NULL) ENGINE=Spider
21
COMMENT = 'wrapper "mysql", srv "Server2"';
22
Query OK, 0 rows affected (0.132 sec)
ОК, ошибок нет, попробуйте, SELECT
набрав некоторые данные:
MySQL
xxxxxxxxxx
1
MariaDB [spidertest]> SELECT * FROM customer;
2
+----+------------+
3
| id | name |
4
+----+------------+
5
| 1 | John Doe |
6
| 2 | Bob Smith |
7
| 3 | Jane Jones |
8
+----+------------+
9
3 rows in set (0.006 sec)
Да, это похоже на работу. Тем не менее, Мария Кюри бьет нас в отделе волнений, но мы добираемся туда.
Используется для ссылки на одну таблицу
Существует даже несколько вариантов использования даже одной ссылки на таблицу, такой как описанная выше. В некоторых случаях его можно использовать для замены репликации, когда это просто одна таблица, которая должна быть реплицирована. Может быть, у вас есть одна таблица, которая поддерживается в одном экземпляре базы данных, например, в таблице клиентов или чем-то еще, и вам нужна ссылка на идентификатор клиента из совершенно другого приложения, запущенного в каком-либо другом экземпляре сервера MariaDB.
Нужно понимать, что есть недостатки этого вида настройки; например, производительность может быть проблемой, потому что для каждого оператора, который использует таблицу пауков, устанавливается соединение с подключенным сервером. Соединение между локальной таблицей и таблицей Spider также может быть медленным, но это зависит от нескольких вещей. В целом, Spider довольно производительный и не является узким местом как таковым, и возможна небольшая настройка.
Третий вариант - когда у нас есть одна таблица, например таблица журнала, которую я не хочу смешивать ни с какими другими таблицами. Тогда таблица Spider может быть способом достижения этого.
Использование Spider для статуса на нескольких серверах
Если у вас работает кластер MariaDB, например, с первичным и несколькими вторичными серверами, то, вероятно, необходимо рассматривать состояние всех серверов в кластере как одно целое. Паук пригодится. Здесь мы рассмотрим, как это можно сделать. У нас есть два сервера, Мо и Гомер, которые мы хотим контролировать. Давайте предположим, что moe является «главным» сервером, и что мы из этого ящика хотим посмотреть глобальное состояние на обоих серверах.
На Гомере мы создаем GLOBAL_STATUS
представление, основанное на таблице GLOBAL STATUS INFORMATION_SCHEMA
, но добавляем столбец с именем сервера и помещаем его в базу данных MySQL.
MySQL
xxxxxxxxxx
1
CREATE OR REPLACE VIEW global_status_homer
2
AS SElECT 'homer' host, gs.variable_name, gs.variable_value
3
FROM information_schema.global_status gs;
И тогда мы делаем то же самое на Мо.
MySQL
xxxxxxxxxx
1
CREATE OR REPLACE VIEW global_status_moe
3
AS SElECT 'moe' host, gs.variable_name, gs.variable_value
4
FROM information_schema.global_status gs;
Следующим шагом является создание ссылки с того, что мы считаем мастером (moe), на другой сервер (homer). Итак, мы выполняем эту команду:
MySQL
xxxxxxxxxx
1
CREATE OR REPLACE SERVER homer FOREIGN DATA WRAPPER mysql
2
OPTIONS(HOST '192.168.0.11', DATABASE 'mysql', PORT 10482, USER 'spider',
3
PASSWORD 'spider');
При этом мы готовы создать вид на мой для просмотра статуса на Гомере.
MySQL
xxxxxxxxxx
1
CREATE OR REPLACE TABLE global_status_homer(host varchar(2048), variable_name VARCHAR(64), variable_value VARCHAR(64)) ENGINE=Spider
2
COMMENT='wrapper "mysql", srv "homer"';
На Гомере у нас теперь есть одна таблица и одно представление, по одному для каждого сервера и с похожей схемой, которые представляют состояние в кластере. Давайте объединим эти два в один ВИД.
MySQL
xxxxxxxxxx
1
CREATE OR REPLACE VIEW global_status_all AS
2
SELECT host, variable_name, variable_value
3
FROM global_status_homer
4
UNION
5
SELECT host, variable_name, variable_value
6
FROM global_status_moe;
А затем, VIEW
который показывает сводный статус по кластеру.
MySQL
xxxxxxxxxx
1
CREATE OR REPLACE VIEW global_status_total AS
2
SELECT variable_name, SUM(variable_value) sum, MAX(variable_value) max,
3
MIN(variable_value) min
4
FROM global_status_all
5
GROUP BY variable_name;
Давайте сейчас попробуем и посмотрим, как это работает:
MySQL
xxxxxxxxxx
1
MariaDB [mysql]> SELECT * FROM global_status_total WHERE variable_name LIKE 'open%';
2
+--------------------------+------+------+------+
3
| variable_name | sum | max | min |
4
+--------------------------+------+------+------+
5
| OPENED_FILES | 629 | 477 | 152 |
6
| OPENED_PLUGIN_LIBRARIES | 1 | 1 | 0 |
7
| OPENED_TABLES | 112 | 75 | 37 |
8
| OPENED_TABLE_DEFINITIONS | 125 | 95 | 30 |
9
| OPENED_VIEWS | 85 | 43 | 42 |
10
| OPEN_FILES | 132 | 76 | 56 |
11
| OPEN_STREAMS | 0 | 0 | 0 |
12
| OPEN_TABLES | 77 | 46 | 31 |
13
| OPEN_TABLE_DEFINITIONS | 83 | 49 | 34 |
14
+--------------------------+------+------+------+
15
9 rows in set (0.029 sec)
Я думаю, что это полезно, хотя это простой пример. С большим количеством серверов, чем эти два, это намного более полезно.
Объединение нескольких серверных таблиц в общем случае
В приведенном выше примере мы рассмотрим, как таблицы с одинаковой структурой с одинаковым содержимым могут быть объединены в одно представление с помощью Spider. Там мы рассмотрим конкретный пример, но в целом для этого есть применение. Допустим, у вас есть приложение, которое запускается в нескольких экземплярах , скажем, какое-то приложение ERP , которое используется несколькими отделами. Если затем вы хотите создавать отчеты по всем отделам с сервера отчетов, то вы можете использовать эту модель для доступа ко всем экземплярам этого приложения.
Альтернативой использованию Spider является использование репликации из нескольких источников, но для этого требуется гораздо больше данных, которые должны храниться на сервере отчетов, поэтому у Spider есть некоторые преимущества.
Осколок с пауком
Осколок является наиболее распространенным вариантом использования Spider. Примеры, которые я описал выше, менее распространены, но все же полезны. В приведенных выше случаях я сопоставил таблицу на одном сервере с таблицей на другом компьютере. Поскольку Spider используется для многораздельной таблицы на одном сервере, каждый раздел существует на отдельном сервере. За исключением этого, на практике не так много различий, хотя сценарий использования разбиения позволяет Spider делать некоторые интересные вещи, а Spider имеет несколько дополнительных приемов, повышающих производительность, для его конкретного случая использования.
Чтобы показать, как работает шардинг с помощью Spider, давайте покажем очень простой пример. Мы собираемся показать, как настроить шард только с двумя шардами, просто чтобы показать принцип. Давайте воспользуемся таблицей клиентов, где у нас всего три сервера, два сервера «данных» с данными для двух сегментов и один сервер, а не сервер «Паук», который не содержит фактических данных для таблицы, с которой мы работаем, но вместо этого указывает на данные, которые находятся на двух других серверах.
Давайте начнем с нижней части, которая предназначена для создания таблиц, которые мы собираемся использовать в серверах MariaDB Server2 и Server3 (это похоже на приведенную выше таблицу клиентов, но не совсем так). Это выполняется на обоих этих серверах как пользователь root
MySQL
xxxxxxxxxx
1
CREATE DATABASE IF NOT EXISTS spidertest;
2
CREATE TABLE spidertest.customer(
3
id INT NOT NULL PRIMARY KEY,
4
name VARCHAR(200) NOT NULL,
5
address VARCHAR(255) NOT NULL);
6
Теперь у нас есть два созданных сегмента, поэтому давайте создадим ссылки, чтобы мы могли обращаться к ним с MariaDB Server1, чтобы на Server1 выполнить эту инструкцию SQL, заменив мой порт, хост, имя пользователя и пароль на что-то соответствующее в вашем случае.
xxxxxxxxxx
1
CREATE OR REPLACE SERVER Server2 FOREIGN DATA WRAPPER mysql
2
OPTIONS(HOST '192.168.0.11', DATABASE 'spidertest', PORT 10482,
3
USER 'spider', PASSWORD 'spider');
4
CREATE OR REPLACE SERVER Server3 FOREIGN DATA WRAPPER mysql
6
OPTIONS(HOST '192.168.0.11', DATABASE 'spidertest', PORT 10483,
7
USER 'spider', PASSWORD 'spider');
Затем давайте свяжем его с разделенной таблицей и отметим, что вы можете использовать любую разумную схему разбиения здесь, я просто выбрал простую, чтобы подчеркнуть.
MySQL
xxxxxxxxxx
1
CREATE TABLE spidertest.customer(id INT NOT NULL PRIMARY KEY,
2
name VARCHAR(200) NOT NULL,
3
address VARCHAR(255) NOT NULL) ENGINE=Spider
4
COMMENT 'wrapper "mysql", table "customer"'
5
PARTITION BY RANGE(id) (
6
PARTITION p0 VALUES LESS THAN (1000) COMMENT = 'srv "Server2"',
7
PARTITION p1 VALUES LESS THAN (2000) COMMENT = 'srv "Server3"');
Теперь мы можем на сервере Server1 вставить некоторые данные и увидеть, что они отображаются соответствующим образом на сервере Server2 и Server3.
MySQL
xxxxxxxxxx
1
INSERT INTO customer VALUES(1, 'Larry', 'Main Street 1');
2
INSERT INTO customer VALUES(2, 'Ed', 'Main Street 1');
3
INSERT INTO customer VALUES(3, 'Bob', 'Main Street 1');
4
INSERT INTO customer VALUES(1001, 'Monty', 'Main Street 1');
5
INSERT INTO customer VALUES(1002, 'David', 'Main Street 1');
6
INSERT INTO customer VALUES(1003, 'Allan', 'Main Street 1');
Исходя из нашей настройки разбиения, три первые строки переходят на Сервер2, а последние три - на Сервер3. Прежде чем закончить этот раздел, я хотел бы отметить, что отдельные шарды, так как они являются обычными экземплярами MariaDB, без движка Spider, поэтому к ним можно получить доступ через шард, подключившись, в данном случае, к Server2 или Server3.
Использует для шардинга с пауком
Наиболее очевидным преимуществом шардинга является повышение производительности при работе с большими наборами данных. Но у Spider есть и другие преимущества, большинство из которых проистекают из того факта, что отдельные сегменты являются простыми серверами MariaDB, к которым можно обращаться по отдельности, поэтому набор данных можно рассматривать как осколок, без какого-либо узкого места в производительности, или вы можете рассматривать его как в целом, используя Spider, в то же время.
Заключение
В этом блоге представлены некоторые варианты использования Spider Storage Engine, и все они полезны сами по себе. Большая часть документации по Spider сфокусирована на сценарии использования шардинга , поэтому первые два использования могут быть удивительными для некоторых.
Счастливый SQL'ing
/ Карлссон