quanbi.dev
Backup dữ liệu website: chiếc chìa khoá treo bên trong đúng cái tủ mà nó mở, nhìn xuyên qua mặt kính của cánh cửa đang khoá

Hướng dẫn thực hànhHướng dẫn

Bản backup của mình tự kiểm mỗi đêm, và vẫn không cứu được site

Quân BiCập nhật 8 phút đọc3 lượt xem

Mỗi đêm con máy tự nạp lại bản dump vừa tạo vào một database trống rồi đếm xem có đủ bài không. Một lần mình còn giải mã hẳn một bản ra, phục hồi thử, và nó pass. Vậy mà backup dữ liệu website của mình vẫn chưa dựng lại nổi cái site này. Chỗ thiếu không nằm ở dữ liệu.

Đêm nào máy cũng tự chấm chính nó

Luồng chạy theo thứ tự này, và mỗi bước có lý do riêng.

  • Dump database ra file trước.
  • Gói toàn bộ ổ ảnh thành một archive sau.
  • Nạp bản dump vừa tạo vào một database tạm, đếm bài và băm nội dung ở đó.
  • Đối chiếu danh sách ảnh bìa mà dump trỏ tới với danh sách nằm trong archive.
  • Ghi một bản kê: số bài, chuỗi băm nội dung, số file ảnh.
  • Mã hoá cả ba file, xoá bản chưa mã hoá, dọn thứ quá bảy ngày.

Cách dump và nạp lại một database Postgres nằm trong tài liệu backup của PostgreSQL.

Vì sao dump trước, gói ảnh sau

Thứ tự này không phải ngẫu nhiên, và đảo lại thì hỏng theo kiểu khó thấy.

Một ảnh tải lên vào đúng khoảng giữa hai bước sẽ nằm trong archive mà không row nào trỏ tới. Thừa một file, vô hại.

Đảo lại thì sinh ra một row trỏ tới file mà archive không có. Bản phục hồi kiểu đó trông hoàn toàn bình thường, cho tới lúc có người mở đúng bài viết ấy ra và thấy một khung ảnh trống.

Kiểm bản dump, không kiểm database đang chạy

Đây là chỗ mình thích nhất trong cả quy trình, và cũng là chỗ mình suýt làm sai.

Cách hiển nhiên là đếm số bài trong database thật rồi ghi vào bản kê. Nhanh hơn, khỏi dựng database tạm.

Nó sai theo hai đường. Con số lấy từ database thật có thể không khớp với chính bản dump mà nó đang mô tả. Và một bài bị xoá sau lúc dump sẽ biến mất khỏi câu truy vấn, trong khi nó vẫn nằm nguyên bên trong file dump.

Nên máy nạp bản dump vào một database trống rồi mới hỏi. Câu trả lời khi đó nói về đúng cái file sẽ được cất đi.

Bản kê là mốc so, không phải bản đang chạy

Con số đếm được ghi vào một bản kê nhỏ đi kèm mỗi đêm.

Lần diễn tập phục hồi sau này so với bản kê đó, không so với site đang chạy. Site đang chạy vẫn được sửa mỗi ngày, nên so kiểu đó sẽ lệch vì lý do hoàn toàn bình thường. Lệch vài lần là người chạy diễn tập quen tay bỏ qua kết quả, và từ đó bài kiểm mất sạch ý nghĩa.

Diễn tập đã chạy thật, và đã pass

Chỗ này mình từng kể sai, nên nói lại cho đúng.

Ngày 28 tháng 7 mình lấy một archive thật rồi giải mã trên máy cá nhân. Nạp vào Postgres, đếm bài, băm nội dung, soi từng ảnh bìa xem có đủ không. Nó pass.

Khoá riêng để giải mã không bao giờ nằm trên con máy chủ. Máy đó mã hoá được và không đọc lại được chính bản nó vừa tạo. Mình kiểm bằng cách lục khắp máy tìm chuỗi khoá riêng, không thấy dòng nào.

Nên câu "chưa biết mấy file kia có dùng được không" là câu mình nói quá. Dump nạp được, ảnh bìa có đủ, và cả hai đều được chứng minh trên một máy khác.

Hai câu nghe rất giống nhau

"Dump nạp được" và "site quay lại được" là hai câu khác nhau. Mình mất một lúc mới chịu nhìn ra khoảng cách giữa chúng.

Diễn tập chứng minh vế đầu. Vế sau đòi thêm: một máy trống, đúng bản code, đúng bộ biến môi trường, rồi mở trình duyệt lên nhìn một bài có ảnh.

Mình chưa đi hết vế sau lần nào.

Cái file không nằm trong bản backup nào

Đây là chỗ đáng sợ nhất, và nó không lộ ra trong bài kiểm hằng đêm.

Bản sao lưu gồm database và ổ ảnh. Bộ biến môi trường của bản chạy thật thì không, vì nó không nằm trong hai chỗ đó. File ấy giữ chuỗi kết nối database, khoá ký phiên đăng nhập, và mấy thứ tương tự.

Mất con máy thì mình có đủ dữ liệu và không có thứ để khởi động nó. Ảnh bìa của bài này vẽ đúng cảnh đó: chìa khoá nằm trong cái tủ mà nó mở.

Bài kiểm hằng đêm không bao giờ kêu, vì nó chỉ được giao đi kiểm dữ liệu.

Bảy ngày, và ba file mỗi đêm

Mỗi đêm để lại ba file đã mã hoá: database, ảnh, bản kê. Máy dọn theo tuổi file, thứ quá bảy ngày thì xoá.

Nghĩa là cửa sổ này cứu được đúng loại lỗi bạn nhìn ra trong vòng bảy ngày. Xoá nhầm một bài rồi ba tuần sau mới có người báo thì không còn bản nào chứa bài đó.

Loại hỏng đi chậm cũng thoát khỏi cửa sổ. Ví dụ một trường bị ghi sai dần qua nhiều lần sửa: mọi bản còn lại đều đã chứa cái sai.

Chỗ chứa ngoài để tuỳ chọn, và đó là chủ ý

Bản kế hoạch đầu tiên bắt buộc phải có chỗ chứa ngoài. Nghe chặt chẽ hơn.

Hậu quả là thiếu một biến cấu hình thì script chết ngay dòng đầu và đêm đó không có bản sao lưu nào cả. Một bản nằm sai chỗ vẫn hơn hẳn không có bản nào.

Nên bây giờ thiếu chỗ chứa ngoài thì script vẫn chạy đủ, in một dòng cảnh báo, và thoát ra bằng mã lỗi khác 0. Mã lỗi mới là phần ăn thua: dòng cảnh báo trên một con máy không ai đọc thư thì bằng không.

Hiện tại chỗ chứa ngoài của mình vẫn chưa bật. Log đêm qua ghi đúng chữ chỉ-nằm-tại-chỗ.

Thứ không cần đưa vào backup dữ liệu website

Trước khi bàn chỗ chứa, cắt bớt danh sách đã.

  • Code. Nó nằm trong git và đã push lên remote.
  • Bản build của app. Dựng lại được từ đúng commit đó.
  • Chứng chỉ HTTPS. Lớp proxy phía trước tự xin lại.

Cách phân loại gọn lại thành một câu hỏi: thứ này mất đi thì dựng lại tốn gì. Dựng lại được từ thứ khác mình vẫn giữ thì nó không phải mục tiêu backup, nó là một bước build. Mỗi GB mang ra khỏi máy là một dòng chi mới, mà mình thì cộng từng dòng ở bài chi phí chạy website một tháng.

Chỗ mình chưa gọn: archive ảnh đang ôm cả những biến thể kích thước mà máy tự sinh ra từ file gốc. Theo đúng câu hỏi trên thì chúng không cần có mặt.

Nút quay về không đụng tới dữ liệu

Deploy hỏng thì con trỏ vẫn nằm ở release cũ. Máy dựng lại chính release đó, và cái đó cứu code.

Nó không đụng tới database, cũng không đụng tới ảnh đã tải lên. Hai thứ đó nằm trong volume và sống xuyên qua mọi lần dựng lại. Thứ máy tự hoàn tác được đúng là thứ git đã giữ hộ rồi.

Bốn lần mình mất việc đã làm đều là thứ chưa kịp vào git, mình kể ở bài mất code khi deploy. Không lần nào do ổ hỏng.

Ai không nên yên tâm như mình từng yên tâm

  • Ai có bản sao lưu chưa từng giải mã ra một lần. Máy mã hoá được không có nghĩa là bạn mở lại được.
  • Ai chưa liệt kê thứ nằm ngoài database và ngoài thư mục ảnh. File cấu hình, khoá, biến môi trường thường rơi hết vào khoảng trống này.
  • Ai đang chạy site có khách trả tiền mà không có máy thứ hai. Mình không có, và mình nói rõ đó là chỗ thiếu chứ không phải cách làm gọn.

Việc mình còn nợ

Ba việc, viết ra đây để khỏi tự thương lượng với mình sau.

  • Bật chỗ chứa ngoài.
  • Đưa bộ biến môi trường vào một chỗ an toàn tách riêng.
  • Dựng lại nguyên cái site từ một bản sao lưu, trên một máy trống.

Việc thứ ba mới trả lời được câu hỏi thật. Hai việc đầu chỉ là điều kiện để làm được việc thứ ba.

Mấy ghi chép cùng loại mình gom ở chủ đề Vận hành. Chuyện tự nuôi máy được gì mất gì thì ở bài tự vận hành VPS cho doanh nghiệp nhỏ.

Bài kiểm hằng đêm của mình chạy tốt, và nó chỉ trả lời đúng câu nó được giao. Bài học rẻ nhất: hỏi xem bản backup dữ liệu website của bạn đang trả lời câu nào. Rồi hỏi tiếp câu nào chưa ai giao cho nó.

Bài này thế nào?

Chia sẻ

XFacebook

Ảnh đại diện của chủ trang quanbi.dev

Về mình

Quân Bi · Người viết

Xem thêm →

Bình luận (0)

Chưa có bình luận nào. Bạn mở hàng nhé.

Viết bình luận