Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Penelusuran kueri terdistribusi di log Postgre di Aurora Postgre SQL Limitless Database SQL
Penelusuran kueri terdistribusi adalah alat untuk melacak dan mengkorelasikan kueri dalam SQL log Postgre di seluruh Database Tanpa Batas Aurora Postgre. SQL Di Aurora PostgreSQL, Anda menggunakan ID transaksi untuk mengidentifikasi transaksi. Namun di Aurora Postgre SQL Limitless Database, ID transaksi dapat diulang di berbagai router. Oleh karena itu, kami menyarankan Anda menggunakan ID penelusuran sebagai gantinya di Limitless Database.
Kasus penggunaan utama adalah sebagai berikut:
-
Gunakan
rds_aurora.limitless_get_last_trace_id()
fungsi untuk menemukan ID penelusuran unik dari kueri terakhir yang dijalankan di sesi saat ini. Kemudian cari grup log cluster DB di Amazon CloudWatch Logs menggunakan ID penelusuran itu untuk menemukan semua log terkait.Anda dapat menggunakan
log_min_error_statement
parameterlog_min_messages
dan bersama-sama untuk mengontrol volume log yang dicetak dan mencetak pernyataan yang berisi ID penelusuran. -
Gunakan
log_min_duration_statement
parameter untuk menentukan waktu proses di mana semua kueri mencetak durasi proses dan ID penelusuran. Waktu berjalan ini kemudian dapat dicari di grup log cluster DB di CloudWatch Log untuk membantu menentukan node bottleneck dan upaya pengoptimalan perencana.log_min_duration_statement
Parameter memungkinkan ID penelusuran untuk semua node terlepas dari nilailog_min_messages
danlog_min_error_statement
parameter.
ID Penelusuran
Inti dari fitur ini adalah pengenal unik yang dikenal sebagai ID penelusuran. ID penelusuran adalah string 31 digit yang ditambahkan ke baris STATEMENT log log Postgre, bertindak sebagai pengidentifikasi yang tepat untuk menghubungkan SQL log yang terkait dengan eksekusi kueri tertentu. Contohnya adalah 1126253375719408504000000000011
dan 1126253375719408495000000000090
.
ID penelusuran terdiri dari yang berikut:
-
Pengenal transaksi — 20 digit pertama, mengidentifikasi transaksi secara unik.
-
Command identifier — 30 digit pertama, yang menunjukkan kueri individu dalam suatu transaksi.
Jika lebih dari 4.294.967.294 kueri dijalankan di dalam blok transaksi eksplisit, perintah Identifier membungkusnya.
1
Ketika ini terjadi, Anda akan diberi tahu melaluiLOG
pesan berikut di log PostgreSQL:wrapping around the tracing ID back to 1 after running 4294967294 (4.2 billion or 2^32-2) queries inside of an explicit transaction block
-
Pengidentifikasi tipe node — Digit terakhir, yang menunjukkan apakah node berfungsi sebagai router koordinator (
1
) atau node peserta (0
).
Contoh berikut menggambarkan komponen ID penelusuran:
-
1126253375719408504000000000011
:-
Pengidentifikasi transaksi —
1126253375719408504
-
Command identifier —
112625337571940850400000000001
menunjukkan perintah pertama di blok transaksi -
Pengidentifikasi tipe node -
1
menunjukkan router koordinator
-
-
1126253375719408495000000000090
:-
Pengidentifikasi transaksi —
1126253375719408495
-
Command identifier —
112625337571940849500000000009
menunjukkan perintah kesembilan di blok transaksi -
Pengidentifikasi tipe node -
0
menunjukkan node peserta
-
Menggunakan penelusuran kueri
Lakukan tugas-tugas berikut untuk menggunakan penelusuran kueri:
-
Pastikan penelusuran diaktifkan.
Anda dapat memeriksa menggunakan perintah berikut:
SHOW rds_aurora.limitless_log_distributed_trace_id;
Ini diaktifkan secara default (
on
). Jika tidak diaktifkan, atur menggunakan perintah berikut:SET rds_aurora.limitless_log_distributed_trace_id = on;
-
Kontrol volume log yang dicetak dengan mengonfigurasi tingkat keparahan log.
Volume log dikendalikan oleh
log_min_messages
parameter.log_min_error_statement
Parameter digunakan untuk mencetakSTATEMENT
garis dengan ID penelusuran. Keduanya diatur secaraERROR
default. Anda dapat memeriksa menggunakan perintah berikut:SHOW log_min_messages; SHOW log_min_error_statement;
Untuk memperbarui tingkat keparahan dan mencetak
STATEMENT
baris untuk sesi saat ini, gunakan perintah berikut dengan salah satu tingkat keparahan ini:SET log_min_messages = '
DEBUG5
|DEBUG4
|DEBUG3
|DEBUG2
|DEBUG1
|INFO
|NOTICE
|WARNING
|ERROR
|LOG
|FATAL
|PANIC
'; SET log_min_error_statement = 'DEBUG5
|DEBUG4
|DEBUG3
|DEBUG2
|DEBUG1
|INFO
|NOTICE
|WARNING
|ERROR
|LOG
|FATAL
|PANIC
';Sebagai contoh:
SET log_min_messages = 'WARNING'; SET log_min_error_statement = 'WARNING';
-
Aktifkan pencetakan ID penelusuran di log di atas waktu proses tertentu.
log_min_duration_statement
Parameter dapat diubah ke waktu proses kueri minimum di atas mana kueri mencetak baris log dengan durasi proses, bersama dengan penelusuran IDs melintasi cluster DB. Parameter ini diatur ke secara-1
default, yang berarti itu dinonaktifkan. Anda dapat memeriksa menggunakan perintah berikut:SHOW log_min_duration_statement;
Mengubahnya untuk
0
mencetak durasi dan melacak ID di log untuk setiap kueri di seluruh cluster DB. Anda dapat mengaturnya0
untuk sesi saat ini dengan menggunakan perintah berikut:SET log_min_duration_statement = 0;
-
Dapatkan ID penelusuran.
Setelah menjalankan kueri (bahkan di dalam blok transaksi eksplisit), panggil
rds_aurora.limitless_get_last_trace_id
fungsi untuk mendapatkan ID penelusuran dari kueri terakhir yang dijalankan:SELECT * FROM rds_aurora.limitless_get_last_trace_id();
Fungsi ini mengembalikan identifier transaksi dan pengidentifikasi perintah. Itu tidak mengembalikan pengidentifikasi tipe simpul.
=> SELECT * FROM customers; customer_id | fname | lname -------------+-------+------- (0 rows) => SELECT * FROM rds_aurora.limitless_get_last_trace_id(); transaction_identifier | command_identifier ------------------------+-------------------------------- 10104661421959001813 | 101046614219590018130000000001 (1 row)
Fungsi mengembalikan baris kosong untuk kueri yang tidak didistribusikan, karena mereka tidak memiliki ID penelusuran.
=> SET search_path = public; SET => SELECT * FROM rds_aurora.limitless_get_last_trace_id(); transaction_identifier | command_identifier ------------------------+-------------------- | (1 row)
catatan
Untuk VACUUM dan ANALYZE kueri, pernyataan durasi tidak dicatat dengan ID penelusuran. Oleh karena itu,
limitless_get_last_trace_id()
tidak mengembalikan ID penelusuran. Jika VACUUM atau ANALYZE merupakan operasi yang berjalan lama, Anda dapat menggunakan kueri berikut untuk mendapatkan ID penelusuran untuk operasi tersebut:SELECT * FROM rds_aurora.limitless_stat_activity WHERE distributed_tracing_id IS NOT NULL;
Jika server berhenti sebelum Anda dapat menemukan ID penelusuran terakhir, Anda harus mencari SQL log Postgre secara manual untuk menemukan penelusuran IDs di log dari tepat sebelum kegagalan.
-
Cari ID penelusuran di seluruh log cluster DB menggunakan CloudWatch.
Gunakan CloudWatch Wawasan untuk menanyakan grup log cluster DB, seperti yang ditunjukkan pada contoh berikut.
-
Kueri untuk pengidentifikasi transaksi tertentu dan semua perintah berjalan di dalamnya:
fields @timestamp, @message | filter @message like /10104661421959001813/ | sort @timestamp desc
-
Kueri untuk pengidentifikasi perintah tertentu:
fields @timestamp, @message | filter @message like /101046614219590018130000000001/ | sort @timestamp desc
-
-
Periksa semua log di seluruh cluster DB yang dihasilkan oleh kueri terdistribusi.
Contoh log
Contoh berikut menunjukkan penggunaan query tracing.
Mengkorelasikan log untuk kueri rawan kesalahan
Dalam contoh ini TRUNCATE
perintah dijalankan di atas customers
meja ketika tabel itu tidak ada.
- Tanpa penelusuran kueri
-
File SQL log Postgre pada router koordinator:
2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[27503]:ERROR: failed to execute remote query 2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[27503]:DETAIL: relation "public.customers" does not exist 2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[27503]:CONTEXT: remote SQL command: truncate public.customers; 2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[27503]:STATEMENT: truncate customers;
File SQL log Postgre pada pecahan peserta:
2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[ 27503]:ERROR: failed to execute remote query 2023-09-26 04:03:19 UTC:[local]: postgres@postgres_limitless:[ 27503]:STATEMENT: truncate customers;
Log ini khas. Mereka tidak memiliki pengidentifikasi tepat yang diperlukan untuk dengan mudah menghubungkan kueri di seluruh cluster DB.
- Dengan penelusuran kueri
-
File SQL log Postgre pada router koordinator:
2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:ERROR: failed to execute remote query 2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:DETAIL: relation "public.customers" does not exist 2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:CONTEXT: remote SQL command: truncate public.customers; 2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:STATEMENT: /* tid = 1126253375719408502700000000011 */ truncate customers;
File SQL log Postgre pada pecahan peserta:
2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:ERROR: failed to execute remote query 2023-09-26 04:03:19 UTC:[local]:postgres@postgres_limitless:[27503]:STATEMENT: /* tid = 1126253375719408502700000000010 */ truncate customers;
Dengan adanya penelusuran kueri, setiap baris log ditambahkan dengan pengidentifikasi unik 31 digit. Di sini,
1126253375719408502700000000011
dan1126253375719408502700000000010
mewakili penelusuran IDs untuk koordinator dan node peserta, masing-masing.-
Pengidentifikasi transaksi —
11262533757194085027
-
Pengidentifikasi perintah: -
112625337571940850270000000001
-
Pengidentifikasi tipe node — Digit terakhir,
1
atau0
, menunjukkan router koordinator dan node peserta, masing-masing.
-
Mengkorelasikan log untuk menemukan waktu proses kueri pada berbagai node
Dalam contoh ini, log_min_duration_statement
parameter telah diperbarui 0
untuk mencetak durasi untuk semua kueri.
- Tanpa penelusuran kueri
-
2024-01-15 07:28:46 UTC:[local]:postgres@postgres_limitless:[178322]:LOG: duration: 12.779 ms statement: select * from customers;
- Dengan penelusuran kueri
-
File SQL log Postgre pada router koordinator:
2024-01-15 07:32:08 UTC:[local]:postgres@postgres_limitless:[183877]:LOG: duration: 12.618 ms statement: /* tid = 0457669566240497088400000000011 */ select * from customers;
File SQL log Postgre pada pecahan peserta:
2024-01-15 07:32:08 UTC:localhost(46358):postgres@postgres_limitless:[183944]:LOG: duration: 0.279 ms statement: /* tid = 0457669566240497088400000000010 */ START TRANSACTION ISOLATION LEVEL READ COMMITTED 2024-01-15 07:32:08 UTC:localhost(46358):postgres@postgres_limitless:[183944]:LOG: duration: 0.249 ms parse <unnamed>: SELECT customer_id, fname, lname FROM public.customers 2024-01-15 07:32:08 UTC:localhost(46358):postgres@postgres_limitless:[183944]:LOG: duration: 0.398 ms bind <unnamed>/c1: SELECT customer_id, fname, lname FROM public.customers 2024-01-15 07:32:08 UTC:localhost(46358):postgres@postgres_limitless:[183944]:LOG: duration: 0.019 ms execute <unnamed>/c1: SELECT customer_id, fname, lname FROM public.customers 2024-01-15 07:32:08 UTC:localhost(46358):postgres@postgres_limitless:[183944]:LOG: duration: 0.073 ms statement: /* tid = 0457669566240497088400000000010 */ COMMIT TRANSACTION