Để cân bằng tải và sao lưu dữ liệu ở nhiều vị trí địa lý khác nhau, bạn có thể sử dụng phương pháp này (chỉ áp dụng cho các tệp tin website, nếu là cơ sở dữ liệu, hãy xem xét kiến trúc đa master của MySQL).
1. Cấu hình máy và IP
- Máy A: Nằm ở Hàng Châu, IP: 115.33.25.25, CentOS 6.4_x64
- Máy B: Nằm ở Mỹ, IP: 192.8.172.133, CentOS 6.4_x64
2. Phần mềm cơ bản
Để thực hiện đồng bộ tệp tin theo thời gian thực, cần sử dụng hai phần mềm sau:
- rsync: Có thể sao chép toàn bộ thư mục từ máy này sang máy khác, hỗ trợ nhiều chế độ, chi tiết xem
man rsync. - inotify-tools: Cho phép theo dõi mọi thay đổi trong một thư mục cụ thể trên Linux, bao gồm thêm, xóa, truy cập, thay đổi quyền.
3. Ý tưởng thực hiện
Sử dụng inotify-tools để theo dõi thay đổi trong thư mục được chỉ định, sau đó dùng rsync để đẩy các tệp đã thay đổi lên máy chủ đích.
4. Thực hiện
Sau khi hiểu rõ nguyên lý, chúng ta sẽ thực hiện theo các bước sau:
Bước 1: Cài đặt rsync trên cả hai máy
yum install rsync -y # Cài đặt rsync
Bước 2: Cấu hình rsyncd.conf trên máy A (IP: 115.33.25.25)
mkdir /etc/rsyncd # Tạo thư mục cấu hình rsync
touch /etc/rsyncd/rsyncd.conf # Tạo file rsyncd.conf
ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf # Tạo liên kết đến /etc/rsyncd.conf
vim /etc/rsyncd/rsyncd.conf # Chỉnh sửa nội dung rsyncd.conf như sau:
uid = apache # Sử dụng user apache để cập nhật dữ liệu
gid = apache # Sử dụng group apache để cập nhật dữ liệu
read only = false
transfer logging = true
max connections = 10
slp refresh = 300
hosts allow = 192.8.172.133 # Chỉ cho phép IP của máy B truy cập
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
log format = %h %o %f %l %b
[web] # Module name used for communication with other machines
path = /var/www/html # Thư mục cần đồng bộ
comment = rsynctest
read only = false # Phải thiết lập thành false, nếu không máy khác không thể push data lên
list = false
auth users = hanxianlong # User name to use when starting rsync in daemon mode
secrets file = /etc/rsyncd/pass_server.conf # File chứa username và password
exclude from = /etc/rsyncd/exclude.txt # Danh sách các tệp hoặc thư mục bị bỏ qua
Bước 3: Tạo file mật khẩu cho rsync trên máy A
vim /etc/rsyncd/pass_server.conf # Chỉnh sửa file mật khẩu
hanxianlong:abc123
chmod 600 /etc/rsyncd/pass_server.conf # Đặt quyền 600 cho file
Bước 4: Khởi động dịch vụ rsync trên máy A
rsync --daemon --config=/etc/rsyncd/rsyncd.conf
Bước 4.1: Đồng bộ dữ liệu từ máy B sang máy A
rsync -avzP /var/www/ hanxianlong@115.33.25.25::web
Để tránh nhập mật khẩu, tạo file pass.conf trên máy B:
vim /etc/rsyncd/pass.conf # Chỉnh sửa file mật khẩu
abc123
rsync -avzP --password-file=/etc/rsyncd/pass.conf /var/www/ hanxianlong@115.33.25.25::web
Bước 5: Cài đặt inotify-tools trên máy B
wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
cp inotify-tools-3.14.tar.gz /usr/local/src/
cd /usr/local/src
tar -xzvf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure --prefix=/usr/local/inotify/ --libdir=/usr/lib64
make && make install
Bước 5.1: Tạo script inotify.sh để theo dõi thay đổi
Tạo file inotify.sh và chỉnh sửa quyền:
#!/bin/sh
src=/var/www/
des=web
ip=115.33.25.25 # IP của máy A
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib ${src} | while read file
do
rsync -avz --delete --progress --password-file=/etc/rsyncd/pass.conf ${src} hanxianlong@${ip}::${des} &&
echo "${src} was rsynced"
done
Bước 5.2: Khởi chạy script inotify
nohup inotify.sh &
Bước 6: Kiểm tra đồng bộ
cd /var/www
touch a.txt
Kiểm tra /var/www trên máy A để đảm bảo tệp đã được đồng bộ. Nếu gặp lỗi, kiểm tra nohup.log.
Bước 7-8: Lặp lại Bước 1-4 và Bước 5-6 trên máy B và máy A tương ứng, điều chỉnh IP phù hợp.
Bước 9: Hoàn thành, hai máy đã có thể đồng bộ thay đổi và xóa tệp theo thời gian thực.
Các vấn đề có thể gặp phải:
- Lỗi kết nối:
rsync: failed to connect to X.X.X.X: No route to host (113) - Lỗi socket:
rsync error: error in socket IO (code 10) at clientserver.c(107) [sender=2.6.8]
Giải quyết:
- Đảm bảo máy đang hoạt động.
- Mở cổng 873 trên tường lửa.
- Thêm quy tắc vào
/etc/sysconfig/iptables:
-A INPUT -p tcp -s X.X.X.X --dport 873 -j ACCEPT
Khởi động lại iptables:
service iptables restart
Tham khảo: