Memahami konflik aktif-aktif - Layanan Basis Data Relasional Amazon

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Memahami konflik aktif-aktif

Saat Anda menggunakan pgactive dalam mode aktif-aktif, menulis ke tabel yang sama dari beberapa node dapat membuat konflik data. Sementara beberapa sistem pengelompokan menggunakan kunci terdistribusi untuk mencegah akses bersamaan, pgactive mengambil pendekatan optimis yang lebih cocok untuk aplikasi yang didistribusikan secara geografis.

Beberapa sistem pengelompokan database mencegah akses data bersamaan dengan menggunakan kunci terdistribusi. Meskipun pendekatan ini bekerja ketika server berada dalam jarak dekat, itu tidak mendukung aplikasi yang didistribusikan secara geografis karena memerlukan latensi yang sangat rendah untuk kinerja yang baik. Alih-alih menggunakan kunci terdistribusi (pendekatan pesimis), ekstensi pgactive menggunakan pendekatan optimis. Ini berarti:

  • Membantu Anda menghindari konflik jika memungkinkan.

  • Memungkinkan jenis konflik tertentu terjadi.

  • Memberikan resolusi konflik ketika konflik terjadi.

Pendekatan ini memberi Anda lebih banyak fleksibilitas saat membangun aplikasi terdistribusi.

Bagaimana konflik terjadi

Konflik antar node muncul dari urutan peristiwa yang tidak dapat terjadi jika semua transaksi yang terlibat terjadi secara bersamaan pada node yang sama. Karena node hanya bertukar perubahan setelah transaksi dilakukan, setiap transaksi valid secara individual pada node yang dilakukannya tetapi tidak akan valid jika dijalankan pada node lain yang telah melakukan pekerjaan lain sementara itu. Karena pgactive apply pada dasarnya memutar ulang transaksi pada node lain, operasi replay dapat gagal jika ada konflik antara transaksi yang diterapkan dan transaksi yang dilakukan pada node penerima.

Alasan sebagian besar konflik tidak dapat terjadi ketika semua transaksi berjalan pada satu node adalah karena PostgreSQL memiliki mekanisme komunikasi antar-transaksi untuk mencegahnya, termasuk:

  • Indeks UNIK

  • SEQUENCEs

  • Penguncian baris dan relasi

  • Pelacakan ketergantungan SERIALIZABLE

Semua mekanisme ini adalah cara untuk berkomunikasi antar transaksi untuk mencegah masalah konkurensi yang tidak diinginkan

pgactive mencapai latensi rendah dan menangani partisi jaringan dengan baik karena tidak menggunakan manajer transaksi terdistribusi atau pengelola kunci. Namun, ini berarti transaksi pada node yang berbeda berjalan dalam isolasi lengkap satu sama lain. Sementara isolasi biasanya meningkatkan konsistensi database, dalam hal ini, Anda perlu mengurangi isolasi untuk mencegah konflik.

Jenis konflik

Konflik yang dapat terjadi meliputi:

KUNCI PRIMER atau konflik UNIK

Konflik baris terjadi ketika beberapa operasi mencoba memodifikasi kunci baris yang sama dengan cara yang tidak mungkin dilakukan pada satu node. Konflik ini mewakili jenis konflik data yang paling umum.

pgactive menyelesaikan konflik yang terdeteksi melalui last-update-wins penanganan atau penangan konflik kustom Anda.

Konflik baris meliputi:

  • SISIPKAN vs SISIPKAN

  • SISIPKAN vs PEMBARUAN

  • PEMBARUAN vs HAPUS

  • SISIPKAN vs HAPUS

  • HAPUS vs HAPUS

  • SISIPKAN vs HAPUS

Konflik INSERT/INSERT

Konflik yang paling umum ini terjadi ketika INSERTs pada dua node yang berbeda membuat tupel dengan nilai KUNCI PRIMARY yang sama (atau nilai kendala UNIK identik ketika tidak ada KUNCI PRIMARY).

pgactivelink menyelesaikan konflik INSERT dengan menggunakan stempel waktu dari host asal untuk mempertahankan tupel terbaru. Anda dapat mengganti perilaku default ini dengan penangan konflik kustom Anda. Meskipun proses ini tidak memerlukan tindakan administrator khusus, ketahuilah bahwa pgactivelink membuang salah satu operasi INSERT di semua node. Tidak ada penggabungan data otomatis yang terjadi kecuali handler kustom Anda mengimplementasikannya.

Pgactivelink hanya dapat menyelesaikan konflik yang melibatkan pelanggaran kendala tunggal. Jika INSERT melanggar beberapa kendala UNIK, Anda harus menerapkan strategi penyelesaian konflik tambahan.

INSERTsyang melanggar beberapa kendala UNIK

Konflik INSERT/INSERT dapat melanggar beberapa kendala UNIK, termasuk KUNCI PRIMAR. pgactivelink hanya dapat menangani konflik yang melibatkan satu kendala UNIK. Ketika konflik melanggar beberapa kendala UNIK, pekerja penerapan gagal dan mengembalikan kesalahan berikut:

multiple unique constraints violated by remotely INSERTed tuple.

Dalam versi yang lebih lama, situasi ini menghasilkan kesalahan 'konflik keunikan yang menyimpang' sebagai gantinya.

Untuk mengatasi konflik ini, Anda harus mengambil tindakan manual. Baik HAPUS tupel lokal yang bertentangan atau PERBARUI untuk menghapus konflik dengan tupel jarak jauh yang baru. Ketahuilah bahwa Anda mungkin perlu mengatasi beberapa tupel yang saling bertentangan. Saat ini, pgactivelink tidak menyediakan fungsionalitas bawaan untuk mengabaikan, membuang, atau menggabungkan tupel yang melanggar beberapa kendala unik.

catatan

Untuk informasi selengkapnya, lihat UPDATEs bahwa melanggar beberapa kendala UNIK.

Konflik PEMBARUIAN/PEMBARUAN

Konflik ini terjadi ketika dua node secara bersamaan memodifikasi Tuple yang sama tanpa mengubah KUNCI PRIMAR-nya. pgactivelink menyelesaikan konflik ini menggunakan last-update-wins logika atau penangan konflik kustom Anda, jika ditentukan. KUNCI UTAMA sangat penting untuk pencocokan tupel dan resolusi konflik. Untuk tabel tanpa KUNCI UTAMA, pgactivelink menolak operasi UPDATE dengan kesalahan berikut:

Cannot run UPDATE or DELETE on table (tablename) because it does not have a primary key.

PERBARUI konflik pada KUNCI PRIMARY

pgactive memiliki batasan saat menangani pembaruan PRIMARY KEY. Meskipun Anda dapat melakukan operasi UPDATE pada KUNCI UTAMA, pgactive tidak dapat secara otomatis menyelesaikan konflik menggunakan last-update-wins logika untuk operasi ini. Anda harus memastikan bahwa pembaruan PRIMARY KEY Anda tidak bertentangan dengan nilai yang ada. Jika konflik terjadi selama pembaruan PRIMARY KEY, konflik tersebut menjadi konflik yang berbeda yang memerlukan intervensi manual Anda. Untuk informasi selengkapnya tentang penanganan situasi ini, lihatKonflik yang berbeda.

UPDATEsyang melanggar beberapa kendala UNIK

pgactivelink tidak dapat menerapkan resolusi last-update-wins konflik ketika UPDATE yang masuk melanggar beberapa batasan UNIK atau nilai KUNCI UTAMA. Perilaku ini mirip dengan operasi INSERT dengan beberapa pelanggaran kendala. Situasi ini menciptakan konflik yang berbeda yang memerlukan intervensi manual Anda. Untuk informasi selengkapnya, lihat Konflik yang berbeda.

PERBARUI/HAPUS konflik

Konflik ini terjadi ketika UPDATEs satu node baris sementara node lain DELETEs secara bersamaan. Dalam hal ini terjadi konflik UPDATE/DELETE pada replay. Resolusinya adalah membuang PEMBARUAN apa pun yang tiba setelah DELETE, kecuali penangan konflik kustom Anda menentukan sebaliknya.

pgactivelink membutuhkan KUNCI UTAMA untuk mencocokkan tupel dan menyelesaikan konflik. Untuk tabel tanpa KUNCI PRIMARY, ia menolak operasi DELETE dengan kesalahan berikut:

Cannot run UPDATE or DELETE on table (tablename) because it does not have a primary key.

catatan

pgactivelink tidak dapat membedakan antara konflik. UPDATE/DELETE and INSERT/UPDATE Dalam kedua kasus, UPDATE mempengaruhi baris yang tidak ada. Karena replikasi asinkron dan kurangnya urutan pemutaran ulang antar node, pgactivelink tidak dapat menentukan apakah PEMBARUAN adalah untuk baris baru (INSERT belum diterima) atau baris yang dihapus. Dalam kedua skenario, pgactivelink membuang UPDATE.

Konflik INSERT/UPDATE

Konflik ini dapat terjadi di lingkungan multi-node. Itu terjadi ketika INSERTs satu node baris, node kedua UPDATEs itu, dan node ketiga menerima UPDATE sebelum INSERT asli. Secara default, pgactivelink menyelesaikan konflik ini dengan membuang PEMBARUAN, kecuali pemicu konflik kustom Anda menentukan sebaliknya. Ketahuilah bahwa metode resolusi ini dapat mengakibatkan inkonsistensi data di seluruh node. Untuk informasi selengkapnya tentang skenario serupa dan penanganannya, lihatPERBARUI/HAPUS konflik.

HAPUS/HAPUS konflik

Konflik ini terjadi ketika dua node berbeda secara bersamaan menghapus tuple yang sama. pgactivelink menganggap konflik ini tidak berbahaya karena kedua operasi DELETE memiliki hasil akhir yang sama. Dalam skenario ini, pgactivelink dengan aman mengabaikan salah satu operasi DELETE tanpa mempengaruhi konsistensi data.

Konflik Kendala Kunci Asing

Kendala FOREIGN KEY dapat menyebabkan konflik saat menerapkan transaksi jarak jauh ke data lokal yang ada. Konflik ini biasanya terjadi ketika transaksi diterapkan dalam urutan yang berbeda dari urutan logisnya pada node asal.

Secara default, pgactive menerapkan perubahan dengan session_replication_role asreplica, yang melewati pemeriksaan kunci asing selama replikasi. Dalam konfigurasi aktif-aktif, ini dapat menyebabkan pelanggaran kunci asing. Sebagian besar pelanggaran bersifat sementara dan diselesaikan setelah replikasi menyusul. Namun, kunci asing yang menggantung dapat terjadi karena pgactive tidak mendukung penguncian baris lintas-simpul.

Perilaku ini melekat pada sistem aktif-aktif asinkron yang toleran partisi. Misalnya, node A mungkin menyisipkan baris anak baru sementara node B secara bersamaan menghapus baris induknya. Sistem tidak dapat mencegah jenis modifikasi bersamaan di seluruh node.

Untuk meminimalkan konflik kunci asing, kami merekomendasikan hal berikut:

  • Batasi hubungan kunci asing ke entitas yang terkait erat.

  • Ubah entitas terkait dari satu node bila memungkinkan.

  • Pilih entitas yang jarang membutuhkan modifikasi.

  • Menerapkan kontrol konkurensi tingkat aplikasi untuk modifikasi.

Konflik kendala pengecualian

tautan pgactive tidak mendukung batasan pengecualian dan membatasi pembuatannya.

catatan

Jika Anda mengonversi database mandiri yang ada ke database pgactivelink, jatuhkan semua batasan pengecualian secara manual.

Dalam sistem asinkron terdistribusi, tidak mungkin untuk menjamin bahwa tidak ada kumpulan baris yang melanggar batasan. Ini karena semua transaksi pada node yang berbeda sepenuhnya terisolasi. Kendala pengecualian dapat menyebabkan kebuntuan pemutaran ulang, di mana pemutaran ulang tidak dapat berkembang dari node mana pun ke node lain karena pelanggaran batasan pengecualian.

Jika Anda memaksa pgactive Link untuk membuat batasan pengecualian, atau jika Anda tidak menghapus yang sudah ada saat mengonversi database mandiri menjadi pgactive Link, replikasi kemungkinan akan rusak. Untuk mengembalikan kemajuan replikasi, hapus atau ubah tupel lokal yang bertentangan dengan tupel jarak jauh yang masuk sehingga transaksi jarak jauh dapat diterapkan.

Konflik data global

Saat menggunakan pgactivelink, konflik dapat terjadi ketika node memiliki data seluruh sistem PostgreSQL global yang berbeda, seperti peran. Konflik ini dapat menyebabkan operasi—terutama DDL—berhasil dan berkomitmen pada satu node tetapi gagal diterapkan ke node lain.

Jika pengguna ada di satu node tetapi tidak yang lain, masalah replikasi dapat terjadi:

  • Node1 memiliki nama penggunafred, tetapi pengguna ini tidak ada di Node2

  • Saat fred membuat tabel di Node1, tabel direplikasi dengan fred sebagai pemilik

  • Ketika perintah DDL ini diterapkan ke Node2, itu gagal karena pengguna fred tidak ada

  • Kegagalan ini menghasilkan ERROR di log PostgreSQL di Node2 dan menambah penghitung pgactive.pgactive_stats.nr_rollbacks

Resolusi: Buat pengguna fred di Node2. Pengguna tidak memerlukan izin yang identik tetapi harus ada di kedua node.

Jika tabel ada pada satu node tetapi tidak yang lain, operasi modifikasi data akan gagal:

  • Node1 memiliki tabel bernama foo yang tidak ada di Node2

  • Setiap operasi DHTML pada foo tabel pada Node1 akan gagal ketika direplikasi ke Node2

Resolusi: Buat tabel foo di Node2 dengan struktur yang sama.

catatan

pgactivelink saat ini tidak mereplikasi perintah CREATE USER atau operasi DDL. Replikasi DDL direncanakan untuk rilis future.

Mengunci konflik dan kebuntuan dibatalkan

Karena proses penerapan pgactive beroperasi seperti sesi pengguna normal, mereka mengikuti aturan penguncian baris dan tabel standar. Hal ini dapat mengakibatkan pgactivelink menerapkan proses menunggu pada kunci yang dipegang oleh transaksi pengguna atau oleh proses penerapan lainnya.

Jenis kunci berikut dapat memengaruhi proses penerapan:

  • Penguncian tingkat tabel eksplisit (LOCK TABLE...) oleh sesi pengguna

  • Penguncian tingkat baris eksplisit (PILIH... UNTUK PEMBARUAN/UNTUK BERBAGI) oleh sesi pengguna

  • Mengunci dari kunci asing

  • Penguncian implisit karena baris UPDATEs, INSERTs, atau DELETEs, baik dari aktivitas lokal atau berlaku dari server lain

Kebuntuan dapat terjadi antara:

  • Proses penerapan pgactivelink dan transaksi pengguna

  • Dua menerapkan proses

Ketika kebuntuan terjadi, detektor kebuntuan PostgreSQL mengakhiri salah satu transaksi masalah. Jika proses pgactivelink apply worker dihentikan, proses tersebut secara otomatis mencoba ulang dan biasanya berhasil.

catatan
  • Masalah ini bersifat sementara dan umumnya tidak memerlukan intervensi administrator. Jika proses penerapan diblokir untuk jangka waktu yang lama dengan mengunci sesi pengguna yang tidak aktif, Anda dapat menghentikan sesi pengguna untuk melanjutkan replikasi. Situasi ini mirip dengan ketika pengguna memegang kunci panjang yang memengaruhi sesi pengguna lain.

  • Untuk mengidentifikasi penundaan pemutaran ulang terkait penguncian, aktifkan fasilitas log_lock_waits di PostgreSQL.

Konflik yang berbeda

Konflik divergen terjadi ketika data yang seharusnya identik di seluruh node berbeda secara tak terduga. Meskipun konflik ini seharusnya tidak terjadi, tidak semua dapat dicegah dengan andal dalam implementasi saat ini.

catatan

Memodifikasi KUNCI UTAMA baris dapat menyebabkan konflik yang berbeda jika node lain mengubah kunci baris yang sama sebelum semua node memproses perubahan. Hindari mengubah kunci utama, atau membatasi perubahan pada satu node yang ditunjuk. Untuk informasi selengkapnya, lihat PERBARUI konflik pada KUNCI PRIMARY .

