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
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é.