Peer-to-Peer - Deteksi Konflik dalam Replikasi Peer-to-Peer
Berlaku untuk: SQL Server
Replikasi transaksional peer-to-peer memungkinkan Anda menyisipkan, memperbarui, atau menghapus data pada node apa pun dalam topologi dan memiliki perubahan data yang disebarkan ke simpul lain. Karena Anda dapat mengubah data pada node apa pun, perubahan data pada node yang berbeda dapat bertentangan satu sama lain. Jika baris dimodifikasi pada lebih dari satu simpul, baris dapat menyebabkan konflik atau bahkan pembaruan yang hilang saat baris disebarkan ke simpul lain.
Replikasi peer-to-peer menyediakan opsi untuk mengaktifkan deteksi konflik di seluruh topologi peer-to-peer. Opsi ini membantu mencegah masalah yang disebabkan oleh konflik yang tidak terdeteksi, termasuk perilaku aplikasi yang tidak konsisten dan pembaruan yang hilang. Dengan opsi ini diaktifkan, secara default perubahan yang bertentangan diperlakukan sebagai kesalahan penting yang menyebabkan kegagalan Agen Distribusi. Jika terjadi konflik, topologi tetap dalam keadaan tidak konsisten sampai konflik diselesaikan dan data dibuat konsisten di seluruh topologi.
Catatan
Untuk menghindari potensi inkonsistensi data, pastikan Anda menghindari konflik dalam topologi peer-to-peer, bahkan dengan deteksi konflik diaktifkan. Untuk memastikan bahwa operasi tulis untuk baris tertentu hanya dilakukan pada satu simpul, aplikasi yang mengakses dan mengubah data harus menyisipkan, memperbarui, dan menghapus operasi partisi. Pemartisian ini memastikan bahwa modifikasi pada baris tertentu yang berasal dari satu node disinkronkan dengan semua node lain dalam topologi sebelum baris dimodifikasi oleh node yang berbeda. Jika aplikasi memerlukan kemampuan deteksi dan resolusi konflik yang canggih, gunakan replikasi penggabungan. Untuk informasi selengkapnya, lihat Menggabungkan Replikasi dan Mendeteksi dan Mengatasi Konflik Replikasi Penggabungan.
Memahami konflik dan deteksi konflik
Dalam database tunggal, perubahan yang dilakukan pada baris yang sama oleh aplikasi yang berbeda tidak menyebabkan konflik. Ini karena transaksi diserialisasikan, dan kunci menangani perubahan bersamaan. Dalam sistem terdistribusi asinkron seperti replikasi peer-to-peer, transaksi bertindak secara independen pada setiap simpul; dan tidak ada mekanisme untuk menserialisasikan transaksi di beberapa simpul. Protokol seperti penerapan dua fase dapat digunakan, tetapi ini memengaruhi performa secara signifikan.
Dalam sistem seperti replikasi peer-to-peer, konflik tidak terdeteksi ketika perubahan dilakukan pada rekan-rekan individu. Sebaliknya, mereka terdeteksi ketika perubahan tersebut direplikasi dan diterapkan pada rekan-rekan lain. Dalam replikasi peer-to-peer, konflik terdeteksi oleh prosedur tersimpan yang menerapkan perubahan pada setiap simpul, berdasarkan satu atau beberapa kolom tersembunyi di setiap tabel yang diterbitkan.
Sebelum SQL Server 2019 (15.x) CU 13, SQL Server menambahkan satu kolom tersembunyi ke setiap tabel yang diterbitkan: $sys_p2p_cd_id
. Kolom tersembunyi ini menyimpan ID yang menggabungkan ID pendahulu yang Anda tentukan untuk setiap simpul dan versi baris.
Pada SQL Server 2019 (15.x) CU 13 dan yang lebih baru, jika Anda membuat publikasi peer to peer dengan @p2p_conflictdetection_policy = 'lastwriter'
SQL Server menambahkan kolom tersembunyi tambahan ke setiap tabel yang diterbitkan: $sys_md_cd_id
. Kolom tersembunyi ini menyimpan tanggalwaktu sebagai datetime2
tipe data.
Selama sinkronisasi, Agen Distribusi menjalankan prosedur untuk setiap tabel. Prosedur ini menerapkan operasi sisipkan, perbarui, dan hapus dari rekan-rekan lain. Jika salah satu prosedur mendeteksi konflik saat membaca nilai atau nilai kolom tersembunyi, itu menimbulkan kesalahan 22815 yang memiliki tingkat keparahan 16:
A conflict of type '%s' was detected at peer %d between peer %d (incoming), transaction id %s and peer %d (on disk), transaction id %s
Secara default, kesalahan ini menyebabkan Agen Distribusi berhenti menerapkan perubahan pada simpul tersebut. Untuk informasi tentang cara menangani konflik yang terdeteksi, lihat Menangani konflik.
Catatan
Kolom tersembunyi hanya dapat diakses oleh pengguna yang masuk melalui Koneksi Administrator Khusus (DAC). Untuk informasi tentang DAC, lihat Koneksi Diagnostik untuk Administrator Database.
Replikasi peer-to-peer mendeteksi jenis konflik berikut:
Sisipkan-sisipkan
Semua baris dalam setiap tabel yang berpartisipasi dalam replikasi peer-to-peer diidentifikasi secara unik dengan menggunakan nilai kunci primer. Konflik sisipan-sisipkan terjadi ketika baris dengan nilai kunci yang sama disisipkan di lebih dari satu simpul.
Pembaruan-pembaruan
Terjadi ketika baris yang sama diperbarui pada lebih dari satu simpul.
Sisipkan-perbarui
Terjadi jika baris diperbarui pada satu simpul, tetapi baris yang sama dihapus dan kemudian diinserksi ulang pada simpul lain.
Sisipkan-hapus
Terjadi jika baris dihapus pada satu simpul, tetapi baris yang sama dihapus dan kemudian diinserksi ulang pada simpul lain.
Perbarui-hapus
Terjadi jika baris diperbarui pada satu simpul, tetapi baris yang sama dihapus di simpul lain.
Hapus-hapus
Terjadi ketika baris dihapus pada lebih dari satu simpul.
Mengaktifkan Deteksi Konflik
Untuk menggunakan deteksi konflik, aktifkan deteksi untuk semua simpul. Secara default, deteksi konflik diaktifkan saat Anda mengonfigurasi replikasi peer-to-peer di SQL Server Management Studio. Kami menyarankan agar Anda mengaktifkan deteksi, bahkan dalam skenario di mana Anda tidak mengharapkan konflik apa pun. Deteksi konflik dapat diaktifkan dan dinonaktifkan dengan menggunakan Prosedur tersimpan Management Studio atau Transact-SQL:
Anda dapat mengaktifkan dan menonaktifkan deteksi di Management Studio baik dengan menggunakan halaman Opsi Langganan dari kotak dialog Properti Publikasi atau halaman Konfigurasi Topologi dari Wizard Konfigurasi Topologi Peer-to-Peer.
Jika Anda mengonfigurasi deteksi konflik dengan menggunakan Management Studio, Agen Distribusi dikonfigurasi untuk berhenti menerapkan perubahan saat konflik terdeteksi.
Anda juga dapat mengaktifkan dan menonaktifkan deteksi dengan menggunakan prosedur tersimpan berikut:
sp_configure_peerconflictdetection.
Jika Anda mengonfigurasi deteksi konflik dengan menggunakan prosedur tersimpan, Anda dapat menentukan apakah Agen Distribusi harus berhenti menerapkan perubahan saat konflik terdeteksi. Defaultnya adalah agar agen berhenti. Kami menyarankan agar Anda menggunakan pengaturan default.
Menangani konflik
Ketika konflik terjadi dalam replikasi peer-to-peer, pemberitahuan deteksi konflik peer-to-peer dinaikkan. Konfigurasikan pemberitahuan ini sehingga Anda diberi tahu ketika konflik terjadi. Untuk informasi selengkapnya tentang pemberitahuan, lihat Menggunakan Pemberitahuan untuk Peristiwa Agen Replikasi.
Setelah Agen Distribusi berhenti dan pemberitahuan dinaikkan, gunakan salah satu pendekatan berikut untuk menangani konflik yang terjadi:
Menginisialisasi ulang simpul tempat konflik terdeteksi dari cadangan simpul yang berisi data yang diperlukan (pendekatan yang direkomendasikan). Metode ini memastikan bahwa data dalam keadaan konsisten.
Coba sinkronkan simpul lagi dengan mengaktifkan Agen Distribusi untuk terus menerapkan perubahan:
Jalankan sp_changepublication: tentukan 'p2p_continue_onconflict' untuk @property parameter dan true untuk @value parameter .
Mulai ulang Agen Distribusi.
Verifikasi konflik yang terdeteksi dengan menggunakan penampil konflik dan tentukan baris yang terlibat, jenis konflik, dan pemenang. Konflik diselesaikan berdasarkan nilai ID pencetus yang Anda tentukan selama konfigurasi: baris yang berasal dari simpul dengan ID tertinggi memenangkan konflik. Untuk informasi selengkapnya, lihat Menampilkan Konflik Data untuk Publikasi Transaksi (SQL Server Management Studio).
Jalankan validasi untuk memastikan bahwa baris yang berkonvergensi berkonvergensi dengan benar. Untuk informasi selengkapnya, lihat Memvalidasi Data yang Direplikasi.
Catatan
Jika data tidak konsisten setelah langkah ini, Anda harus memperbarui baris secara manual pada simpul yang memiliki prioritas tertinggi, lalu membiarkan perubahan menyebar dari simpul ini. Jika tidak ada perubahan yang bertentangan lebih lanjut dalam topologi, semua simpul akan dibawa ke keadaan yang konsisten.
Jalankan sp_changepublication: tentukan 'p2p_continue_onconflict' untuk @property parameter dan false untuk @value parameter .
Menangani konflik secara otomatis dengan kemenangan tulis terakhir
Dimulai dengan SQL Server 2019 (15.x) CU 13, Anda dapat mengonfigurasi replikasi peer-to-peer untuk menyelesaikan konflik secara otomatis dengan memungkinkan sisipan atau pembaruan terbaru untuk memenangkan konflik. Jika salah satu tulis menghapus baris, SQL Server memungkinkan penghapusan untuk memenangkan konflik. Metode ini dikenal sebagai kemenangan tulisan terakhir.
Gunakan prosedur tersimpan untuk mengonfigurasi kemenangan tulis terakhir. Lihat Mengonfigurasi deteksi &resolusi konflik penulis terakhir. Anda tidak dapat mengonfigurasi kemenangan tulis terakhir dengan SQL Server Management Studio.
Catatan
Replikasi peer-to-Peer dengan Last Writer Wins tergantung pada jam berpartisipasi simpul yang sinkron untuk hasil yang andal. Jika jam server yang berpartisipasi menjadi terlalu jauh dari sinkronisasi, hasil resolusi konflik mungkin tidak terduga dan/atau tidak diinginkan. Misalnya, jika server A memiliki jam yang akurat, tetapi server B adalah seminggu di belakang, maka server A akan dipilih untuk memenangkan setiap konflik, bahkan jika secara objektif tidak terakhir untuk memperbarui baris. Jika tidak dimungkinkan untuk menyimpan jam dalam toleransi yang Anda butuhkan untuk resolusi hasil, Anda mungkin ingin memilih strategi resolusi konflik yang berbeda.