1. Giới thiệu

Bài viết này sẽ hướng dẫn các bạn cấu hình unison để tự động đồng bộ thư mục, file ở 2 hay nhiều máy chủ. Các câu hỏi liên quan đến Unison

  1. Unison khác gì so với Rsync?
    Unison cho phép đồng bộ 2 chiều: A→BA \rightarrow BABA←BA \leftarrow BAB. Còn Rsync phù hợp với đồng bộ 1 chiều.
  2. Unison chạy được trên những hệ điều hành nào?
    Mac, Linux, Windows
  3. Unison có thể đồng bộ với nhiều kịch bản khác nhau không?
    Có ! Bạn định nghĩa kịch bản khác nhau trong thư mục .unison, ví dụ syn_doc.prt, sync_image.prt
  4. Unison được viết bằng ngôn ngữ gì?
    ocaml
  5. Unison được khởi động theo những cách nào?
    Unison có thể khởi động thủ công, hoặc định thời cron job hoặc kích hoạt mỗi khi có sự kiện thay đổi file trong thư mục
  6. Unison dùng network protocol nào để đồng bộ?
    Unison có dùng qua SSH hoặc tạo ra một Unison server để nhận các yêu cầu đồng bộ unison -socket port
  7. Unison dùng cơ chế Push (đẩy) hay Pull (kéo) khi đồng bộ?
    Unison dùng cơ chế Push và Pull. Unison client sẽ gửi danh sách các lệnh cần đồng bộ lên SSH server hoặc Unison server, nó cũng nhận lại danh sách những thay đổi ở server bên kia.
  8. Unison client khác gì server?
    Unison đóng gói thành duy nhất một file binary. Tùy thuộc cách bạn chạy nó sẽ là client hay server. Thông thường nó chạy dạng client với tham số là kịch bản đồng bộ ví dụ unison sync.prt. Nếu bạn không dùng SSH server, thì bạn có thể khởi động unison lắng nghe ở một cổng unison -socket 5000 như vậy biến unison thành server.

2. Unison làm được gì?

  • Đồng bộ 1 chiều và 2 chiều.
  • Đồng bộ thủ công hoặc định thời dùng cron job hoặc ngay khi có thay đổi trong thư mục.
  • Quan sát thay đổi trong thư mục để đồng bộ (cần cài thêm inotify-tools)
  • Giải quyết xung đột file: mới đè lên cũ hay bỏ qua.
  • Tạo nhiều profile. Mỗi profile có kịch bản đồng bộ đến thư mục, máy chủ khác nhau.
  • Sử dụng SSH mã hóa tốt hơn, bảo mật hơn.
Cơ chế hoạt động của Unison
Cơ chế hoạt động của Unison

3. Các bước cài đặt cấu hình Unison

Giả sử chúng ta có hai máy chủ tên là A (địa chỉ ip_A) và B (địa chỉ ip_B). A có thư mục folderX còn B có thư mục folderY cần phải đồng bộ 2 chiều.

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

sudo apt update
sudo apt install unison
sudo apt install inotify-tools

inotify-tools là phần mềm thông báo khi có thay đổi trong folder

Bước 2: Kết nối SSH bằng public key

Unison client dùng SSH connection để đồng bộ. Cách bảo mật nhất và không dùng đến password là tạo ra public/private key. Ở server1, gõ lệnh dưới vào terminal

ssh-keygen -t rsa -b 4096 -C "yourmail@gmail.com"

Thông báo trả về sẽ như sau

Your identification has been saved in /home/vagrant/.ssh/id_rsa
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub

Ở đây tôi đang login với user là vagrant thực tế máy của bạn sẽ khác. Private key file là id_rsa còn public key là id_rsa.pub.

Tiếp đến tôi đọc nội dung trong public key id_rsa.pub bằng lệnh

cat /home/vagrant/.ssh/id_rsa.pub

Copy toàn bộ, rồi kết nối SSH vào server2. Mở file ~/.ssh/authorized_keys để soạn thảo

