Dropbox là dịch vụ chia sẻ file trực tuyến, cho phép người dùng lưu trữ và chia sẻ dữ liệu với dung lượng miễn phí 2GB. Điểm đặc biệt của dropbox là khả năng đồng bộ dữ liệu thời gian thực, theo đó, ta chỉ định một directory cụ thể trên máy tính kết nối với dropbox client, dữ liệu sẽ được đồng bộ hóa lên dropbox server bất cứ khi nào có kết nối Internet.
Bài viết này hướng dẫn bạn xây dựng một mô hình server – client tương tự dropbox, với sự kết hợp của rsync server và rsync client (lsyncd).
Rsync: là một application được viết dành cho các hệ điều hành Unix và Unix likes, cho phép đồng bộ hóa dữ liệu từ một directory này sang một directory khác, hoặc giữa dữ liệu ở máy tính trạm sang một máy tính khác trong một network, hay internet với nhiều options khác nhau. (Wikipedia)
Ở chế độ daemon mode, rsync lắng nghe trên port 873, chờ đợi kết nối từ rsync client thông qua remote shell như ssh hay rsh
Bài viết này dựa vào daemon mode của rsync để thiết lập một rsync server.
Lsyncd sử dụng rsync để đồng bộ hóa một hoặc nhiều directory với máy chủ rsync. Lsyncd có thể đồng bộ hóa dữ liệu theo thời gian thực thông qua một subsystem process của Unix là inotify. Inotify có chứ năng giám sát sự thay đổi của dữ liệu: tăng giảm dung lượng, sửa xóa...Khi dữ liệu có bất cứ sự thay đổi nào, lsyncd sẽ dựa vào inotify event để đồng bộ hóa dữ liệu với rsync server. (Lsyncd homepage)
Mục tiêu của bài viết là cung cấp một giải pháp back up trong suốt với người dùng cuối, đối với những dạng dữ liệu vừa phải (không quá lớn). Sử dụng rsync là một cách để giảm thiểu tối đa dữ liệu truyền qua network dùng để back up. Ta chỉ đồng bộ những thay đổi.
Với cách này, ta cũng có thể backup cơ sở dữ liệu, dữ liệu của một web server đến một máy chủ ở xa, cung cấp khả năng mirroring, backup một cách kịp thời nhất.
Cài đặt:
Cài đặt:
Rsync Server:
Rsync có sẵn trên hầu hết các hệ điều hành Linux, mặc định rsync là một công cụ như ssh hoặc scp. Để cài đặt rsync server cần làm các bước sau. Distro mà tôi sử dụng là Debian Lenny, các bước cài đặt hầu như tương tự trên bất kì distro Linux nào khác:
Tạo user:
debian:~# adduser hungnv
Sao chép file cấu hình mẫu của rsync vào thư mục /etc/
debian:~# cp /usr/share/doc/rsync/examples/rsyncd.conf /etc/
Sửa file cấu hình để tạo shared module
debian:~# cat /etc/xinetd.d/rsync
service rsync {
disable = no
socket_type = stream wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
Các option ở trên hầu như là mặc định, trừ uid, gid và read only option. Vì ta chỉ muốn user có username hungnv được phép đồng bộ file ở /home/hungnv/sync nên sử dụng gid và gid này.
Tôi sử dụng xinetd (superserver) để quản lí rsync daemon. Sở dĩ xinetd được gọi là superserver vì xinetd có thể hoạt động như một daemon lắng nghe trên tất cả các port của các dịch vụ liệt kê trong cấu hình của xinetd.
Cài đặt xinetd:
debian:~# aptitude install xinetd
Tao và sửa chữ nội dung file rsync ở /etc/xinetd.d/rsync
debian:~# cat /etc/xinetd.d/rsync
service rsync {
disable = no
socket_type = stream
wait = no user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
Restart xinetd:
debian:~# /etc/init.d/xinetd restart
Stopping internet superserver: xinetd.
Starting internet superserver: xinetd.
Kiểm tra sự hoạt động của rsync:
debian:~# netstat -ntl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN
Kiểm tra module được share:
debian:~# rsync localhost::
hungnv hungnv's private stuff
Chuyển sang client:
Cài đặt lsyncd, trong bài viết này tôi sử dụng gentoo, ở các distro khác bạn download source code của lsyncd tại link cung cấp trong bài viết.
g3n2 ~ # echo "=app-admin/lsyncd-1.26" >> /etc/portage/package.keywords
g3n2 ~ # emerge -av lsyncd
Cấu hình: Do quá dài và chứa nhiều kí tự đặc biệt, nên bạn có thể xem ở đây http://osvn.pastebin.com/W6f3fQk1
Chú ý phần tag directory
Phần source: là đường dẫn đến directory mà bạn muốn đồng bộ với server
Phần target: là địa chỉ server và module đã tạo ra trước đó.
Ở Server và client: setup authentication sử dụng public key:
Client: gen key và copy key lên server:
hungnv@g3n2 ~ $ ssh-keygen -t rsa -b 1024
hungnv@g3n2 ~ $ cat .ssh/id_dsa.pub |ssh 192.168.1.11 "cat - >> ~/.ssh/authorized_keys"
hungnv@g3n2 ~ $ ssh 192.168.1.11 chmod 700 ~/.ssh
hungnv@g3n2 ~ $ ssh 192.168.1.11 chmod 600 ~/.ssh/authorized_keys
Kiểm tra bằng cách ssh 192.168.1.11 mà không bị hỏi password login, ta có thể tiếp tục bước cuối cùng.
Kiểm tra kết nối đến lsync server:
hungnv@g3n2 ~ $ rsync 192.168.1.11::
hungnv hungnv's private stuff
Kiểm tra cấu hình lsyncd:
hungnv@g3n2 ~ $ lsyncd –conf /etc/lsyncd.conf.xml –debug
nếu có lỗi gì xảy ra, ta trở về sửa chữa file /etc/lsync.conf.xml, kiểm tra directory và quyền trên server.
Khởi động lsycd:
hungnv@g3n2 ~ $ sudo lsyncd
Xem quá trình đồng bộ xảy ra
Sat Mar 27 22:53:18 2010: Starting up
Sat Mar 27 22:53:18 2010: watching /mnt/data/sync
Sat Mar 27 22:53:18 2010: found new directory: Terpinus in /mnt/data/sync -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: pydiction-1.2 in vimdict -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: vimdict in /mnt/data/sync -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: squid in ftp-conf -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: namespace in alchemist -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: switchboard in alchemist -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: alchemist in ftp-conf -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: templates in jabberd -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: jabberd in ftp-conf -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: policy in targeted -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: files in contexts -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: users in contexts -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: contexts in targeted -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: modules in previous -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: previous in modules -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: modules in active -- added on tosync stack.
Sat Mar 27 22:53:18 2010: found new directory: active in modules -- added on tosync stack.
Đến đây hoàn tất.
Tôi có viết một init script để start lsyncd như một service của hệ thống, hữu ích nếu bạn muốn start lsyncd lúc khởi động
#!/bin/sh
# Start/stop the lsyncd daemon.
#
### BEGIN INIT INFO
#hungnv[at]opensource[dot]com[dot]vn
#License: GPL Version 2
#http://opensource.com.vn
test -f /usr/bin/lsyncd || exit 0
. /lib/lsb/init-functions
case "$1" in
start) log_daemon_msg "Starting periodic command scheduler" "lsyncd"
start-stop-daemon --start --quiet --pidfile /var/run/lsyncd.pid --name lsyncd --startas /usr/bin/lsyncd
log_end_msg $?
;;
stop) log_daemon_msg "Stopping periodic command scheduler" "lsyncd"
start-stop-daemon --stop --quiet --pidfile /var/run/lsynd.pid --name lsyncd
log_end_msg $?
;;
restart) log_daemon_msg "Restarting periodic command scheduler" "lsyncd"
start-stop-daemon --stop --retry 5 --quiet --pidfile /var/run/lsyncd.pid --name lsyncd
start-stop-daemon --start --quiet --pidfile /var/run/lsyncd.pid --name lsyncd --startas /usr/bin/lsyncd
;;
reload|force-reload) log_daemon_msg "Reloading configuration files for periodic command scheduler" "lsyncd"
# lsyncd reloads automatically
log_end_msg 0
;;
*) log_action_msg "Usage: /etc/init.d/lsyncd {start|stop|restart|reload|force-reload}"
exit 2
;;
esac
exit 0
Khi quá trình syncing hoàn tất, lsyncd sẽ chuyển sang trạng thái theo dõi (monitoring), bất cứ khi nào có sự thay đổi, lsyncd sẽ cập nhật sự thay đổi gần như tức thì.
Nếu lượng dữ liệu muốn backup lớn, thì công cụ trong bài viết này không phải là công cụ mà bạn cần, có nhiều giải pháp đáp ứng nhu cầu này tốt hơn.
Nên chia thời gian back up dữ liệu (lần đầu) giữa các máy client để tránh tình trạng nghẽn mạng xảy ra.
Lsync có thể hoạt động, sau đó dừng nếu có vấn đề về network, nhưng có thể hoạt động bình thường ngay sau khi mạng hoạt động trở lại.
Cách cài đặt và triển khai trong bài viết này có thể dài dòng và phức tạp, mục đích để người đọc nắm rõ cách hoạt động của các công cụ trên. Chúng ta hoàn toàn có thể chủ động tạo ra script tự động hóa quá trình cài đặt này.
Tham khảo:
Rsync: http://samba.anu.edu.au/rsync/documentation.html
Lsyncd: http://code.google.com/p/lsyncd/
Xinetd: http://linux.about.com/library/cmd/blcmdl8_xinetd.htm
Dropbox: http://dropbox.com
|