Thiết lập HyperDB để mở rộng Database cho WordPress (Phần 1)

2
535

Ở bài viết trước cách đây khá lâu: Mở rộng, chuyển đổi dự phòng, cân bằng tải, và phân vùng cơ sở dữ liệu cho blog WordPress. Mình có đề cập đến mở rộng cơ sở dữ liệu cho WordPress nằm rải rác trên các server – sau này mỗi khi cần mở rộng cơ sở dữ liệu (rất lớn) các bạn chỉ cần thêm máy chủ vào và cấu hình là được.

Tuy nhiên nếu nói về mô hình lớn và yêu cầu uyển chuyển hơn thì các bạn có một lựa chọn đó là MySQL Cluster. Tuy nhiên đó là đối với những hệ thống yêu cầu Database khá lớn và I/O cao. Mình đã sử dụng MySQL Cluster trong một thời gian, thấy cũng khá ổn định nhưng để thiết lập nên một hệ thống MySQL Cluster cũng khá mất thời gian, chưa kể là mình chưa tận dụng được tối đa tính năng và sức mạnh của hệ lưu trữ MySQL Cluster nên thành ra mình đến với HyperDB.

HyperDB là một Plugin của WordPress được phát triển bởi Automattic, đây là công ty sở hữu WordPress.com: Dịch vụ tạo Blog miễn phí và trả phí chuyên nghiệp sử dụng mã nguồn WordPress làm nền tảng. Bạn có thể thấy WordPress.com là một tập hợp các Website con với tên miền phụ kiểu như:

  • blog1.wordpress.com
  • blog2.wordpress.com
  • blog3.wordpress.com

Những miền phụ này nằm trong hệ thống Multisite WordPress. Với hệ thống nhiều site con. Có tới hàng triệu site con cho nên vấn đề đó là phải phân chia các database đồng đều ra các máy chủ phân tán. Và chính WordPress.com cũng sử dụng HyperDB để làm điều này. (Không biết hiện tại họ sử dụng mô hình gì nhưng trước đây là sử dụng HyperDB).

Chính vì thế nên mình xin bắt đầu luôn vào trọng tâm.

Trước tiên là về cấu trúc của Plugin HyperDB:

Plugin có cấu trúc đơn giản (nhỏ nhưng mà có võ) gồm 2 tập tin chính là db.php
db-config.php. Tập tin còn lại là readme.txt thì bạn có thể đọc để biết thêm chi tiết chứ chúng ta không động vào.

Nhưng dẫu sao cũng nên đọc sơ qua, tập tin readme coi có vẻ không cần thiết nhưng nếu bạn nào siêng năng chịu khó tìm hiểu thì sẽ giúp ích cho bạn khá nhiều đấy. Ngày xưa mình nhớ mỗi lần mua đĩa CD về cài Game, lúc mới đầu thấy tập tin này chẳng thèm đọc, cuối cùng cài xong rồi, làm vài “thủ thuật” nho nhỏ để chơi game thì không tài nào làm được. Cuối cùng mở tập tin readme ra mới té ngửa đó là trò đó phải cài trên ổ C thì mới chơi được (lúc đó mình cài trên ổ D mới chết cơ chứ).

Điểm sơ qua một chút thông tin ở file readme.txt.

Như vậy, Plugin này có khả năng giúp chúng ta:

  • Đọc và ghi trên các máy chủ được thiết lập (nhân rộng)
  • Cấu hình ưu tiên để đọc và ghi cơ sở dữ liệu
  • Cho phép thiết lập Trung tâm dữ liệu cục bộ và từ xa (Database)
  • Mạng riêng và mạng công cộng
  • Các bảng khác nhau trên các cơ sở dữ liệu/máy chủ khác nhau: Đối với những Database lớn, nhiều bảng và cũng chứa lượng dữ liệu lớn, HyperDB cho phép cấu hình để chúng ta lưu trữ phân tán các bảng này có thể nằm trên các cơ sở dữ liệu khác nhau, các bảng này cũng có thể nằm trong các cơ sở dữ liệu (database) trên các máy chủ khác nhau, đây là tính năng cần thiết nhất mà mình đề cập đến trong bài viết này.
  • Bài đọc chủ viết thông minh
  • Chuyển đổi dự phòng cho máy chủ lưu trữ bị hỏng (lỡ có máy chủ lưu trữ dabase nào đó bị hỏng, bạn sẽ vẫn còn máy chủ dự phòng được thiết lập trước đó, tránh tình trạng gián đoạn).
  • Thống kê nâng cao cho hồ sơ
  • WordPress Multisite

