Helpex - Trao đổi & giúp đỡ Đăng nhập

Sử dụng cho MariaDB và Spider Storage Engine

Spider là một công cụ lưu trữ cho Nền tảng MariaDB cho phép bạn xây dựng cơ sở dữ liệu phân tán từ thiết lập MariaDB tiêu chuẩn. Công nghệ này không phức tạp, mặc dù cách thực hiện. Blog này sẽ giải thích cách hoạt động của công cụ lưu trữ Spider, công dụng của nó và cũng sẽ chỉ ra một số trường hợp sử dụng.

Công cụ lưu trữ MariaDB

Trước khi chúng ta xem xét động cơ lưu trữ Spider, chúng ta hãy xem nhanh khái niệm động cơ lưu trữ. Công cụ lưu trữ là việc triển khai mã quản lý mức độ truy cập dữ liệu thấp trong MariaDB. Công cụ lưu trữ xử lý những thứ như đọc và ghi dữ liệu, khóa cấp độ hàng, nếu được hỗ trợ, quản lý đa phiên bản và giao dịch, trong số những thứ khác.

Các công cụ lưu trữ được định nghĩa trên cơ sở từng bảng và một khi một bảng được tạo và xác định để sử dụng một công cụ lưu trữ cụ thể (sử dụng   ENGINE thuộc tính Table), nó thường sẽ được xử lý giống như bất kỳ bảng nào khác. Các bảng sử dụng các công cụ khác nhau, sau khi được tạo, được xử lý như nhau và có thể được kết hợp, có dữ liệu được chọn từ một thành khác, v.v. Các bảng cũng có thể có công cụ lưu trữ thay đổi sau khi bảng được tạo.

Bạn cũng có thể tận hưởng: Trạng thái của Công cụ Lưu trữ

Nhện từ cấp độ cao

Những gì Spider cung cấp, đầu tiên và quan trọng nhất, là một cách để truy cập một bảng trên một Máy chủ MariaDB từ một Máy chủ MariaDB khác. Máy chủ MariaDB chứa dữ liệu bảng thực tế không có bất kỳ mã Spider cụ thể nào trên đó; nó là một Máy chủ MariaDB bình thường. Máy chủ MariaDB được cấu hình để truy cập dữ liệu đó sau đó sử dụng công cụ lưu trữ Spider để truy cập dữ liệu trên máy chủ khác bằng giao thức MariaDB thông thường.

Sử dụng cho MariaDB và Spider Storage Engine

Có thể thấy, Spider chỉ hoạt động trên nút tham chiếu; nút đích không cần phải cài đặt Spider trên đó. Tạo một "bảng nhện" có nghĩa là chúng tôi xác định một bảng có chứa cùng một hoặc một tập hợp con của các cột trong bảng đích và tham chiếu đến máy chủ đích.

Ngoài ra, lưu ý rằng không có dữ liệu cho các bảng này trên "nút nhện" và không có dữ liệu trùng lặp, tất cả dữ liệu đều nằm trên nút đích.

Cài đặt Công cụ lưu trữ Spider

Spider được bao gồm trong Máy chủ MariaDB và cũng có một tập lệnh cài đặt cài đặt công cụ Spider và cũng có một số tiện ích đang hỗ trợ các đối tượng và bạn nên cài đặt spider bằng cách sử dụng tập lệnh này. Nếu bạn đã cài đặt MariaDB dưới dạng RPM, tập lệnh cài đặt spider này nằm trong / usr / share / mysql và được gọi là install_spider.sql. Để chạy nó, hãy sử dụng công cụ dòng lệnh MariaDB MySQL và sử dụng lệnh nguồn, như thế này.

$ mysql -u root
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2835
Server version: 10.4.6-MariaDB-log MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB> source /usr/share/mysql/install_spider.sql

Sau khi chạy tập lệnh, hãy kiểm tra xem Spider đã được cài đặt chưa bằng   SHOW ENGINES lệnh:

MariaDB> SHOW ENGINES;
+--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+
| SPIDER | YES | Spider storage engine | YES | YES | NO |
| MRG_MyISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| Aria | YES | Crash-safe tables with MyISAM heritage. Used for internal temporary tables and privilege tables | NO | NO | NO |
| MyISAM | YES | Non-transactional engine with good performance and small data footprint | NO | NO | NO |
| SEQUENCE | YES | Generated tables filled with sequential values | YES | NO | YES |
| InnoDB | DEFAULT | Supports transactions, row-level locking, foreign keys and encryption for tables | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| CSV | YES | Stores tables as CSV files | NO | NO | NO |
+--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.001 sec)

Bây giờ chúng tôi đã sẵn sàng để bắt đầu sử dụng động cơ Spider.

Liên kết bảng đơn với Spider

Hãy xem một ví dụ, một ví dụ rất cơ bản. Trên máy chủ "đích", chúng tôi tạo một bảng. Lưu ý rằng trên máy chủ này, Spider không cần thiết; điều này chỉ được yêu cầu trên máy chủ truy cập dữ liệu từ xa và chúng ta sẽ làm điều đó tiếp theo. Vì vậy, bây giờ chúng ta tạo một bảng trên máy chủ "đích", hãy gọi đó là "Máy chủ 2:"

$ mysql -u root -S /tmp/mariadb2.sock -u root
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 10.4.8-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE spidertest;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> use spidertest;
Database changed
MariaDB [spidertest]> CREATE TABLE customer(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(200) NOT NULL,
address VARCHAR(255) NOT NULL);
Query OK, 0 rows affected (0.539 sec)

Sau đây, hãy chèn một số dữ liệu vào bảng này:

MariaDB [spidertest]> INSERT INTO customer VALUES(NULL, 'John Doe', '1 Main Street');
Query OK, 1 row affected (0.309 sec)

MariaDB [spidertest]> INSERT INTO customer VALUES(NULL, 'Bob Smith', '45 Elm Street');
Query OK, 1 row affected (0.092 sec)

MariaDB [spidertest]> INSERT INTO customer VALUES(NULL, 'Jane Jones',
'18 Second Street');
Query OK, 1 row affected (0.094 sec)

Tôi thừa nhận rằng đây không phải là thí nghiệm thú vị nhất kể từ khi Marie Curie phát minh ra radium, nhưng chúng tôi vẫn chưa hoàn thành. Những gì chúng ta sẽ làm bây giờ là truy cập bảng này từ một phiên bản khác của Máy chủ MariaDB. Khi Spider kết nối với máy chủ từ xa như một người dùng bình thường, chúng tôi cần tạo một người dùng và cấp cho nó một số quyền truy cập vào bảng mà chúng tôi đã tạo ở trên, trên cùng một phiên bản Máy chủ MariaDB như trên:

MariaDB [spidertest]> CREATE USER 'spider'@'192.168.0.11' IDENTIFIED BY 'spider';
Query OK, 0 rows affected (0.236 sec)

MariaDB [spidertest]> GRANT ALL ON spidertest.* TO 'spider'@'192.168.0.11';
Query OK, 0 rows affected (0.238 sec)

MariaDB [spidertest]> GRANT ALL ON mysql.* TO 'spider'@'192.168.0.11';
Query OK, 0 rows affected (0.238 sec)

Bước tiếp theo là tạo một   SERVER . Nếu bạn chưa sử dụng Spider, có thể bạn đã không sử dụng lệnh trước đó, nhưng những gì nó làm được là nó xác định các tham số được sử dụng để kết nối với một phiên bản Máy chủ MariaDB khác, vì vậy máy chủ được xác định trên phiên bản Máy chủ MariaDB đó là truy cập vào bảng chúng tôi tạo ở trên (hãy gọi đó là Server1).

r$ mysql -u root -S /tmp/mariadb1.sock -u root
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 12
Server version: 10.4.8-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [none]> CREATE SERVER Server2 FOREIGN DATA WRAPPER mysql
OPTIONS(HOST '192.168.0.11', DATABASE 'spidertest', PORT 10482,
USER 'spider', PASSWORD 'spider');
Query OK, 0 rows affected (0.233 sec)

Với điều này, hãy tạo một liên kết bằng Spider từ Server1 đến Server2. Lưu ý rằng chúng ta không phải sử dụng tất cả các trường trong bảng đích.

$ mysql -u root -S /tmp/mariadb1.sock -u root
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 33
Server version: 10.4.8-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> DROP DATABASE IF EXISTS spidertest;
Query OK, 0 rows affected, 1 warning (0.000 sec)

MariaDB [(none)]> CREATE DATABASE spidertest;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> use spidertest;
Database changed
MariaDB [spidertest]> CREATE TABLE customer(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(200) NOT NULL) ENGINE=Spider
COMMENT = 'wrapper "mysql", srv "Server2"';
Query OK, 0 rows affected (0.132 sec)

OK, không có lỗi, sau đó thử nó bằng cách nhập   SELECTmột số dữ liệu:

MariaDB [spidertest]> SELECT * FROM customer;
+----+------------+
| id | name |
+----+------------+
| 1 | John Doe |
| 2 | Bob Smith |
| 3 | Jane Jones |
+----+------------+
3 rows in set (0.006 sec)

Có, điều này có vẻ hiệu quả. Marie Curie vẫn đánh bại chúng tôi trong bộ phận phấn khích, nhưng chúng tôi đang đạt được điều đó.

Sử dụng cho một liên kết bảng đơn

Có khá nhiều cách sử dụng cho ngay cả một liên kết bảng đơn lẻ, chẳng hạn như liên kết được mô tả ở trên. Trong một số trường hợp, nó có thể được sử dụng để thay thế bản sao khi nó chỉ là một bảng duy nhất cần được sao chép. Có thể bạn có một bảng duy nhất được duy trì trong một phiên bản cơ sở dữ liệu chẳng hạn như bảng khách hàng hoặc một cái gì đó và sau đó bạn muốn tham chiếu đến ID khách hàng từ một ứng dụng hoàn toàn khác đang chạy trong một số phiên bản Máy chủ MariaDB khác.

Người ta cần hiểu rằng có những hạn chế đối với kiểu thiết lập này; ví dụ, hiệu suất có thể là một vấn đề, bởi vì đối với mỗi câu lệnh sử dụng bảng nhện, một kết nối được thực hiện với máy chủ được kết nối. Một phép nối giữa bảng cục bộ và bảng Spider cũng có thể chậm, nhưng điều đó phụ thuộc vào một số điều. Nói chung, Spider là khá performant và không phải là một nút cổ chai cho mỗi gia nhập và có khá nhiều điều chỉnh càng tốt.

Tùy chọn thứ ba là khi chúng ta có một bảng, ví dụ như bảng nhật ký, mà tôi không muốn trộn lẫn với bất kỳ bảng nào khác. Sau đó, một bảng Spider có thể là một cách để đạt được điều đó.

Sử dụng Spider cho trạng thái trên nhiều máy chủ

Nếu bạn có một Cụm MariaDB đang chạy, chẳng hạn với một máy chủ chính và một số máy thứ hai, thì có lẽ bạn cần phải xem trạng thái của tất cả các máy chủ trong cụm như một đơn vị. Spider có ích. Ở đây chúng ta sẽ xem xét làm thế nào điều đó có thể được thực hiện. Chúng tôi có hai máy chủ, moe và homer, mà chúng tôi muốn theo dõi. Chúng ta hãy giả định rằng moe là máy chủ "chính" và chúng ta từ hộp đó muốn xem trạng thái chung trên cả hai máy chủ.

Trên homer, chúng tôi tạo một dạng xem   GLOBAL_STATUS dựa trên bảng TRẠNG THÁI TOÀN CẦU   INFORMATION_SCHEMA , nhưng thêm một cột có tên của máy chủ và đặt nó trong cơ sở dữ liệu MySQL.

CREATE OR REPLACE VIEW global_status_homer
AS SElECT 'homer' host, gs.variable_name, gs.variable_value
FROM information_schema.global_status gs;

Và sau đó chúng tôi làm điều tương tự trên moe.


CREATE OR REPLACE VIEW global_status_moe
AS SElECT 'moe' host, gs.variable_name, gs.variable_value
FROM information_schema.global_status gs;

Bước tiếp theo là tạo một liên kết từ cái mà chúng ta coi là cái chính (moe) đến máy chủ khác (homer). Vì vậy, trên moe, chúng tôi thực hiện lệnh này:

CREATE OR REPLACE SERVER homer FOREIGN DATA WRAPPER mysql
OPTIONS(HOST '192.168.0.11', DATABASE 'mysql', PORT 10482, USER 'spider',
PASSWORD 'spider');

Với điều này, chúng tôi đã sẵn sàng tạo một chế độ xem trên moe để xem trạng thái trên homer.

CREATE OR REPLACE TABLE global_status_homer(host varchar(2048), variable_name VARCHAR(64), variable_value VARCHAR(64)) ENGINE=Spider
COMMENT='wrapper "mysql", srv "homer"';

Trên homer, bây giờ chúng ta có một bảng và một chế độ xem, một cho mỗi máy chủ và với lược đồ tương tự, biểu thị trạng thái trên toàn bộ cụm. Hãy kết hợp hai điều này thành một XEM duy nhất.

