12/08/2018, 14:38

Giải pháp Synchronize folder giữa 2 server

Chắc hẳn ở đây có rất nhiều người đã và đang sử dụng nhiều giải pháp để đồng bộ giữa 2 server. Hôm nay mình xin trình bày 2 giải pháp đồng bộ: rsync, lsyncd. Như các bạn biết, đồng bộ là quá trình đảm bảo rằng các tập tin trong hai hoặc nhiều host được cập nhật thông qua những quy tắc nhất ...

Chắc hẳn ở đây có rất nhiều người đã và đang sử dụng nhiều giải pháp để đồng bộ giữa 2 server. Hôm nay mình xin trình bày 2 giải pháp đồng bộ: rsync, lsyncd.

Như các bạn biết, đồng bộ là quá trình đảm bảo rằng các tập tin trong hai hoặc nhiều host được cập nhật thông qua những quy tắc nhất định. Có rất nhiều cách đồng bộ với nhau. Trong đó, chia ra làm 3 nhóm chính:

  • Open source như: rsync, lsyncd, FreeFileSync ...
  • Freeware như: Resilio Sync ...
  • Bản thương mại như: BitTorrent Sync, CloudMe, Ubuntu One ...

Và hôm nay mình sẽ giới thiệu 2 tools trong open source.

1. Rsync

Vâng. nhắc đến rsync thì chắc hẳn ai làm về system cũng đều biết về tool này. Rsync (Remote Sync) là một công cụ dùng để sao chép và đồng bộ file/thư mục được dùng rất phổ biến. 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.

Nếu sử dụng rsync, các bạn cần biết qua các tham số cơ bản để thực hiện câu lệnh -v: hiển thị trạng thái kết quả -r: copy folder, nhưng không đảm bảo thông số của file và thư mục -a: cho phép copy folder, đồng thời giữ nguyên được tất cả các thông số của thư mục và file -z: nén dữ liệu khi transfer, tiết kiệm băng thông tuy nhiên tốn thêm một chút thời gian khi cần checksum sau khi giải nén -u: không ghi đè dữ liệu ở thư mục đích -h: human-readable, output kết quả dễ đọc --delete: xóa dữ liệu ở destination nếu source không tồn tại dữ liệu đó. --exclude: loại trừ ra những dữ liệu không muốn truyền đi, nếu bạn cần loại ra nhiều file hoặc folder ở nhiều đường dẫn khác nhau thì mỗi cái bạn phải thêm --exclude tương ứng.

Và mình sẽ hướng dẫn các bạn 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ì.

2. Lsyncd

Lsyncd (Live Syncing Daemon) được viết bằng ngôn ngữ Lua - là giải pháp để cho thư mục local của bạn sẽ tự động đồng bộ hóa với các máy khác. Các tập tin trên máy tính local sẽ được theo dõi những thay đổi mỗi vài giây và nếu có thay đổi được ghi nhận thông qua inotify hoặc fsevents, sau đó sẽ được nhân rộng và đồng bộ hóa với máy chủ từ xa. Giải pháp để đồng bộ hóa này dễ dàng cài đặt, trọng lượng nhẹ, và không hạn chế hiệu suất của hệ thống tập tin local. Theo mặc định, Lsync sử dụng rsync để sao chép các tập tin từ máy tính cục bộ và sẽ chỉ chuyển các tập tin đã thay đổi. Nó hoạt động theo cơ chế master - slave. Vì cơ chế của lsyncd là khi master có thay đổi gì thì slave mới cập nhật file / folder đó nên nếu chúng ta xóa dữ liệu trên slave thì tất cả các file được đồng bộ lần đầu thì sẽ không được đồng bộ lại nữa. Đó cũng chính là điểm hạn chế của lsyncd.

Ta bắt đầu với việc install: $apt-get update && apt-get install -y lua5.1 liblua5.1-dev pkg-config rsync asciidoc $ apt-get install lsyncd $ mkdir /var/log/lsyncd $ mkdir /etc/lsyncd config lsyncd: $ vi /etc/lsyncd/lsyncd.conf.lua

settings {
logfile = "/var/log/lsyncd/lsyncd.log",  
statusFile = "/var/log/lsyncd/lsyncd-status.log",
statusInterval = 10
}

-- Slave server configuration

sync {
default.rsync,  -- set default là rsync
source="/opt/test",   -- source trên local
target="192.168.13.221:/opt/test/", -- destination trên host
delay = 1, -- set time sync giữa 2 server là 1s sau khi có update
rsync = {
compress = true, -- nén file khi transfer 
acls = true, -- giữ nguyên acls 
delete = false, -- nếu ko muốn xóa file đích trên host nếu source không tồn tại
verbose = true, -- hiển thị kết quả
owner = true, -- giữ nguyên người sở hữu
group = true, -- giữ nguyên group
perms = true, -- giữ permission
rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no"
}
}

Các bạn nhớ tạo private key ssh cho user và add sang server slave nhé. OK. Giờ start lên nào: $ /etc/init.d/lsyncd start

Check lại nào:

root@cap2:/opt/test# mkdir a.b
root@cap2:/opt/test# ll
total 12
drwxr-xr-x 3 root root 4096 Jan 27 17:22 ./
drwxr-xr-x 4 root root 4096 Jan 27 17:20 ../
drwxr-xr-x 2 root root 4096 Jan 27 17:22 a.b/

trên sv 2:

root@cap3:/opt/test# ll
total 8
drwxr-xr-x 2 root root 4096 Jan 27 17:17 ./
drwxr-xr-x 4 root root 4096 Jan 27 17:17 ../
root@cap3:/opt/test# ll
total 12
drwxr-xr-x 3 root root 4096 Jan 27 17:22 ./
drwxr-xr-x 4 root root 4096 Jan 27 17:17 ../
drwxr-xr-x 2 root root 4096 Jan 27 17:22 a.b/

OK. vậy là đã đồng bộ được.

0