Về cài đặt:

Không giống như những Plugin khác lắm.

Bạn cấu hình tập tin “db-config.php“. Sau đó chép tập tin này vào thư mục gốc của Website có chứa tập tin “wp-config.php“.

Sau đó chép tập tin db.php vào thư mục /wp-content/ để kích hoạt Plugin, sau này bạn di chuyển tập tin db.php đi chỗ khác hoặc xóa đi thì Plugin sẽ được tắt.

Chú ý: Mọi giá trị của WP_USE_MULTIPLE_DB sẽ bị bỏ qua bởi HyperDB.

Chúng ta chỉ tập trung thiết lập trên tập tin “db-config.php”, bây giờ là các lưu ý:

Ở các mục:

/** Variable settings **/:

$wpdb->max_connections = 10;

Bạn hãy nâng con số này lên thành 20 hay 100 cũng được, con số này là số kết nối cho phép được mở, như vậy con số càng cao thì số kết nối cũng sẽ được tăng lên.

/** Configuration Functions **/

  • $wpdb-> add_database ($database);
  • $database là một mảng kết hợp với các tham số sau:
  • host (bắt buộc) Tên máy chủ với tùy chọn: cổng. Cổng mặc định là 3306.
  • user (bắt buộc) tên người dùng MySQL.
  • password (bắt buộc) mật khẩu người dùng MySQL.
  • name (bắt buộc) tên cơ sở dữ liệu MySQL.
  • read (tùy chọn) Cho dù máy chủ có thể đọc được hay không. Mặc định là 1 (có thể đọc được). Cũng được sử dụng để gán tùy chọn. Xem “Cấu trúc liên kết mạng”.
  • write (tùy chọn) Cho dù máy chủ có thể ghi được. Mặc định là 1 (có thể ghi). Cũng được sử dụng để gán tùy chọn trong chế độ đa chủ.
  • dataset (tùy chọn) Tên tập dữ liệu. Mặc định là ‘global’.  Các bạn chú ý mục này là thiết lập quan trọng. HyperDB quản lý các bảng bằng cách ánh xạ (mapping) các tên bảng (có thể trên một hoặc nhiều database) thành datasets (các bộ dữ liệu).
  • timeout (tùy chọn) Giây để chờ phản hồi TCP. Mặc định là 0,2
  • lag_threshold (tùy chọn) Độ trễ tối thiểu trên node slave tính bằng giây trước khi chúng ta xem xét độ trễ. Để trống để vô hiệu hóa. Khi không được đặt, giá trị của $wpdb-> default_lag_threshold sẽ được sử dụng. Cái này bạn để mặc định, không cần động vào làm gì.

