PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PostgreSQL 13:Đừng để các vị trí giết chết vị trí chính của bạn

Một trong những tính năng thú vị trong PostgreSQL kể từ phiên bản 9.4 là khả năng kiểm soát việc loại bỏ các tệp WAL bằng cách sử dụng các khe sao chép. Mặt tối của nó là các khe sao chép có thể khiến các đĩa chứa đầy WAL cũ, giết chết máy chủ sản xuất chính. Trong bài viết này, tôi giải thích về các khe sao chép PostgreSQL và cách một tính năng mới trong PostgreSQL 13 giúp ngăn chặn vấn đề này.

Sản xuất WAL

Như bạn đã biết, WAL được sản xuất để thay đổi cơ sở dữ liệu trong máy chủ chính:chèn, cập nhật, v.v. . Cơ sở dữ liệu hoạt động nhiều hơn sẽ tạo ra nhiều WAL hơn - trong một máy chủ hoạt động rất tích cực, có thể có nhiều gigabyte WAL được tạo ra mỗi phút. WAL được ghi vào các tệp có tên theo thứ tự số tăng dần và các tệp luôn có cùng kích thước (16 MB là mặc định và điển hình). Khi dữ liệu trong tệp không còn cần thiết nữa, tệp đó có thể được tái chế , có nghĩa là đổi tên nó thành một vị trí được đánh số cao hơn trong chuỗi để sau này có thể lấp đầy dữ liệu mới.

(Có những tình huống đặc biệt như sự gia tăng hoạt động dẫn đến việc tạo ra các tệp bổ sung; sau đó, khi sự gia tăng này giảm xuống, các tệp bổ sung đó sẽ bị loại bỏ thay vì tái chế.)

Bởi vì tất cả hoạt động ghi cơ sở dữ liệu tạo ra WAL, điều quan trọng là phải có dung lượng đĩa. Khi đĩa lưu trữ WAL đầy, máy chủ sẽ không thể xử lý các giao dịch mới và có thể bị kẹt, hoặc tệ hơn:nó có thể bị sập hoàn toàn. Vì vậy, đây là một tình huống cần phải tránh bằng mọi cách có thể.

Khe sao chép

Bản sao trong PostgreSQL hoạt động bằng cách xử lý các tệp WAL. Để điều này hoạt động, tất cả các tệp WAL phải có sẵn tạm thời cho đến khi chúng được xử lý. Do đó, cần có một cơ chế để thông báo cho ban quản lý WAL chính không được tái chế hoặc xóa tệp.

Nhập các vị trí sao chép. Slots là một cơ chế chỉ ra rằng điều này bản sao lưu mà chúng tôi đang thực hiện sẽ yêu cầu điều đó Tệp WAL, và bạn có thể vui lòng chưa xóa nó; hoặc cái này bản sao vẫn chưa xử lý điều đó Tệp WAL, vậy có thể để nó yên một chút không.

Bản thân các khe sao chép chiếm rất ít dung lượng ổ đĩa. Họ chỉ lưu trữ một chút siêu dữ liệu, bao gồm một con trỏ đến một vị trí trong WAL. Nhưng dữ liệu WAL mà nó bảo vệ lại là một vấn đề khác:trong một máy chủ hoạt động mạnh, nó có thể được đo bằng gigabyte hoặc tệ hơn.

Mức tiêu thụ WAL

Cung cấp dữ liệu cho một bản sao vật lý có nghĩa là sao chép dữ liệu WAL từ máy chủ chính của nó. Tương tự, một bản sao lôgic cần đọc dữ liệu WAL (và truyền một phiên bản đã diễn giải tới bản sao). Vị trí WAL đang được đọc là thứ mà vị trí này sẽ theo dõi. Khi bản sao đã bảo mật dữ liệu WAL bằng cách nào đó, vị trí có thể được nâng cao; điều này cho ban quản lý WAL biết trong tệp chính rằng tệp WAL sau đó có sẵn để xóa. Điều này xảy ra liên tục khi bản sao đang hoạt động, do đó WAL trong máy chủ chính sẽ sử dụng cùng một lượng không gian đĩa hoặc có thể chỉ nhiều hơn một chút. Thậm chí nhiều gấp đôi hoặc gấp mười lần đều có thể chấp nhận được, tùy thuộc vào điều kiện.

Vấn đề là nếu một bản sao chết hoàn toàn và không phục hồi trong một thời gian dài; hoặc bản sao bị phá hủy và DBA quên loại bỏ rãnh sao chép; hoặc vị trí là một phần còn sót lại bị lãng quên của một số thử nghiệm; hoặc thậm chí bản sao đang được cung cấp qua một liên kết mạng chậm, thì WAL dành riêng sẽ phát triển không giới hạn. Và điều đó trở thành một quả bom tích tắc.

