1. Rsync:
Với sự trợ giúp của rsync, bạn có thể đồng bộ dữ liệu trên local hoặc giữa các server với nhau một cách dễ dàng. Nó nổi tiếng nhờ thuật toán delta-copy (tức chỉ copy phần khác nhau) làm giảm số lượng dữ liệu gửi qua mạng bằng cách gửi chỉ những khác biệt giữa các tập tin nguồn và các tập tin hiện tại đích đến.
Rsync có 2 mode, 1 là dùng như lệnh copy bình thường, 2 là chạy deamon (hay gọi là service). Rsync daemon mặc định bind đến cổng 873. Khi chạy ở daemon mode, rsync có thể hoạt động giống 1 ftp server, tức cho phép download file public. Config rsync daemon được thực hiện trong file rsyncd.conf.
Một số đặc điểm:

Rsync đồng bộ hóa 2 nơi bằng cách copy dữ liệu theo dạng block (mặc định) chứ không copy theo dạng file (có option riêng hỗ trợ) , nên tốc độ được cải thiện nhiều khi áp dụng với file, thư mục có dung lượng lớn.
Rsync cho phép mã hóa dữ liệu trong quá trình transfer sử dụng ssh, nên quá trình này được bảo mật.
Rsync cho phép tiết kiệm băng thông bằng phương pháp nén dữ liệu ở nguồn và giải nén ở đích, tuy nhiên việc này tốn thêm 1 lượng thời gian đáng kể. (tham số -z)
Một điểm đặc biệt của rsync là cho phép giữ nguyên được tất cả các thông số của thư mục và file (sử dụng tham số -a) : Recursive mode, Symbolic links, Permissions, TimeStamp, Owner và group Rsync không yêu cầu quyền super-user.
Cách đồng bộ realtime với rsync:
Trước hết, ta chuẩn bị sẵn 2 server: 192.168.13.220 và 192.168.13.221 (nhớ allow port 837 trên firewall nhé)

Cài gói rsync, xinetd trên cả 2 server (rsync thì để đồng bộ rồi. còn xinetd là để chạy rsync dưới dạng daemon) $ apt-get install xinetd rsync

update-rc.d: warning: default stop runlevel arguments (0 1 6) do not match rsync Default-Stop values (none)
System start/stop links for /etc/init.d/rsync already exist.
Setting up libfile-copy-recursive-perl (0.38-1) …
Setting up update-inetd (4.43) …
Setting up xinetd (1:2.3.15-3ubuntu1) …
xinetd start/running, process 22027
Processing triggers for ureadahead (0.100.0-16) ..
Ta config rsync. $ sudo vi /etc/default/rsync -> thay dòng: RSYNC_ENABLE=false thành RSYNC_ENABLE=true

Tạo file rsyncd.conf trong /etc

lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid

[data] path = /home/cuongtv
uid = root
gid = root
read only = no
hosts allow = 192.168.13.220/255.255.255.0
Run rsync : $ /etc/init.d/rsync start. Starting rsync daemon: rsync.

Và làm ở server thứ 2 cũng các bước trên. ok. ta test thử:

root@cap2:/home/cuongtv/rsync# ll
total 8
drwxr-xr-x 2 root root 4096 Jan 27 01:42 ./
drwxr-xr-x 6 cuongtv cuongtv 4096 Jan 27 01:42 ../
-rw-r–r– 1 root root 0 Jan 27 01:42 a.txt

ifconfig
eth0 Link encap:Ethernet HWaddr
inet addr:192.168.13.220 Bcast:192.168.13.255 Mask:255.255.255.0
Ta thực hiện rsync $rsync -avz –progress –delete /home/cuongtv/rsync/ rsync://192.168.13.220/data

a.txt
0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/3)

sent 149 bytes received 38 bytes 374.00 bytes/sec
total size is 0 speedup is 0.00
Trên sv 192.168.13.221 kiểm tra xem folder đã được đồng bộ hay chưa.

root@cap3:/home/cuongtv/rsync# ll
total 8
drwxr-xr-x 2 cuongtv cuongtv 4096 Jan 27 01:42 ./
drwxr-xr-x 5 cuongtv cuongtv 4096 Jan 27 02:59 ../
-rw-r–r– 1 cuongtv cuongtv 0 Jan 27 01:42 a.txt
Vậy là đã đồng bộ được. Nhưng chưa có tính tự động và realtime. Giờ mình sẽ cấu hình thêm 1 vài bước nữa để có thể tự trao đổi với nhau nhé. Về cơ bản, ý tưởng là tạo script cho rsync giữa 2 server liên tục. Và dùng crontab để thực hiện.

Tạo script để chạy đồng bộ. Đoạn này dùng vòng while, dừng 1 giây và chạy rsync liên tục $ vi /opt/rsync.sh

#!/bin/bash
while true
do
rsync -avz –progress –delete /home/cuongtv/rsync/ rsync://192.168.13.220/data
sleep 1
done
Bước 2 mình sẽ tạo 1 script để add vào crontab check xem có chạy fie rsync.sh ở trên ko. nếu chạy thì bỏ qua, nếu ko thì sẽ chạy file đó. Mục đích để tránh tình trạng run quá nhiều sesion rsync khác nhau. Nhớ làm cùng nhau trên cả 2 server nhé.

$ vi /opt/cron.sh

#!/bin/bash
ps -ef | grep -v grep | grep rsync.sh && echo “Running” || sh /opt/rsync.sh
$ crontab -e

* * * * * sh /opt/cron.sh
$ /etc/init.d/cron restart

OK. Vậy là đã xong khâu thiết lập. các bạn có thể test lại nhé.

Các bạn có thể thấy, trong trường hợp khi tạo mới 1 folder hoặc 1 file, 2 server sẽ ngay lập tức đồng bộ với nhau. Nhưng vấn đề ở đây là gì khi chạy rsync trên cả 2 server? Khi các bạn xóa 1 file hoặc update nội dung của file bất kì trên 1 server, các bạn có thể thấy sau khi vừa thao tác xong thì có trường hợp tất cả lại trở lại nguyên trạng ban đầu nhưng cũng có trường hợp 2 server sẽ cập nhật như mong muốn. Vì sao? Nguyên nhân ở đây chính là vì chạy cùng lúc 2 script trên 2 server. Khi update 1 số hành động nhất định thì có thể sau khi kết thúc, lệnh sync từ bên server vừa cập nhật sẽ được gọi tới và chạy sync sang server kia. và kết quả là cả 2 cùng được cập nhật. còn nếu sau khi kết thúc hành động, lệnh sync từ server kia được gọi tới thì dữ liệu sẽ đồng bộ từ server không update đồng bộ sang. và kết quả trong t/h này sẽ là dữ liệu không thay đổi gì.