/** Masters and slaves

Master và Slave ở đây đóng vai trò như là một node chính hay phụ. Cũng có thể coi một node là chính và một node là phụ. Node chính là để ghi dữ liệu, node phụ thì sao chép cơ sở dữ liệu trên Node chính và chỉ để đọc chẳng hạn, như vậy sẽ cải thiện hiệu suất (đọc nhanh chóng hơn).

Hoặc có thể node chính là để mỗi khi truy xuất dữ liệu thì ưu tiên trên node chính (Master) khi nào node chính bị lỗi hay gặp sự cố thì lại đọc và ghi dữ liệu trên Node phụ (Slave). Cái này tùy theo cách các bạn cấu hình thế nào mà thôi. Ở đây mình có nói đến node. Các bạn hiểu node ở đây có nghĩa là nút chứa đựng cơ sở dữ liệu. Nó có thể là một VPS, Dedicated hay đơn thuần là máy tính có hệ Mysql để lưu trữ cơ sở dữ liệu hoặc cũng có thể là một Database.

Đi kèm với các nút Master và slave có cấu hình với “write” và “read“. “write” là ghi (được phép ghi dữ liệu lên đó) và “read” là đọc (chỉ được phép đọc, không có quyền ghi).

Nút Database chính có thể được thiết lập vừa được ghi và đọc:
‘write’ => 1,
‘read’ => 1,
Giả sử như thiết lập là:
‘write’ => 1,
‘read’ => 0,
có nghĩa là không được ghi nhưng có quyền đọc.
Trong khi đó trên nút Slave (nút phụ – cũng có thể là Database phụ):
‘write’ => 0,
‘read’ => 1,
Vì write là 0 lên không được phép ghi, read là 1 nên được phép đọc nhưng không được ghi.

Tương tự như vậy, đối với hệ thống nhiều node, bạn cũng có thể thiết lập sự ưu tiên để đọc hay ghi. Chẳng hạn chúng ta có mô hình như sau:

  • Local slave 1: ‘write’ => 0, ‘read’ => 1, (không ghi chỉ đọc)
  • Local slave 2: ‘write’ => 0, ‘read’ => 1, (không ghi, chỉ đọc)
  • Local master: ‘write’ => 1, ‘read’ => 2, (được ghi, được đọc nhưng priority là 2, tức là đọc sau local slave 1 và local slave 2)
  • Remote slave 1: ‘write’ => 0, ‘read’ => 3, (không ghi, chỉ đọc nhưng priority là 3 tức là đọc sau local slave 1, local slave 2 và cả local master)
  • Remote slave 2: ‘write’ => 0, ‘read’ => 4, (không ghi, chỉ đọc nhưng priority là 4 tức là đọc sau local slave 1, local slave 2 và cả local master, remote slave 1).

Như vậy “0” có nghĩa là tắt. 1, 2, 3, 4 là thông số priority. Giống như khi bạn thiết lập chỉ số priority của Email với các máy chủ nhận thư vậy.

Ở trên đây là sơ đồ minh họa cho các thông số thiết lập ở trên.

Chúng ta đến với thiết lập cơ bản khi bạn chưa sử dụng đến các tính năng mở rộng cho Database:

/** Sample Configuration 1: Using the Default Server **/
/** NOTE: THIS IS ACTIVE BY DEFAULT. COMMENT IT OUT. **/

/**
 * This is the most basic way to add a server to HyperDB using only the
 * required parameters: host, user, password, name.
 * This adds the DB defined in wp-config.php as a read/write server for
 * the 'global' dataset. (Every table is in 'global' by default.)
 */
$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,
));

/**
 * This adds the same server again, only this time it is configured as a slave.
 * The last three parameters are set to the defaults but are shown for clarity.
 */
$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,
));

Ở các mục thiết lập như ở trên, bạn hoàn toàn dễ dàng cấu hình như cấu hình một kết nối đến database cho các script. Chủ yếu là các thông số:

‘user’ => DB_USER,                          // user database
‘password’ => DB_PASSWORD,     //password đã tạo cho user
‘name’ => DB_NAME,                      //tên database
‘write’ => 0,                                       //cho phép ghi trên cơ sở dữ liệu (0- tắt hoặc 1- bật)
‘read’ => 1,                                        //cho phép đọc trên cơ sở dữ liệu (1, 2, 3…)
‘dataset’ => ‘global’,                        // tên cho dataset
‘timeout’ => 0.2,                              // thời gian timeout.

Như vậy cấu hình xong có thể chúng ta có một ví dụ thế này cho site 1 site sử dụng 1 database:

$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,
));

/**
 * Sau đây là chúng ta thêm một server, thiết lập như là một slave.
 * 3 tham số cuối cùng để như mặc định (read, dataset, timeout).
 */
$wpdb->add_database(array(
	'host'     => 192.168.2.68 //IP của máy chủ cơ sở dữ liệu, đay là IP LAN, thay thế bằng IP WAN nếu kết nối ra bên ngoài mạng LAN nếu port của máy chủ cơ sở dữ liệu khác 3306, sử dụng host:port.
	'user'     => vngeek_admin,
	'password' => password,
	'name'     => vngeek_database2,
	'write'    => 0,
	'read'     => 1,
	'dataset'  => 'global',
	'timeout'  => 0.2,
));

Như vậy là xong một phần tìm hiểu sở lược cơ bản về HyperDB.

Xin mời các bạn tiếp tục theo dõi phần 2.

2 BÌNH LUẬN

BÌNH LUẬN

Please enter your comment!
Please enter your name here