TopDev

Cách để đồng bộ file giữa hai máy chủ Ubuntu

minhdev 📖 9 phút đọc 💬 3 phản hồi

Chào bạn, có vài cách để đồng bộ file giữa hai máy chủ Ubuntu, nhưng giải pháp phổ biến và hiệu quả nhất cho nhu cầu của bạn là sử dụng rsync kết hợp với cron job. Dưới đây là hướng dẫn chi tiết về cách thực hiện.

1. Sử dụng rsync kết hợp Cron Job#

Phương pháp này sử dụng rsync để đồng bộ file và cron job để tự động hóa quá trình này theo một lịch trình cụ thể.

a. rsync là gì?#

rsync là một công cụ dòng lệnh mạnh mẽ dùng để đồng bộ hóa file và thư mục. Nó chỉ sao chép những phần của file đã thay đổi, giúp tiết kiệm băng thông và thời gian. Nó hoạt động bằng cách so sánh file giữa hai thư mục và chỉ di chuyển những file mới hoặc đã cập nhật.

b. Cron Job là gì?#

Cron job là một dịch vụ lập lịch trình của Linux, cho phép bạn tự động chạy các lệnh hoặc tập lệnh vào những khoảng thời gian đã định. Khi kết hợp với rsync, bạn có thể thiết lập để quá trình đồng bộ diễn ra tự động, ví dụ như 5 phút một lần.

c. Các bước thực hiện#

Bước 1: Cài đặt rsync trên cả hai máy chủ

Mặc định, rsync thường đã có sẵn trên Ubuntu. Nếu không, bạn có thể cài đặt bằng lệnh:

sudo apt update sudo apt install rsync

Bước 2: Thiết lập SSH Key

Để rsync có thể hoạt động mà không cần nhập mật khẩu mỗi lần, bạn cần thiết lập SSH key. Bạn có thể làm theo các bước sau:

  • Trên VPS 1 (VPS nguồn), tạo một SSH key mới nếu bạn chưa có: ssh-keygen -t rsa -b 4096

  • Sau đó, sao chép public key sang VPS 2 (VPS đích): ssh-copy-id username@ip_vps_2 Thay thế usernameip_vps_2 bằng thông tin của VPS 2. Bây giờ bạn có thể ssh từ VPS 1 sang VPS 2 mà không cần nhập mật khẩu.

Bước 3: Tạo Cron Job để đồng bộ

Bạn cần tạo một cron job trên VPS 1 để đẩy file từ VPS 1 sang VPS 2 và một cron job trên VPS 2 để kéo file từ VPS 1. Điều này đảm bảo việc đồng bộ là hai chiều.

Trên VPS 1, chỉnh sửa cron job:

crontab -e

Thêm dòng sau vào cuối file để đồng bộ mỗi 5 phút:

*/5 * * * * rsync -avz --delete /duong/dan/thu/muc/vps1/ username@ip_vps_2:/duong/dan/thu/muc/vps2/

  • */5 * * * *: Chạy lệnh mỗi 5 phút.

  • rsync -avz: a (archive): Chế độ lưu trữ, giữ nguyên quyền, thời gian, và các thuộc tính khác. v (verbose): Hiển thị chi tiết quá trình đồng bộ.

    • z (compress): Nén dữ liệu trong quá trình truyền.
  • --delete: Xóa các file ở thư mục đích nếu chúng không còn tồn tại ở thư mục nguồn. Hãy cẩn thận khi sử dụng tùy chọn này, nó sẽ đảm bảo hai thư mục giống hệt nhau nhưng có thể xóa file không mong muốn.

Trên VPS 2, chỉnh sửa cron job:

crontab -e

Thêm dòng sau vào cuối file để đồng bộ ngược lại mỗi 5 phút:

*/5 * * * * rsync -avz --delete /duong/dan/thu/muc/vps2/ username@ip_vps_1:/duong/dan/thu/muc/vps1/

  • Thay usernameip_vps_1 bằng thông tin của VPS 1.

  • Đảm bảo SSH key đã được thiết lập từ VPS 2 sang VPS 1 tương tự như bước 2.



2. Các giải pháp thay thế khác#

a. lsyncd#

lsyncd là một công cụ mạnh mẽ hơn, hoạt động theo thời gian thực (real-time) bằng cách theo dõi các sự kiện thay đổi file và ngay lập tức kích hoạt rsync để đồng bộ. Nó hiệu quả hơn cron job vì không cần phải đợi theo lịch trình cố định.

  • Ưu điểm: Đồng bộ gần như tức thì.

  • Nhược điểm: Phức tạp hơn một chút để cấu hình.

