Penelusuran kueri terdistribusi di log Postgre di Aurora Postgre SQL Limitless Database SQL - Amazon Aurora

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 parameter log_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_statementParameter memungkinkan ID penelusuran untuk semua node terlepas dari nilai log_min_messages dan log_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 melalui LOG 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:

  1. 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;
  2. Kontrol volume log yang dicetak dengan mengonfigurasi tingkat keparahan log.

    Volume log dikendalikan oleh log_min_messages parameter. log_min_error_statementParameter digunakan untuk mencetak STATEMENT garis dengan ID penelusuran. Keduanya diatur secara ERROR 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';
  3. Aktifkan pencetakan ID penelusuran di log di atas waktu proses tertentu.

    log_min_duration_statementParameter 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 mengaturnya 0 untuk sesi saat ini dengan menggunakan perintah berikut:

    SET log_min_duration_statement = 0;
  4. 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.

  5. 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
  6. 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 dan 1126253375719408502700000000010 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