Optimization

Cài đặt và tối ưu MariaDB trên VPS Ubuntu 24.04

Bạn vừa thuê một VPS chạy Ubuntu 24.04, và có kế hoạch chạy ứng dụng web cần database. Việc đầu tiên cần làm là cài đặt MariaDB, một nhánh thay thế mạnh mẽ cho MySQL, với hiệu năng cao và bảo trì tích cực từ cộng đồng. Nhưng cài xong chưa đủ, bạn cần tinh chỉnh các thông số để tận dụng tối đa RAM và NVMe SSD. Bài viết này sẽ hướng dẫn bạn toàn bộ quy trình: từ cài đặt, bảo mật, đến tối ưu cấu hình cho VPS Linux chạy Ubuntu 24.04.

Yêu cầu trước khi bắt đầu

  • Một VPS chạy Ubuntu 24.04 (khuyến nghị tối thiểu 1 vCPU, 2GB RAM). Bạn có thể tham khảo các gói VPS giá rẻ với ổ NVMe để có hiệu năng I/O hàng đầu.
  • User sudo (không dùng root) để thực hiện các lệnh cài đặt.
  • Đã nâng cấp hệ thống: sudo apt update && sudo apt upgrade -y.

Bước 1, Cài đặt MariaDB từ kho lưu trữ chính thức

Ubuntu 24.04 đi kèm MariaDB trong kho mặc định, nhưng phiên bản thường không phải mới nhất. Để có bản ổn định nhất (MariaDB 11.4 tại thời điểm viết bài), bạn nên thêm kho lưu trữ của MariaDB Foundation.

Trước hết, cài đặt gói software-properties-common để quản lý kho:

sudo apt install -y software-properties-common

Thêm GPG key và kho lưu trữ chính thức:

sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
sudo add-apt-repository 'deb [arch=amd64] https://ftp.osuosl.org/pub/mariadb/repo/11.4/ubuntu noble main'

Lưu ý: lệnh apt-key đã legacy, nhưng MariaDB chưa chuyển hết. Nếu bạn muốn cách hiện đại, có thể tải .asc về và đặt vào /etc/apt/trusted.gpg.d/. Cách trên vẫn hoạt động tốt.

Cập nhật danh sách gói và cài đặt MariaDB server:

sudo apt update
sudo apt install -y mariadb-server

Verify: Kiểm tra dịch vụ đã chạy:

sudo systemctl status mariadb

Bạn sẽ thấy output dạng Active: active (running). Nếu chưa chạy, khởi động:

sudo systemctl start mariadb
sudo systemctl enable mariadb

Bước 2, Bảo mật cài đặt với mysql_secure_installation

Sau khi cài, MariaDB có cấu hình mặc định yếu: user root không mật khẩu, database test tồn tại, và cho phép đăng nhập từ xa. Script mysql_secure_installation giúp vá tất cả lỗ hổng này.

sudo mysql_secure_installation

Script sẽ hỏi lần lượt:

  • Enter current password for root: Nhấn Enter (chưa có mật khẩu).
  • Switch to unix_socket authentication? Nhập Y (khuyến nghị), cho phép đăng nhập root bằng user hệ thống.
  • Change the root password? Nhập N (nếu dùng unix_socket, không cần mật khẩu riêng).
  • Remove anonymous users? Y.
  • Disallow root login remotely? Y (bảo mật cao).
  • Remove test database and access to it? Y.
  • Reload privilege tables now? Y.

Sau khi hoàn tất, test đăng nhập:

sudo mysql -u root

Nếu vào được prompt MariaDB, mọi thứ đã ổn. Thoát bằng EXIT;

Bước 3, Tinh chỉnh tệp cấu hình my.cnf cho VPS NVMe

Tệp cấu hình chính của MariaDB nằm ở /etc/mysql/mariadb.conf.d/50-server.cnf. Bạn cần chỉnh sửa các thông số sau để tối ưu cho workload web và phần cứng VPS hiện đại.

Các thông số cốt lõi

Thông sốGợi ý giá trịGiải thích
innodb_buffer_pool_size70-80% RAMVùng đệm chính cho dữ liệu InnoDB. VPS 2GB RAM => 1.5GB. VPS 4GB => 3GB.
innodb_log_file_size512MKích thước redo log. Giá trị lớn giúp insert/update nhanh, phục hồi nhanh sau crash.
query_cache_size0Vô hiệu hóa query cache (không còn hiệu quả với InnoDB và gây contention).
max_connections150-200Số kết nối đồng thời tối đa. Tăng nếu app có nhiều request.
innodb_flush_methodO_DIRECTTránh double buffering, phù hợp với NVMe SSD.

Mở tệp cấu hình:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Ví dụ một số dòng bạn cần thay đổi trong section [mysqld]:

innodb_buffer_pool_size = 1G
innodb_log_file_size = 512M
innodb_flush_method = O_DIRECT
query_cache_size = 0
query_cache_type = 0
max_connections = 150

Lưu ý: Nếu VPS của bạn có RAM nhỏ hơn 2GB, giảm innodb_buffer_pool_size xuống 512M để tránh swap. Nếu dùng VPS NVMe, O_DIRECT giúp tận dụng tối đa tốc độ SSD.

Sau khi sửa, khởi động lại MariaDB:

sudo systemctl restart mariadb

Verify: Kiểm tra các thông số đã áp dụng:

sudo mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
sudo mysql -e "SHOW VARIABLES LIKE 'innodb_log_file_size';"

Bước 4, Tạo database và user cho ứng dụng

hiếm khi dùng user root cho ứng dụng. Hãy tạo một database và user riêng:

sudo mysql -u root

Tại prompt MariaDB:

CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'matkhau_manh';
GRANT ALL PRIVILEGES ON myapp.* TO 'myapp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Kiểm tra kết nối bằng client:

mysql -u myapp_user -p myapp

Nếu vào được, bạn đã sẵn sàng kết nối database cho WordPress, Laravel, hoặc bất kỳ ứng dụng nào.

Bước 5, Thiết lập sao lưu tự động với mysqldump

Dữ liệu là tài sản quan trọng. Thiết lập cronjob để sao lưu hàng ngày:

sudo mkdir -p /var/backups/mariadb
sudo crontab -e

Thêm dòng sau (chạy lúc 3h sáng):

0 3 * * * mysqldump -u root --all-databases | gzip > /var/backups/mariadb/all-dbs-$(date +\%Y\%m\%d).sql.gz

Lưu ý: Vì bạn đang dùng unix_socket với user root, mysqldump sẽ chạy dưới quyền root. Nếu muốn dùng user khác, cần cấp quyền SELECT và LOCK TABLES.

Xử lý lỗi thường gặp

Lỗi "Can't connect to local MySQL server through socket"

Dịch vụ chưa chạy hoặc socket bị hỏng. Kiểm tra trạng thái và xem log:

sudo systemctl status mariadb
sudo journalctl -u mariadb -n 20

Khởi động lại nếu cần:

sudo systemctl restart mariadb

Lỗi "Failed to restart mariadb.service: Unit mariadb.service not found"

Trên Ubuntu 24.04, tên service có thể là mariadb hoặc mysql. Thử:

sudo systemctl restart mysql

Lỗi innodb_buffer_pool_size quá lớn

Nếu bạn đặt innodb_buffer_pool_size lớn hơn RAM khả dụng, MariaDB có thể bị kill bởi OOM. Giảm giá trị xuống và kiểm tra RAM trống:

free -h

Câu hỏi thường gặp

Tôi nên dùng MariaDB hay MySQL cho VPS?

MariaDB tương thích ngược với MySQL, có hiệu năng cao hơn ở nhiều benchmark và được cộng đồng phát triển tích cực. Với VPS Ubuntu 24.04, MariaDB là lựa chọn được khuyến nghị.

Làm sao để biết MariaDB đang dùng bao nhiêu RAM?

Dùng lệnh sudo mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';" và kiểm tra tiến trình với ps aux | grep mariadb. Bạn cũng có thể dùng htop để xem tổng thể.

Tôi cần mở port nào trên firewall cho MariaDB?

MariaDB chạy mặc định trên port 3306. Chỉ nên mở port này nếu bạn cần kết nối từ xa. Trên VPS, dùng sudo ufw allow 3306/tcp. Tuy nhiên, vì lý do bảo mật, khuyến nghị chỉ cho phép kết nối từ localhost hoặc qua SSH tunnel.

Tại sao tôi không thể đăng nhập root bằng password sau khi chạy mysql_secure_installation?

Bạn đã chọn unix_socket authentication, nghĩa là chỉ có user hệ thống root mới đăng nhập được. Dùng sudo mysql -u root thay vì mysql -u root -p.

Bài viết liên quan

Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.