b. unison#

unison là một công cụ đồng bộ hai chiều mạnh mẽ, có khả năng phát hiện và giải quyết xung đột khi cả hai file đều được thay đổi cùng lúc.

  • Ưu điểm: Được thiết kế đặc biệt cho đồng bộ hai chiều, có thể giải quyết xung đột.

  • Nhược điểm: Yêu cầu cài đặt thêm và cấu hình phức tạp hơn.

Kết luận:

Với nhu cầu của bạn, giải pháp rsync kết hợp với cron job là lựa chọn tốt nhất vì nó dễ cấu hình, hiệu quả và đáng tin cậy. Nếu bạn muốn đồng bộ tức thì, bạn có thể khám phá lsyncd, nhưng rsync đã là đủ cho hầu hết các trường hợp.

3 phản hồi

  1. minhdev #1

    OK 👍 để đồng bộ file qua lại tự động giữa 2 VPS Ubuntu, bạn có mấy giải pháp phổ biến:



    🔹 Giải pháp 1: Dùng rsync + inotify#

    • rsync dùng để đồng bộ file nhanh (chỉ copy phần thay đổi).

    • inotify dùng để theo dõi thư mục, có file mới sẽ kích hoạt đồng bộ.

    Cài đặt:#

    Trên cả 2 VPS:

    sudo apt update sudo apt install rsync inotify-tools -y

    Script đồng bộ (ví dụ từ VPS1 → VPS2)#

    ` #!/bin/bash SRC="/var/www/html/uploads/" DEST="user@IP_VPS2:/var/www/html/uploads/" LOG="/var/log/rsync.log"

    inotifywait -m -r -e create,modify,delete,move "$SRC" --format '%w%f' | while read FILE do rsync -avz --delete "$SRC" "$DEST" >> "$LOG" 2>&1 done `

    • Tương tự, bạn cũng chạy script ngược lại từ VPS2 → VPS1 để có đồng bộ 2 chiều.

    • Chạy script như một systemd service để auto chạy khi khởi động.



    🔹 Giải pháp 2: Dùng lsyncd (đơn giản hơn)#

    lsyncd (Live Syncing Daemon) = inotify + rsync chạy nền.

    Cài đặt:

    sudo apt install lsyncd -y

    Cấu hình /etc/lsyncd/lsyncd.conf.lua:

    ` settings { logfile = "/var/log/lsyncd/lsyncd.log", statusFile = "/var/log/lsyncd/lsyncd.status", nodaemon = false, }

    sync { default.rsync, source="/var/www/html/uploads/", target="user@IP_VPS2:/var/www/html/uploads/", rsync = { archive = true, compress = true, verbose = true, _extra = {"--delete"}, } } `

    Khởi động:

    sudo systemctl enable lsyncd sudo systemctl start lsyncd

    👉 Lưu ý: muốn 2 chiều thì cài lsyncd cả 2 server.



    🔹 Giải pháp 3: Dùng Unison#

    Unison là công cụ đồng bộ 2 chiều thông minh (giống Dropbox, Nextcloud).

    Cài:

    sudo apt install unison -y

    Chạy đồng bộ:

    unison /var/www/html/uploads/ ssh://user@IP_VPS2//var/www/html/uploads/

    • Có thể chạy cron hoặc systemd để tự động hóa.

    • Unison xử lý conflict tốt hơn so với rsync.



    🔹 Giải pháp 4: Dùng NFS/GlusterFS (chia sẻ chung thư mục)#

    Nếu bạn muốn chia sẻ 1 thư mục dùng chung thay vì đồng bộ, có thể:

    • Dùng NFS (network file system).

    • Dùng GlusterFS / CephFS (dành cho hệ thống lớn, nhiều VPS).



    ✅ Tóm lại:

    • Nếu ít file, muốn đơn giản → lsyncd.

    • Nếu muốn đồng bộ 2 chiều có xử lý conflict → Unison.

    • Nếu muốn share ổ cứng như mạng LAN → NFS / GlusterFS.



    👉 Bạn muốn tôi viết luôn script systemd service cho lsyncd (2 chiều) để bạn chỉ cần copy chạy không?

  2. minhdev #2

    Tôi sẽ giới thiệu cho bạn một số giải pháp để đồng bộ file giữa 2 VPS Ubuntu:

    1. Rsync với SSH (Đơn giản, phổ biến)#

    Cài đặt: sudo apt update sudo apt install rsync openssh-server

    Đồng bộ một chiều: `

    Từ server A sang server B

    rsync -avz -e ssh /path/to/source/ user@server-B:/path/to/destination/

    Từ server B sang server A

    rsync -avz -e ssh /path/to/source/ user@server-A:/path/to/destination/ `

    Tự động hóa với crontab: ` crontab -e

    Thêm dòng: */5 * * * * rsync -avz -e ssh /path/to/source/ user@other-server:/path/to/destination/

    `

    2. Syncthing (Real-time, hai chiều)#

    Cài đặt trên cả 2 server: curl -s https://syncthing.net/release-key.txt | sudo apt-key add - echo "deb https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list sudo apt update sudo apt install syncthing

    Khởi động: systemctl --user enable syncthing systemctl --user start syncthing

    Truy cập web UI qua http://server-ip:8384 để cấu hình.

    3. Unison (Đồng bộ hai chiều thông minh)#

    Cài đặt: sudo apt install unison

    Sử dụng: unison /local/path ssh://user@remote-server//remote/path

    4. inotify + rsync (Real-time monitoring)#

    Script tự động: #!/bin/bash inotifywait -m -r -e modify,create,delete /path/to/watch | while read path action file; do rsync -avz -e ssh /path/to/source/ user@remote-server:/path/to/destination/ done

    Khuyến nghị:#

    • Cho file ít thay đổi: Dùng rsync + crontab

    • Cho real-time sync: Dùng Syncthing (dễ setup) hoặc inotify + rsync

    • Cho conflict resolution: Dùng Unison

    Bạn muốn triển khai giải pháp nào? Tôi có thể hướng dẫn chi tiết từng bước.

  3. minhdev #3

    Giải pháp tốt nhất để đồng bộ hai thư mục giữa hai VPS Ubuntu theo thời gian thực (hoặc gần như thời gian thực) là sử dụng Syncthing hoặc Unison, tùy vào mức độ phức tạp và yêu cầu của bạn. Dưới đây là hai phương án phổ biến:



    🔄 Giải pháp 1: Dùng Syncthing – đồng bộ hai chiều, tự động#

    Syncthing là một công cụ mã nguồn mở, hoạt động như một dịch vụ nền, giúp đồng bộ file giữa các máy tính qua mạng một cách bảo mật và tự động.

    ✅ Ưu điểm:#

    • Đồng bộ hai chiều

    • Tự động phát hiện và đồng bộ file mới

    • Giao diện web dễ quản lý

    • Mã hóa dữ liệu khi truyền

    🔧 Cách cài đặt:#

    Trên cả hai VPS:

    curl -s https://syncthing.net/release-key.txt | sudo apt-key add - echo "deb https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list sudo apt update sudo apt install syncthing

    🚀 Khởi chạy:#

    syncthing

    Sau đó truy cập giao diện web tại http://<IP>:8384 để cấu hình:

    • Thêm thiết bị (device ID của VPS kia)

    • Chọn thư mục cần đồng bộ

    • Chọn chế độ đồng bộ hai chiều



    🔁 Giải pháp 2: Dùng Unison – đồng bộ theo lịch hoặc thủ công#

    Unison là công cụ đồng bộ file hai chiều, phù hợp nếu bạn muốn kiểm soát thời điểm đồng bộ (ví dụ: theo cron job).

    ✅ Ưu điểm:#

    • Đồng bộ hai chiều

    • Có thể chạy qua SSH

    • Kiểm soát tốt quá trình đồng bộ

    🔧 Cài đặt:#

    sudo apt install unison

    🛠 Cấu hình:#

    Tạo file cấu hình sync.prf:

    ` root = /home/user/thumuc root = ssh://user@ip_vps2//home/user/thumuc

    auto=true batch=true prefer=newer `

    🕒 Thiết lập cron job:#

    crontab -e

    Thêm dòng sau để chạy mỗi 5 phút:

    */5 * * * * unison sync.prf



    🛡️ Lưu ý bảo mật:#

    • Dùng SSH key để tránh nhập mật khẩu mỗi lần

    • Mở port cần thiết (8384 cho Syncthing hoặc SSH cho Unison)

    • Kiểm tra firewall (ufw hoặc iptables)



    Bạn muốn đồng bộ theo thời gian thực hay theo lịch cố định? Nếu bạn cần hướng dẫn chi tiết từng bước cho Syncthing hoặc Unison, mình có thể giúp bạn thiết lập ngay.

Bài liên quan trong #Tin tức

✓ Đã sao chép link