Cấu hình đồng bộ thời gian thực giữa nhiều máy chủ Linux

Để 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:

  1. 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.
  2. 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:

Thẻ: rsync inotify CentOS real-time synchronization Load Balancing

Đăng vào ngày 30 tháng 6 lúc 11:35