nano ~/.ssh/authorized_keys

Dán nội dung vừa copy vào bên dưới, sau đó lưu lại file này. Bằng cách này tôi đã lưu nội dung public key tạo ra ở server1 vào file ~/.ssh/authorized_keys ở server2. Như vậy server1 có thể kết nối SSH vào server2 thông qua mã hóa public/private key.

Bước 3: Tạo profile cấu hình thư mục cần đồng bộ

Trên một máy chủ, có thể có 1 hoặc nhiều profile. Mỗi profile sẽ cấu hình từng kịch bản đồng bộ (thư mục ở local, thư mục remote, cách kết nối vào máy chủ remote, cách đồng bộ)

~/.unison/media.prf ở máy chủ server1

root = /home/vagrant/media
root = ssh://vagrant@server2///home/vagrant/media
auto = true
batch = true
repeat = watch
times = true
fastcheck = true
rsync = true
retry = 3
confirmbigdel = false
silent = false
media.prf

Giải thích cấu hình

  • root = /home/vagrant/media: thư mục cần đồng bộ ở server1, hãy gọi là local folder
  • root = ssh://vagrant@server2///home/vagrant/media: kết nối và thư mục cần đồng bộ ở server2. ssh://vagrant@server2 mô tả kết nối SSH./home/vagrant/media là thư mục ở server2. Nó có thể khác thư mục ở server1
  • auto = true: tự động cập nhật không cần người dùng can thiệp
  • batch = true: cập nhật nhiều thay đổi trong 1 lần kết nối
  • repeat = watch: quan sát thay đổi ở cả local folder và remote folder
  • times = true: đồng bộ cả đánh dấu thời gian (time stamp) của file
  • fastcheck = true: so sánh nhanh 2 files bằng kích thước và time stamp thay vì nội dung
  • rsync = true: áp dụng thuật toán rsync chỉ gửi đi phần nội dung thay đổi của file thay vì cả file
  • retry = 3: thử lại 3 lần nếu có lỗi kết nối
  • confirmbigdel = false: nếu nhiều file bị xoá thì đồng bộ mà không cần hỏi ý kiến người dùng.
  • silent = true không thông báo số lượng thay đổi khi đồng bộ. Cứ lẳng lặng mà làm.

4. Chạy unison client

Ở server1, đơn giản nhất là gõ lệnh unison media. Tham số media có nghĩa tôi muốn dùng kịch bản đồng bộ ở file ~/.unison/media.prf

Nếu bạn muốn chạy lệnh này ngầm, và không muốn in thông báo tiền trình chạy ra màn hình thì gõ lệnh
unison media -silent > /dev/null 2>&1 &

Giải thích
-silent: không cần báo cáo mỗi lần đồng bộ
> /dev/null 2>&1: chuyển hướng các thông báo, báo lỗi xuất ra terminal và null device (hưu vô)
&: chạy ở chế độ ngầm, không cản trở người dùng tiếp tục gõ lệnh vào terminal

Tạo các file ở cả 2 máy chủ

Ở máy chủ server1 và server2, bạn có thể tạo, xóa nhiều file ở các thư mục được quan sát trong file cấu hình ~/.unison/media.prf

5. Kết luận

Cấu hình và chạy unison không quá khó. Unison đồng bộ 2 chiều linh hoạt hơn hẳn rsync. Tuy nhiên bạn cần chú ý trường hợp phá hoại có chủ đích khi một thư mục bị xóa rất nhiều file, unison chạy tự động ngầm và confirmbigdel = false sẽ đồng bộ tất cả lệnh xóa file không cần hỏi ý kiến bạn. Điều này khá rủi ro. Tuy nhiên nếu bật confirmbigdel = true, khi bạn thực sự muốn xóa nhiều file, unison sẽ dừng việc đồng bộ và hỏi ý kiến bạn, việc này khiến việc đồng bộ không còn tự động nữa.