Giới hạn kích thước vùng

Để giải quyết vấn đề này, Kyotaro Horiguchi đã làm việc kể từ tháng 2 năm 2017 trong một bản vá PostgreSQL để giới hạn kích thước của WAL được dành riêng bởi một vị trí. Sau một quá trình đánh giá và làm lại rất dài, tôi đã tích hợp nó cho PostgreSQL 13, cải thiện việc quản lý các trang trại PostgreSQL có tính khả dụng cao.

Nguyên tắc chính là giết một bản sao (bằng cách nào đó làm cho vị trí của nó không hợp lệ; thêm vào điều đó bên dưới) tốt hơn là giết máy chủ chính cung cấp bản sao đó và gỡ bỏ toàn bộ quá trình sản xuất với nó.

Cách hoạt động của nó khá đơn giản:set max_slot_wal_keep_size (tài liệu) trong postgresql.conf đến dung lượng ổ đĩa tối đa của WAL mà các khe sao chép được phép dự trữ. Nếu một vị trí đạt đến điểm đó và một điểm kiểm tra xảy ra, vị trí đó sẽ bị đánh dấu là không hợp lệ và một số tệp WAL có thể bị xóa. Nếu vị trí đang được sử dụng bởi walsender quá trình, quá trình đó sẽ được báo hiệu để nó kết thúc. Nếu trình tìm kiếm bắt đầu lại, nó sẽ thấy rằng các tệp WAL cần thiết sẽ không còn ở đó nữa. Bản sao sử dụng vị trí đó sẽ phải được mở lại.

Nếu max_slot_wal_keep_size là 0, là giá trị mặc định, sau đó không có giới hạn. Tôi không khuyến khích điều này, vì nó dẫn đến lỗi khi các khe lấp đầy đĩa.

Theo dõi Tình trạng Khe cắm

Cũng bao gồm một số tính năng giám sát. Hai cột trong pg_replication_slots có liên quan. Điều quan trọng nhất là wal_status . Nếu cột đó được reserved , khi đó vị trí đang trỏ đến dữ liệu trong max_wal_size; nếu nó được extended thì nó đã vượt quá max_wal_size , nhưng vẫn được bảo vệ bởi wal_keep_size hoặc max_slot_wal_keep_size (kể cả khi max_slot_wal_keep_size bằng 0). Một trong hai trạng thái là tốt và bình thường. Tuy nhiên, khi một vị trí vượt quá giới hạn, trước tiên, vị trí đó sẽ unreserved , có nghĩa là nó sắp gặp nguy hiểm nhưng vẫn có thể phục hồi nếu đủ nhanh. Cuối cùng, trạng thái trở thành lost khi tệp WAL đã bị xóa và không thể khôi phục được.

Cột còn lại là safe_wal_size :nó hiển thị số byte WAL có thể được ghi trước khi vùng này có nguy cơ bị xóa các tệp WAL. Chúng tôi khuyên bạn nên theo dõi chặt chẽ cột này trong hệ thống giám sát của mình và cảnh báo cháy khi nó xuống thấp. Bằng không hoặc âm có nghĩa là bản sao của bạn sẽ chết ngay sau khi một trạm kiểm soát xảy ra:

SELECT slot_name, active, wal_status, safe_wal_size
  FROM pg_catalog.pg_replication_slots;

Chúng tôi tin rằng tính năng mới này giúp việc bảo trì các bản sao dễ dàng hơn và mạnh mẽ hơn; hy vọng rằng chúng tôi sẽ không gặp thêm bất kỳ thảm họa nào về sản xuất vì những vấn đề này.

(Lưu ý:safe_wal_size đã được giới thiệu trong 13beta3, vì vậy hãy nhớ tham khảo tài liệu cập nhật hoặc bạn sẽ thấy min_safe_lsn thay thế. Bỏ qua điều đó.)

Cảm ơn

Đặc biệt cảm ơn Kyotaro Horiguchi đã làm việc để giải quyết vấn đề này. Một số người đánh giá đã hiểu sâu về điều này, trong đó tôi muốn cảm ơn đặc biệt là Masahiko Sawada, Fujii Masao, Jehan-Guillaume de Rorthais và Amit Kapila (không theo thứ tự cụ thể).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách cài đặt PostgreSQL 12 trên Ubuntu 20.04 / 18.04 / 16.04

  2. Làm cách nào để làm việc với các số thập phân có độ chính xác cao trong PHP

  3. Làm cách nào để thêm cột không cho phép null trong cơ sở dữ liệu Postgresql?

  4. Trình điều khiển QPSQL không được tải Qt

  5. Tôi có thể tạo một hàm plpgsql trả về một số nguyên mà không cần sử dụng một biến không?