Đồng bộ dữ liệu giữa các Node trong mô hình Web Cluster

I – Giới thiệu:

Ở bài trước, mình có trình bày Cấu hình Web Cluster giúp tăng tính sẵn sàng cho hệ thống Web Server của chúng ta. Tuy nhiên, nếu một Node trong hệ thống Cluster “chết”, sau một thời gian sau Node đó “sống” trở lại thì dữ liệu trên Node không còn nhất quán với các Node còn lại nữa!. Trong bài này, mình sẽ tiếp tục trình bày về đồng bộ dữ liệu giữa các Node trong mô hình Web Cluster.

cluster_sync_0


Yêu cầu:

  • 2 Server làm Web Server với dịch vụ httpd (Ở đây mình dùng CentOS 5.6)
  • Đã thực hiện cấu hình Web Cluster.

Chú ý: Bài này mình trình bày về đồng bộ dữ liệu chứa trên các thư mục của Web Server (ví dụ: hình ảnh, tệp tin âm thanh,…). Để có được mô hình đẩy đủ hơn, chúng ta có thể tiến hành thiết lập đồng bộ Cơ Sở Dữ Liêu của các Web Server này, bạn có thể tham khảo bài viết Đồng bộ dữ liệu trên 2 Database Server sử dụng MySQL Server, sử dụng kĩ thuật MySQL Replication.

II – Cài đặt gói rsync và test đồng bộ:

Trên cả 2 Node, tiến hành cài đặt các gói rsync

#yum install rsync

Tạo một user dùng để 2 Node xác thực trong quá trình đăng nhập đồng bộ dữ liệu. Ở Node1 mình tạo một user với tên là backup

#root@node1# useradd backup
#root@node1# passwd backup


cluster_sync_1

Trên Node2 mình sẽ thử đồng bộ bằng tay để xem các gói rsync đã cài đặt đúng hay chưa.

root@node2# rsync –avz –e ssh backup@172.16.1.1:/var/www/html/ /var/www/html/

Trong đó:
  • backup là user đã tạo ở Node1.
  • 172.16.1.1 là IP của Node1.
  • /var/www/html/ là 2 thư mục cần đồng bộ.

cluster_sync_2

Đồng bộ dữ liệu từ Node1 qua Node2 thành công!. Ta kiểm tra 2 thư mục /var/www/html/ ở Node1 và Node2 thì thấy chúng có nội dung giống nhau.


III – Tạo SSH-Key và lập lịch tự động đồng bộ:


Trên Node2, tiến hành tạo Key

root@node2# mkdir /root/rsync
root@node2# ssh-keygen –t dsa –b 1024 –f /root/rsync/mirror-rsync-key


Ở đây bạn sẽ được yêu cầu nhập passphrase 2 lần. Hãy nhập passphrase trắng cả 2 lần!
cluster_sync_3

Sau khi tạo Key xong, tiến hành chuyển Key này tới cho Node1. Chúng ta sẽ đưa key vào mục home của userbackup được tạo ở bước trên

root@node2# scp /root/rsync/mirror-rsync-key.pub backup@172.16.1.1:/home/backup

cluster_sync_4

Trở lại Node1, ta tiến hành chuyển qua thao tác trên user backup:

backup@node1# mkdir ~/.ssh
backup@node1# chmod 700 ~/.ssh
backup@node1# mv ~/mirror-rsync-key.pub ~/,ssh/
backup@node1# cd ~/.ssh
backup@node1 .ssh# touch authorized_keys
backup@node1 .ssh# chmod 600 authorized_keys
backup@node1 .ssh# cat mirror-rsync-key.pub >> authorized_keys


cluster_sync_5

Tiến hành mở file authorized_keys lên
backup@node1 .ssh# vi authorized_keys

Thêm vào trước nội dung có sẵn của file authorized_keys nội dung sau:

command="/home/backup/rsync/checkrsync",from="172.16.1.2",no-port-forwarding,no-X11-forwarding,no-pty ssh-dss

