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
- Unison khác gì so với Rsync?
Unison cho phép đồng bộ 2 chiều: A→BA \rightarrow BA→B và A←BA \leftarrow BA←B. Còn Rsync phù hợp với đồng bộ 1 chiều. - Unison chạy được trên những hệ điều hành nào?
Mac, Linux, Windows - 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
… - Unison được viết bằng ngôn ngữ gì?
ocaml - 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 - 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
- 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. - 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ổngunison -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.
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 folderroot = 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 ở server1auto = true
: tự động cập nhật không cần người dùng can thiệpbatch = true
: cập nhật nhiều thay đổi trong 1 lần kết nốirepeat = watch
: quan sát thay đổi ở cả local folder và remote foldertimes = true
: đồng bộ cả đánh dấu thời gian (time stamp) của filefastcheck = true
: so sánh nhanh 2 files bằng kích thước và time stamp thay vì nội dungrsync = 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ả fileretry = 3
: thử lại 3 lần nếu có lỗi kết nốiconfirmbigdel = 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ệnhunison 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.
Bình luận