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

0
2185
(Last Updated On: Th5 8, 2014)

Chào các bạn, một ngày mới lại bắt đầu và khi ngồi rảnh không có việc gì để làm thì mình xin viết mấy bài viết chia sẻ kiến thức WordPress cho các bạn. Hì nói là chia sẻ chứ thật ra có lẽ nhiều bạn biết rồi nên nếu có gì sai xót hay bổ sung xin các bạn Comment ở dưới để mình rút kinh nghiệm. Xin thứ lỗi trước nếu đắc tội với các bậc tiền bối.

Hẳn là các bạn đã gặp vấn đề Website bạn chạy chậm rì hay là Post bài rất là lâu. Cũng như là độ phản hồi rất chậm. Nói chung là do nhiều nguyên nhân lắm.

  • Do máy chủ chạy website WordPress của bạn không đủ mạnh hay cấu hình tương đối như CPU yếu, RAM thấp, đóng vai trò cũng rất quan trọng là tốc độ ổ cứng của server nữa.
  • Do các bạn cài quá nhiều Plugins của WordPress
  • Giao diện trang web của bạn, một số giao diện Load rất nhiều CSS hay JS Script, nhưng giao diện lại không ảnh hưởng tới tốc độ Post bài trên wordpress.
  • …còn rất nhiều nguyên nhân sâu xa gây ảnh hưởng tới tốc độ của bạn

Hồi trước đây, khi mà thời Forum VBulletin còn phát triển mạnh ở Việt Nam, mình còn nhớ lúc đó các website đều lựa chọn mã nguồn này, ở trang chủ là Content CMS, còn ở trang Forum là để trao đổi thảo luận ở các thành viên.

Lỗi này có lẽ gặp nhiều ở các Forum VBB

Tuy nhiên đối với WordPress thì lại khác, ngoài sử dụng Mysql Cluster trong một số bài viết mình đã cập nhật trên website này (các bạn có thể search từ khóa mysql cluster vào khung tìm kiếm để tìm hiểu thêm nhé). Thì các bạn có thể sử dụng một Plugin đi kèm theo đó được viết dành riêng cho site WordPress nhằm tăng khả năng dự phòng và cân bằng tải, trong đó có một tính năng rất hay đó là partitioning giúp phân vùng cho cơ sở dữ liệu của bạn.

hyperdb
Plugin Hyper DB cho WordPress

Đó là Plugin HyperDB của WordPress. Theo giới thiệu của tác giả thì nó có khả năng

  • nhân rộng
  • chuyển đổi
  • dự phòng
  • cân bằng tải
  • phân vùng

Và nó cho phép người dùng:

  • Đọc và ghi dữ liệu lên các máy chủ (sao chép giống nhau)
  • Ưu tiên cấu hình để đọc và ghi dữ liệu (ưu tiên nút dữ liệu nào chuyên để đọc và ghi dữ liệu)
  • Trung tâm dữ liệu Local và từ xa (sử dụng máy chủ database trên server local và các server khác)
  • Mạng dữ liệu cá nhân và công cộng (Kiểu như Private và Public ấy mà)
  • Các bảng khác nhau trên cơ sở dữ liệu khác nhau / hosts (Cái này có nghĩa là các bảng trong cơ sở dữ liệu của WordPress có thể nằm trên các Database khác nhau và các Database này có thể nằm trên các Server khác nhau, ví dụ như bảng wp_comments nằm trên database web trên server 1, còn bảng  wp_posts nằm trên database blog trên server 2 chẳng hạn)
  • Database server đọc và ghi chính (Có thể có Database server chuyên để đọc và ghi thì trên nhiều server. Bởi vì đọc thì lượng hao tốn máy chủ rất thấp cũng như sử dụng IO của ổ cứng thấp không giống như ghi dữ liệu cho nên khi ghi dữ liệu thì phân chia ra).
  • Chuyển đổi dự phòng cho máy chủ bị hỏng (Giả sử có 2 database server chứa cùng một cơ sở dữ liệu giống nhau, một cái là Master, một cái là Slave, khi cái Master chẳng hạn bị sự cố cúp điện hay đường truyền kết nối bị đứt, nó sẽ tự động điều hướng đến database server Slave, và làm cho trang web vẫn hoạt động chứ không hiển thị lỗi Error Establishing a Database Connection)
  • Thống kê (báo cáo lại trong file log như tình trạng hoạt động, server nào có lỗi)
WordPress-with-HyperDB.png (570×360)
Minh họa sử dụng HyperDB thay thế cho Default DB của WordPress

Dưới đây là file db-config.php mà các bạn sẽ cấu hình với ý muốn của bạn, ở dòng thứ 239 trở đi là một ví dụ để bạn partitioning cơ sở dữ liệu của bạn.

partitioning-hyperdb
Partitioning trong HyperDB – Plugin WordPress

Tất nhiên là mình cũng có một file cấu hình phần Partitioning mà các bạn có thể tham khảo:

$wpdb->add_database(array(
	'host' => DB_HOST,
	'user' => DB_USER,
	'password' => DB_PASSWORD,
	'name' => 'wordpressdb_blog1',
	'dataset' => 'blog1',
));
$wpdb->add_database(array(
	'host' => DB_HOST,
	'user' => DB_USER,
	'password' => DB_PASSWORD,
	'name' => 'wordpressdb_blog2',
	'dataset' => 'blog2',
));
$wpdb->add_database(array(
	'host' => DB_HOST,
	'user' => DB_USER,
	'password' => DB_PASSWORD,
	'name' => 'wordpressdb_blog3',
	'dataset' => 'blog3',
));
$wpdb->add_database(array(
	'host' => DB_HOST,
	'user' => DB_USER,
	'password' => DB_PASSWORD,
	'name' => 'wordpressdb_blog4',
	'dataset' => 'blog4',
));
$wpdb->add_callback('blogs_db_callback');
function blogs_db_callback($query, $wpdb) {
	/* distribute blog databases into 4 shards */
	if ( preg_match("/^{$wpdb->base_prefix}\d+_/i", $wpdb->table) ){
		$arr = array();
		/* get blog_id*/
		preg_match_all("/^{$wpdb->base_prefix}(\d+)/i", $wpdb->table, $arr, PREG_PATTERN_ORDER);
		$blog_id = isset($arr[1][0])?$arr[1][0]:1;
 
		if($blog_id<1000){ // in case you want to add more datasets, you can use these conditions to add more without destroying the old ones... (you have to add more $wpdb->add_database for the other datasets)
			$blogDbToUse = ($blog_id%4)+1;
			return 'blog'.$blogDbToUse;
		}elseif($blog_id<2000){
			$blogDbToUse = ($blog_id%4)+1;
			return 'blog_added_dataset'.$blogDbToUse;
		}else{
			$blogDbToUse = ($blog_id%4)+1;
			return 'blog_another_added_dataset'.$blogDbToUse;
		}
	}
}

Đây là cấu hình mà phân vùng cơ sở dữ liệu trên 4 database của trang web sử dụng BuddyPress + WordPress Multisite. Hoạt động 1000 khách hàng đầu tiên sẽ được ghi trên cơ sở dữ liệu wordpressdb_blog1 tương tự 1000 khách hàng tiếp theo với các cập nhật, bài viết hay các thông tin sẽ được ghi trên wordpressdb_blog2. Việc của bạn là thêm database vào, giống như là thêm một máy chủ khác, tương tự như việc thêm một máy ở quán nét nếu quán đã hết máy mà có khách vào chơi vậy.

Chúc các bạn thành công.

Quý Phát

Bình luận