Menu
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Đang tải...

Bài 27 — Backup Strategy: 3-2-1 Rule

Operations Management for Tech Bài 27/60

Mở đầu — vì sao bài này quan trọng

Có một câu nói kinh điển trong giới vận hành hệ thống mà tôi muốn bạn ghi nhớ ngay từ đầu: "Không ai thực sự muốn backup, người ta chỉ muốn restore." Nghe có vẻ đùa, nhưng nó chạm đúng vào bản chất công việc. Bạn sao lưu dữ liệu hàng ngày, hàng giờ, tốn tiền lưu trữ, tốn công cấu hình — nhưng giá trị thật sự chỉ hiện ra vào đúng cái khoảnh khắc tệ hại nhất: khi database bị xóa nhầm, khi ransomware mã hóa toàn bộ server, khi một kỹ sư gõ nhầm DROP TABLE trên production, hoặc khi cả một region của nhà cung cấp cloud sập.

Và đây là sự thật đau lòng mà nhiều đội ngũ chỉ nhận ra khi đã quá muộn: có backup không đồng nghĩa với có khả năng phục hồi. Rất nhiều công ty tin rằng mình an toàn cho đến ngày họ thử restore và phát hiện file backup bị corrupt, hoặc bản sao lưu duy nhất nằm chung server với dữ liệu gốc và cùng bị xóa, hoặc backup đã ngừng chạy âm thầm từ ba tháng trước mà không ai để ý.

Quy tắc 3-2-1 ra đời chính là để chống lại những cái bẫy đó. Đây là một nguyên tắc đơn giản đến mức bạn có thể ghi nhớ trong mười giây, nhưng đủ mạnh để trở thành tiêu chuẩn vàng được các cơ quan an ninh mạng như US-CERT khuyến nghị. Trong bài này, chúng ta sẽ mổ xẻ từng con số, hiểu vì sao nó được thiết kế như vậy, và quan trọng nhất là cách áp dụng nó trong bối cảnh cloud-native hiện đại — nơi khái niệm "hai loại phương tiện khác nhau" hay "một bản offsite" cần được diễn giải lại cho đúng.

Lưu ý: bài này tập trung riêng vào chiến lược sao lưu dữ liệu. Việc phục hồi sau thảm họa ở quy mô hệ thống (RTO, RPO) sẽ được bàn ở Bài 26, còn kiến trúc đa vùng active-active thuộc về Bài 57. Ở đây, chúng ta chỉ nói về một câu hỏi cốt lõi: làm sao để dữ liệu của bạn luôn có đường sống sót.

Khái niệm cốt lõi

Quy tắc 3-2-1 nói gì

Quy tắc phát biểu rằng để bảo vệ dữ liệu an toàn, bạn cần:

  • 3 bản sao dữ liệu (three copies): bao gồm bản gốc đang chạy trên production và ít nhất hai bản sao lưu khác. Con số 3 xuất phát từ xác suất: nếu mỗi bản sao có xác suất hỏng độc lập, thì việc mất đồng thời cả ba bản gần như bằng không. Một bản gốc cộng một bản backup vẫn có điểm yếu — nếu cả hai cùng hỏng trong một sự cố, bạn trắng tay.
  • 2 loại phương tiện lưu trữ khác nhau (two different media types): đừng để tất cả bản sao nằm trên cùng một loại thiết bị. Lý do là các phương tiện cùng loại thường có chung kiểu hỏng hóc. Nếu bạn lưu cả ba bản trên ổ SSD cùng lô sản xuất, chúng có thể hỏng gần như cùng lúc do lỗi firmware. Đa dạng phương tiện giúp phân tán rủi ro tương quan (correlated failure).
  • 1 bản offsite (one offsite copy): ít nhất một bản sao phải nằm ở vị trí địa lý khác. Đây là lá chắn cuối cùng chống lại thảm họa vật lý — cháy nổ trung tâm dữ liệu, lụt lội, mất điện diện rộng, hoặc toàn bộ văn phòng bị trộm thiết bị.

Vì sao ba con số bổ sung cho nhau

Điều tinh tế là ba yêu cầu này bảo vệ bạn khỏi ba loại rủi ro khác nhau, không thể thay thế lẫn nhau:

Con số 3 chống lại rủi ro hỏng hóc ngẫu nhiên và lỗi thao tác — file corrupt, xóa nhầm, ghi đè. Con số 2 chống lại rủi ro hỏng hóc tương quan theo công nghệ — một lỗi firmware, một cuộc tấn công nhắm vào một loại hệ thống. Con số 1 chống lại rủi ro thảm họa cục bộ theo địa lý — cháy, lụt, mất điện cả một tòa nhà.

Bạn có thể có 5 bản backup, nhưng nếu cả 5 đều nằm trong cùng một phòng máy chủ thì con số 5 vô nghĩa trước một đám cháy. Đó là lý do 3-2-1 không chỉ nói về số lượng, mà về sự đa dạng có chủ đích.

Diễn giải 3-2-1 trong thời đại cloud-native

Khi mọi thứ chạy trên cloud, một số học viên bối rối: "Làm sao có hai loại phương tiện vật lý khi tôi chẳng sờ được cái ổ cứng nào?" Câu trả lời là chúng ta diễn giải lại tinh thần của quy tắc chứ không bám cứng vào chữ nghĩa của những năm 2000.

Một cách áp dụng hợp lý cho một ứng dụng cloud-native điển hình:

  • Copy 1 — Bản gốc production: database đang chạy, ví dụ một cụm Amazon RDS PostgreSQL hoặc Google Cloud SQL.
  • Copy 2 — Automated snapshot cùng nhà cung cấp, khác lớp lưu trữ: snapshot tự động của RDS lưu trên S3, hoặc bản dump định kỳ đẩy sang một object storage bucket. Đây là "loại phương tiện thứ hai" theo nghĩa cloud — block storage của database khác về bản chất với object storage.
  • Copy 3 — Offsite/khác vùng, khác nhà cung cấp: bản sao đẩy sang một region khác (ví dụ từ Singapore sang Tokyo), hoặc mạnh hơn nữa là sang một nhà cung cấp khác hoàn toàn (từ AWS sang một cold storage của Backblaze B2 hay Wasabi). Đây vừa là "offsite" vừa giúp bạn thoát khỏi rủi ro khóa tài khoản của một nhà cung cấp duy nhất.
Trong thế giới cloud, ranh giới "media type" thường được hiểu là khác lớp dịch vụ lưu trữ và khác cơ chế hỏng hóc, còn "offsite" được hiểu là khác region, và lý tưởng là khác nhà cung cấp.

3-2-1-1-0: phiên bản mở rộng hiện đại

Ngành công nghiệp đã bổ sung thêm hai con số để đối phó với ransomware và corruption âm thầm:

  • 1 bản immutable hoặc air-gapped: một bản không thể bị sửa hoặc xóa trong một khoảng thời gian, thường dùng tính năng Object Lock của S3 (chế độ WORM — Write Once Read Many). Ransomware không thể mã hóa thứ nó không được phép ghi đè.
  • 0 lỗi khi kiểm tra phục hồi: bạn phải xác minh bản backup restore được thành công, không có lỗi. Đây là con số quan trọng nhất mà nhiều đội bỏ quên.

Tình huống thực tế

Tình huống 1 — Startup fintech tại TP.HCM và cú xóa nhầm database

Một startup fintech ở Quận 1, TP.HCM (gọi là công ty A) xử lý ví điện tử với khoảng 80.000 người dùng. Toàn bộ hệ thống chạy trên một cụm PostgreSQL đặt tại AWS region Singapore (ap-southeast-1). Đội ngũ tự tin vì họ đã bật automated snapshot hàng ngày của RDS.

Một tối thứ Sáu, một kỹ sư backend chạy script migration trên môi trường mà anh tưởng là staging, nhưng thực chất connection string đang trỏ về production. Script vô tình TRUNCATE bảng transactions. Trong vài giây, lịch sử giao dịch biến mất.

Tin tốt: họ có snapshot lúc 2 giờ sáng cùng ngày. Tin xấu: snapshot đó cách thời điểm sự cố 18 tiếng, và toàn bộ giao dịch trong ngày làm việc — hàng nghìn lượt nạp và rút tiền — nằm ngoài bản backup. Họ khôi phục được cấu trúc và phần lớn dữ liệu, nhưng phải huy động log ứng dụng và đối soát thủ công với cổng thanh toán để dựng lại giao dịch của 18 tiếng bị mất, mất trọn hai ngày cuối tuần.

Bài học: Công ty A có "backup" nhưng tần suất snapshot một-lần-một-ngày không đủ cho dữ liệu tài chính. Sau sự cố, họ chuyển sang bật Point-in-Time Recovery (lưu WAL/transaction log liên tục) để có thể phục hồi về gần như bất kỳ giây nào, đồng thời tách quyền truy cập production khỏi màn hình làm việc hàng ngày. Backup không chỉ là có hay không, mà là khoảng cách dữ liệu bạn chấp nhận mất giữa hai lần sao lưu.

Tình huống 2 — Công ty thương mại điện tử và bản backup nằm chung nhà với dữ liệu gốc

Một công ty thương mại điện tử tầm trung ở Hà Nội (công ty B) lưu trữ hình ảnh sản phẩm và database đơn hàng trên các máy chủ vật lý đặt tại một trung tâm dữ liệu thuê ngoài. Họ có backup — mỗi đêm sao chép database và toàn bộ folder ảnh sang một server backup đặt cùng rack, cùng phòng máy.

Về mặt con số, họ có 3 bản (production, bản trên server backup, và một bản cũ). Nhưng cả ba đều nằm trong cùng một trung tâm dữ liệu. Khi hệ thống làm mát của tầng đó gặp sự cố và nhiệt độ tăng vọt trong một đêm hè, nhiều ổ cứng trong rack hỏng gần như đồng thời. Cả server production lẫn server backup đều bị ảnh hưởng. Công ty mất gần một tuần để khôi phục một phần dữ liệu từ những bản cũ rời rạc còn cứu được.

Bài học: Họ đã thỏa mãn con số "3" nhưng vi phạm hoàn toàn con số "1 offsite". Khi rủi ro là môi trường vật lý chung, số lượng bản sao trong cùng một phòng không có ý nghĩa. Sau đó công ty B áp dụng đúng 3-2-1: giữ bản local để restore nhanh, đồng thời đẩy một bản mã hóa hàng đêm lên object storage của một nhà cung cấp cloud ở region khác. Chi phí tăng thêm vài triệu đồng mỗi tháng — rẻ hơn rất nhiều so với một tuần ngừng bán hàng.

Tình huống 3 — GitLab và bài học được cả ngành ghi nhớ

Đây là một ví dụ thật nổi tiếng. Năm 2017, GitLab gặp sự cố khi một kỹ sư trong lúc xử lý tải cao đã xóa nhầm thư mục dữ liệu của database production, mất khoảng 300 GB dữ liệu. Điều khiến sự cố trở thành bài học kinh điển không phải là việc xóa nhầm — mà là khi họ đi tìm backup để phục hồi.

Họ có tới năm cơ chế sao lưu trên giấy tờ. Nhưng khi cần đến: các bản dump định kỳ thất bại âm thầm vì lỗi tương thích phiên bản; snapshot của một loại storage không được bật cho server đó; bản đẩy lên cloud storage cũng trống. Cuối cùng thứ cứu họ là một snapshot tình cờ được tạo thủ công vài giờ trước bởi một kỹ sư — hoàn toàn may mắn. Họ vẫn mất khoảng 6 giờ dữ liệu.

Bài học: Đây là minh chứng sống động cho con số 0 — verify khả năng restore. Có năm loại backup nhưng không loại nào được kiểm tra thực sự, nên khi cần thì bốn trên năm đều vô dụng. GitLab sau đó công khai toàn bộ postmortem và thiết lập quy trình kiểm thử phục hồi định kỳ. Backup mà chưa từng restore thử thì chỉ là một giả định, không phải một sự đảm bảo.

Hướng dẫn từng bước

Đây là cách xây dựng một chiến lược backup theo 3-2-1 cho một hệ thống cloud-native điển hình.

Bước 1 — Phân loại dữ liệu theo mức độ quan trọng. Không phải mọi dữ liệu đều đáng backup như nhau. Hãy chia thành các nhóm: dữ liệu sống còn (database giao dịch, thông tin người dùng), dữ liệu quan trọng (file người dùng tải lên, cấu hình), và dữ liệu có thể tái tạo (cache, log tạm, ảnh đã có bản gốc nơi khác). Dồn nguồn lực và ngân sách vào nhóm sống còn.

Bước 2 — Xác định tần suất backup dựa trên mức mất mát chấp nhận được. Hãy tự hỏi: nếu mất dữ liệu, tôi chấp nhận mất tối đa bao nhiêu phút hay giờ? Dữ liệu tài chính có thể cần point-in-time recovery (gần như liên tục), trong khi dữ liệu ít thay đổi có thể chỉ cần snapshot hàng ngày. Tần suất quyết định trực tiếp lượng dữ liệu bạn có thể mất.

Bước 3 — Thiết lập ba bản sao theo đúng tinh thần đa dạng. Cấu hình bản gốc production, một bản snapshot/dump tự động ở lớp lưu trữ khác, và một bản đẩy sang region hoặc nhà cung cấp khác. Đảm bảo mỗi bản độc lập về cơ chế hỏng hóc, không cùng chung một điểm chết duy nhất.

Bước 4 — Bật mã hóa và immutability. Mọi bản backup rời khỏi hệ thống gốc phải được mã hóa (encryption at rest và in transit). Với ít nhất một bản, bật Object Lock hoặc chế độ immutable để chống ransomware và xóa nhầm — kể cả tài khoản admin cũng không xóa được trong thời gian khóa.

Bước 5 — Thiết lập retention policy. Quyết định giữ backup bao lâu. Một mô hình phổ biến là GFS (Grandfather-Father-Son): giữ bản hàng ngày trong 1-2 tuần, bản hàng tuần trong 1-2 tháng, bản hàng tháng trong một năm. Điều này giúp bạn phục hồi cả từ sự cố mới lẫn corruption âm thầm phát hiện muộn, đồng thời kiểm soát chi phí lưu trữ.

Bước 6 — Tự động hóa và giám sát. Backup phải chạy tự động và phải báo động khi thất bại. Một backup âm thầm ngừng chạy nguy hiểm hơn không có backup, vì nó tạo cảm giác an toàn giả. Đặt alert cho cả trường hợp "backup không chạy" lẫn "backup chạy nhưng dung lượng bất thường".

Bước 7 — Kiểm thử phục hồi định kỳ. Đây là bước không được bỏ. Ít nhất hàng quý, hãy restore một bản backup vào môi trường tách biệt, chạy kiểm tra tính toàn vẹn, và đo thời gian phục hồi thực tế. Ghi lại kết quả. Đây chính là con số 0 trong 3-2-1-1-0.

Lỗi thường gặp & mẹo

Lỗi 1 — Nhầm replication với backup. Read replica hay đồng bộ real-time không phải là backup. Nếu ai đó xóa một bảng ở primary, lệnh xóa đó lập tức được nhân bản sang replica. Backup phải là bản chụp tại một thời điểm, tách biệt và bất biến. Đây là nhầm lẫn tai hại nhất tôi thường thấy.

Lỗi 2 — Không bao giờ test restore. Như GitLab đã dạy cả ngành, backup chưa restore thử chỉ là niềm tin. Hãy biến việc test phục hồi thành một nghi thức định kỳ có lịch cụ thể.

Lỗi 3 — Backup nằm cùng tài khoản/credential với production. Nếu tài khoản cloud bị chiếm quyền, kẻ tấn công xóa được cả production lẫn backup. Hãy để bản offsite ở một tài khoản hoặc nhà cung cấp riêng, với quyền truy cập tách biệt.

Lỗi 4 — Quên backup những thứ ngoài database. File người dùng tải lên, biến môi trường, secret, cấu hình hạ tầng (IaC state) — tất cả đều cần được sao lưu. Nhiều đội chỉ backup database rồi phát hiện họ không dựng lại được toàn bộ ứng dụng.

Lỗi 5 — Không mã hóa backup. Backup thường chứa toàn bộ dữ liệu nhạy cảm ở một nơi. Một bản dump không mã hóa bị rò rỉ là một thảm họa bảo mật lẫn pháp lý.

Mẹo: Hãy tính chi phí backup như một khoản bảo hiểm, không phải một khoản lãng phí. Dùng storage tier lạnh (cold/archive) cho bản offsite ít khi cần đến để tiết kiệm — chi phí lưu trữ archive rất rẻ, bạn chỉ trả nhiều hơn khi thực sự cần lấy dữ liệu ra, mà lúc đó thì tiền không còn là vấn đề.

Mẹo: Document rõ quy trình restore và để nó ở nơi truy cập được ngay cả khi hệ thống chính sập. Đừng để runbook phục hồi nằm trên chính wiki đang bị sự cố.

Bài tập thực hành

  • Kiểm toán hiện trạng: Liệt kê mọi loại dữ liệu quan trọng trong một dự án bạn đang làm (hoặc một dự án giả định). Với mỗi loại, ghi ra: hiện đang có bao nhiêu bản sao, nằm ở đâu, có thỏa mãn 3-2-1 không. Đánh dấu những chỗ vi phạm.
  • Thiết kế chiến lược 3-2-1: Cho một ứng dụng web có PostgreSQL và một object storage chứa ảnh người dùng, hãy vẽ ra sơ đồ ba bản sao: mỗi bản nằm ở đâu, tần suất bao nhiêu, retention bao lâu, bản nào immutable. Giải thích mỗi con số 3, 2, 1 được thỏa mãn ở đâu.
  • Tính toán mức mất mát: Nếu bạn backup mỗi 24 giờ và sự cố xảy ra ngay trước lần backup kế tiếp, bạn mất tối đa bao nhiêu dữ liệu? Nếu yêu cầu nghiệp vụ chỉ cho phép mất tối đa 15 phút, bạn cần thay đổi gì trong chiến lược?
  • Viết checklist test restore: Soạn một quy trình từng bước để kiểm thử phục hồi một database backup vào môi trường cách ly, gồm cách xác minh dữ liệu toàn vẹn và cách đo thời gian phục hồi. Đây là artifact bạn có thể mang thẳng vào công việc thật.

Tóm tắt

Quy tắc 3-2-1 gói gọn hàng thập kỷ kinh nghiệm mất dữ liệu vào ba con số dễ nhớ: 3 bản sao để chống hỏng hóc ngẫu nhiên, 2 loại phương tiện để chống hỏng hóc tương quan, 1 bản offsite để chống thảm họa vật lý. Trong thời đại cloud-native, ta diễn giải "phương tiện" thành khác lớp dịch vụ lưu trữ và khác cơ chế hỏng hóc, còn "offsite" thành khác region và lý tưởng là khác nhà cung cấp.

Phiên bản hiện đại 3-2-1-1-0 bổ sung 1 bản immutable chống ransomware và 0 lỗi khi test restore — con số quan trọng nhất mà nhiều đội bỏ quên. Ba tình huống trong bài, từ startup fintech Sài Gòn xóa nhầm database, công ty e-commerce Hà Nội mất cả rack cùng lúc, đến sự cố kinh điển của GitLab, đều dạy chung một điều: backup chỉ có giá trị khi bạn đã chứng minh được nó restore được.

Hãy nhớ ba nguyên tắc sống còn: đừng nhầm replication với backup, đừng để backup chung số phận với production, và đừng bao giờ tin vào một backup mà bạn chưa từng phục hồi thử. Dữ liệu là tài sản quý nhất của một hệ thống — và 3-2-1 chính là hợp đồng bảo hiểm rẻ nhất bạn có thể mua cho nó.