CREATE OR REPLACE VIEW global_status_all AS
SELECT host, variable_name, variable_value
FROM global_status_homer
UNION
SELECT host, variable_name, variable_value
FROM global_status_moe;

Và sau đó là a   VIEW hiển thị trạng thái tóm tắt trên toàn bộ cụm.

CREATE OR REPLACE VIEW global_status_total AS
SELECT variable_name, SUM(variable_value) sum, MAX(variable_value) max,
MIN(variable_value) min
FROM global_status_all
GROUP BY variable_name;

Bây giờ hãy thử xem nó hoạt động như thế nào:

MariaDB [mysql]> SELECT * FROM global_status_total WHERE variable_name LIKE 'open%';
+--------------------------+------+------+------+
| variable_name | sum | max | min |
+--------------------------+------+------+------+
| OPENED_FILES | 629 | 477 | 152 |
| OPENED_PLUGIN_LIBRARIES | 1 | 1 | 0 |
| OPENED_TABLES | 112 | 75 | 37 |
| OPENED_TABLE_DEFINITIONS | 125 | 95 | 30 |
| OPENED_VIEWS | 85 | 43 | 42 |
| OPEN_FILES | 132 | 76 | 56 |
| OPEN_STREAMS | 0 | 0 | 0 |
| OPEN_TABLES | 77 | 46 | 31 |
| OPEN_TABLE_DEFINITIONS | 83 | 49 | 34 |
+--------------------------+------+------+------+
9 rows in set (0.029 sec)

Tôi nghĩ rằng điều này là hữu ích, mặc dù đây là một ví dụ đơn giản. Với nhiều máy chủ hơn hai máy chủ này, nó sẽ hữu ích hơn rất nhiều.

Kết hợp nhiều bảng máy chủ trong trường hợp chung

Trong ví dụ trên, chúng ta xem xét cách các bảng có cùng cấu trúc với nội dung tương tự có thể được kết hợp thành một dạng xem duy nhất, bằng cách sử dụng Spider. Chúng tôi xem xét một ví dụ cụ thể ở đó, nhưng nói chung, có những cách sử dụng cho việc này. Giả sử bạn có một ứng dụng chạy trong nhiều trường hợp , giả sử một ứng dụng ERP nào đó được nhiều phòng ban sử dụng. Sau đó, nếu bạn muốn thực hiện báo cáo trên các phòng ban từ một máy chủ báo cáo, thì bạn có thể sử dụng mô hình này để truy cập tất cả các phiên bản của ứng dụng này.

Giải pháp thay thế cho việc sử dụng Spider là sử dụng sao chép đa nguồn, nhưng điều đó đòi hỏi nhiều dữ liệu hơn được lưu trữ trong máy chủ báo cáo, vì vậy Spider có một số lợi thế.

Mài với Nhện

Sharding là trường hợp sử dụng phổ biến nhất cho Spider. Các ví dụ tôi mô tả ở trên ít phổ biến hơn, nhưng vẫn hữu ích. Trong các trường hợp trên, tôi đã ánh xạ một bảng trên một máy chủ với một bảng trên một máy khác. Với Spider được sử dụng cho một bảng được phân vùng trên một máy chủ, mỗi phân vùng tồn tại trên một máy chủ riêng biệt. Ngoại trừ điều này, không có nhiều khác biệt trong thực tế, mặc dù trường hợp sử dụng phân vùng cho phép Spider thực hiện một số điều thú vị và Spider có một số thủ thuật nâng cao hiệu suất bổ sung cho trường hợp sử dụng cụ thể này.

Để cho thấy cách hoạt động của sharding với Spider, hãy xem một ví dụ rất đơn giản. Chúng tôi sẽ chỉ ra cách thiết lập sharding chỉ với hai phân đoạn, chỉ để hiển thị nguyên tắc. Hãy để chúng tôi sử dụng bảng khách hàng trong đó chúng tôi có tổng cộng ba máy chủ, hai máy chủ "dữ liệu" với dữ liệu cho hai phân đoạn và một máy chủ hơn là máy chủ "Spider" không chứa dữ liệu thực tế cho bảng chúng tôi đang làm việc, nhưng thay vào đó trỏ đến dữ liệu nằm trên hai máy chủ khác.

Sử dụng cho MariaDB và Spider Storage Engine

Hãy bắt đầu ở phần dưới cùng, đó là tạo các bảng mà chúng ta sẽ sử dụng trong Máy chủ MariaDB Server2 và Server3 (điều này trông giống với bảng khách hàng ở trên, nhưng không chính xác như vậy). Điều này được thực thi trên cả hai Máy chủ này với tư cách là người dùng root

CREATE DATABASE IF NOT EXISTS spidertest;
CREATE TABLE spidertest.customer(
id INT NOT NULL PRIMARY KEY,
name VARCHAR(200) NOT NULL,
address VARCHAR(255) NOT NULL);

Bây giờ chúng tôi đã tạo hai phân đoạn, vì vậy hãy tạo liên kết để chúng tôi có thể truy cập chúng từ MariaDB Server1, vì vậy trên Server1 thực thi câu lệnh SQL này, thay thế cổng, máy chủ, tên người dùng và mật khẩu của tôi bằng một thứ gì đó có liên quan trong trường hợp của bạn.

CREATE OR REPLACE SERVER Server2 FOREIGN DATA WRAPPER mysql
OPTIONS(HOST '192.168.0.11', DATABASE 'spidertest', PORT 10482,
USER 'spider', PASSWORD 'spider');

CREATE OR REPLACE SERVER Server3 FOREIGN DATA WRAPPER mysql
OPTIONS(HOST '192.168.0.11', DATABASE 'spidertest', PORT 10483,
USER 'spider', PASSWORD 'spider');

Sau đó, chúng ta hãy buộc nó lại với một bảng có phân vùng, và lưu ý rằng bạn có thể sử dụng bất kỳ sơ đồ phân vùng hợp lý nào ở đây, tôi chỉ chọn một sơ đồ đơn giản để làm cho điểm.

CREATE TABLE spidertest.customer(id INT NOT NULL PRIMARY KEY,
name VARCHAR(200) NOT NULL,
address VARCHAR(255) NOT NULL) ENGINE=Spider
COMMENT 'wrapper "mysql", table "customer"'
PARTITION BY RANGE(id) (
PARTITION p0 VALUES LESS THAN (1000) COMMENT = 'srv "Server2"',
PARTITION p1 VALUES LESS THAN (2000) COMMENT = 'srv "Server3"');

Giờ đây, trên Server1 chúng ta có thể chèn một số dữ liệu và thấy nó xuất hiện phù hợp trên Server2 và Server3.

INSERT INTO customer VALUES(1, 'Larry', 'Main Street 1');
INSERT INTO customer VALUES(2, 'Ed', 'Main Street 1');
INSERT INTO customer VALUES(3, 'Bob', 'Main Street 1');
INSERT INTO customer VALUES(1001, 'Monty', 'Main Street 1');
INSERT INTO customer VALUES(1002, 'David', 'Main Street 1');
INSERT INTO customer VALUES(1003, 'Allan', 'Main Street 1');

Dựa trên thiết lập phân vùng của chúng tôi, ba hàng đầu tiên chuyển đến Server2 và ba hàng cuối cùng đến Server3. Tôi muốn chỉ ra trước khi kết thúc phần này rằng các phân đoạn riêng lẻ, vì chúng là các phiên bản MariaDB phổ biến, không có công cụ Spider, vì vậy chúng có thể được truy cập phân đoạn bằng phân đoạn bằng cách kết nối, trong trường hợp này là Server2 hoặc Server3.

Sử dụng để mài với Spider

Ưu điểm rõ ràng nhất của sharding là tăng hiệu suất khi làm việc với các tập dữ liệu lớn. Nhưng với Spider có những lợi thế khác, hầu hết đến từ thực tế rằng các phân đoạn riêng lẻ là Máy chủ MariaDB đơn giản có thể được truy cập riêng lẻ, vì vậy tập dữ liệu có thể được xem xét từng phân đoạn mà không có bất kỳ nút thắt hiệu suất nào hoặc bạn có thể xem nó như toàn bộ, sử dụng Spider, cùng một lúc.

Phần kết luận

Blog này đã trình bày một số cách sử dụng cho Spider Storage Engine, tất cả đều hữu ích theo cách riêng của chúng. Hầu hết các tài liệu xung quanh Spider đều tập trung vào trường hợp sử dụng sharding , vì vậy hai cách sử dụng đầu tiên có thể gây ngạc nhiên cho một số người.

Chúc mừng SQL'ing
/ Karlsson

Đọc thêm

Giải thích về độ sắc nét cơ sở dữ liệu bằng tiếng Anh thuần túy

Truyền dữ liệu với MariaDB

12 hữu ích 0 bình luận 12k xem chia sẻ

Có thể bạn quan tâm

loading