Tối đa hiệu suất của WordPress với MySQL Replication trên Ubuntu 14.04

2 năm trước

 

Giới thiệu

Bài viết này sẽ hướng dẫn bạn cách mở rộng MySQL database server của WordPress sử dụng master-slave database replication và HyperDB. Việc thêm nhiều database server giúp cho WordPress có thể đọc dữ liệu từ nhiều database server giúp tăng hiệu suất đọc.

MySQL replication mang đến hiệu quả cao nhất cho một hệ thống đọc nhiều hơn ghi như WordPress. Bằng cách sử dụng một single-master đi kèm với nhiều slave, bạn có thể thêm vào các slave server đến khi hết băng thông hoặc vượt quá khả năng xử lí của Master server. Để thêm nhiều hơn một băng thông, hãy lặp lại bước thêm vào slave database.

Giả sử quá trình cài đặt bao gồm 2 WordPress application server cân bằng tải, được kết nối với một MySQL database server riêng biệt.Việc hai application server phải cân bừng tải không bắt buộc, nhưng MySQL database server cần phải tách biệt với application server.

 

Yêu cầu

Ban cần biết:

  • Cách thiết lập Remote Database để tối ưu hiệu năng trang web với MySQL
  • Cách sử dụng HAProxy như một Layer 4 Load Balancer( bộ cân bằng tải trên tầng 4- Network Layer) cho WordPress Application Server trên Ubuntu 14.04 (không bắt buộc)

Để bắt đầu, ta cần 1 HAProxy server, 2 WordPress application server và một WordPress Database server với 4 VPS khác nhau. Để cho tiện hãy kí hiệu 4 server này như sau:

  • haproxy-www:  HAProxy server để Layer 4 load balancing WordPress web application server. 
  • wordpress-1:  WordPress web application server đầu tiên
  • wordpress-2:WordPress web application server thứ hai
  • mysql-1: MySQL database Server cho WordPress

Sơ đồ sẽ như sau

WordPress and Separate MySQL Database Server

Bên cạnh đó ta sẽ thêm vào một VPS nữa:

  • mysql-2: Slave MySQL database server
 

Mục tiêu

Sau khi hoàn tất quá trình cài đặt dưới đây, bạn sẽ có:

  • Hai database servers ,một master và một slave.
  • WordPress sẽ chỉ ghi dữ liệu trên master server và đọc dữ liệu từ cả slave và master server sử dụng plugin HyperDB của WordPress.

Master-Slave Database Replication

Chú ý rằng hai application server (wordpress-1/wordpress-2) không cần thực sự cân bằng tải, việc cân bằng tải giữa các database server chỉ có tác dụng phân chia đều công việc cho chúng để tránh quá tải. Bạn cũng có thêm thêm nhiều slave server nếu muốn.

 

Thiết lập MySQL Master-Slave Replication

 

Tạo MySQL Slave VPS, mysql-2

Bạn sẽ cần tạo một VPS mới sẽ đóng vai trò làm MySQL slave server - ta sẽ gọi server này mysql-2. Các slave server sẽ được cấu hình để sao chép tất cả dữu liệu trong database của MySQL master server, bao gồm cả database của WordPress.

Trên mysql-2, cài MySQL:

sudo apt-get update
sudo apt-get install mysql-server

Nhập vào root password để hoàn tất quá trình cài đặt.

Cấu hình một MySQL Server có sẵn thành một Master Server

 

Trên mysql-1, edit file cấu hình của MySQL:

sudo vi /etc/mysql/my.cnf

Tìm đến 3 dòng sau

