22/08/2018, 10:47

SolidDB cho MySQL

Peter Gulutzan Solid Information Technology ( www.soliddb.com / www.solidtech.com ) ra đời và hoạt động từ vài năm nay. Tuy không quá nổi bật nhưng công ty này đã trở nên quen thuộc với những người sành sỏi trong thế giới SQL. Gần đây, Solid trở ...

Peter Gulutzan

Solid Information Technology (www.soliddb.com/www.solidtech.com) ra đời và hoạt động từ vài năm nay. Tuy không quá nổi bật nhưng công ty này đã trở nên quen thuộc với những người sành sỏi trong thế giới SQL.

Gần đây, Solid trở thành người phân phối lại của MySQL Enterprise và họ cũng là một bạn hàng của MySQL. Sản phẩm "solidDB for MySQL" của công ty này (từ giờ chỉ gọi là Solid) về mặt kỹ thuật là sự kết hợp server của MySQL (MyISAM) và bộ máy lưu trữ solidDB. Bộ máy lưu trữ thực hiện công việc nâng chuyển nặng (như file IO, tìm kiếm chỉ mục, khôi phục file log,…). Còn server của MySQL có nhiệm vụ lập kế hoạch và các liên hệ (như phân tích cú pháp SQL, tối ưu, file log thông thường,…). Một số bộ máy lưu trữ đáng quan tâm là MyISAM của MySQL, InnoDB của InnoBase Oy và cơ chế mới được công bố gần đây “Falcon” cho MySQL 5.1 (http://dev.MySQL.com/doc/refman/5.1/en/se-falcon.html).

Download

Solid có một số điểm khác cơ bản với bộ máy lưu trữ khác: nó không có trong phân phối MySQL thông thường. Nếu muốn dùng Solid bạn phải download từ forge.MySQL.com hoặc tốt nhất là trên website của công ty: http://dev.soliddb.com/download/. Một mẫu đăng ký được đưa ra khi vào website, nhưng bạn có thể bỏ qua bằng cách kích vào: "No thanks. Go to Downloads". Tại thời điểm viết bài này, thông tin trang web là:

solidmysql-5.0.27.0050 released on December 19, 2006
Windows
Windows binary
Windows source
solidDB for MySQL User Guide for Windows (solidDB cho MySQL User Guide trên
Windows)
Release Notes
Linux 32-bit
Linux 32-bit binary
Linux source
solidDB for MySQL User Guide for Linux (solidDB cho MySQL User Guide trên
Linux)
Release Notes
Linux 64-bit
Linux 64-bit binary
Linux source
solidDB for MySQL User Guide for Linux
Release Notes

Chúng ta có thể hy vọng rằng Solid sẽ nhanh chóng hỗ trợ đầy đủ cho mọi thành phần trên danh sách MySQL Enterprise "Supported Platforms" http://www.MySQL.com/support/supportedplatforms/enterprise.html.

Nhưng người dùng Solaris, HP-UX và Apple có thể sẽ thất vọng một chút.

Lựa chọn bản download Linux 64-bit và chọn nơi đặt là khu vực cá nhân /home/pgulutzan/Desktop, phần download có dạng:

pgulutzan@linux:~/Desktop> cd /home/pgulutzan/Desktop
pgulutzan@linux:~/Desktop> tar zxvf
solidmysql-5.0.27-linux-x86_64-glibc23-0050.tar.gz
...
[list of files]
...
pgulutzan@linux:~/Desktop> 
 cd solidmysql-5.0.27-linux-x86_64-glibc23-0050 
 pgulutzan@linux: 
    ~/Desktop/solidmysql-5.0.27-linux-x86_64-glibc23-0050> 
 su root Password:
linux:/home/pgulutzan/Desktop/solidmysql-5.0.27-linux-x86_64-glibc23-0050 
  # bin/mysqld 
   --user=root 
   --skip-networking 
   --default-storage-engine=solid
solidDB for MySQL 5.0.27 - 06.00.0050
 (Linux 2.6.13 AMD64 64bit MT) Copyright (C) 
  Solid Information Technology Ltd 1993-2006 Database started.
070101 16:39:57 InnoDB: Started;
 log sequence number 0 12719128 070101 16:39:57
 [ERROR] Can't open shared library 'udf_example.so'
 (errno: 0 udf_example.so: cannot open shared object file: No such file or directory)
070101 16:39:57 [Note] bin/mysqld: ready for connections.
Version: '5.0.27' socket: '/tmp/MySQL.sock' port: 0 Source
Distribution

Khi download nó không bị cản trở bởi các cài đặt đã có trên MySQL, mặc dù để an toàn tôi đã tắt tất cả chương trình mysqld đang mở trước khi tiến hành.

Ấn tượng đầu tiên

Trước khi sử dụng cơ chế Solid, xem xét lại trong MySQL với chương trình MySQL client:

MySQL> SELECT VERSION();
+-----------+
| version() |
+-----------+
| 5.0.27 |
+-----------+
1 row in set (0.00 sec)

Đọc phần hiển thị trên:

Chỉ có một phiên bản dùng được là 5.0.27. Sau này nó sẽ là "SolidDB for MySQL 5.1", nhưng bây giờ chúng ta chưa thể chơi được với các thành phần mới của MySQL 5.1 như event (sự kiện), partition (phân vùng) hay row-level log.

MySQL> SHOW ENGINES;
+------------+---------+-----------------------------------------------------+
| Engine | Support | Comment
|
+------------+---------+-----------------------------------------------------+
| solidDB | YES | Fully transactional disk-based engine with
multiversion optimistic/pessimistic concurrency control |
...

Đọc phần hiển thị trên:

Các bộ máy lưu trữ có thể dùng được là Solid, cơ chế “tại gia” của MySQL và InnoDB. Chúng ta có thể dùng hai cơ chế với nhau cùng một lúc.

MySQL> SHOW VARIABLES LIKE 'solid%';
+------------------------------+----------+
| Variable_name | Value |
+------------------------------+----------+
| soliddb_cache_size | 67108864 |
| soliddb_durability_level | 3 |
| soliddb_logdir | |
| soliddb_backupdir | |
| soliddb_admin_command | |
| soliddb_checkpoint_deletelog | ON |
| soliddb_filespec | |
| soliddb_lock_wait_timeout | 30 |
| soliddb_db_block_size | 8192 |
| soliddb_log_block_size | 16384 |
| soliddb_backup_block_size | 65536 |
| soliddb_checkpoint_interval | 50000 |
| soliddb_checkpoint_time | 0 |
| soliddb_io_threads | 5 |
| soliddb_lockhash_size | 1000000 |
| soliddb_pessimistic | ON |
| soliddb_write_threads | 1 |
| soliddb_extend_increment | 500 |
| soliddb_readahead | 4 |
+------------------------------+----------+
19 rows in set (0.00 sec)

Đọc phần hiển thị trên:

Một số biến liên quan đến Solid bạn có thể dùng để điều chỉnh, nhưng các giá trị mặc định khá ổn.

Bảng Solid đầu tiên

MySQL>
  CREATE DATABASE solidtest;
Query OK, 1 row affected (0.00 sec)
MySQL>
  USE solidtest;
Database changed
MySQL>
  CREATE TABLE t (s1 INT,s2 VARCHAR(1000)) ENGINE=SOLIDDB;
Query OK, 0 rows affected (0.01 sec)
MySQL>
  CREATE INDEX i ON t (s1);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL>
  INSERT INTO t VALUES (1,'a');
Query OK, 1 row affected (0.01 sec)
MySQL>
  SELECT * FROM t;
+------+------+
| s1 | s2 |
+------+------+
| 1 | a |
+------+------+
1 row in set (0.00 sec)

Đọc phần hiển thị trên:

Chỉ có một điểm khác là phải cung cấp thông tin "ENGINE=SOLIDDB" khi tạo bảng.(Thực tế bạn không cần phải khai báo điều này nếu sử dụng mặc định Solid là bộ máy lưu trữ). Các lệnh SQL không có gì khác biệt. Khi khai báo bảng này là Solid, MySQL sẽ biết nó phải dùng bộ máy lưu trữ của Solid khi làm việc với bảng.

Và bây giờ là giao dịch kiểm tra đầu tiên.

MySQL>
  SET @@autocommit=0;
Query OK, 0 rows affected (0.00 sec)
MySQL>
  START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
MySQL>
  INSERT INTO t VALUES (2,'b');
Query OK, 1 row affected (0.00 sec)
MySQL>
  ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
MySQL>
  SELECT * FROM t WHERE s1 = 2;
Empty set (0.00 sec)

Đọc phần hiển thị trên:

Kết quả của cả đoạn mã chỉ ra: Solid là bộ máy lưu trữ “giao dịch”. Điều này khác so với MyISAM và giống InnoDB, Falcon nhiều hơn.

Kiểm tra độ chính xác về thời gian

Website của Solid có một số lệnh khác nhau về tốc độ và kết quả kiểm tra riêng của họ như TM1, kiểm tra với nhiều sơ đồ cho thấy Solid nhanh hơn InnoDB:
http://www.solidtech.com/developers/CarrierGrade/TM1/SolidDB_TM1Benchmark.pdf

DELIMITER //
CREATE PROCEDURE p ()
BEGIN
   DECLARE v INT DEFAULT 0; 
   WHILE v <
  10000 DO 
      INSERT INTO t VALUES (v,'cde'); 
      SET v = v + 1; 
      END WHILE; 
   END//
DELIMITER ;
CALL p();                        -- Time this
SELECT SUM(s1) FROM t;           -- Time this
UPDATE t SET s2=CONCAT(s2,s2);   -- Time this

Khi thực hiện kiểm tra như vậy với phiên bản mới nhất MySQL 5.1, khai báo "engine=myisam" và "engine=innodb" thay vì "engine=solid", kết quả đưa ra là (tất cả thời gian đều tính bằng giây):

           MyISAM     InnoDB     Solid
INSERT       0.78       3.92      9.01
UPDATE       0.01       0.03      0.20
DELETE       0.13       1.47      0.94

Bạn có thể thấy Solid hoàn toàn xứng đáng trở thành thành viên mới đáng mong đợi của cộng đồng lưu trữ MySQL. Đó mới chỉ là bài kiểm tra đơn giản. Để có đánh giá chính xác hơn, chúng ta sẽ phải thực hiện một số kiểm tra phức tạp khác, nhưng ấn tượng đầu tiên về Solid quả là không tồi.

Những cái còn thiếu

Có một số thành phần không được hỗ trợ trong Solid. Không phải thành phần nào cũng được chú ý, hoan nghênh, nhưng hầu hết chúng đều có mặt trong một số bộ máy lưu trữ MySQL khác. Và không ít cư dân của cộng đồng SQL sẽ thấy tiếc khi vắng mặt chúng.

  • Chỉ có một kiểu đối chiếu “chữ hoa Latin1”.
    Chỉ có một kiểu đối chiếu chữ là latin1_general_cs. Nếu có cột nào khác không phải tập hợp ký tự Latin hoặc không viết hoa, bạn không thể tìm thấy nó.
     
  • Fulltext (phải gõ đầy đủ tên)
    Đây không phải là thiếu sót của Solid, nhưng kiểu chỉ mục “fulltext” có trong MyISAM và chưa được thay đổi.

Tổng kết và thực hiện một số phép ngoại suy trên phần gỡ lỗi, từ một số e-mail của bộ phận hỗ trợ kỹ thuật Solid thì các thành phần MySQL sau chưa có trên Solid:

Các chỉ mục FULLTEXT
INSERT DELAYED
BACKUP
LOAD INDEX
OPTIMIZE
SAVEPOINT
Unsigned BIGINT
Các cột UNIQUE có nhiều hơn một giá trị NULL
Hầu hết các kiểu đối chiếu.
Tất cả thành phần MySQL 5.1 mới.
Một số platform.

Một số thành phần mới chưa có trên bộ máy lưu trữ khác

Solid có một số thứ mà bạn sẽ không thể tìm ra trên bất cứ cơ chế nào khác của MySQL. Chẳng hạn các Foreign Keys hiện chưa có trên Falcon.

Foreign Keys

Solid có một số nhược điểm giống InnoDB (như không thể tham chiếu nội tuyến) và một số nhược điểm khác (bạn có thể tìm thấy các than phiền về chúng trên Bug Tracker: http://dev.soliddb.com/bug). Nhưng Solid kiểm tra vi phạm khóa ngoại foreign-key ở “cuối lệnh”, còn InnoDB thì không. Dưới đây là một ví dụ trong đó tôi sử dụng lệnh UPDATE bảng khóa chính. Đó có thể là nguyên nhân vi phạm khóa ngoại trong lệnh, nhưng không phải ở cuối. Khi khai báo: engine=solid, kiểm tra hợp lệ và được thông qua. Còn với engine=innodb, kiểm tra thất bại.

MySQL>
  create table t1a (s1 int, primary key(s1)) engine=solid; 
Query OK, 0 rows affected (0.02 sec)
MySQL> 
  create table t1b (s1 int, foreign key (s1) references t1a(s1))
engine=solid;
Query OK, 0 rows affected (0.02 sec)
MySQL> 
  insert into t1a values (1),(2);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
MySQL> 
  insert into t1b values (1);
Query OK, 1 row affected (0.00 sec)
MySQL> 
  update t1a set s1 = s1 - 1; /* This won't cause an error! */
Query OK, 2 rows affected (0.04 sec)
Rows matched: 2 Changed: 2 Warnings: 0
MySQL> 
  create table t7a (s1 int, primary key(s1)) engine=innodb;
Query OK, 0 rows affected (0.05 sec)
MySQL> 
  create table t7b (s1 int, foreign key (s1) references t7a(s1))
engine=innodb;
Query OK, 0 rows affected (0.05 sec)
MySQL> 
  insert into t7a values (1),(2);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
MySQL> 
  insert into t7b values (1);
Query OK, 1 row affected (0.01 sec)
MySQL> 
  update t7a set s1 = s1 - 1; /* This will cause an error! */
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key
constraint fails

Chức năng phục hồi mạnh

Solid có thể phục hồi chính xác và nhanh chóng sau khi gặp sự cố. Tôi đã thử một số kiểm tra thông thường như 'kill -9 ' khi chương trình đang update một bảng lớn. Quá trình không bị ngắt quãng.

Chọn Optimistic hay Pessimistic

Các kế hoạch optimistic và “multi-versioning” (đa phiên bản) rất phổ biến, như trong InnoDB / PostgreSQL / Oracle / Falcon hay trong Solid (mặc định). Nhưng kế hoạch pesimistic (định hình các “khóa” truyền thống và quen thuộc cho kiểm soát trùng hợp) chỉ có trong Solid (với tùy chọn --soliddb_pessimistic ). Điều này quả là tuyệt, là nơi cho các kế hoạch pessimistic in shop và việc chuyển từ DB2 hay SQL Server dễ dàng dễ dàng hơn. Đây chính là Big Unique Feature của Solid.

Duy trì giao dịch

Khi viết bài này tôi đang có hai máy client MySQL chạy các giao dịch trên bảng Solid với tổng số một triệu hàng. Nguy cơ xung đột luôn tiềm ẩn khi tìm kiếm nhiều hàng hay thay đổi, update một hàng. Công việc này diễn ra từ một đến hai giờ và chưa thể kiểm chứng được nó có hiệu quả cho các hoạt động kinh doanh lâu dài hay không.

Có một số tài liệu tham khảo, nhưng tốt nhất là bạn nên download, thử nghiệm trực tiếp phần mềm. Nó khá dễ hiểu và hoàn toàn miễn phí.

0