in ,

Cách tự sao lưu dữ liệu server bằng rsync and crontab

Máy chủ Linux được nhiều công ty sử dụng rộng rãi để lưu trữ các trang web, cơ sở dữ liệu hoặc các dịch vụ khác. Cá nhân mình cũng dùng hệ thống Linux hơn nhiều so với Windows Server, không chỉ vì Linux miễn phí, mà bạn sẽ có được hiệu suất tốt hơn và nhiều công cụ mạnh mẽ hơn trên Linux.

Để thiết lập máy chủ Linux, bạn thực sự không cần máy chủ vật lý mà chỉnh cần một máy ảo VPS từ Linode, DigitalOcean hoặc Amazon là đã có thể sử dụng. Mặc dù hầu hết các nhà cung cấp máy chủ đám mây đều có dịch vụ sao lưu (thường không miễn phí), nhưng tốt hơn hết bạn nên có kế hoạch sao lưu của riêng mình.

Lệnh rsync là một công cụ lý tưởng để sao chép và đồng bộ hóa các tệp và thư mục với một máy tính từ xa, trong khi lệnh crontab được sử dụng để lên lịch thực hiện các công việc theo định kỳ. Kết hợp hai lệnh này, chúng ta có thể thiết lập một giải pháp sao lưu nhẹ và hiệu quả.

Bài viết này sử dụng hệ thống CentOS / Redhat làm ví dụ để giới thiệu cách thiết lập kế hoạch sao lưu.

Đầu tiên, dữ liệu nào nên được sao lưu?

Nói chung, chúng ta cần sao lưu dữ liệu quan trọng trên server như các trang web, cơ sở dữ liệu, tệp cấu hình và dữ liệu cá nhân. Bạn không cần thiết phải sao lưu dữ liệu như tệp hệ thống Linux, phần mềm đã cài đặt.

Dưới đây là một số thư mục cần được quan tâm:

  • Thư mục /etc: Mặc dù một số tệp trong thư mục này không cần sao lưu. Nhưng vì tổng dung lượng của thư mục này thường không quá 50 Megabyte, nên việc sao lưu toàn bộ thư mục sẽ không gây hại gì.
  • Thư mục /home: Đây là vị trí cho dữ liệu người dùng cá nhân của tất cả các tài khoản (trừ tài khoản root) và việc sao lưu phải bao gồm thư mục này. Tuy nhiên, có một vấn đề: Có rất nhiều dữ liệu bộ nhớ cache, history,… nằm trong thư mục này. Nó chỉ là vô nghĩa để sao lưu những dữ liệu này. Thay vì sao lưu toàn bộ /home, chỉ đặt các thư mục con cụ thể, chẳng hạn như /home/web/nhatphuc.com chẳng hạn.
  • Thư mục /var/www: Đây là thư mục mặc định cho các tệp trang web. (Nếu các tệp web của bạn nằm trong các thư mục khác, hãy tìm chúng và đưa vào danh sách sao lưu của bạn).
  • Thư mục /var/spool/mail: Đây là nơi chứa dữ liệu thư và chắc chắn phải được sao lưu.
  • Thư mục /var/lib/mysql: Đây là thư mục chứa dữ liệu cơ sở dữ liệu.

Nếu bạn muốn sao lưu toàn bộ dữ liệu được liệt kê ở trên mọi lúc, bạn có thể soạn một tập lệnh bash để lưu trữ tất cả các tệp bằng lệnh Linux tar và sau đó gửi (scp) tarball đến vị trí sao lưu. Phương pháp này hoạt động tốt để sao lưu trong mạng cục bộ, nhưng có thể không khả thi khi sao lưu dữ liệu từ VPS từ xa sang máy tính cục bộ vì hàng trăm hoặc thậm chí hàng nghìn megabyte được chuyển giữa hai máy tính từ xa mỗi lần. Nó khá lãng phí băng thông. Do đó bạn nên có một số mẹo để sử dụng hiệu quả bằng cách dùng kỹ thuật incremental backup.

Incremental backup sử dụng tiện ích rsync trong Linux sẽ giúp chỉ sao lưu dữ liệu đã sửa đổi. Đối với hầu hết các trường hợp, đây là một lựa chọn đúng đắn do tính hiệu quả và tiết kiệm băng thông và thời gian.

Bạn nên lưu trữ dữ liệu sao lưu ở đâu?

Ngoài việc sao lưu cục bộ. Mình luôn có một sao lưu nằm ở một máy tính từ xa, nó chỉ là một VPS Linux khác mình thuê rẻ thôi.

Làm thế nào để lên lịch sao lưu tự động?

Sử dụng song song lệnh rsync và cronjob có thể giúp bạn lên lịch sao lưu định kỳ, ví dụ: một script sao lưu có thể được lên lịch vào lúc nửa đêm mỗi ngày.

