[Article] Đồng bộ dữ liệu với mô hình Dropbox |
01/04/2010 20:53:57 (+0700) | #1 | 208260 |
mR.Bi
Member
|
0 |
|
|
Joined: 22/03/2006 13:17:49
Messages: 812
Offline
|
|
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:
1. 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:
Code:
Sao chép file cấu hình mẫu của rsync vào thư mục /etc/
Code:
debian:~# cp /usr/share/doc/rsync/examples/rsyncd.conf /etc/
Sửa file cấu hình để tạo shared module
Code:
debian:~# cat /etc/rsyncd.conf
pid file=/var/run/rsyncd.pid syslog facility=daemon
# MODULE OPTIONS
[hungnv]
comment = hungnv's private stuff
path = /home/hungnv/sync
use chroot = yes
max connections=10
lock file = /var/lock/rsyncd
# the default for read only is yes...
read only = no
list = yes
uid = hungnv
gid = hungnv
# exclude =
# exclude from =
# hosts allow =
# hosts deny =
ignore errors = no
ignore nonreadable = yes
transfer logging = no
log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
timeout = 600
refuse options = checksum dry-run
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
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. (Wikipedia)
Cài đặt xinetd:
Code:
debian:~# aptitude install xinetd
Tao và sửa chữ nội dung file rsync ở /etc/xinetd.d/rsync
Code:
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:
Code:
debian:~# /etc/init.d/xinetd restart
Stopping internet superserver: xinetd.
Starting internet superserver: xinetd.
Kiểm tra sự hoạt động của rsync:
Code:
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:
Code:
debian:~# rsync localhost::
hungnv hungnv's private stuff
2. 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.
Code:
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:
Code:
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:
Code:
hungnv@g3n2 ~ $ rsync 192.168.1.11::
hungnv hungnv's private stuff
Kiểm tra cấu hình lsyncd:
Code:
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:
Code:
hungnv@g3n2 ~ $ sudo lsyncd
Xem quá trình đồng bộ xảy ra
Code:
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.
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
Code:
#!/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
log_end_msg $?
;;
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
Thêm một scripts giúp việc cấu hình rsyncd nhanh hơn:
Code:
#!/usr/bin/python
import os
root = '/home/'
names = os.listdir(root)
#names = open('/mnt/data/names.txt','r')
names.sort()
for line in names:
# if not line:
# break
if not os.path.isdir(root + line):
continue
if line == 'lost+found':
continue
print "[" "%s" "]" %line
print ' comment = ''%s' %line
print ' path ='+root +line
print """ use chroot = yes
max connections=10
lock file = /var/lock/rsyncd
read only = no
list = yes
"""
print ' uid= '+line
print ' gid= '+line
print """ ignore errors = no
ignore nonreadable = yes
transfer logging = no
log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
timeout = 600
refuse options = checksum dry-run
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
"""
Đến đây hoàn tất.
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.
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
|
|
All of my life I have lived by a code and the code is simple: "honour your parent, love your woman and defend your children" |
|
|
|
[Article] Đồng bộ dữ liệu với mô hình Dropbox |
02/04/2010 12:31:11 (+0700) | #2 | 208292 |
|
quanta
Moderator
|
Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
|
|
mR.Bi wrote:
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.
Như có lần anh pnco đã gợi ý, mấy cái này anh nghĩ đẩy qua "local vpn" là đẹp nhất. |
|
Let's build on a great foundation! |
|
|
|
[Article] Đồng bộ dữ liệu với mô hình Dropbox |
03/04/2010 11:55:39 (+0700) | #3 | 208356 |
mR.Bi
Member
|
0 |
|
|
Joined: 22/03/2006 13:17:49
Messages: 812
Offline
|
|
Em không hiểu "local vpn" là gì anh. Anh nói rõ hơn được không? |
|
All of my life I have lived by a code and the code is simple: "honour your parent, love your woman and defend your children" |
|
|
|
[Article] Đồng bộ dữ liệu với mô hình Dropbox |
03/04/2010 12:39:54 (+0700) | #4 | 208357 |
|
quanta
Moderator
|
Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
|
|
mR.Bi wrote:
Em không hiểu "local vpn" là gì anh. Anh nói rõ hơn được không?
Ý anh là "VPN in LAN". |
|
Let's build on a great foundation! |
|
|
|
[Article] Đồng bộ dữ liệu với mô hình Dropbox |
03/04/2010 15:58:14 (+0700) | #5 | 208367 |
|
tranhuuphuoc
Moderator
|
Joined: 05/09/2004 06:08:09
Messages: 865
Location: Lầu Xanh
Offline
|
|
E-LINE và E-LAN |
|
|
|
|
[Article] Đồng bộ dữ liệu với mô hình Dropbox |
03/04/2010 20:12:40 (+0700) | #6 | 208384 |
mR.Bi
Member
|
0 |
|
|
Joined: 22/03/2006 13:17:49
Messages: 812
Offline
|
|
quanta: thế thì phí công lắm, theo em thì cứ chia thời gian synchronize lần đầu ra là được, mà cho dù có sử dụng VPN, anh cũng phải chia thời gian chứ không thể làm một lúc được vì cho dù giải pháp VPN in LAN có làm giảm tình trạng nghẽn mạng, thì dữ liệu lớn đẩy cùng lúc lên server cũng làm server chết đứ đừ.
|
|
All of my life I have lived by a code and the code is simple: "honour your parent, love your woman and defend your children" |
|
|
|
[Article] Đồng bộ dữ liệu với mô hình Dropbox |
04/04/2010 07:02:27 (+0700) | #7 | 208400 |
rs
Member
|
0 |
|
|
Joined: 15/07/2008 23:07:11
Messages: 220
Location: YANYM
Offline
|
|
tranhuuphuoc wrote:
E-LINE và E-LAN :)
bạn đang làm cho isp nào đó, ở tỉnh nào đó, và chỗ bạn có cung cấp 2 dịch vụ này, mình hiểu thế đúng không ? :D |
|
|
|
|
[Article] Đồng bộ dữ liệu với mô hình Dropbox |
04/04/2010 21:37:50 (+0700) | #8 | 208426 |
|
tranhuuphuoc
Moderator
|
Joined: 05/09/2004 06:08:09
Messages: 865
Location: Lầu Xanh
Offline
|
|
rs wrote:
bạn đang làm cho isp nào đó, ở tỉnh nào đó, và chỗ bạn có cung cấp 2 dịch vụ này, mình hiểu thế đúng không ? :D
Hello Mr.Bi và quanta, sorry vì topic khá hay mà mình lại vào góp ý
Hi bạn rs,
Ah, do mình muốn chỉnh sửa thuật ngữ của anh em , chứ local VPN, VPN in LAN là gì vậy cà ? Vì 2 thuật ngữ này khá trừu tượng và nói chung trong vấn đề đàm phán giữa anh em trong phòng, trong công ty với nhau. Mình thì hay gọi là Metro Ethernet Services
Nó chẳng qua là E-Line, E-LAN, E-TREE,... mà thôi ;) Mình thì không làm ISP và cũng không cung cấp 2 dịch vụ này vì các thuật ngữ này đâu nhất thiết phải là ở ISP bạn nhĩ, mà bạn còn ghi mình sinh sống ở tỉnh nữa chứ, thế mới ...ghê :D
Rất vui được làm quen với bạn rs :) |
|
|
|
|
[Article] Đồng bộ dữ liệu với mô hình Dropbox |
04/04/2010 22:28:34 (+0700) | #9 | 208428 |
mR.Bi
Member
|
0 |
|
|
Joined: 22/03/2006 13:17:49
Messages: 812
Offline
|
|
Thật tình thì lúc đầu nghe "local VPN" em cũng thấy là lạ, trước giờ chỉ nghe VPN client-to-site hoặc VPN site-to-site, nhưng sau đó anh quanta giải thích VPN in LAN thì em cũng na ná hiểu.
Em chưa từng nghe thuật ngữ E-* của anh tranhuuphuoc lần nào, có lẽ vì chưa có dịp được đụng đến những công nghệ như thế, không biết anh có thể chia sẻ được không? (Google gives no result). Em cũng thắc mắc không biết anh có hiểu nhầm "VPN in LAN" của anh quanta không (?).
Sẵn tiện đây có bạn nào đọc qua có thể giải thích vì sao VPN in LAN lại làm giảm tình trạng nghẽn mạng không? Vì sao VPN mà không phải là giải pháp khác ? :-D |
|
All of my life I have lived by a code and the code is simple: "honour your parent, love your woman and defend your children" |
|
|
|
[Article] Đồng bộ dữ liệu với mô hình Dropbox |
04/04/2010 23:03:55 (+0700) | #10 | 208429 |
rs
Member
|
0 |
|
|
Joined: 15/07/2008 23:07:11
Messages: 220
Location: YANYM
Offline
|
|
To GA:
Thì ra ý bài reply là vậy, bạn viết ngắn gọn quá không đoán đc :D
Ở đây mình cũng không rõ khái niệm "VPN in LAN" ở trên, nhưng đoán không phải là E-LINE, hay E-LAN.
|
|
|
|
|
[Article] Đồng bộ dữ liệu với mô hình Dropbox |
08/04/2010 17:42:55 (+0700) | #11 | 208658 |
|
MrMe
Elite Member
|
0 |
|
|
Joined: 08/07/2006 13:01:01
Messages: 150
Offline
|
|
Khà VPN in LAN chỉ đơn giản là cài thêm 1 VPN để cho các máy trong mạng giao tiếp với nhau thôi.
Tham khảo link
/hvaonline/posts/list/14855.html
các anh nhà ta đã bàn về log và có 1 chút vpn in lan.
Log và Sync có quan hệ rất gần với nhau |
|
|
|
|
[Article] Đồng bộ dữ liệu với mô hình Dropbox |
16/06/2011 13:46:44 (+0700) | #12 | 241060 |
tuan_ryan
Member
|
0 |
|
|
Joined: 09/03/2011 12:46:14
Messages: 29
Offline
|
|
mR.Bi wrote:
2. 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.
Code:
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 đó.
Chào bạn mR.Bi,
Mình cài đến bước này nhưng client của mình là Ubuntu và Debian nên ko dùng được lệnh
Code:
lsyncd –conf /etc/lsyncd.conf.xml –debug
và file cấu hình của bác không dùng được cho lsyncd trên Ubuntu/Debinan thì phải vì khi chạy thì nó hiển thị :
Code:
$ lsyncd /etc/lsyncd.conf.xml
Error: Nothing to watch!
Error: Use sync(SOURCE, TARGET, BEHAVIOR) in your config file
|
|
|
|
|
[Article] Đồng bộ dữ liệu với mô hình Dropbox |
17/06/2011 05:36:47 (+0700) | #13 | 241122 |
|
quanta
Moderator
|
Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
|
|
tuan_ryan wrote:
Mình cài đến bước này nhưng client của mình là Ubuntu và Debian nên ko dùng được lệnh
Code:
lsyncd –conf /etc/lsyncd.conf.xml –debug
"không dùng được" là sao? lsyncd đâu có phụ thuộc vào distro.
tuan_ryan wrote:
và file cấu hình của bác không dùng được cho lsyncd trên Ubuntu/Debinan thì phải vì khi chạy thì nó hiển thị :
Code:
$ lsyncd /etc/lsyncd.conf.xml
Error: Nothing to watch!
Error: Use sync(SOURCE, TARGET, BEHAVIOR) in your config file
Đừng lấy file cấu hình của người khác về chạy mà không hiểu gì cả. Bạn chỉnh source + target chưa? |
|
Let's build on a great foundation! |
|
|
|
[Article] Đồng bộ dữ liệu với mô hình Dropbox |
17/06/2011 11:35:52 (+0700) | #14 | 241165 |
tuan_ryan
Member
|
0 |
|
|
Joined: 09/03/2011 12:46:14
Messages: 29
Offline
|
|
quanta wrote:
tuan_ryan wrote:
Mình cài đến bước này nhưng client của mình là Ubuntu và Debian nên ko dùng được lệnh
Code:
lsyncd –conf /etc/lsyncd.conf.xml –debug
"không dùng được" là sao? lsyncd đâu có phụ thuộc vào distro.
tuan_ryan wrote:
và file cấu hình của bác không dùng được cho lsyncd trên Ubuntu/Debinan thì phải vì khi chạy thì nó hiển thị :
Code:
$ lsyncd /etc/lsyncd.conf.xml
Error: Nothing to watch!
Error: Use sync(SOURCE, TARGET, BEHAVIOR) in your config file
Đừng lấy file cấu hình của người khác về chạy mà không hiểu gì cả. Bạn chỉnh source + target chưa?
Chào bạn quanta,
Rất vui vì bạn đã trả lời bài của mình.
Về mặt lý thuyết các thông số của file config XML thì chả có gì mà khó hiểu cả. Nhưng bài viết của bác mR.Bi có lẽ là đã hơn 1 năm và mình lên trang web của lsyncd : http://code.google.com/p/lsyncd/ thì không thấy còn dùng file config xml nữa. Họ có hướng dẫn 1 file config dạng text, có lẽ là phiên bản 2.0 thì như vậy. Ngay cả cấu trúc chạy lệnh với tham số -conf hay -debug thì lsyncd cũng không hiểu
Cũng mong bạn hiểu là mình không phải là dạng chạy hệ thống mà không hiểu file cấu hình. Nếu bạn đã từng cài lsyncd 2.0 và có kinh nghiệm về vấn đề này thì mong bạn góp ý cho mình.
Thân,
Tuấn.
|
|
|
|
|
|