Mengapa commit SQL segerak anda menunggu perjalanan pergi balik VPN
Commit segerak dalam kumpulan ketersediaan merangkumi pengerasan log jauh. Ukur laluan itu sebelum menyalahkan lebar jalur atau menukar mod.
Kependaman tulis melonjak selepas replika dipindahkan ke tapak kedua, dan terowong ialah komponen terbaharu, jadi ia dipersalahkan. Terowong mungkin tidak bersalah: dalam kumpulan ketersediaan dengan commit segerak, replika utama tidak boleh mengesahkan commit sehingga penulisan log jauh selesai, jadi setiap transaksi membayar perjalanan pergi balik berapa pun megabit yang boleh dibawa pautan. Throughput mengukur bait sesaat, kependaman mengukur berapa lama satu pertukaran berlaku, dan commit hanya perlukan satu pertukaran kecil untuk selesai. Satu nombor menyelesaikan perdebatan: tempoh commit transaksi kecil, diukur dalam pangkalan data ketersediaan dan sekali lagi terhadap jadual tempatan pada instans yang sama.
Apa yang sebenarnya ditunggu oleh replika utama
Dengan commit segerak, replika utama menahan pengesahan commit sehingga rakan mengesahkan rekod lognya telah mengeras. Mengeras bermaksud ditulis secara tahan lama ke log transaksi sekunder, bukan dimainkan semula ke halaman datanya. Redo boleh ketinggalan beberapa minit tanpa menambah satu milisaat pun pada commit replika utama.
Dokumentasi Microsoft tentang mod ketersediaan menerangkan jabat tangan itu dan apa yang platform lakukan apabila rakan tercicir. Replika yang ditanda segerak ialah peraturan tentang menunggu, bukan janji kekal bahawa salinan jauh yang sihat wujud untuk setiap commit. Laluan terputus ditakrifkan secara berasingan, dan ia bukan sekadar commit gagal.
Jadi penantian yang anda lihat ialah jumlah: pengangkutan log, penjadualan pada kedua-dua hos dan penulisan ke storan jauh. Replika sekunder dengan volum log tepu menambah masa yang tiada ujian kelajuan akan tunjukkan. Cakera itu jarang diukur apabila aduan menyebut VPN.
Lebar jalur bukan kelewatan perjalanan pergi balik
Ujian kelajuan membanjiri laluan sebentar dan melaporkan kadar. Commit meminta sesuatu yang lebih sempit: berapa lama mesej kecil mengambil masa untuk sampai ke seberang, disimpan dan kembali. Panjang laluan, baris gilir dan kehilangan paket menentukan nombor itu, dan tiada satu pun bertambah baik apabila pembekal menaikkan siling.
Terowong «laju» oleh itu boleh menambah penalti yang kelihatan pada beban kerja berat tulis yang dibina daripada banyak transaksi kecil berturutan. Jumlah bait yang sama dibahagikan kepada seribu commit membayar perjalanan pergi balik seribu kali; satu pemindahan pukal membayarnya sekali.
Minta pemilik rangkaian mengukur kelewatan dan kehilangan pada laluan replika itu sendiri di bawah beban perwakilan. Ping dari komputer riba pejabat ke gerbang VPN, atau ujian kelajuan ke nod berdekatan, hampir tidak mengaitkan apa-apa dengan laluan yang sebenarnya dilalui log. Pastikan tetingkap pengukuran bertindih dengan waktu penulisan lambat.
Baca keadaan replika sebelum mengubah apa-apa
Mulakan dengan apa yang instans laporkan tentang dirinya sendiri, kerana kedua-dua pihak mungkin tidak bersetuju tentang betapa sihatnya perkongsian itu dan purata papan pemuka menyembunyikan baris gilir mana yang bergerak. Pertanyaan di bawah menjawab soalan berbeza: satu membaca keadaan replikasi setiap pangkalan data, satu lagi membaca bagaimana setiap replika dikonfigurasikan. Jalankan kedua-duanya sebelum menyentuh mod.
SELECT ag.name AS ag_name, drs.database_id, drs.synchronization_state_desc,
drs.log_send_queue_size, drs.redo_queue_size, drs.secondary_lag_seconds
FROM sys.dm_hadr_database_replica_states AS drs
JOIN sys.availability_groups AS ag ON ag.group_id = drs.group_id;
SELECT ar.replica_server_name, ar.availability_mode_desc, ar.failover_mode_desc
FROM sys.availability_replicas AS ar;
Hasil pertama memisahkan pengangkutan log daripada redo. log_send_queue_size naik sementara redo_queue_size kekal rata bermaksud log belum tiba; sebaliknya bermaksud ia tiba dan main semula ketinggalan. Hanya kes pertama duduk di laluan commit.
Hasil kedua mengesahkan replika mana yang benar-benar dikonfigurasikan seperti yang anda andaikan, kerana mod yang diubah semasa insiden terdahulu cenderung kekal diubah dan tidak didokumenkan. Baca baris yang anda peduli dan bukan lalai kumpulan: availability_mode_desc dan failover_mode_desc adalah setiap replika. secondary_lag_seconds hanya wujud pada SQL Server 2016 dan lebih baharu, jadi binaan lama meninggalkan anda dengan lajur baris gilir hantar dan redo sahaja.
Kemudian ukur penulisan perwakilan daripada mempercayai purata papan pemuka. Jalankan blok di bawah dalam pangkalan data ketersediaan, kemudian jalankannya semula terhadap bentuk jadual yang sama dalam pangkalan data di luar kumpulan pada instans yang sama. Jurang antara dua tempoh itu ialah harga kasar untuk log jauh, dan dalam perdebatan dengan pasukan rangkaian ia bertahan jauh lebih baik daripada graf. Selepas itu ubah satu pemboleh ubah pada satu masa, jika tidak jurang itu tidak lagi bermakna.
IF OBJECT_ID('dbo.CommitProbe') IS NULL
CREATE TABLE dbo.CommitProbe (probe_id int PRIMARY KEY, touched_at datetime2(3));
IF NOT EXISTS (SELECT 1 FROM dbo.CommitProbe WHERE probe_id = 1)
INSERT INTO dbo.CommitProbe (probe_id) VALUES (1);
SET STATISTICS TIME ON;
BEGIN TRANSACTION;
UPDATE dbo.CommitProbe SET touched_at = SYSUTCDATETIME() WHERE probe_id = 1;
COMMIT TRANSACTION;
SET STATISTICS TIME OFF;
Apa yang dibeli commit tak segerak, dan apa kosnya
Dengan commit tak segerak, replika utama berhenti menunggu pengesahan pengerasan jauh, jadi perjalanan pergi balik keluar dari laluan commit. Kependaman commit menurun dan replika sekunder bebas ketinggalan sejauh yang tiada siapa kawal. Itu pembaikan sebenar untuk penantian dan perubahan sebenar pada janji.
Harganya ialah keputusan titik pemulihan. Jika replika utama mati sebelum lognya sampai ke sasaran failover yang benar-benar boleh anda gunakan, memindahkan perkhidmatan ke salinan tak segerak membuang transaksi yang aplikasi sudah laporkan sebagai commit. Tiada dialog konfigurasi membingkaikannya begitu, kerana ia soalan perniagaan tentang kerugian yang boleh diterima, bukan tetapan prestasi. Tulis tetingkap kerugian yang ditoleransi sebelum insiden, bukan semasanya.
Sepakati mod dengan pemilik data, secara bertulis, bersama prosedur failover untuk kes sasaran pilihan tidak tersedia. Segerak dalam dokumen reka bentuk bukan buku panduan operasi, dan tak segerak bukan lesen untuk berhenti memantau baris gilir.
Pilih pembaikan yang boleh anda pertahankan kemudian
Terdapat empat pilihan jujur. Potong perjalanan pergi balik commit yang boleh dielakkan di mana semantik aplikasi membenarkan pengelompokan; baiki halangan pengangkutan atau storan yang anda ukur, yang mungkin bermaksud volum log lebih pantas pada replika sekunder dan bukannya paip lebih besar; dekatkan replika supaya perjalanan pergi balik mengecil; atau longgarkan dasar perlindungan dan terima tetingkap kerugian yang lebih luas. Setiap satu membeli kependaman dengan membelanjakan sesuatu yang lain, dan yang keempat membelanjakan ketahanan. Namakan perbelanjaan sebelum memilih.
Putuskan dengan sasaran kependaman beban kerja dan keperluan ketahanannya di hadapan anda pada masa yang sama, kerana mengoptimumkan satu membelanjakan yang lain secara senyap. Kemudian jalankan semula transaksi yang sama yang anda ukur sebelum perubahan. Pembaikan yang tidak dapat menggerakkan nombor itu ialah tekaan yang memakai tiket perubahan.
Simpan bacaan sebelum dan selepas dalam rekod perubahan. Jika tidak, orang seterusnya yang melihat penulisan lambat mengulang siasatan dari awal dan mula menyalahkan terowong lagi.