Chú ý: Có khoảng trắng giữa đoạn mới thêm với đoạn nội dung có sẵn của file authorized_keys nhé Smile.

cluster_sync_6

Để đảm bảo hệ thống được an toàn khi thực các lệnh bởi user backup. Chúng ta nên cấm tất các các câu lệnh ngoại trừ rsync trên user này.

backup@node1# ~/rsync
backup@node1# vi ~/rsync/checkrsync


Tạo thêm nội dung dưới đây cho file checkrsync

case "$SSH_ORIGINAL_COMMAND" in
*\&*)
echo "Rejected"
;;
*\(*)
echo "Rejected"
;;
*\{*)
echo "Rejected"
;;
*\;*)
echo "Rejected"
;;
*\<*)
echo "Rejected"
;;
*\'*)
echo "Rejected"
;;
rsync\ --server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Rejected"
;;
esac


cluster_sync_7

Sau đó lưu file checkrsync lại và chmod nó ở 700

#chmod 700 ~/rsync/checkrsync
Bây giờ, trên Node2 ta sẽ kiểm tra lại sự đồng bộ dữ liệu đăng nhập bởi user backup có sử dụng SSH-Key

root@node2# rsync -avz --delete --exclude=**/stats --exclude=**/error -e "ssh -i /root/rsync/mirror-rsync-key" backup@172.16.1.1:/var/www/html/ /var/www/html/

Trong đó:
  • delete: Khi file được xóa trên Node1 thì nó cũng sẽ được xóa trên Node2
  • exclude: Loại ra các thư mục không muốn đồng bộ. Ví dụ ở trên mình loại ra các thư mục như /stats và /error

cluster_sync_8

Nếu có kết quả đồng bộ đại loại như hình trên thì bạn đã cấu hình thành công!. Bây giờ ta sẽ tiến hành lập lịch đểNode2 tự động đồng bộ dữ liệu giống như Node1.

root@node2# crontab –e

Thêm vào nội dung như bên dưới rồi tiến hành lưu lại:

*/1 * * * * /usr/bin/rsync -azq --delete --exclude=**/stats --exclude=**/error -e "ssh -i /root/rsync/mirror-rsync-key" backup@172.16.1.1:/var/www/html/ /var/www/html/

cluster_sync_9

Ở đoạn lệnh trên mình đã lập lịch Node2 cứ một phút thì nó lại tiến hành đồng bộ dữ liệu với Node1. Chúng ta tiến hành kiểm tra đơn giản như sau.

Trên Node1, tạo một file kiemtra.txtroot@node1# touch /var/www/html/kiemtra.txt

cluster_sync_10

Trên Node2, ta tiến hành kiểm tra lại thư mục /var/www/html/ thì thấy file kiemtra.txt đã xuất hiện Open-mouthed smile

cluster_sync_11

IV – Đồng bộ dữ liệu qua lại giữa 2 Node:

Ở các bước cấu hình trên, mình đã thiết lập được quá trình đồng bộ dữ liệu từ Node1 tới Node2. Kiểu thiết lập này nhằm mục đích backup lại dữ liệu ở Node chính. Tuy nhiên, nếu Node1 bị chết, Node2 thay thế để đáp ứng nhu cầu Web cho Client và khi Node1 được phục hồi thì dữ liệu của chúng ta sẽ không còn nhất quán nữa! (dữ liệu không thể đồng bộ từ Node2 tới Node1). Để khắc phục điều này, chúng ta sẽ tiến hành tương tự như trên, nhưng ngược lại đối với 2 Node! Node1 sẽ đồng bộ dữ liệu trên Node2!

Mô hình Backup: Node1 -----> Node2

Mô hình đồng bộ trên 2 Node: Node1 <---------> Node2

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

Source: khanh.com.vn

 
2012 upshell | Header Image by Game Wallpapers
Avatar Gamezine Designed by Cheapest Tablet PC
Supported by Phones 4u