Trong phần này chúng ta sẽ tìm hiểu về kiến trúc memory và process, cách thức hoạt động của RDBMS PostgreSQL. Dự đoán là nó không quá phức tạp, khi mà thư mục cài đặt PostgreSQL chỉ có dung lượng vài chục MB, hi vọng là thế boring

 

Kiến trúc memory

 

Phần bộ nhớ trên RAM khi PostgreSQL hoạt động được chia thành các vùng buffer khác nhau. Trong đó quan trọng nhất là shared buffers.

 

Shared buffers (buffer cache)

 

Hoạt động chính của database là đọc (read) và ghi (insert, update, delete) dữ liệu. Nếu thao tác trực tiếp với dữ liệu trong data file trên disk, thao tác sẽ chậm đi rất nhiều do tốn physical I/O. Thay vào đó, PostgreSQL dùng shared buffers trên RAM làm vùng nhớ chia sẻ, chứa dữ liệu tạm thời đọc từ data file lên và trước khi ghi xuống data file, phục vụ cho các hoạt động đọc ghi được nhanh chóng. 

 

 

Dung lượng shared buffers được cấu hình trong file postgresql.conf, và được khởi tạo trên RAM khi ta start database cluster. Đây là phần bộ nhớ chính phục vụ cho hoạt động của database, nên cũng thường được cấu hình 1 dung lượng kha khá. Dữ liệu sẽ được chứa trong các buffer. Nếu buffer có trạng thái dirty, nghĩa là dữ liệu có thay đổi, đến thời điểm sẽ được ghi lại xuống data file.

 

WAL buffer

 

WAL buffer – Write Ahead Log buffer, là phần bộ nhớ trên RAM phục vụ cho tính năng WAL trong việc bảo toàn dữ liệu. Ở trên ta đã biết buffer dữ liệu khi thay đổi sẽ được đánh dấu dirty. Đồng thời, những thay đổi đó cũng sẽ được ghi lại trong WAL buffer và đẩy xuống WAL segment trên disk. Trường hợp database bị crash, dirty buffer trong shared buffers chưa được ghi xuống disk, khi start lại, PostgreSQL sẽ kiểm tra các WAL segment và thực hiện recovery, ghi lại đầy đủ dữ liệu của các transaction đã được commit mà chưa kịp ghi xuống data file. 

 

 

Work mem

 

Đây là phần bộ nhớ phục vụ cho các thao tác sort, hash table… của từng user session, do đó sẽ không được cấp phát ngay từ đầu như shared buffers. 

 

 

Lưu ý rằng đây là dung lượng cấp cho mỗi session. Cho nên nếu có 100 session, mỗi session dùng hết 4MB, thì dung lượng RAM cần phải có là 4×100 = 400MB. 

 

Nếu phần work mem được sử dụng hết, session sẽ phải sử dụng temp file trên disk để phục vụ tiếp cho các hoạt động của mình. Do đó nếu biết trước các thao tác cần dung lượng tạm lớn, có thể set work mem cao hơn để dùng trong session

 

 

Maintenance work mem

 

Đây là phần bộ nhớ dùng cho các hoạt động bảo trì database như analyze, vacuum, tạo index, restore database… Cũng như work mem, nếu dùng hết phần bộ nhớ này, session sẽ phải dùng thêm các temp file trên disk để tiếp tục hoạt động.

 

 

Ngoài ra, còn có Commit Log buffer (CLOG buffer) để lưu trạng thái commit của mỗi transaction, free space map để theo dõi tình trạng free space, catalog cache để chứa các table catalog của hệ thống… Tóm gọn lại, có thể minh họa kiến trúc memory của PostgreSQL bằng hình vẽ dưới đây

 

pg_6

 

Kiến trúc process

 

Kiểm tra hệ thống đang chạy và lấy master process id

 

Kiểm tra các process được tạo ra

 

Master process

 

 

Đây là master process khi chúng ta start PostgreSQL. Process này khởi tạo instance, quản lý bộ nhớ, quản lý thư mục lưu trữ, tạo ra các process con thực hiện các hoạt động trong database. Ngoài ra process này kiêm luôn nhiệm vụ lắng nghe connection và tạo ra các server process (backend process) để phục vụ client. Mỗi backend process sẽ phục vụ 1 client.

 

pg_7

 

 

Checkpoint process

 

 

Checkpoint có thể hiểu là hoạt động đồng bộ dữ liệu trong buffer với dữ liệu trên disk, đảm bảo tính toàn vẹn dữ liệu. Khi checkpoint xảy ra, checkpoint process sẽ ghi toàn bộ dirty buffer xuống data file, đồng thời ghi lại checkpoint record trong log files, đảm bảo nếu có crash thì PostgreSQL có thể biết được vị trí để bắt đầu thực hiện recovery (thao tác REDO).

 

Checkpoint xảy ra khi:

  • Đã ghi đầy hết số checkpoint_segments (mặc định là 3 segment, mỗi segment là 16MB)
  • Hoặc khi đến thời gian checkpoint_timeout (mặc định là 5min)
  • Hoặc đáp ứng cấu hình checkpoint_completion_target

Cấu hình checkpoint cần phù hợp để đảm bảo hệ thống không bị quá tải I/O, hay thời gian cần thiết để recover sau khi bị sự cố không quá dài.

 

WAL & WAL writer process

 

 

Write Ahead Log là tính năng lưu trữ các dữ liệu thay đổi trong WAL buffer trên RAM và WAL segment trên disk, đảm bảo tính toàn vẹn dữ liệu. Các WAL segment (WAL file) nằm trong thư mục pg_xlog, với kích thước mặc định 16MB.

 

 

Do các tập tin của WAL chứa các dữ liệu thay đổi, vì vậy WAL có khả năng hỗ trợ:

  • Recovery khi hệ thống bị crash
  • Thực hiện point-in-time recovery với bản backup snapshot
  • Dùng cho việc replication

Khả năng hỗ trợ tới đâu phụ thuộc vào việc cấu hình wal_level:

  • minimal: ghi rất ít thông tin trong WAL buffer, chỉ đủ để hỗ trợ crash recovery
  • archive: ghi đầy đủ thông tin từ WAL buffer ra các WAL segment, hỗ trợ tới point-in-time recovery
  • hot_standby: ghi đầy đủ thông tin từ WAL buffer ra các WAL segment, cũng như thêm các thông tin để đáp ứng hoạt động replication

Thường ta cũng nên cấu hình tối thiểu ở mức archive

 

 

Background writer process

 

 

Background writer process có nhiệm vụ ghi dirty buffer xuống data file theo thuật toán LRU để đảm bảo luôn có buffer trống cho hệ thống sử dụng. Số dirty buffer ghi mỗi lần sẽ phụ thuộc vào tham số bgwriter_lru_max_pages hoặc bgwriter_lru_multiplier. Thời gian giữa mỗi lần ghi mặc định là 200ms (tham số bgwriter_delay).

 

3 process checkpoint, wal writer, background writer có thể mô tả nhiệm vụ như sau

 

pg_8

 

Autovacuum process

 

 

Khi delete, dữ liệu trong block chưa được xóa ngay mà mới chỉ được đánh dấu xóa. Khi update, thực chất là xóa dữ liệu cũ (delete) và insert lại dữ liệu mới. Các thao tác này làm cho nhiều block trong data files chứa dữ liệu cũ không còn sử dụng nữa.  Vacuum process có nhiệm vụ kiểm tra đánh dấu những block đó có khả năng sử dụng lại, để tránh lãng phí tài nguyên. Ta có thể thực hiện việc này bằng 1 lệnh thủ công. Thao tác vacuum này không gây lock table.

 

Nếu ta sử dụng vacuum full, thao tác này đòi hỏi exclusive lock trên table, bù lại sẽ dọn dẹp luôn dữ liệu đã đánh dấu delete, sắp xếp lại dữ liệu table, do đó sẽ giảm kích thước table và database xuống (thực chất quá trình này là tạo data file mới, copy dữ liệu hiện tại qua, rồi clear data file cũ).

 

Thực hiện vacuum với option analyze sẽ giúp thu thập table statistics để phục vụ cho query planner.

 

 

Logging process

 

 

Logging process có nhiệm vụ ghi log hoạt động của database. Mặc định việc ghi log này không được enable, ta phải cấu hình trong file postgresql.conf

 

Stats collector process

 

 

Process này có nhiệm vụ thu thập tất cả các thông tin database statistics, thông tin về table, index,…  theo dõi các hoạt động vacuum, analyze,…

 

WAL sender & WAL receiver process

 

2 process này sử dụng khi ta cấu hình database replication. Sender process bên primary server gửi WAL sang cho receiver process bên standby server để đồng bộ dữ liệu.

 


 

Như vậy là chúng ta đã tìm hiểu về kiến trúc memory cũng như kiến trúc process của PostgreSQL. Nhìn sơ qua thì có vẻ kiến trúc PostgreSQL đơn giản hơn nhiều so với kiến trúc của Oracle DB. Có những cái mình cũng chưa hiểu lắm, chẳng hạn như background writer và checkpoint đều làm nhiệm vụ ghi dirty buffer – có dư thừa hay chưa tối ưu không, có cấu hình thêm nhiều process writer được không, hay mặc định thì việc ghi log không được enable? Đành từ từ tìm hiểu vậy 🙂  Ở bài sau chúng ta sẽ tiếp tục tìm hiểu về kiến trúc lưu trữ của hệ quản trị CSDL này.