Reading Time: 11 minutes

Trong bài hướng dẫn này, chúng ta sẽ khám phá các chiến lược sao lưu dữ liệu khác nhau. Vì mỗi trường hợp sử dụng đòi hỏi một giải pháp riêng. Bài viết này không thể đưa ra một câu trả lời chung cho tất cả, nhưng bạn sẽ học được những yếu tố quan trọng cho mỗi kịch bản và những cách triển khai phù hợp nhất cho hệ thống của mình.

chiến lược sao lưu dữ liệu

Sao lưu là một công việc rất quan trọng đối với các máy chủ cloud. Dù bạn đang vận hành một dự án với toàn bộ dữ liệu được lưu trên một server, hay đang triển khai từ Git trực tiếp lên các máy ảo (vốn được tạo ra và xóa đi trong khi chỉ giữ lại một lượng log tối thiểu), bạn nên luôn có kế hoạch cho các sự cố. Kế hoạch tùy thuộc vào ứng dụng bạn đang sử dụng, tầm quan trọng của việc chuyển đổi dự phòng (failover) tức thời, và những loại sự cố có thể xảy ra.

Trong phần đầu, chúng ta sẽ xem xét một số giải pháp sao lưu thông dụng và đánh giá ưu điểm tương đối của từng giải pháp để bạn có thể chọn phương pháp phù hợp với mình. Sau đó, chúng ta sẽ khám phá các tùy chọn về dự phòng (redundancy).

Sự khác biệt giữa dự phòng và sao lưu là gì?

Các định nghĩa của thuật ngữ dự phòng (redundancy) và sao lưu (backup) thường chồng chéo và trong nhiều trường hợp còn dễ gây nhầm lẫn. Đây là hai khái niệm riêng biệt tuy có liên quan nhưng khác nhau. Một số giải pháp cung cấp cả hai.

Dự phòng

Các giải pháp dự phòng cung cấp cơ chế failover ngay lập tức trong trường hợp xảy ra sự cố hệ thống. Failover có nghĩa là nếu một bộ dữ liệu (hoặc một host) không còn dùng được, một bản sao hoàn hảo khác sẽ ngay lập tức được hoán đổi để thay thế. Điều này giúp gần như không có thời gian chết (downtime) đáng kể, và ứng dụng hoặc trang web có thể tiếp tục phục vụ các yêu cầu như chưa có chuyện gì xảy ra. Trong khi đó, quản trị viên hệ thống (trong trường hợp này là bạn) có thời gian để khắc phục sự cố và đưa hệ thống trở lại trạng thái hoạt động đầy đủ ban đầu.

Tuy nhiên, một giải pháp dự phòng thường không phải là một giải pháp sao lưu. Lưu trữ dự phòng không mặc định bảo vệ bạn khỏi một sự cố ảnh hưởng đến toàn bộ máy hoặc hệ thống.

Ví dụ, nếu bạn có cấu hình RAID nhân bản (mirrored RAID, chẳng hạn như RAID 1), dữ liệu của bạn có tính dự phòng vì nếu một ổ đĩa bị lỗi, ổ đĩa còn lại vẫn sẽ khả dụng. Tuy nhiên, nếu chính máy chủ bị lỗi, toàn bộ dữ liệu của bạn có thể bị mất.

Với các giải pháp dự phòng như MySQL Group Replication, mọi thao tác thường được thực hiện cả trên mọi bản sao của dữ liệu. Điều này bao gồm cả các hành động phá hoại hoặc vô tình gây lỗi. Trong khi đó, một giải pháp sao lưu phải cho phép bạn khôi phục từ một thời điểm trước đó mà dữ liệu được xác định là hợp lệ.

Sao lưu

Nhìn chung, bạn luôn cần duy trì các bản sao lưu cho những dữ liệu quan trọng của mình. Tùy thuộc vào tình huống, điều này có nghĩa là tạo sao lưu dữ liệu của ứng dụng, của người dùng, hoặc của toàn bộ trang web hay máy chủ.

