Chào các bạn, việc sao lưu là công việc vô cùng quan trọng. Chính vì thế trên VnGeek có khá nhiều bài viết liên quan đến chủ đề này. Ví dụ như: Sao lưu và khôi phục máy chủ Ubuntu toàn diện (Phần 1/Phần 2). Hoặc là: Sao lưu và khôi phục dữ liệu máy tính với UrBackup
Còn một số bài viết khác về sao lưu cơ sở dữ liệu với Sypex Dumper 2,… Dùng Syncthing để đồng bộ, sao lưu dữ liệu dự phòng, cùng một số bài viết khác hy vọng mang lại chút kiến thức giúp ích cho các bạn.
Ngày hôm nay, mình xin chia sẻ với các bạn giải pháp sao lưu hiện tại mà mình đang áp dụng đối với máy chủ web VnGeek.com.
Trước tiên xin mời các bạn xem sơ đồ.
Một Website bao giờ cũng có 3 thành phần chính:
- Mã nguồn
- Cơ sở dữ liệu
- Các tập tin Media
Ngoài các thành phần trên hội tụ lại để một Website có thể hoạt động, tất nhiên không thể thiếu môi trường máy chủ (hay hosting) để chứa đựng và thực hiện các tác vụ tính toán, phản hồi các request của người dùng. Chính vì thế chúng ta cũng phải sao lưu cả môi trường máy chủ.
Chẳng hạn như muốn chạy một Website WordPress thông thường, chúng ta cần có các LEMP, LAMP stack,… tức là phải có phần mềm webserver, môi trường PHP, hệ thống quản trị cơ sở dữ liệu (database). Đã gọi là sao lưu toàn diện thì chúng ta cũng phải sao lưu cả môi trường. Bởi bạn sẽ không muốn phải cài đặt lại từ đầu rồi phát sinh lỗi này, lỗi kia khá mất thời gian, đôi khi cài xong lại không tương thích với mã nguồn,…
Như vậy, cần thiết phải sao lưu cả hệ thống hiện tại (hệ điều hành, các ứng dụng,…).
Như vậy, ở đây mình đã có giải pháp (tất nhiên là ở quy mô nhỏ lẻ của VnGeek.com):
1 tuần/1 lần, tiến hành sao lưu hệ điều hành và các ứng dụng, môi trường bằng TAR. Được thực hiện tự động bởi Cronjob.
Sao lưu toàn bộ mã nguồn, Media của trang VnGeek tại thư mục:
/var/www –> Sử dụng Syncthing để đồng bộ. Tương tự với cơ sở dữ liệu. Sẽ được Export ra bởi Sypex Dumper 2 và đồng bộ sang máy chủ sao lưu cũng bằng Syncthing.
Bây giờ đến bước cấu hình.
Trước tiên đối với sao lưu hệ điều hành Ubuntu Server 16.04. Để sao lưu hệ thống hiện tại mà không cần phải suy nghĩ đắn đo nhiều, chúng ta có dòng lệnh:
tar -cvpzf backup.tar.gz --exclude=/backup.tar.gz --one-file-system /
Mình xin giải thích một chút ở các hậu tố đằng sau lệnh TAR:
tar – là lệnh tạo tập tin lưu trữ.
c – tạo một bản lưu trữ sao lưu mới.
v – hiển thị chi tiết những gì lệnh tar thực hiện ra màn hình.
p – lưu giữ phân quyền các tệp được lưu trữ trong tập tin lưu trữ để khôi phục sau này.
z – nén tệp sao lưu bằng ‘gzip’ để làm cho tệp nhỏ hơn.
f – nơi lưu trữ tập tin sao lưu backup.tar.gz. Theo như lệnh trên thì tập tin này sẽ nằm ngay tại thư mục hiện hành – nơi dòng lệnh Tar được thực thi.
Bạn cũng có thể nâng cao hơn một chút bằng cách thêm –exclude vào dòng lệnh để loại trừ những thư mục không cần thiết không muốn thêm vào tập tin sao lưu backup.tar.gz.
tar -cvpzf backup.tar.gz \
--exclude=/backup.tar.gz \
--exclude=/proc \
--exclude=/var/www \
--exclude=/tmp \
--exclude=/mnt \
--exclude=/dev \
--exclude=/sys \
--exclude=/run \
--exclude=/media \
--exclude=/var/log \
--exclude=/var/cache/apt/archives \
--exclude=/usr/src/linux-headers* \
--exclude=/home/*/.gvfs \
--exclude=/home/*/.cache \
--exclude=/home/*/.local/share/Trash /
Bạn hãy tùy biến theo nhu cầu của mình. Mình có thêm dòng
--exclude=/var/www
Bởi vì mình sẽ đồng bộ thư mục này trực tiếp với Syncthing đến máy chủ sao lưu.
Dòng lệnh cuối cùng mà mình sẽ sử dụng sẽ như thế này:
tar -cvpzf /vngeek/backup.tar.gz --exclude=/backup.tar.gz --exclude=/var/www --exclude=/var/log --one-file-system /
Để có thể thực hiện sao lưu tự động, chúng ta cần tạo một script để chạy lệnh TAR: Chúng ta tạo file /backup.sh:
#!/bin/bash
#Purpose = Backup of Important Data
#Created on 15-10-2018
#Author = PhatNLQ, Source:Hafiz Haider (http://broexperts.com/how-to-backup-files-and-directories-in-linux-using-tar-cron-jobs/)
#Version 1.0
#START
TIME=`date +%b-%d-%y` # This Command will add date in Backup File Name.
FILENAME=backup-$TIME.tar.gz # Here i define Backup file name format.
SRCDIR=/ # Location of Important Data Directory (Source of backup).
DESDIR=/vngeek # Destination of backup file.
tar -cvpzf $DESDIR/$FILENAME --exclude=/vngeek --exclude=/var/www --exclude=/var/log --one-file-system $SRCDIR
#END
Nhìn vào Script ở trên chắc các bạn đã hiểu rồi chứ.
Bây giờ tạo thư mục /vngeek để chứa tập tin sao lưu hệ thống:
mkdir /vngeek
Thêm vào Crontab:
crontab -e
5 8 * * 0 /bin/bash /backup.sh
Có nghĩa là Script sẽ được chạy vào lúc 8 giờ 5 phút sáng chủ nhật hàng tuần. Khi đó bản sao lưu hệ thống của chúng ta cũng tự động được tạo ra.
Các bạn có thể chạy thử mà không cần chờ đợi Cronjob để kiểm tra:
/bin/bash /backup.sh
Và kết quả:
root@vngeek:/# cd /vngeek
root@vngeek:/vngeek# dir
backup-Oct-16-18.tar.gz
root@vngeek:/vngeek# ls -lh
total 2.1G
-rw-r--r-- 1 root root 2.1G Oct 16 00:59 backup-Oct-16-18.tar.gz
root@vngeek:/vngeek#
Như vậy là chúng ta đã tạo thành công tập tin backup-Oct-16-18.tar.gz. Sau này chỉ việc đồng bộ với Syncthing thôi.
Tuy nhiên sau một thời gian, các tập tin sao lưu sẽ ngày càng nhiều đi và đôi khi các tập tin sao lưu cũ bạn sẽ không muốn dùng tới nữa và cần xóa nó đi. Bạn có thể tự động xóa các tập tin bằng lệnh sau:
find /vngeek -type f -name '*.tar.gz' -mtime +30 -exec rm {} \;
Dòng lệnh ở trên có nghĩa là tìm những tập tin có đuôi mở rộng là .tar.gz, nằm trong thư mục /vngeek, nếu quá 14 ngày kể từ ngày tạo thì xóa đi.
Thêm vào Cronjob:
5 8 * * 0 /usr/bin/find /vngeek -type f -name '*.tar.gz' -mtime +14 -exec rm {} \;
Câu lệnh trên cũng đồng nghĩa chúng ta không chứa quá 3 file sao lưu trên thư mục sao lưu /vngeek
Tiếp tục, sao lưu thư mục Web root – ở đây là /var/www.
Dùng Syncthing để đồng bộ, các bạn muốn tìm hiểu cách cài đặt chi tiết có thể tham khảo các bài viết về Syncthing trên VnGeek luôn.
Bạn cần thêm thư mục để Sync trong phần cấu hình của máy chủ Web VnGeek. Sau đó chúng ta sẽ đồng bộ trên máy chủ sao lưu.
Tóm tắt lại cách cài đặt Syncthing cho bạn nào lười tìm kiếm:
sudo apt-get install curl
curl -s https://syncthing.net/release-key.txt | sudo apt-key add -
Thêm Deb:
echo "deb http://apt.syncthing.net/ syncthing release" | sudo tee /etc/apt/sources.list.d/syncthing.list
Cài đặt:
sudo apt-get update
sudo apt-get install syncthing
Thêm dịch vụ tự chạy mỗi khi khởi động cho Syncthing:
systemctl enable syncthing@root.service
Mình sử dụng root là User. Bạn hãy đổi sang tên người dùng phù hợp của bạn, cá nhân mình dùng root luôn, mặc dù không được khuyến cáo nhưng xài luôn root cho toàn quyền. Sau này tính sau.
Nếu dịch vụ được enable thành công trông như thế này:
Bây giờ chúng ta chạy dịch vụ luôn:
systemctl start syncthing@root.service
Kiểm tra lại xem dịch vụ chạy chưa bằng lệnh:
systemctl status syncthing@root.service
Tiếp theo tìm tập tin thiết lập cho Syncthing:
updatedb
locate config.xml
Tìm ra được ở đây rồi:
root@vngeek-backup:/home/phatnlq# locate config.xml
/root/.config/syncthing/config.xml
root@vngeek-backup:/home/phatnlq#
Giờ thì chỉnh sửa config.xml để chúng ta có thể truy cập Web Gui từ xa:
nano /root/.config/syncthing/config.xml
Tìm đến dòng:
<gui enabled="true" tls="false" debugging="false">
<address>127.0.0.1:8384</address>
<apikey>wYWNRRmvgsTdkhXe6zpx6VFo3k6CdZz3</apikey>
<theme>default</theme>
</gui>
Sửa 127.0.0.1:8384 thành 0.0.0.0:8384 để có thể truy cập Web Gui của Syncthing từ bất cứ địa chỉ IP nào.
Đừng quên khởi động lại dịch vụ Syncthing để thấy được thay đổi:
systemctl restart syncthing@root.service
Giờ thì truy cập vào Syncthing ở địa chỉ: http://ip_may_chu:8384
Bây giờ bạn chỉ việc đồng bộ thư mục chia sẻ từ máy chủ VnGeek Web sang máy chủ sao lưu VnGeek Backup thôi. Cái này thì đơn giản rồi. Mình không cần phải hướng dẫn thêm đâu.
Hì tương tự như vậy, các bạn tiếp tục sử dụng Syncthing để đồng bộ các tập tin cần thiết khác nhé. Bạn có thể xem Video bên dưới về cách thiết lập đồng bộ một chiều từ máy chủ VnGeek Web sang VnGeek Backup nhé.
Video mình sẽ đăng sớm, các bạn chờ nhé.