
Giới thiệu
Trong phần 2, chúng ta đã thấy TSDB sử dụng Write-Ahead-Log (WAL) để tăng độ bền chống sập. Tuy nhiên, nó cũng khiến việc khởi động lại Prometheus chậm lại khi bạn đạt đến một tỷ lệ khá vì việc phát lại Checkpoint+WAL mất nhiều thời gian.
Trong bài viết này, chúng ta sẽ hiểu rõ hơn về tính năng mới được giới thiệu trong Prometheus v2.30.0: snapshot dữ liệu trong bộ nhớ khi tắt máy để khởi động lại nhanh hơn bằng cách bỏ qua hoàn toàn quá trình phát lại WAL.
Snapshot là gì
Snapshot trong TSDB là chế độ xem tĩnh chỉ đọc dữ liệu trong bộ nhớ của TSDB tại một thời điểm nhất định.
Snapshot gồm các nội dung sau (theo thứ tự):
- Toàn bộ time series và in-memory chunk của mỗi series có trong Head block. (Tóm tắt Phần 3: ngoại trừ chunk cuối cùng, mọi thứ khác đều đã có trên đĩa và được m-mapped).
- Tất cả các tombstones trong Head block.
- Tất cả các exemplars trong Head block.
Lấy cảm hứng từ checkpoints trong phần 2, chúng tôi đặt tên cho snapshots này là chunk_snapshot.X.Y, trong đó X là số phân đoạn WAL cuối cùng được nhìn thấy khi chụp ảnh nhanh và Yl à độ lệch byte mà dữ liệu được ghi vào X phân đoạn WAL.
data
├── 01EM6Q6A1YPX4G9TEB20J22B2R
| ├── chunks
| | ├── 000001
| | └── 000002
| ├── index
| ├── meta.json
| └── tombstones
├── chunk_snapshot.000005.12345
| ├── 000001
| └── 000002
├── chunks_head
| ├── 000001
| └── 000002
└── wal
├── checkpoint.000003
| ├── 000000
| └── 000001
├── 000004
└── 000005Chúng tôi thực hiện snapshot khi shutdown TSDB sau khi dừng tất cả các thao tác ghi. Nếu TSDB bị dừng đột ngột, sẽ không có snapshot mới nào được tạo và snapshot từ lần tắt máy gần nhất vẫn được giữ nguyên.
Tính năng này bị tắt theo mặc định và có thể được bật bằng --enable-feature=memory-snapshot-on-shutdown.
Snapshot format
Snapshot sử dụng triển khai WAL chung của Prometheus TSDB và xác định 3 định dạng bản ghi mới cho các snapshot.
Thứ tự của các bản ghi trong ảnh chụp nhanh luôn là:
- Bản ghi series (>=0): Bản ghi này là snapshot của một series duy nhất. Mỗi series được ghi một bản ghi theo cách không được sắp xếp. Bản ghi này bao gồm siêu dữ liệu của series và dữ liệu in-memory chunk (nếu có).
- Bản ghi tombstones (0-1): Sau khi tất cả các series được hoàn tất, chúng ta sẽ ghi một bản ghi tombstone chứa tất cả tombstones của Head block. Một bản ghi duy nhất được ghi vào snapshot chứa tất cả tombstones.
- Bản ghi exemplar (>=0): Cuối cùng, chúng ta ghi một hoặc nhiều bản ghi exemplar trong khi gom các bản ghi exemplar trong mỗi bản ghi. Exemplar được sắp xếp theo thứ tự chúng được ghi vào bộ đệm vòng.
Định dạng của các bản ghi này có thể được tìm thấy tại đây , chúng tôi sẽ không thảo luận về chúng trong bài đăng trên blog này.
Khôi phục trạng thái in-memory
Với chunk_snapshot.X.Y, chúng ta có thể bỏ qua WAL trước vị trí bù Xthcủa phân đoạn Yvà chỉ phát lại WAL sau đó vì snapshot cùng với m-mapped chunks biểu thị trạng thái được phát lại cho đến thời điểm đó trong WAL.
Do đó, khi bật tính năng snapshot, quá trình phát lại dữ liệu để khôi phục Head sẽ diễn ra như sau:
- Lặp lại tất cả m-mapped chunks như mô tả trong phần 3 và xây dựng bản đồ.
- Lặp lại các bản ghi series từ bản ghi mới nhất
chunk_snapshot.X.Ytheo từng cái một. Với mỗi bản ghi series, tạo lại series trong bộ nhớ với các label và in-memory chunk trong bản ghi. Tương tự như việc xử lý bản ghiSeriestrong WAL, chúng tôi tìm kiếm m-mapped chunks tương ứng cho tham chiếu series này và đính kèm nó vào chuỗi series. - Đọc bản ghi tombstones (nếu có) từ snapshot và khôi phục nó vào bộ nhớ.
- Lặp lại các bản ghi exemplar từng cái một (nếu có) và đặt chúng trở lại bộ đệm tròn theo cùng thứ tự.
- Sau khi phát lại m-mapped chunks và snapshot, chúng tôi tiếp tục phát lại WAL từ độ lệch byte
Xthcủa phân đoạnYnhư bình thường. Nếu có WAL checkpoints được đánh số>=X, chúng tôi cũng phát lại checkpoint cuối cùng trước khi phát lại WAL.
Trong hầu hết các trường hợp (ví dụ như tắt máy bình thường), sẽ không có WAL nào được phát lại vì snapshot được chụp sau khi dừng ghi trong quá trình tắt máy. Sẽ có WAL/Checkpoint được phát lại nếu Prometheus đột ngột gặp sự cố/tắt máy.
Khởi động nhanh hơn
Khi chúng ta nói về việc khởi động lại, không chỉ là thời gian phát lại dữ liệu trên đĩa để khôi phục trạng thái bộ nhớ mà còn là thời gian tắt máy, vì chụp nhanh hiện nay sẽ thêm một chút độ trễ cho việc tắt máy.
Việc ghi lại snapshot mất vài giây, và thường dưới một phút cho 1 triệu series. Việc phát lại checkpoint cũng mất vài giây. Trong khi đó, việc phát lại WAL có thể mất nhiều phút cho cùng một series.
Bằng cách bỏ qua hoàn toàn việc phát lại WAL trong quá trình khởi động lại bình thường, chúng tôi đã thấy thời gian khởi động lại giảm từ 50-80% .
Một số điều cần lưu ý
- Tính năng snapshot sẽ chiếm thêm dung lượng đĩa khi được bật và không thay thế tính năng hiện có.
- Tùy thuộc vào số lượng series bạn có và tốc độ ghi của đĩa, việc tắt máy có thể mất một chút thời gian. Do đó, hãy thiết lập thời gian gia hạn chấm dứt pod (hoặc tương đương) cho pod Prometheus phù hợp.
Câu hỏi thường gặp
Tại sao chỉ snapshot khi tắt máy?
Khi xem xét số lần một sample được ghi vào đĩa (hoặc ghi lại trong quá trình nén), con số này chỉ là một số ít. Nếu chúng ta snapshot theo định kỳ trong khi Prometheus đang chạy, điều này có thể làm tăng số lần một sample được ghi vào đĩa lên một % lớn, do đó gây ra hiện tượng khuếch đại ghi không cần thiết. Vì vậy, chúng tôi đã chọn phương án tắt máy bình thường trong trường hợp xảy ra sự cố, trong khi đó, WAL sẽ đọc một phần dữ liệu tùy thuộc vào snapshot cuối cùng hiện có trên đĩa.
Tại sao chúng ta vẫn cần WAL?
Nếu Prometheus gặp sự cố do nhiều lý do, chúng ta cần WAL để đảm bảo độ bền vì không thể snapshot. Ngoài ra, remote-write phụ thuộc vào WAL.
Mã tham khảo
Mã để snapshot và đọc snapshot có trong tsdb/head_wal.go.

