Cách chuyển MySQL Database sang một Server mới trên Ubuntu 14.04

4 năm trước

Giới thiệu

Nếu bạn đang sử dụng một ứng dụng web với database, chẳng hạn như LAMP stack, trên một VPS đơn lẻ, bạn đôi khi sẽ phải mở rộng hệ thống để có thể xử lí nhiều yêu cầu hơn. Một cách khá hiệu quả để làm việc này là chuyển database server của bạn sang một VPS riêng biệt khác trên cùng một datacenter.

Hướng dẫn này sé giúp bạn dịch chuyển một MySQL database ra khỏi application server của bạn. Vì mọi ứng dụng đều có cấu hình riêng với các kết nối đến database, ta sẽ ví dụ với quá trình dịch chuyển database với WordPress, nhưng bạn có thể thực hiện tương tự với các ứng dụng web sử dụng MySQL.

Note: Nếu muốn thực hiện các thiết lập ban đầu với một database server riêng, để database được tách khỏi application server, bạn nên tham khảo Cách thiết lập Remote Database để tối ưu hiệu suất của trang web sử dụng MySQL.

 

Yêu cầu

 

Giả sử rằng web application và database của bạn đang được lưu trữ trên cùng một server, như sơ đồ sau:

LAMP Stack

 

Một ví dụ cho kiểu thiết lập này được đề cập trong bài viết: Cách cài đặt Wordpress trên Ubuntu 14.04

Để cho ngắn, từ giờ hãy gọi server của bạn là lamp-1.

Bạn sẽ cần tạo thêm một VPS cho MySQL server riêng của bạn. Ta sẽ gọi server này là mysql-1.

 

Mục tiêu

 

Sau khi hoàn thành hướng dẫn này, database của bạn sẽ được chuyển từ lamp-1 sang một server mới là mysql-1 ,như sau:

Separate Database Server

Các công việc cần làm

 

Để hoàn thành mục tiêu ở trên, ta cần làm 2 việc:

  1. Chuyển database sang server mới .
  2. Cấu hình lại application server để làm việc với database mới.

Chuyển Database ở Server hiện tại sang Server mới

 

Tạo MySQL VPS mới

Ở bước này ta sẽ tạo ra một VPS mới để chứa database là mysql-1. Nếu chưa biết cách cấu hình cơ bản cho một server mới, tham khảo bài viết: Thiết lập ban đầu với server Ubuntu 14.04

Cài đặt và cấu hình MySQL Server

 

Sau khi tạo một database VPS mới, ta sẽ kết nối đến nó để cài đặt MySQL Server.

Trên mysql-1, update apt với lệnh:

sudo apt-get update

Sau đó cài MySQL server:

sudo apt-get install mysql-server

Nhập vào root password để xác nhận quá trình cài đặt ( chính là root password của lamp-1).

Sau đó chạy lệnh sau để tạo ra một bảng mặc định của MySQL:

sudo mysql_install_db

Kết thúc quá trình cài đặt với lệnh:

sudo mysql_secure_installation

Trả lời "no" với yêu cầu reset lại root password và Yes cho mọi yêu cầu khác.

Hiện tại MySQL database được cấu hình để chỉ nghe trên localhost (hay 127.0.0.1 ). Ta cần phải cấu hình lại database server để nghe trên private IP address của nó, vì vậy application server, lamp-1, có thể kết nối đến nó. 

Mở file cấu hình của MySQL:

sudo vi /etc/mysql/my.cnf

Tìm đến dòng bind-address.

bind-address = 127.0.0.1

Thay thế 127.0.0.1 bằng private IP address của database server:

bind-address = mysql_1_private_IP

Chỉnh sửa những cấu hình riêng mà bạn đã cài trên lamp-1 cho khớp, sau đó lưu và đóng file và restart mysql:

sudo service mysql restart

 

Export file Backup của Database gốc

 

Bạn có thể dừng application server để tránh việc thay đổi database trong quá trình dịch chuyển nếu muốn. Mặc dù database chắc chắn sẽ bị khóa lại, nhưng bạn vẫn nên dừng xử lí để đảm bảo không có lỗi xảy ra.

Tiếp theo ta sẽ export ra một bản backup của database gốc, và chuyển nó đến database mới. Trước khi tiến hành dịch chuyển ta cần khóa database.

 Note: Khóa database sẽ chặn tất cả bản ghi lên nó, nên bạn chỉ có thể đọc dữ liệu trên database mà không thể ghi đến khi nó được mở khóa.

Trên lamp-1, vào MySQL console:

mysql -u root -p

Để khóa database trên lamp-1, chạy lệnh sau từ MySQL console:

FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;
EXIT

Export database ra file dump.sql với lệnh:

mysqldump --lock-all-tables -u root -p --all-databases > dump.sql

Copy file dump.sql đến mysql-1, sử dụng lệnh scp:

scp dump.sql user@mysql_1_private_IP:/tmp

Vì không cần sử dụng đến MySQL trên server gốc nữa, ta có thể để nó ở chế độ khóa. Nếu muốn mở khóa database, chạy lệnh sau trên MySQL Console:

SET GLOBAL read_only = OFF;
UNLOCK TABLES;

 

Import Database gốc vào Server mới

 

Trên mysql-1, chạy lệnh sau để dump.sql file:

mysql -u root -p < /tmp/dump.sql

Đến đây, tất cả dữ liệu trong database và user gốc đã được copy đến mysql-1. Bước tiếp theo là tạo một user cho database mới với những quyền tương tự với user ở database gốc.

Tạo các User để Cho phép Kết nối từ Web Application Server

 

Vì MySQL quản lí các user của nó dựa trên username và các hosst pair nguồn,  bạn sẽ phải tạo một user mới với giá trị "host" khớp với private IP address của web server.

Vào MySQL console trên mysql-1:

mysql -u root -p

Dùng lệnh sau để hiển thị các user và host:

SELECT user,host FROM mysql.user;
Example Output:
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| debian-sys-maint | localhost |
| root | localhost |
| wordpressuser | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

Chú ý và user tên wordpressuser với host nguồn là localhost. Giả sử "wordpressuser" là người dùng web. Vì ứng dụng web và database nằm trên hai server riêng biệt, ứng dụng web sẽ không thể kết nối đến "localhost". Ta cần tạo một user mới tên là wordpressuser với giá trị host là private IP address của application server, lamp-1, để cho phép kết nối.

Lệnh sau giúp bạn tạo một user như ở trên đã đề cập. Đảm bảo rằng "password" khớp với mật khẩu của user gốc.

CREATE USER 'wordpressuser'@'lamp_1_private_IP' IDENTIFIED BY 'password';

Với mỗi user muốn tạo, chạy lệnh sau để kiểm tran các quyền được cấp cho user đấy.

SHOW GRANTS FOR wordpressuser@localhost;

Output:
User Privileges

Chú ý vào ( những) dòng nằm sau GRANT USAGE ON *.* vì bạn sẽ chỉnh sửa nó một chút để dùng cho user mới. Ví dụ, dựa trên những quyền của user gốc, ta sẽ chạy lệnh sau để gán quyền cho user mới (ở đây là wordpress ). Dùng lệnh trên nhưng thay localhost thành private IP address của lamp-1:

GRANT ALL PRIVILEGES ON `wordpress`.* TO 'wordpressuser'@'lamp_1_private_IP';

Kiểm tra lại các quyền được cấp cho user mới:

SHOW GRANTS FOR wordpressuser@lamp_1_private_IP;

Output:
User Privileges

Sau khi các lệnh trên chạy đúng, dùng lệnh sau để lưu các thay đổi và thoát khỏi console:

FLUSH PRIVILEGES;
EXIT

 

Update  Cấu hình cho Ứng dụng

 

Bước cuối cùng là update cấu hình cho ứng dụng đẻ trỏ tới database server mới tạo mysql-1). Vị trí file cấu hình cảu mỗi ứng dụng khác nhau là khác nhau tùy thuộc vào quá trình cài đặt ứng dụng, ở đây ta sẽ dùng WordPress làm ví dụ.

Ví dụ về cách cấu hình cho WordPress

 

WordPress lưu những cấu hình cho việc kết nối đến database tại file wp-config.php trong thư mục cài đặt của nó ( ở đây là /var/www/html/ ).

Mở file cấu hình:

sudo vi /var/www/html/wp-config.php

Tìm đến những dòng:

/** MySQL hostname */
define('DB_HOST', 'localhost');

Thay thế localhost bằng private IP address của database server, mysql-1. Sau khi edit ta thu được:

define('DB_HOST', 'mysql_1_private_IP');

Lưu và thoát. Thử kết nối như bình thường ( dùng public IP address hoặc domain name của lamp-1 ). Sẽ không có gì thay đổi trừ việc database của bạn được lưu ở một nơi khác là mysql-1.

Với các ứng dụng khác

 

Với các ứng dụng khác, ta đơn giản chỉ cần lặp lại các bước trên với private IP address hoặc domain name của database server thay cho "localhost" và "127.0.0.1". Tùy vào những ứng dụng khác nhau, bạn có thể sẽ phải restart lại server để lưu thay đổi.

 

Tắt MySQL trên Web Application Server

 

Sau khi việc truy cập đã diễn ra bình thường, ta sẽ tiến hành tắt kết nối trên web server vì nó không cong cần thiết nữa.

Trên lamp-1: chạy những dòng lệnh sau để dừng MySQL và không cho phép nó tự khởi động cùng hệ thống.

sudo service mysql stop
sudo sh -c "echo 'manual' > /etc/init/mysql.override"
 

Tổng kết

 

Giờ thì database server đã được tách khỏi application server, hệ thống của bạn đã có thể xử lí lưu lượng truy cập lớn hơn vì lượng tài nguyên sẵn sàng cung cấp nhiều hơn. Bên cạnh nó cũng sẵn sàng cho các cấu hình nâng cao khác như load balancing( cân bằng tải) và database replication ( nhân bản database server với quan hệ Master- Slave. Xem bài hướng dẫn: Cách cài đặt Master Slave Replication trong MySQL.