bind-address = mysql_1_private_IP#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
  • bind-address: địa chỉ IP MySQL sẽ nghe. Thường là private IP address của mysql-1
  • server-id: ID riêng của server. Ở đây ta sẽ đặt giá trị cho nó bằng 1 rồi uncomment( xóa dấu # để dòng lệnh được chạy) dòng này.
  • log_bin: Vị trí của file log nhị phân. Uncomment dòng này.

Sau khi edit:

bind-address = mysql_1_private_IPserver-id = 1
log_bin = /var/log/mysql/mysql-bin.log

 

Nếu muốn cấm bản sao truy cập vào database wordpress , thêm dòng này vào file cấu hình, thay wordpress thành tên server của bạn.

binlog_do_db = wordpress

Lưu và thoát, xong đó khởi động lại MySQL:

sudo service mysql restart

Vào MySQL console bằng lệnh:

mysql -u root -p

Nhập vào mật khẩu root.

Tạo một user dùng riêng để sao chép dành cho slave server tên là repl. Thay repl_passwordbằng mật khẩu của bạn. Dấu % nghĩa là source IP của user có thể là bất cứ thứ gì, tuy nhiên bạn cũng có thể thêm vào sau nó private IP address of your slave MySQL server, mysql-2, để cấm truy cập từ user này đến server đó.

CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

Giữ nguyên và không thoát khỏi console!

Export một file Backup của MySQL Master Server

 

Để xuất database trong master server ra một file backup, đầu tiên ,trên MySQL console của mysql-1 chạy lệnh:

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

Chạy lệnh sau trên console của Master MySQL server để xuất database ra file masterdump.sql:

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

Copy masterdump.sql đến slave server, mysql-2, sử dụng lệnh scp:

scp masterdump.sql user@mysql_2_private_IP:/tmp

Chuyển đến console của mysql-1 rồi gõ:

mysql -u root -p

Sau đó mở khóa database:

SET GLOBAL read_only = OFF;
UNLOCK TABLES;

In ra trang thái của Master Server:

SHOW MASTER STATUS;
Output:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 408 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Chú ý vào các giá trị File và Position, vì ta sẽ cần chúng để cấu hình slave server.

 

Cấu hình MySQL Slave Server

 

Trên mysql-2, import file masterdump.sql với lệnh:

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

Tiếp theo, ta sẽ cấu hình mysql-2 thành một slave. Trên mysql-2, edit file cấu hình MySQL:

sudo vi /etc/mysql/my.cnf

Tìm đến hai dòng sau:

bind-address = 127.0.0.1
#server-id = 1
  • bind-address: địa chỉ IP MySQL sẽ nghe. Đựt giá trị này thành private IP address của mysql-2
  • server-id: Thay giá trị thành 2 và uncomment dòng này.

Sau khi edit, ta sẽ thu được:

bind-address = mysql_2_private_IPserver-id = 2

Lưu và thoát. Restart MySQL để các thay đổi có hiệu lực:

sudo service mysql restart

Vào MySQL console:

mysql -u root -p

Tiếp theo ta sẽ kết nối slave với master. Để làm việc này cần các lệnh sau:

  • MASTER_HOST:chuyển thành mysql-1's private IP
  • MASTER_USER: chuyển thành user đưuọc tạo cho việc sao chép, ở đây là repl
  • MASTER_PASSWORD: Password của user ở trên.
  • MASTERLOGFILE: đổi thành giá trị "File" trong ouput của lệnh SHOW MASTER STATUS; trên Master MySQL server.
  • MASTERLOGPOS: đổi thành giá trị "Position" trong ouput của lệnh SHOW MASTER STATUS; trên Master MySQL server.

Tập lệnh hoàn chỉnh như sau:

CHANGE MASTER TO
MASTER_HOST='mysql_1_private_IP',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=408;

Sau khi các lệnh đã đưuọc chạy thành công, khởi tạo kết nối đến slave với lệnh:

START SLAVE;

Kiểm tra lại với lệnh:

SHOW SLAVE STATUS\G
 

Chặn quyền ghi từ Slave User

 

Đây là một tùy chọn vì plugin HyperDB có thể được cấu hình để chỉ đọc mà không ghi vào slave database server của bạn. Tuy nhiên, việc này giúp database không bị thay đổi khi bạn lỡ ghi ứng dụng vào slave server chẳng hạn.

Trên mysql-2, chạy lệnh sau trên console để hiển thị danh sách user:

SELECT user,host FROM mysql.user;
Output:
+------------------+----------------+
| user | host |
+------------------+----------------+
| repl | % |
| wordpressuser | wordpress_1_IP |
| wordpressuser | wordpress_2_IP |
...

Xem các quyền được cấp cho một user cụ thể với lệnh:

SHOW GRANTS FOR wordpressuser@wordpress_1_IP;

Ở đây, ta có một wordpressuser cho mỗi WordPress server, nên ta sẽ chặn quyền insertupdate, và delete từ chúng ("wordpress" là tên của database trong ví dụ):

REVOKE INSERT, UPDATE, DELETE ON wordpress.* FROM 'wordpressuser'@'wordpress_1_private_IP';
REVOKE INSERT, UPDATE, DELETE ON wordpress.* FROM 'wordpressuser'@'wordpress_2_private_IP';
FLUSH PRIVILEGES;

Đến đây quá trình thiết lập MySQL Replication đã hoàn tất.

 

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

 

Tải về HyperDB từ kho plugin của WordPress, sau đó giải nén file vừa tải về.

cd ~; wget http://downloads.wordpress.org/plugin/hyperdb.zip
sudo apt-get install zip
unzip hyperdb.zip

File giải nén sẽ có tên là "hyperdb", nằm trong thư mục gốc. Copy file cấu hình gốc vào thư mục cài đặt của WordPress, rồi mở nó để edit.

cp ~/hyperdb/db-config.php /var/www/example.com/
vi /var/www/example.com/db-config.php

Tìm đến lần xuất hiện thứ hai của DB_HOST, trông giống hệt như sau:

$wpdb->add_database(array(
'host' => DB_HOST, // If port is other than 3306, use host:port.
'user' => DB_USER,
'password' => DB_PASSWORD,
'name' => DB_NAME,
'write' => 0,
'read' => 1,
'dataset' => 'global',
'timeout' => 0.2,
));

Lần đầu tiên ta bắt gặp DBHOST nó biểu diễn master database server, và lần tiếp theo là của slave database server ( do có 'write' => 0,). Thay thế 'DBHOST' thành 'DB_SLAVE_1'

 'host' => DB_SLAVE_1, // If port is other than 3306, use host:port.

Lưu và thoát.

Mở file wp-config.php để edit:

vi /var/www/example.com/wp-config.php

Tìm dòng chứa DB_HOST rồi thêm vào bên dưới nó dòng cấu hình dưới đây:

define('DB_SLAVE_1', 'mysql_2_private_IP');

Lưu và thoát.

Kết thúc quá trình cài đặt bằng cách copy file db.php vào thư mục wp-content trong thưu mcuj cacif đặt WordPress, sau đó cấm quyền truy cập vào nó.

cp ~/hyperdb/db.php /var/www/example.com/wp-content/
sudo chmod a-w /var/www/example.com/wp-content/db.php

Sau đó update quyền sở hữu các file WordPress với các giá trị của chúng. Ở ví dụ này ta sử dụngwww-data :

sudo chown -R www-data:www-data /var/www/example.com/

 

Tổng kết

 

Bạn đã cài đặt và cấu hình thành công MySQL replication cùng với HyperDB trên hệ thống của mình. Giờ đây bạn có thể mở rộng hệ thống bằng việc thêm vào các slave server, giúp cho quá trình truy xuất dữ liệu nhanh và thuận lợi hơn.