Chi tiết cách sao lưu tự động bằng kỹ thuật Incremental backup

Bài viết này mình hớng dẫn với server A chạy CentOS / Redhat và một VPS B để sao lưu với hệ thống CentOS / Redhat.

Bước 1: Cài rsync

Bạn cần phải cài rsync trên cải server A và VPS B. Nếu chưa được cài đặt, bạn có thể cài đặt nó bằng lệnh dưới đây trên cả hai:

yum install rsync

Bước 2: Tạo vị trí sao lưu trên VPS B

Bạn hãy đăng nhập vào VPS B bằng tài khoản root (Crontab yêu cầu quyền của người dùng root) và tạo một thư mục để chứa dữ liệu sao lưu, ví dụ mình tạo một thư mục /var/ServerBackup chứa dữ liệu sao lưu với lệnh dưới:

mkdir -p /var/ServerBackup

Bước 3: Tạo cặp khóa SSH

Tạo cặp khoá SSH để làm gì. Do bạn hướng đến tự động sao lưu, mà hai VPS này sẽ giao tiếp với nhau qua giao thức SSH, việc tạo khoá SSH sẽ giúp hai server kết nối với nhau không cần mật khẩu nhưng vẫn an toàn. Ở đây mình cần sao lưu dữ liệu từ server A đến VPS B, nên mình sẽ tạo khoá trước trên server A:

Bạn hãy đăng nhập vào server A và chạy lệnh sau:

ssh-keygen

Sẽ có một số câu hỏi để tạo key, nhưng bạn cứ Enter là được. Sau khi xong, hai tệp sẽ được tạo trong thư mục /root/.ssh: một tên có tên id_rsa là tệp chứa private key, một tệp là id_rsa.pub là tệp public key, phải được sao chép vào VPS B.

Bước 4: Chép public key vào VPS B:

Bạn cần chép file id_rsa.pub vào VPS B, cách dễ nhất là dùng lệnh sau:

scp /root/.ssh/id_rsa.pub root@A.com: /root/id_rsa.pub

Trong đó root@A.com với A.com là địa chỉ VPS B của bạn, để kết nối bằng SSH chép cho nhanh đó mà.

Bước 5: Thiết lập public key

Đăng nhập vào VPS B bằng tài khoản root và đính kèm nội dung trong tệp id_rsa.pub vào tệp authorized_keys. Nếu tệp /root/.ssh/authorized_keys không tồn tại trong VPS B, hãy thực hiện các lệnh sau để tạo trước:

mkdir -p /root/.ssh
chmod 700 /root/.ssh
touch /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys

Để đính public_key được tạo trong server A vào tệp ủy quyền bạn chạy câu lệnh:

cat /root/id_rsa.pub >> /root/.ssh/authorized_keys

Bây giờ bạn đã có thể sử dụng lệnh rsync để chuyển dữ liệu từ server A sang VPS B mà không cần mật khẩu.

Bước 6: chạy thử rsync (không cần thiết)

Bạn nên chạy thử lệnh rsync để kiểm tra nó hoạt động không. Ví dụ này sẽ sync thư mục /var/www qua VPS B:

rsync -avz root@A.com: /var/www /var/ServerBackup

Bước 7: Thiết lập sao lưu tự động với crontab

Đầu tiên bạn dùng lệnh crontab -e để hiệu chỉnh file lệnh tự động. Thêm dòng này vào cuối tệp crontab:

0 2 * * * /usr/bin/rsync -avz root@A.com: /var/www /var/ServerBackup

Câu lệnh trên sẽ thực thi câu lệnh tự động vào hai giờ sáng hàng ngày.

Ngoài ra bạn có thể tạo một file bash để hệ thống tự chạy nhiều lệnh.

ví dụ trong crontab bạn đặt:

0 2 * * * bash backup.sh

Nghĩa là 2 giờ sáng sẽ chạy file backup.sh

Giờ bạn soạn nội dung file batch cho phù hợp, ví dụ:

#!/bin/sh

/usr/bin/rsync -avz root@A.com:/etc  /var/ServerBackup
/usr/bin/rsync -avz --exclude mysite/updraft  --exclude mysite/.cache    root@A.com:/var/www   /var/ServerBackup
........  (other similar commands)
/usr/bin/rsync -avz root@A.com:/var/lib/mysql   /var/ServerBackup

Tập lệnh này chỉ là một mẫu và bạn có thể sửa đổi nó dựa trên nhu cầu của mình.

Vậy là xong, bây giờ bạn có thể yên tâm mà không phải lo lắng về việc mất dữ liệu.

Written by Linh Nguyễn

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments