Monitor Streaming Replication trong PostgreSQL

 

1. Giới thiệu về monitor Stream Replication

Ở một bài trước đây, tôi đã hướng dẫn các bạn cấu hình chức năng Streaming Replication để đồng bộ dữ liệu giữa 2 server trong PostgreSQL. Tuy nhiên, làm sao chúng ta biết được tiến trình đồng bộ Streaming Replication vẫn hoạt động bình thường, chúng ta làm sao liên tục check dữ liệu giữa 2 bên để so sánh xem sự sai khác thế nào được, phải không?

PostgreSQL sẽ cung cấp cho chúng ta các câu lệnh để kiểm tra trạng thái (hay monitor) Streaming Replication, và ở bài này tôi sẽ hướng dẫn các bạn điều đó.

2. Monitor Streaming Replication trên Standby

1. Giám sát WAL Receiver

Trên database Standby sẽ có 1 tiến trình WAL receiver có nhiệm vụ nhận những WAL record được gửi từ Primary sang. Đầu tiên chúng ta cần phải check xem tiến trình này có đang hoạt động bình thường hay không.

Bạn sử dụng câu lệnh sau:

select * from pg_stat_wal_receiver;

 

Kết quả là:

  pid  |  status   | receive_start_lsn | receive_start_tli | written_lsn | flushed_lsn | received_tli |      last_msg_send_time       |     last_msg_receipt_
time     | latest_end_lsn |        latest_end_time        | slot_name |  sender_host  | sender_port |
                                                                            conninfo

-------+-----------+-------------------+-------------------+-------------+-------------+--------------+-------------------------------+----------------------
---------+----------------+-------------------------------+-----------+---------------+-------------+--------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------
 25996 | streaming | 0/3000000         |                 1 | 0/3006F28   | 0/3006F28   |            1 | 2021-08-05 19:26:54.277385+07 | 2021-08-05 19:26:55.4
83295+07 | 0/3006F28      | 2021-08-05 18:53:49.822119+07 |           | 192.168.56.10 |        5432 | user=replication password=******** channel_binding=pref
er dbname=replication host=192.168.56.10 port=5432 fallback_application_name=walreceiver sslmode=prefer sslcompression=0 ssl_min_protocol_version=TLSv1.2 gss
encmode=prefer krbsrvname=postgres target_session_attrs=any
(1 row)

 

Nhìn kiểu này hơi khó nhìn đúng không, bạn hãy chuyển sang chế độ nhìn Expanded display của psql. Chế độ này sẽ biến mỗi dòng dữ liệu thành dạng cột. Rất hữu ích khi các bạn muốn xem dữ liệu của những bảng có ít dòng nhưng lại có nhiều cột.

postgres=# x
Expanded display is on.

 

và chạy lại câu lệnh:

select * from pg_stat_wal_receiver;

 

Kết quả:

-[ RECORD 1 ]---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pid                   | 25996
status                | streaming
receive_start_lsn     | 0/3000000
receive_start_tli     | 1
written_lsn           | 0/3006F28
flushed_lsn           | 0/3006F28
received_tli          | 1
last_msg_send_time    | 2021-08-05 19:27:24.344093+07
last_msg_receipt_time | 2021-08-05 19:27:25.550181+07
latest_end_lsn        | 0/3006F28
latest_end_time       | 2021-08-05 18:53:49.822119+07
slot_name             |
sender_host           | 192.168.56.10
sender_port           | 5432
conninfo              | user=replication password=******** channel_binding=prefer dbname=replication host=192.168.56.10 port=5432 fallback_application_name=walreceiver sslmode=prefer sslcompression=0 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any

Dễ nhìn hơn nhiều rồi phải không?

 

2. Giải thích các thông số

Kết quả trên cho thấy có một tiến trình WAL Receiver với PID 25996, hiện đang hoạt động và đã nhận dữ liệu từ 0/3000000 đến 0/3006F28.

Sự chênh lệch giữa last_msg_send_time và last_msg_receipt_time cho biết độ trễ của kết nối, trong trường hợp này là hơn 1 giây. (gửi lúc 19:27:24.34 và nhận lúc 19:27:25.55).

Chúng ta cũng sẽ thấy 1 số thông tin khác như: máy chủ đang gửi WAL (sender_host) là 192.168.56.10 thông qua port (sender_port) 5432.

Tuy nhiên, pg_stat_wal_receiver chỉ cho biết thông tin là WAL file có đang được gửi từ primary về hay không, chứ chưa đủ thông tin để kết luận là Standby có đang replay các WAL đó trên database của mình hay không

Để biết được điều đó, bạn hãy sử dụng câu lệnh sau:

select pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn(), pg_last_xact_replay_timestamp();
-[ RECORD 1 ]-----------------+------------------------------
pg_last_wal_receive_lsn       | 0/3007080
pg_last_wal_replay_lsn        | 0/3006F28
pg_last_xact_replay_timestamp | 2021-08-05 18:50:35.298393+07

Ở đây pg_last_wal_receive_lsn là vị trí (tính theo hexa) WAL record đã nhận, và pg_last_wal_replay_lsn là vị trí mà tiến trình replay đang đọc. Chúng ta có thể biết là: Standby còn phải đọc bao nhiêu MB WAL record nữa thì mới đuổi kịp được Primary bằng cách lấy pg_last_wal_receive_lsn – pg_last_wal_replay_lsn

Ví dụ, ở đây:
pg_last_wal_receive_lsn = 0x3007080 (Trong Hexadecimal, nhớ thay / bằng x nhé) = 50360448 (Decimal)
pg_last_wal_replay_lsn = 0x3006F28 (Hexadecimal) = 50360104 (Decimal)

pg_last_wal_receive_lsn – pg_last_wal_replay_lsn = 50360448 – 50360104 = 344 (Bytes)

Như vậy là, Standby đang “chậm” hơn Primary 344 Bytes

Ngoài ra, bạn còn có thể monitor streaming replication tại thư mục log nằm trong PGDATA. Hãy nhớ đặt tham số logging_collector = on để có log mà đọc nhé.
Kiểm tra xem liệu tiến trình ghi log có được bật hay chưa (On là đã được bật)
show logging_collector;
-[ RECORD 1 ]-----+---
logging_collector | on
2021-08-05 13:26:08.904 +07 [25989] LOG:  starting PostgreSQL 13.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
2021-08-05 13:26:08.905 +07 [25989] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2021-08-05 13:26:08.905 +07 [25989] LOG:  listening on IPv6 address "::", port 5432
2021-08-05 13:26:08.907 +07 [25989] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2021-08-05 13:26:08.910 +07 [25989] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"
2021-08-05 13:26:08.913 +07 [25991] LOG:  database system was interrupted; last known up at 2021-08-05 13:23:36 +07
2021-08-05 13:26:09.759 +07 [25991] LOG:  entering standby mode
2021-08-05 13:26:09.763 +07 [25991] LOG:  redo starts at 0/2000028
2021-08-05 13:26:09.765 +07 [25991] LOG:  consistent recovery state reached at 0/2000138
2021-08-05 13:26:09.765 +07 [25989] LOG:  database system is ready to accept read only connections
2021-08-05 13:26:09.773 +07 [25996] LOG:  started streaming WAL from primary at 0/3000000 on timeline 1
2021-08-05 13:27:05.462 +07 [26079] ERROR:  cannot execute INSERT in a read-only transaction
2021-08-05 13:27:05.462 +07 [26079] STATEMENT:  insert into test values (4);
2021-08-05 13:27:49.583 +07 [26079] ERROR:  relation "test" does not exist at character 15
2021-08-05 13:27:49.583 +07 [26079] STATEMENT:  select * from test;

Các bạn có thể nhìn thấy dòng “LOG: started streaming WAL from primary at 0/3000000 on timeline 1” cho thấy tiến trình WAL receiver hiện đang được chạy.

3. Monitor Streaming Replication trên Primary

1. Giám sát WAL Sender

Ở trên primary, bạn cũng có thể kiểm tra xem tiến trình gửi WAL Sender có đang hoạt động hay không bằng câu lệnh

postgres=# select * from pg_stat_replication;

 

Kết quả là:

-[ RECORD 1 ]----+------------------------------
pid              | 16114
usesysid         | 16394
usename          | replication
application_name | walreceiver
client_addr      | 192.168.56.11
client_hostname  |
client_port      | 41814
backend_start    | 2021-08-05 13:26:08.906084+07
backend_xmin     |
state            | streaming
sent_lsn         | 0/3007168
write_lsn        | 0/3007168
flush_lsn        | 0/3007168
replay_lsn       | 0/3007168
write_lag        |
flush_lag        |
replay_lag       |
sync_priority    | 0
sync_state       | async
reply_time       | 2021-08-05 19:56:55.152998+07

 

2. Giải thích các thông số

Như các bạn thấy kết quả của câu lệnh trên. Hiện primary chỉ gửi WAL sang 1 địa chỉ standby là 192.168.56.11.

Tiến trình đó có PID là 16114, bắt đầu chạy lúc 2021-08-05 13:26:08.906084+07.

Hiện nó đã gửi WAL record có vị trí 0/3007168 sang standby.

Như vậy là tôi đã hướng dẫn các bạn monitor Streaming Replication trong PostgreSQL, có bất cứ thắc mắc nào các bạn hãy để lại bình luận ở bên dưới bài viết nhé.

Related posts

Perform Manual Failover & Switchover with repmgr in PostgreSQL

Configure automatic failover with repmgrd in PostgreSQL

Thủ tục Failover/Switchover Streaming Replication trên PostgreSQL