Konflik divergen yang melibatkan data baris biasanya memerlukan intervensi administrator. Untuk mengatasi konflik ini, Anda harus menyesuaikan data secara manual pada satu node agar sesuai dengan yang lain sambil menonaktifkan replikasi sementara menggunakan. pgactive.pgactive_do_not_replicate Konflik ini seharusnya tidak terjadi ketika Anda menggunakan pgactive seperti yang didokumentasikan dan menghindari pengaturan atau fungsi yang ditandai sebagai tidak aman.

Sebagai administrator, Anda harus menyelesaikan konflik ini secara manual. Bergantung pada jenis konflik, Anda harus menggunakan opsi lanjutan sepertipgactive.pgactive_do_not_replicate. Gunakan opsi ini dengan hati-hati, karena penggunaan yang tidak tepat dapat memperburuk situasi. Karena berbagai kemungkinan konflik, kami tidak dapat memberikan instruksi resolusi universal.

Konflik divergen terjadi ketika data yang seharusnya identik di seluruh node yang berbeda secara tak terduga berbeda. Meskipun konflik ini seharusnya tidak terjadi, tidak semua konflik semacam itu dapat dicegah dengan andal dalam implementasi saat ini.

Menghindari atau mentolerir konflik

Dalam kebanyakan kasus, Anda dapat menggunakan desain aplikasi yang sesuai untuk menghindari konflik atau membuat aplikasi Anda toleran terhadap konflik.

Konflik hanya terjadi ketika operasi simultan terjadi pada beberapa node. Untuk menghindari konflik:

  • Menulis hanya ke satu simpul

  • Menulis ke subset database independen pada setiap node (misalnya, menetapkan setiap node skema terpisah)

Untuk konflik INSERT vs INSERT, gunakan urutan Global untuk mencegah konflik sepenuhnya.

Jika konflik tidak dapat diterima untuk kasus penggunaan Anda, pertimbangkan untuk menerapkan penguncian terdistribusi di tingkat aplikasi. Seringkali, pendekatan terbaik adalah merancang aplikasi Anda untuk bekerja dengan mekanisme resolusi konflik pgactive daripada mencoba mencegah semua konflik. Untuk informasi selengkapnya, lihat Jenis konflik.

Penebangan konflik

pgactivelink mencatat insiden konflik dalam pgactive.pgactive_conflict_history tabel untuk membantu Anda mendiagnosis dan menangani konflik aktif-aktif. Pencatatan konflik ke tabel ini hanya terjadi ketika Anda menyetel pgactive.log_conflicts_to_table ke true. Ekstensi pgactive juga mencatat konflik ke file log PostgreSQL saat log_min_messages disetel ke atau, terlepas dari pengaturannya. LOG lower pgactive.log_conflicts_to_table

Gunakan tabel riwayat konflik untuk:

  • Ukur seberapa sering aplikasi Anda membuat konflik

  • Identifikasi di mana konflik terjadi

  • Tingkatkan aplikasi Anda untuk mengurangi tingkat konflik

  • Mendeteksi kasus di mana resolusi konflik tidak menghasilkan hasil yang diinginkan

  • Tentukan di mana Anda memerlukan pemicu konflik yang ditentukan pengguna atau perubahan desain aplikasi

Untuk konflik baris, Anda dapat mencatat nilai baris secara opsional. Ini dikendalikan oleh pgactive.log_conflicts_to_table pengaturan. Perhatikan bahwa:

  • Ini adalah opsi seluruh basis data global

  • Tidak ada kontrol per tabel atas pencatatan nilai baris

  • Tidak ada batasan yang diterapkan pada nomor bidang, elemen array, atau panjang bidang

  • Mengaktifkan fitur ini mungkin tidak disarankan jika Anda bekerja dengan baris multi-megabyte yang dapat memicu konflik

Karena tabel riwayat konflik berisi data dari setiap tabel dalam database (masing-masing dengan skema yang berpotensi berbeda), nilai baris yang dicatat disimpan sebagai bidang JSON. JSON dibuat menggunakanrow_to_json, mirip dengan memanggilnya langsung dari SQL. PostgreSQL tidak menyediakan json_to_row fungsi, jadi Anda memerlukan kode khusus tabel (PL/pgSQL, PL/Python, PL/Perlin, dll.) untuk merekonstruksi tupel yang diketik komposit dari JSON yang dicatat.

catatan

Support untuk konflik yang ditentukan pengguna direncanakan sebagai fitur ekstensi future.