Đồ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.
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
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ộ.
Đồ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!
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 user
backup được tạo ở bước trên
root@node2# scp /root/rsync/mirror-rsync-key.pub backup@172.16.1.1:/home/backup
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
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é .
Để đả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
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
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/
Ở đ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.txt:
root@node1# touch /var/www/html/kiemtra.txt
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
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
Theo: khanh.com.vn