Trong bài đăng trên blog trước, chúng ta đã trình bày về 4 thành phần quản lý cơ bản sử dụng máy khách dòng lệnh MaxCtrl. Trong bài đăng blog này, chúng tôi sẽ đề cập đến phần còn lại của các thành phần MaxScale thường được sử dụng trong MariaDB Cluster:
- Quản lý bộ lọc
- Quản lý MaxScale
- Quản lý nhật ký
Tất cả các lệnh trong bài đăng trên blog này đều dựa trên MaxScale 2.5.3.
Quản lý Bộ lọc
Bộ lọc là một mô-đun trong MaxScale hoạt động như một công cụ xử lý và định tuyến cho một dịch vụ MaxScale. Quá trình lọc xảy ra giữa kết nối máy khách tới MaxScale và kết nối MaxScale tới các máy chủ cơ sở dữ liệu phụ trợ. Đường dẫn này (phía máy khách của MaxScale đến các máy chủ cơ sở dữ liệu thực tế) có thể được coi là một đường dẫn, các bộ lọc sau đó có thể được đặt trong đường dẫn đó để theo dõi, sửa đổi, sao chép hoặc chặn nội dung truyền qua đó.
Có nhiều bộ lọc có thể được áp dụng để mở rộng khả năng xử lý của dịch vụ MaxScale, như thể hiện trong bảng sau:
Tên bộ lọc | Mô tả |
Binlog | Sao chép có chọn lọc các sự kiện nhật ký nhị phân tới các máy chủ phụ được kết hợp với dịch vụ binlogrouter. |
Bộ nhớ đệm | Bộ nhớ đệm đơn giản có khả năng lưu vào bộ nhớ đệm kết quả của các CHỌN, để các CHỌN giống hệt nhau tiếp theo được MaxScale phân phối trực tiếp mà không cần chuyển đến bất kỳ truy vấn nào máy chủ. |
Đọc Phê bình Nhất quán | Cho phép thực hiện các lần đọc quan trọng nhất quán thông qua MaxScale trong khi vẫn cho phép chia tỷ lệ các lần đọc không quan trọng. |
Tường lửa cơ sở dữ liệu | Chặn các truy vấn phù hợp với một bộ quy tắc. Bộ lọc này nên được xem như một giải pháp nỗ lực tốt nhất nhằm bảo vệ khỏi việc vô tình lạm dụng thay vì các cuộc tấn công độc hại. |
Gợi ý | Thêm gợi ý định tuyến vào dịch vụ, hướng dẫn bộ định tuyến định tuyến truy vấn đến một loại máy chủ nhất định. |
Chèn Luồng | Chuyển đổi số lượng lớn các chèn thành các luồng dữ liệu CSV được sử dụng bởi máy chủ phụ trợ thông qua cơ chế TẢI DỮ LIỆU ĐỊA PHƯƠNG THÔNG TIN |
Lua | Gọi một tập hợp các hàm trong tập lệnh Lua. |
Đắp mặt nạ | Làm xáo trộn giá trị trả về của một cột cụ thể |
Maxrows | Hạn chế số hàng mà SELECT, câu lệnh đã chuẩn bị hoặc thủ tục được lưu trữ có thể trả về ứng dụng khách. |
Máy chủ Được đặt tên | Định tuyến các truy vấn đến máy chủ dựa trên các kết quả khớp biểu thức chính quy (regex). |
Tất cả nhật ký truy vấn | Ghi nội dung truy vấn vào một tệp ở định dạng CSV. |
Regex | Viết lại nội dung truy vấn bằng cách sử dụng đối sánh biểu thức chính quy và thay thế văn bản. |
Áo thun | Tạo bản sao của các yêu cầu từ khách hàng và gửi các bản sao đến một dịch vụ khác trong MariaDB MaxScale. |
Throttle | Thay thế và mở rộng chức năng limit_queries của bộ lọc Tường lửa Cơ sở dữ liệu |
Lên trên | Theo dõi hiệu suất truy vấn của câu lệnh SQL đã chọn đi qua bộ lọc. |
Giám sát Hiệu suất Giao dịch | Theo dõi mọi câu lệnh SQL đi qua bộ lọc, được nhóm theo giao dịch, để phân tích hiệu suất giao dịch. |
Tạo bộ lọc
Mỗi bộ lọc MaxScale đều có cách định cấu hình riêng. Trong ví dụ này, chúng ta sẽ tạo một bộ lọc che, để che dữ liệu nhạy cảm của chúng ta cho cột "card_no" trong bảng "credit_cards" của chúng ta. Tạo mặt nạ yêu cầu tệp quy tắc, được viết ở định dạng JSON. Trước hết, hãy tạo một thư mục để lưu trữ các tệp quy tắc của chúng tôi:
$ mkdir /var/lib/maxscale/rules
Sau đó, tạo một tệp văn bản:
$ vi /var/lib/maxscale/rules/masking.json
Chỉ định các dòng như sau:
{
"rules": [
{
"obfuscate": {
"column": "card_no"
}
}
]
}
Các quy tắc đơn giản ở trên sẽ đơn giản làm xáo trộn đầu ra của cột card_no cho bất kỳ bảng nào, để bảo vệ dữ liệu nhạy cảm được ứng dụng khách MariaDB nhìn thấy.
Sau khi tệp quy tắc đã được tạo, chúng ta có thể tạo bộ lọc bằng lệnh sau:
maxctrl: create filter Obfuscates-card masking rules=/var/lib/maxscale/rules/masking.json
OK
Lưu ý rằng một số bộ lọc yêu cầu các thông số khác nhau. Đối với bộ lọc tạo mặt nạ này, tham số cơ bản là "quy tắc", nơi chúng ta cần chỉ định tệp quy tắc tạo mặt nạ ở định dạng JSON.
Đính kèm Bộ lọc vào Dịch vụ
Bộ lọc chỉ có thể được kích hoạt bằng cách gắn nó vào một dịch vụ. Việc sửa đổi dịch vụ hiện có bằng MaxCtrl chỉ được hỗ trợ bởi một số tham số và thêm bộ lọc không phải là một trong số chúng. Chúng tôi phải thêm thành phần bộ lọc trong tệp cấu hình dịch vụ của MaxScale để đính kèm bộ lọc về cơ bản. Trong ví dụ này, chúng tôi sẽ áp dụng bộ lọc "Obfuscates-card" cho dịch vụ tổng hợp hiện có của chúng tôi được gọi là rr-service.
Đi tới thư mục /var/lib/maxscale/maxscale.cnf.d và tìm rr-service.cnf, mở nó bằng trình soạn thảo văn bản rồi thêm dòng sau:
filters=Obfuscates-card
Cần phải khởi động lại MaxScale để tải thay đổi mới:
$ systemctl restart maxscale
Để kiểm tra bộ lọc, chúng tôi sẽ sử dụng một máy khách MariaDB và so sánh kết quả đầu ra bằng cách kết nối với hai dịch vụ khác nhau. Dịch vụ rw của chúng tôi được gắn vào một thiết bị nghe đang nghe trên cổng 3306 mà không có bất kỳ bộ lọc nào được định cấu hình. Do đó, chúng ta sẽ thấy phản hồi chưa được lọc từ MaxScale:
$ mysql -ucard_user -p -hmaxscale_host -p3306 -e "SELECT * FROM secure.credit_cards LIMIT 1"
+----+-----------+-----------------+-------------+-----------+---------+
| id | card_type | card_no | card_expiry | card_name | user_id |
+----+-----------+-----------------+-------------+-----------+---------+
| 1 | VISA | 425388910909238 | NULL | BOB SAGAT | 1 |
+----+-----------+-----------------+-------------+-----------+---------+
Khi kết nối với trình nghe rr-service trên cổng 3307, được định cấu hình với bộ lọc của chúng tôi, giá trị "card_no" của chúng tôi bị xáo trộn với đầu ra vô nghĩa:
$ mysql -ucard_user -p -hmaxscale_host -p3307 -e "SELECT * FROM secure.credit_cards LIMIT 1"
+----+-----------+-----------------+-------------+-----------+---------+
| id | card_type | card_no | card_expiry | card_name | user_id |
+----+-----------+-----------------+-------------+-----------+---------+
| 1 | VISA | ~W~p[=&^M~5f~~M | NULL | BOB SAGAT | 1 |
+----+-----------+-----------------+-------------+-----------+---------+
Việc lọc này được thực hiện bởi MaxScale, tuân theo các quy tắc đối sánh bên trong masking.json mà chúng tôi đã tạo trước đó.
Bộ lọc Danh sách
Để liệt kê tất cả các bộ lọc đã tạo, hãy sử dụng lệnh "bộ lọc danh sách":
maxctrl: list filters
┌─────────────────┬────────────┬─────────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼─────────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼─────────────┤
│ Obfuscates-card │ rr-service │ masking │
├─────────────────┼────────────┼─────────────┤
│ fetch │ │ regexfilter │
└─────────────────┴────────────┴─────────────┘
Trong các ví dụ trên, chúng tôi đã tạo 3 bộ lọc. Tuy nhiên, chỉ bộ lọc thẻ Obfuscates được liên kết với một dịch vụ.
Để hiển thị chi tiết tất cả các dịch vụ:
maxctrl: show filters
Hoặc nếu bạn muốn hiển thị một dịch vụ cụ thể:
maxctrl: show filter Obfuscates-card
┌────────────┬──────────────────────────────────────────────────────┐
│ Filter │ Obfuscates-card │
├────────────┼──────────────────────────────────────────────────────┤
│ Module │ masking │
├────────────┼──────────────────────────────────────────────────────┤
│ Services │ rr-service │
├────────────┼──────────────────────────────────────────────────────┤
│ Parameters │ { │
│ │ "check_subqueries": true, │
│ │ "check_unions": true, │
│ │ "check_user_variables": true, │
│ │ "large_payload": "abort", │
│ │ "prevent_function_usage": true, │
│ │ "require_fully_parsed": true, │
│ │ "rules": "/var/lib/maxscale/rules/masking.json", │
│ │ "treat_string_arg_as_field": true, │
│ │ "warn_type_mismatch": "never" │
│ │ } │
└────────────┴──────────────────────────────────────────────────────┘
Xóa bộ lọc
Để xóa một bộ lọc, trước tiên người ta phải hủy liên kết khỏi các dịch vụ liên quan. Ví dụ:hãy xem xét các bộ lọc sau trong MaxScale:
maxctrl: list filters
┌─────────────────┬────────────┬───────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼───────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼───────────┤
│ Obfuscates-card │ rr-service │ masking │
└─────────────────┴────────────┴───────────┘
Đối với bộ lọc qla, chúng ta có thể chỉ cần sử dụng lệnh sau để xóa nó:
maxctrl: destroy filter qla
OK
Tuy nhiên, đối với bộ lọc thẻ Obfuscates, nó phải được hủy liên kết với rr-service và rất tiếc, điều này yêu cầu sửa đổi tệp cấu hình và khởi động lại MaxScale. Đi tới thư mục /var/lib/maxscale/maxscale.cnf.d và tìm rr-service.cnf, mở nó bằng trình soạn thảo văn bản rồi xóa dòng sau:
filters=Obfuscates-card
Bạn cũng có thể xóa chuỗi "Obfuscates-card" khỏi dòng trên và để dòng "filter" bằng một giá trị trống. Sau đó, lưu tệp và khởi động lại dịch vụ MaxScale để tải các thay đổi:
$ systemctl restart maxscale
Chỉ khi đó, chúng tôi mới có thể xóa bộ lọc thẻ Obfuscates khỏi MaxScale bằng lệnh "hủy bộ lọc":
maxctrl: destroy filter Obfuscates-card
OK
Quản lý MaxScale
Liệt kê Người dùng
Để liệt kê tất cả người dùng MaxScale, hãy sử dụng lệnh "danh sách người dùng":
maxctrl: list users
┌───────┬──────┬────────────┐
│ Name │ Type │ Privileges │
├───────┼──────┼────────────┤
│ admin │ inet │ admin │
└───────┴──────┴────────────┘
Tạo người dùng MaxScale
Theo mặc định, người dùng được tạo là người dùng chỉ đọc:
maxctrl: create user dev mySecret
OK
Để tạo người dùng quản trị viên, hãy chỉ định lệnh --type =admin:
maxctrl: create user dba mySecret --type=admin
OK
Xóa người dùng MaxScale
Để xóa người dùng, chỉ cần sử dụng lệnh "hủy người dùng":
maxctrl: destroy user dba
OK
Người dùng quản trị cuối cùng còn lại không thể bị xóa. Tạo người dùng quản trị thay thế trước khi cố gắng xóa người dùng quản trị cuối cùng.
Hiển thị Thông số Tỷ lệ Tối đa
Để hiển thị tất cả các tham số đã tải cho phiên bản MaxScale, hãy sử dụng lệnh "show maxscale":
maxctrl: show maxscale
┌──────────────┬──────────────────────────────────────────────────────────────────────┐
│ Version │ 2.5.3 │
├──────────────┼──────────────────────────────────────────────────────────────────────┤
│ Commit │ de3770579523e8115da79b1696e600cce1087664 │
├──────────────┼──────────────────────────────────────────────────────────────────────┤
│ Started At │ Mon, 21 Sep 2020 04:44:49 GMT │
├──────────────┼──────────────────────────────────────────────────────────────────────┤
│ Activated At │ Mon, 21 Sep 2020 04:44:49 GMT │
├──────────────┼──────────────────────────────────────────────────────────────────────┤
│ Uptime │ 1627 │
├──────────────┼──────────────────────────────────────────────────────────────────────┤
│ Parameters │ { │
│ │ "admin_auth": true, │
│ │ "admin_enabled": true, │
│ │ "admin_gui": true, │
│ │ "admin_host": "127.0.0.1", │
│ │ "admin_log_auth_failures": true, │
│ │ "admin_pam_readonly_service": null, │
│ │ "admin_pam_readwrite_service": null, │
│ │ "admin_port": 8989, │
│ │ "admin_secure_gui": true, │
│ │ "admin_ssl_ca_cert": null, │
│ │ "admin_ssl_cert": null, │
│ │ "admin_ssl_key": null, │
│ │ "auth_connect_timeout": 10000, │
│ │ "auth_read_timeout": 10000, │
│ │ "auth_write_timeout": 10000, │
│ │ "cachedir": "/var/cache/maxscale", │
│ │ "connector_plugindir": "/usr/lib/x86_64-linux-gnu/mysql/plugin", │
│ │ "datadir": "/var/lib/maxscale", │
│ │ "debug": null, │
│ │ "dump_last_statements": "never", │
│ │ "execdir": "/usr/bin", │
│ │ "language": "/var/lib/maxscale", │
│ │ "libdir": "/usr/lib/x86_64-linux-gnu/maxscale", │
│ │ "load_persisted_configs": true, │
│ │ "local_address": null, │
│ │ "log_debug": false, │
│ │ "log_info": false, │
│ │ "log_notice": false, │
│ │ "log_throttling": { │
│ │ "count": 0, │
│ │ "suppress": 0, │
│ │ "window": 0 │
│ │ }, │
│ │ "log_warn_super_user": false, │
│ │ "log_warning": false, │
│ │ "logdir": "/var/log/maxscale", │
│ │ "max_auth_errors_until_block": 10, │
│ │ "maxlog": true, │
│ │ "module_configdir": "/etc/maxscale.modules.d", │
│ │ "ms_timestamp": true, │
│ │ "passive": false, │
│ │ "persistdir": "/var/lib/maxscale/maxscale.cnf.d", │
│ │ "piddir": "/var/run/maxscale", │
│ │ "query_classifier": "qc_sqlite", │
│ │ "query_classifier_args": null, │
│ │ "query_classifier_cache_size": 0, │
│ │ "query_retries": 1, │
│ │ "query_retry_timeout": 5000, │
│ │ "rebalance_period": 0, │
│ │ "rebalance_threshold": 20, │
│ │ "rebalance_window": 10, │
│ │ "retain_last_statements": 0, │
│ │ "session_trace": 0, │
│ │ "skip_permission_checks": false, │
│ │ "sql_mode": "default", │
│ │ "syslog": true, │
│ │ "threads": 1, │
│ │ "users_refresh_interval": 0, │
│ │ "users_refresh_time": 30000, │
│ │ "writeq_high_water": 16777216, │
│ │ "writeq_low_water": 8192 │
│ │ } │
└──────────────┴──────────────────────────────────────────────────────────────────────┘
Tham số thay đổi MaxScale
- auth_connect_timeout
- auth_read_timeout
- auth_write_timeout
- admin_auth
- admin_log_auth_failures
- bị động
Phần còn lại của các tham số phải được đặt bên trong /etc/maxscale.conf, yêu cầu khởi động lại MaxScale để áp dụng các thay đổi mới.
GUI MaxScale
MaxGUI là một công cụ dựa trên trình duyệt mới để định cấu hình và quản lý MaxScale, được giới thiệu trong phiên bản 2.5. Nó có thể truy cập thông qua cổng 8989 của máy chủ MaxScale trên giao diện máy chủ cục bộ, 127.0.0.1. Theo mặc định, bắt buộc phải đặt admin_secure_gui =true và định cấu hình cả tham số admin_ssl_key và admin_ssl_cert. Tuy nhiên, trong bài đăng blog này, chúng tôi sẽ cho phép kết nối qua HTTP thuần túy bằng cách thêm dòng sau trong lệnh [maxctrl] bên trong /etc/maxscale.cnf:
admin_secure_gui = false
Khởi động lại dịch vụ MaxScale để tải thay đổi:
$ systemctl restart maxscale
Vì GUI đang lắng nghe trên giao diện máy chủ cục bộ, chúng tôi có thể sử dụng đường hầm SSH để truy cập GUI từ máy trạm cục bộ của chúng tôi:
$ ssh -L 8989:localhost:8989 [email protected]<Maxscale public IP address>
Sau đó, mở trình duyệt web, trỏ URL tới http://127.0.0.1:8989/ và đăng nhập. MaxGUI sử dụng thông tin đăng nhập tương tự như maxctrl, do đó mật khẩu mặc định là "admin" với mật khẩu "mariadb". Vì mục đích bảo mật, người ta nên tạo người dùng quản trị mới với mật khẩu mạnh hơn dành riêng cho mục đích này. Sau khi đăng nhập, bạn sẽ thấy bảng điều khiển MaxGUI như bên dưới:
Hầu hết các lệnh quản lý MaxCtrl mà chúng tôi đã trình bày trong loạt bài blog này có thể được thực hiện trực tiếp từ GUI này. Nếu bạn nhấp vào nút "Tạo mới", bạn sẽ thấy hộp thoại sau:
Như bạn có thể thấy, tất cả các thành phần MaxScale quan trọng có thể được quản lý trực tiếp từ GUI, với giao diện trực quan đẹp mắt, làm cho mọi thứ trở nên đơn giản và dễ quản lý hơn nhiều. Ví dụ:việc liên kết bộ lọc có thể được thực hiện trực tiếp từ giao diện người dùng mà không cần khởi động lại dịch vụ MaxScale, như được hiển thị trong phần "Đính kèm bộ lọc vào dịch vụ" trong bài đăng blog này.
Để biết thêm thông tin về GUI mới này, hãy xem hướng dẫn MaxGUI này.
Quản lý ghi nhật ký
Hiển thị các thông số ghi nhật ký
Để hiển thị các thông số ghi nhật ký, hãy sử dụng lệnh "hiển thị nhật ký":
maxctrl: show logging
┌────────────────────┬────────────────────────────────┐
│ Current Log File │ /var/log/maxscale/maxscale.log │
├────────────────────┼────────────────────────────────┤
│ Enabled Log Levels │ alert │
│ │ error │
│ │ warning │
│ │ notice │
├────────────────────┼────────────────────────────────┤
│ Parameters │ { │
│ │ "highprecision": true, │
│ │ "log_debug": false, │
│ │ "log_info": false, │
│ │ "log_notice": true, │
│ │ "log_warning": true, │
│ │ "maxlog": true, │
│ │ "syslog": true, │
│ │ "throttling": { │
│ │ "count": 10, │
│ │ "suppress_ms": 10000, │
│ │ "window_ms": 1000 │
│ │ } │
│ │ } │
└────────────────────┴────────────────────────────────┘
Chỉnh sửa thông số ghi nhật ký
Tất cả các tham số ghi nhật ký như được hiển thị ở trên có thể được cấu hình thông qua lệnh MaxCtrl trong thời gian chạy. Ví dụ:chúng ta có thể bật log_info bằng cách sử dụng lệnh "ghi nhật ký thay đổi":
maxctrl: alter logging log_info true
Xoay nhật ký
Theo mặc định, MaxScale cung cấp tệp cấu hình xoay nhật ký theo /etc/logrotate.d/maxscale_logrotate. Dựa trên cấu hình xoay vòng nhật ký, tệp nhật ký được luân chuyển hàng tháng và sử dụng lệnh "xoay nhật ký" của MaxCtrl. Chúng ta có thể buộc việc xoay nhật ký diễn ra ngay lập tức bằng lệnh sau:
$ logrotate --force /etc/logrotate.d/maxscale_logrotate
Xác minh bằng lệnh sau:
$ ls -al /var/log/maxscale/
total 1544
drwxr-xr-x 2 maxscale maxscale 4096 Sep 21 05:53 ./
drwxrwxr-x 10 root syslog 4096 Sep 20 06:25 ../
-rw-r--r-- 1 maxscale maxscale 75 Sep 21 05:53 maxscale.log
-rw-r--r-- 1 maxscale maxscale 253250 Sep 21 05:53 maxscale.log.1
-rw-r--r-- 1 maxscale maxscale 1034364 Sep 18 06:25 maxscale.log.2
-rw-r--r-- 1 maxscale maxscale 262676 Aug 1 06:25 maxscale.log.3
Kết luận
Chúng ta đã đến phần cuối của loạt bài triển khai và quản lý MaxScale bằng máy khách MaxCtrl. Trên toàn bộ loạt blog này, chúng tôi đã sử dụng một số phiên bản MaxScale mới nhất khác nhau (liên quan đến ngày viết lên) và chúng tôi đã thấy nhiều cải tiến đáng kể trong mọi phiên bản.
Xin chúc mừng nhóm MariaDB MaxScale vì họ đã làm việc chăm chỉ để biến MaxScale trở thành một trong những công cụ cân bằng tải cơ sở dữ liệu tốt nhất trên thị trường.