Mục đích của việc sao lưu là trong trường hợp hệ thống, máy chủ hoặc dữ liệu bị mất, bạn có thể khôi phục, triển khai lại hoặc truy cập vào dữ liệu của mình. Việc khôi phục từ bản sao lưu có thể gây ra downtime tạm thời, nhưng như vậy bạn chỉ mất dữ liệu trong một ngày gần đây thay vì mất toàn bộ dữ liệu. Bất cứ thứ gì bạn không thể để mất thì mặc định là phải nên được sao lưu.

Về phương pháp, có khá nhiều cấp sao lưu khác nhau. Chúng có thể được kết hợp khi cần thiết để đối phó với các loại sự cố khác nhau. Ví dụ, bạn có thể sao lưu một file cấu hình trước khi sửa đổi nó để có thể quay lại sử dụng nó nếu có sự cố phát sinh. Tuy nhiên, phương pháp này sẽ không giúp ích gì trong trường hợp ổ đĩa bị lỗi hoặc có sự cố phức tạp hơn. Bạn cũng nên có các bản sao lưu tự động, định kỳ ở một nơi bên ngoài (remote).

Bản thân việc sao lưu không cung cấp cơ chế failover tự động. Điều này có nghĩa là sự cố có thể không làm bạn mất dữ liệu (giả sử bản sao lưu của bạn được cập nhật 100%), nhưng có thể làm mất thời gian hoạt động (uptime). Đây là một lý do tại sao dự phòng và sao lưu thường được sử dụng kết hợp với nhau.

Sao lưu cấp file

Một trong những hình thức sao lưu quen thuộc nhất là sao lưu cấp file (file-level backup). Loại sao lưu này sử dụng các công cụ sao chép ở cấp hệ thống file thông thường để chuyển các file đến một vị trí hoặc thiết bị khác.

Sử dụng lệnh cp

Về lý thuyết, bạn có thể sao lưu một máy Linux, như máy chủ cloud của bạn, bằng lệnh cp. Nó sao chép các file từ một vị trí cục bộ này sang một vị trí cục bộ khác. Trên máy tính cục bộ, bạn có thể mount (gắn) một ổ đĩa di động, sau đó sao chép các file vào đó:

mount /dev/sdc /mnt/my-backup
cp -a /etc/* /mnt/my-backup
umount /dev/sdc

Ví dụ này mount ổ đĩa di động sdc, vào đường dẫn /mnt/my-backup và sau đó sao chép thư mục /etc vào đó. Sau đó, nó ngắt kết nối ổ đĩa, và bạn có thể cất nó ở một nơi an toàn.

Sử dụng Rsync

Một lựa chọn tốt hơn cp so với là lệnh rsync. Rsync là một công cụ mạnh mẽ cung cấp một loạt các tùy chọn để nhân bản các file và thư mục trên nhiều môi trường khác nhau, tích hợp khả năng xác thực checksum và các tính năng khác.

Lệnh rsync sau có tác dụng tương đương với ví dụ cp ở trên:

mount /dev/sdc /mnt/my-backup
rsync -azvP /etc/* /mnt/my-backup
umount /dev/sdc

-azvP là một bộ các tùy chọn hay dùng trong Rsync. Dưới đây là phân tích về chức năng của từng tùy chọn:

  • a: Kích hoạt chế độ lưu trữ (Archive Mode) cho thao tác sao chép này, giúp bảo toàn thời gian sửa đổi file, chủ sở hữu, v.v. Nó cũng tương đương với bộ tùy chọn -rlptgoD. Lưu ý là tùy chọn -r yêu cầu Rsync thực hiện việc copy với tất cả cấp thư mục con. Tùy chọn này cũng hay được sử dụng trong các công cụ copy khác như cpscp.
  • z: Nén dữ liệu trong quá trình truyền nếu có thể. Điều này có ích khi bạn copy file qua môi trường có kết nối chậm, đặc biệt khi dữ liệu có khả năng nén hiệu quả như log và các loại văn bản khác.
  • v: Bật chế độ thông tin chi tiết (verbose mode) để bạn có thể đọc thêm về quá trình truyền dữ liệu khi nó đang diễn ra.
  • P: Yêu cầu Rsync giữ lại các bản sao một phần của file khi nó chưa được truyền xong hoàn toàn. Điều này giúp quá trình truyền có thể được tiếp tục sau đó.

Bạn có thể xem tất cả các tùy chọn rsync khác trên trang man của nó.

Trong môi trường cloud, không phải lúc nào ta cũng dùng một ổ đĩa di động để sao chép file vào đó. Rsync cũng có thể thực hiện sao lưu từ xa qua mạng với cú pháp kiểu SSH.

Cách thức này hoạt động trên bất kỳ host nào bạn có thể SSH vào, miễn là Rsync được cài đặt ở cả hai đầu. Vì Rsync là một công cụ cốt lõi của các hệ thống Linux, nó thường đã được cài đặt sẵn trên đo, ngay cả khi bạn đang làm việc cục bộ trên máy Mac hoặc Windows.

rsync -azvP /etc/* username@remote_host:/backup/

Lệnh này sẽ sao lưu thư mục /etc của máy cục bộ vào một thư mục tại /backup trên máy remote_host. Nó sẽ chỉ chạy thành công nếu bạn có quyền ghi vào thư mục này và ổ đĩa có đủ dung lượng trống.

Sử dụng các công cụ sao lưu khác

Mặc dù cp và Rsync rất hữu ích và phổ biến, tự chúng không phải là một giải pháp hoàn chỉnh. Để tự động hóa việc sao lưu bằng Rsync, bạn sẽ cần tạo các quy trình tự động, lịch trình sao lưu, xoay vòng log (log rotation), v.v.

Mặc dù việc triển khai thủ công có thể phù hợp với một hệ thống nhỏ không sử dụng các dịch vụ bên ngoài, hoặc các hệ thống lớn có nhân lực để viết và bảo trì các script cho các mục đích khác nhau, nhiều người dùng có thể muốn dùng các giải pháp sao lưu chuyên dụng.

Bacula

Bacula là một giải pháp phức tạp, linh hoạt hoạt động theo mô hình client-server. Nó được thiết kế với các khái niệm riêng biệt về client, vị trí sao lưu, và director (thành phần điều phối việc sao lưu thực tế). Nó cũng cấu hình mỗi tác vụ sao lưu thành một đơn vị gọi là “job”.

Điều này cho phép ta cấu hình việc sao lưu cực kỳ chi tiết và linh hoạt. Bạn có thể sao lưu nhiều client vào một thiết bị lưu trữ, một client vào nhiều thiết bị lưu trữ, và sửa đổi lược đồ sao lưu bằng cách thêm các node hoặc điều chỉnh chi tiết của chúng. Nó hoạt động tốt trong môi trường mạng và có thể mở rộng theo dạng mô-đun. Vì các lý do đó, Bacula là lựa chọn tuyệt vời để sao lưu một trang web hoặc ứng dụng trải rộng trên nhiều server.

Duplicity

Duplicity là một công cụ sao lưu mã nguồn mở khác. Nó mặc định sử dụng mã hóa GPG cho các việc truyền dữ liệu. Lợi ích rõ ràng của việc này khi sao lưu file là dữ liệu không được lưu trữ dưới dạng văn bản thuần túy (plain text).

Chỉ có chủ sở hữu của khóa GPG mới có thể giải mã dữ liệu. Điều này cung cấp một mức độ bảo mật để bù đắp cho các biện pháp bảo mật bổ sung cần thiết cho việc lưu trữ dữ liệu ở nhiều vị trí.

Một lợi ích khác những người chưa sử dụng GPG có thể không nhận ra là mỗi giao dịch phải luôn được xác minh là hợp lệ. Giống như Rsync, GPG thực thi việc kiểm tra hash (mã băm) để đảm bảo không có mất mát dữ liệu trong quá trình truyền. Điều này có nghĩa là khi khôi phục dữ liệu từ một bản sao lưu, bạn sẽ ít có khả năng gặp phải tình trạng file bị hỏng.

Sao lưu cấp block

Một phương pháp thay thế khác tuy ít phổ biến hơn nhưng cũng quan trọng không kém là sao lưu cấp block (khối). Kiểu sao lưu này còn được gọi là tạo ảnh đĩa (image) vì nó có thể nhân bản và khôi phục toàn bộ các đĩa lưu trữ.

Sao lưu cấp block cho phép bạn sao chép ở một cấp sâu hơn các file. Trong khi sao lưu dựa trên file có thể sao chép file1, file2, và file3 đến một vị trí sao lưu, một hệ thống sao lưu dựa trên khối sẽ sao chép toàn bộ khối (block) mà các file đó cư trú trên các ổ đĩa. Nói một cách khác, đây là kiểu sao chép toàn bộ dữ liệu theo từng bit một và chúng ta không cần biết cụ thể file nào nằm trên các bit đó.

Một ưu điểm của sao lưu cấp block là tốc độ nhanh hơn. Trong khi sao lưu dựa trên file thường khởi tạo một lần truyền dữ liệu mới cho mỗi file, phương pháp này sẽ truyền các khối dữ liệu và cần ít lần truyền không tuần tự hơn để hoàn thành việc sao chép.

Sử dụng dd

Phương pháp phổ biến nhất để thực hiện sao lưu cấp block là với tiện ích dd. Nó có thể tạo toàn bộ ảnh đĩa, và cũng thường được sử dụng để lưu trữ các ổ lưu trữ di động như CD hoặc DVD. Điều này có nghĩa là bạn có thể sao lưu chỉ một partition (phân vùng) hoặc toàn bộ disk (ổ đĩa) thành một file duy nhất hoặc lên một thiết bị lưu trữ trống khác mà không cần các bước chuẩn bị nào.

Để sử dụng dd, bạn cần chỉ định một vị trí đầu vào và một vị trí đầu ra như sau:

dd if=/path/of/original/device of=/path/to/place/backup

Trong lệnh này, đối số if= chỉ định thiết bị hoặc vị trí đầu vào (input). Đối số of= chỉ định file hoặc vị trí đầu ra (output). Hãy cẩn thận để không nhầm lẫn chúng, nếu không bạn có thể vô tình xóa toàn bộ dữ liệu mà bạn muốn sao lưu.

Ví dụ, để sao lưu một partition (/dev/sda3) chứa tài liệu, bạn có thể tạo một ảnh của thư mục đó bằng cách cung cấp một đường dẫn đầu ra đến một file :

dd if=/dev/sda3 of=~/documents.img

Sao lưu theo phiên bản

Một trong những mục đính chính để sao lưu dữ liệu là khả năng khôi phục một phiên bản cụ thể trong quá khử của một file trong trường hợp đã có thay đổi không mong muốn. Mặc dù tất cả các cơ chế sao lưu được đề cập cho đến nay đều hỗ trợ điều này, bạn cũng có thể triển khai một giải pháp chi tiết hơn.

Ví dụ, đây là một cách tạo một bản sao lưu thủ công của một file trước khi chỉnh sửa nó với nano:

cp file1 file1.bak
nano file1

Bạn thậm chí có thể tự động hóa quy trình này bằng cách tạo các file ẩn có kèm dấu thời gian mỗi khi bạn sửa đổi một file. Ví dụ, bạn có thể đặt đoạn mã này vào file ~/.bashrc để mỗi khi bạn chạy nano từ bash (tức là $), nó sẽ tự động tạo một bản sao lưu được đánh dấu theo năm (%y), tháng (%m), ngày (%d), v.v.:

nano() { cp $1 .${1}.`date +%y-%m-%d_%H.%M.%S`.bak; /usr/bin/nano $1; }

Cơ chế này chỉ hoạt động khi bạn chỉnh sửa file thủ công bằng nano và có thể nhanh chóng làm đầy ổ đĩa. Bạn có thể dễ dàng nhận thấy vì sao đôi khi nó còn tệ hơn việc sao chép thủ công các file bạn sắp chỉnh sửa.

Một giải pháp thay thế để giải quyết các vấn đề cố hữu ở trên là sử dụng Git làm hệ thống quản lý phiên bản. Mặc dù nó được tạo ra chủ yếu để quản lý phiên bản của các file plain text (thường là các file code) theo từng dòng một, bạn có thể sử dụng Git để theo dõi thay đổi của gần như mọi loại file.

Sao lưu cấp máy chủ

Hầu hết các nhà cung cấp dịch vụ hosting cũng sẽ cung cấp chức năng sao lưu tùy chọn của riêng họ. Ví dụ, chức năng sao lưu của DigitalOcean thường xuyên thực hiện các bản sao lưu tự động cho các droplet (máy chủ ảo trên DigitalOcean) đã bật dịch vụ này. Bạn có thể bật tính năng này trong quá trình tạo droplet bằng cách chọn hộp kiểm Backups:

Các lựa chọn của chiến lược sao lưu cấp server

Tính năng này sẽ sao lưu toàn bộ ảnh (image) của máy chủ cloud của bạn một cách thường xuyên. Điều này có nghĩa là bạn có thể triển khai lại từ bản sao lưu đó hoặc sử dụng nó làm cơ sở để tạo các droplet mới.

Để tạo ảnh một lần cho hệ thống của bạn, bạn cũng có thể tạo các snapshot. Chúng hoạt động tương tự như sao lưu, nhưng không được tự động hóa. Mặc dù ta có thể tạo snapshot của một hệ thống đang chạy trong một số bối cảnh, điều này không phải lúc nào cũng nên làm mà còn tùy thuộc vào cách bạn đang ghi vào hệ thống file của mình:

Sao lưu cấp server

GitOps

Có một số trường hợp đáng lưu ý mà bạn không nhất thiết phải tìm cách triển khai sao lưu trên từng server. Ví dụ, nếu việc triển khai của bạn tuân theo các nguyên tắc của GitOps, từng máy chủ cloud riêng lẻ có thể được xóa hoặc thay thế dễ dàng. Thay vào đó, ta có thể coi các nguồn dữ liệu từ xa như kho chứa Git là nguồn dữ liệu chính thống (source of truth) cho dữ liệu của mình.

Các hệ thống triển khai phức tạp, hiện đại như thế này có thể có khả năng mở rộng tốt hơn và ít bị lỗi hơn trong nhiều trường hợp. Tuy nhiên, bạn vẫn sẽ muốn triển khai một chiến lược sao lưu cho chính các kho dữ liệu của mình, hoặc cho một máy chủ log tập trung mà mỗi máy chủ dễ thay thế đó có thể đang gửi thông tin đến. Hãy xem xét những khía cạnh nào của hệ thống triển khai của bạn có thể không cần sao lưu, và những khía cạnh nào cần.

Tổng kết

Trong bài viết này, bạn đã tìm hiểu các khái niệm và chiến lược sao lưu dữ liệu khác nhau. Việc nắm rõ khi nào nên sử dụng sao lưu cấp file, cấp block, cấp máy chủ, theo phiên bản cũng như cách tự động hóa quy trình sẽ giúp dữ liệu của bạn an toàn hơn. Ở bước tiếp theo, bạn có thể tham khảo các phương án triển khai dự phòng đi kèm cho hệ thống của mình.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất