Moodle là một nền tảng rất phổ biến để chạy các khóa học trực tuyến. Với tình hình mà chúng ta thấy vào năm 2020, Moodle cùng với các nhà truyền thông như Zoom tạo thành xương sống của các dịch vụ cho phép học tập trực tuyến và giáo dục tại nhà. Nhu cầu đặt trên nền tảng Moodle tăng lên đáng kể so với những năm trước. Các nền tảng mới đã được xây dựng, tải bổ sung đã được đặt trên các nền tảng mà trước đây, chúng chỉ đóng vai trò như một công cụ trợ giúp và giờ đây chúng nhằm thúc đẩy toàn bộ nỗ lực giáo dục. Làm thế nào để mở rộng Moodle? Chúng tôi có một blog về chủ đề này. Làm thế nào để chia tỷ lệ cơ sở dữ liệu phụ trợ cho Moodle? Chà, đó là một câu chuyện khác. Hãy xem xét nó vì việc mở rộng cơ sở dữ liệu không phải là điều dễ dàng thực hiện nhất, đặc biệt nếu Moodle có thêm một chút thay đổi nhỏ của riêng nó.
Là điểm đầu vào, chúng tôi sẽ sử dụng kiến trúc được mô tả trong một trong các bài viết trước đó của chúng tôi. MariaDB Cluster với ProxySQL và Keepalived trên mọi thứ.
Như bạn có thể thấy, chúng ta có Cụm MariaDB ba nút với ProxySQL. phân chia các lần đọc an toàn từ phần còn lại của lưu lượng truy cập dựa trên người dùng.
<?php // Moodle configuration file
unset($CFG);
global $CFG;
$CFG = new stdClass();
$CFG->dbtype = 'mysqli';
$CFG->dblibrary = 'native';
$CFG->dbhost = '192.168.1.222';
$CFG->dbname = 'moodle';
$CFG->dbuser = 'moodle';
$CFG->dbpass = 'pass';
$CFG->prefix = 'mdl_';
$CFG->dboptions = array (
'dbpersist' => 0,
'dbport' => 6033,
'dbsocket' => '',
'dbcollation' => 'utf8mb4_general_ci',
'readonly' => [
'instance' => [
'dbhost' => '192.168.1.222',
'dbport' => 6033,
'dbuser' => 'moodle_safereads',
'dbpass' => 'pass'
]
]
);
$CFG->wwwroot = 'http://192.168.1.200/moodle';
$CFG->dataroot = '/var/www/moodledata';
$CFG->admin = 'admin';
$CFG->directorypermissions = 0777;
require_once(__DIR__ . '/lib/setup.php');
// There is no php closing tag in this file,
// it is intentional because it prevents trailing whitespace problems!
Người dùng, như được hiển thị ở trên, được xác định trong tệp cấu hình Moodle. Điều này cho phép chúng tôi gửi tự động và an toàn các lần ghi và tất cả các câu lệnh SELECT yêu cầu tính nhất quán dữ liệu đến nút ghi trong khi vẫn gửi một số SELECT tới các nút còn lại trong Cụm MariaDB.
Giả sử rằng thiết lập cụ thể này là không đủ đối với chúng tôi. Các tùy chọn mà chúng tôi có là gì? Chúng tôi có hai yếu tố chính trong thiết lập - MariaDB Cluster và ProxySQL. Chúng tôi sẽ xem xét các vấn đề của cả hai bên:
- Có thể làm gì nếu phiên bản ProxySQL không thể đối phó với lưu lượng truy cập?
- Có thể làm gì nếu MariaDB Cluster không thể đối phó với lưu lượng truy cập?
Hãy bắt đầu với tình huống đầu tiên.
Phiên bản ProxySQL bị Quá tải
Trong môi trường hiện tại, chỉ một phiên bản ProxySQL có thể xử lý lưu lượng - phiên bản Virtual IP trỏ tới. Điều này để lại cho chúng ta một phiên bản ProxySQL đang hoạt động như một chế độ chờ - chạy và chạy nhưng không được sử dụng cho bất cứ việc gì. Nếu phiên bản ProxySQL đang hoạt động đang tiến gần đến mức bão hòa của CPU, có một số điều bạn có thể muốn làm. Đầu tiên, rõ ràng là bạn có thể mở rộng quy mô theo chiều dọc - tăng kích thước của một phiên bản ProxySQL có thể là cách dễ nhất để cho phép nó xử lý lưu lượng truy cập cao hơn. Hãy nhớ rằng ProxySQL, theo mặc định, được định cấu hình để sử dụng 4 luồng.
Nếu bạn muốn có thể sử dụng nhiều lõi CPU hơn, đây là cài đặt bạn cũng cần thay đổi.
Ngoài ra, bạn có thể cố gắng thu nhỏ theo chiều ngang. Thay vì sử dụng hai phiên bản ProxySQL với VIP, bạn có thể kết hợp ProxySQL với máy chủ Moodle. Sau đó, bạn muốn cấu hình lại Moodle để kết nối với ProxySQL trên máy chủ cục bộ, lý tưởng nhất là thông qua Unix socket - đây là cách hiệu quả nhất để kết nối với ProxySQL. Không có nhiều cấu hình mà chúng tôi sử dụng với ProxySQL do đó việc sử dụng nhiều phiên bản ProxySQL không nên thêm quá nhiều chi phí. Nếu muốn, bạn luôn có thể thiết lập Cụm ProxySQL để giúp bạn giữ cho các phiên bản ProxySQL được đồng bộ về cấu hình.
Cụm MariaDB bị Quá tải
Bây giờ chúng ta đang nói về một vấn đề nghiêm trọng hơn. Tất nhiên, tăng kích thước của các phiên bản sẽ hữu ích, như thường lệ. Mặt khác, tỷ lệ ra theo chiều ngang có phần hạn chế vì giới hạn "đọc an toàn". Chắc chắn, bạn có thể thêm nhiều nút hơn vào cụm nhưng bạn chỉ có thể sử dụng chúng cho các lần đọc an toàn. Điều này cho phép bạn mở rộng quy mô ở mức độ nào, điều đó phụ thuộc vào khối lượng công việc. Đối với khối lượng công việc chỉ đọc thuần túy (duyệt qua nội dung, diễn đàn, v.v.), nó trông khá đẹp:
MySQL [(none)]> SELECT hostgroup, srv_host, srv_port, status, queries FROM stats_mysql_connection_pool WHERE hostgroup IN (20, 10) AND status='ONLINE';
+-----------+---------------+----------+--------+---------+
| hostgroup | srv_host | srv_port | status | Queries |
+-----------+---------------+----------+--------+---------+
| 20 | 192.168.1.204 | 3306 | ONLINE | 5683 |
| 20 | 192.168.1.205 | 3306 | ONLINE | 5543 |
| 10 | 192.168.1.206 | 3306 | ONLINE | 553 |
+-----------+---------------+----------+--------+---------+
3 rows in set (0.002 sec)
Đây là tỷ lệ khá lớn là 1:20 - đối với một truy vấn chạm đến người viết, chúng tôi có 20 "lần đọc an toàn" có thể được trải rộng trên các nút còn lại. Mặt khác, khi chúng tôi bắt đầu sửa đổi dữ liệu, tỷ lệ sẽ nhanh chóng thay đổi.
MySQL [(none)]> SELECT hostgroup, srv_host, srv_port, status, queries FROM stats_mysql_connection_pool WHERE hostgroup IN (20, 10) AND status='ONLINE';
+-----------+---------------+----------+--------+---------+
| hostgroup | srv_host | srv_port | status | Queries |
+-----------+---------------+----------+--------+---------+
| 20 | 192.168.1.204 | 3306 | ONLINE | 3117 |
| 20 | 192.168.1.205 | 3306 | ONLINE | 3010 |
| 10 | 192.168.1.206 | 3306 | ONLINE | 6807 |
+-----------+---------------+----------+--------+---------+
3 rows in set (0.003 sec)
Đây là kết quả đầu ra sau khi phát hành một số điểm, tạo chủ đề diễn đàn và thêm một số nội dung khóa học. Như bạn có thể thấy, với tỷ lệ truy vấn an toàn / không an toàn như vậy, người viết sẽ bị bão hòa sớm hơn người đọc, do đó việc mở rộng quy mô bằng cách thêm nhiều nút là không phù hợp.
Có thể làm gì với nó? Có một cài đặt được gọi là "độ trễ". Theo tệp cấu hình, nó xác định thời điểm an toàn để đọc bảng sau khi ghi. Khi ghi xảy ra, bảng được đánh dấu là đã sửa đổi và trong khoảng thời gian "độ trễ", tất cả các CHỌN sẽ được gửi đến nút ghi. Sau khi thời gian dài hơn “độ trễ” trôi qua, các SELECT từ bảng đó lại có thể được gửi đến các nút đã đọc. Xin lưu ý rằng với MariaDB Cluster, thời gian cần thiết để ghi tập được áp dụng trên tất cả các nút thường rất thấp, được tính bằng mili giây. Điều này sẽ cho phép chúng tôi đặt độ trễ khá thấp trong tệp cấu hình Moodle, ví dụ:giá trị như 0,1s (100 mili giây) sẽ khá ổn. Tất nhiên, nếu bạn gặp bất kỳ vấn đề nào, bạn luôn có thể tăng giá trị này hơn nữa.
Một tùy chọn khác để kiểm tra là hoàn toàn dựa vào MariaDB Cluster để cho biết khi nào việc đọc là an toàn và khi nào thì không. Có một biến wsrep_sync_wait có thể được định cấu hình để buộc kiểm tra quan hệ nhân quả trên một số mẫu truy cập (đọc, cập nhật, chèn, xóa, thay thế và hiển thị lệnh). Đối với mục đích của chúng tôi, sẽ đủ để đảm bảo rằng các lần đọc được thực thi với quan hệ nhân quả được thực thi, do đó chúng tôi sẽ đặt biến này thành ‘1’.
Chúng tôi sẽ thực hiện thay đổi này trên tất cả các nút Cụm MariaDB. Chúng tôi cũng sẽ cần phải cấu hình lại ProxySQL để phân chia đọc / ghi dựa trên các quy tắc truy vấn, không chỉ người dùng, như chúng tôi đã làm trước đây. Chúng tôi cũng sẽ xóa người dùng ‘moodle_safereads’ vì nó không còn cần thiết nữa trong thiết lập này.
Chúng tôi thiết lập ba quy tắc truy vấn phân phối lưu lượng truy cập dựa trên truy vấn. CHỌN… CHO CẬP NHẬT được gửi đến nút người viết, tất cả các truy vấn CHỌN được gửi đến người đọc và mọi thứ khác (CHÈN, XÓA, THAY THẾ, CẬP NHẬT, BẮT ĐẦU, COMMIT, v.v.) cũng được gửi đến nút người viết.
Điều này cho phép chúng tôi đảm bảo rằng tất cả các lần đọc có thể được trải rộng trên các nút của trình đọc, do đó cho phép mở rộng quy mô theo chiều ngang thông qua việc thêm nhiều nút hơn vào Cụm MariaDB.
Chúng tôi hy vọng với một vài mẹo đó, bạn sẽ có thể mở rộng phần phụ trợ cơ sở dữ liệu Moodle của mình dễ dàng hơn nhiều và ở mức độ lớn hơn