PostgreSQL va ulanishga xos yozish izchilligi sozlamalari

Maqolaning tarjimasi kurs talabalari uchun maxsus tayyorlangan "Ma'lumotlar bazasi". Ushbu yo'nalishda rivojlanishga qiziqasizmi? ga taklif qilamiz Ochiq eshiklar kuni, bu erda biz dastur, onlayn formatning xususiyatlari, o'qishdan so'ng bitiruvchilarni kutayotgan vakolatlar va martaba istiqbollari haqida batafsil gaplashamiz.

PostgreSQL va ulanishga xos yozish izchilligi sozlamalari

PostgreSQL va ulanishga xos yozish izchilligi sozlamalari
Compose-da biz ko'plab ma'lumotlar bazalari bilan ishlaymiz, bu bizga ularning funksionalligi va kamchiliklari bilan ko'proq tanishish imkoniyatini beradi. Biz yangi ma'lumotlar bazalarining xususiyatlarini yaxshi ko'rishni o'rganar ekanmiz, ba'zida biz uzoq vaqt davomida ishlayotgan etukroq vositalarda shunga o'xshash xususiyatlar mavjud bo'lsa, qanchalik yaxshi bo'lardi, deb o'ylay boshlaymiz. Men PostgreSQL-da ko'rmoqchi bo'lgan yangi xususiyatlardan biri bu butun klaster bo'ylab har bir ulanish uchun sozlanishi mumkin bo'lgan yozish izchilligi edi. Va ma'lum bo'lishicha, bizda allaqachon mavjud va bugun biz siz bilan uni qanday ishlatishingiz haqida ma'lumot almashishni xohlaymiz.

Nega menga kerak?

Klaster o'zini qanday tutishi sizning ilovangizga bog'liq. Masalan, hisob-kitoblarni to'lash dasturini olaylik. Sizga klaster bo'ylab XNUMX% izchillik kerak bo'ladi, shuning uchun ma'lumotlar bazasi barcha o'zgarishlarni kutishi uchun sinxron topshiriqlarni yoqishingiz kerak bo'ladi. Biroq, agar sizning arizangiz tez rivojlanayotgan ijtimoiy tarmoq bo'lsa, ehtimol siz XNUMX% izchillikdan tez javob berishni afzal ko'rasiz. Bunga erishish uchun siz klasteringizda asinxron majburiyatlardan foydalanishingiz mumkin.

Murosaga erishing

Ma'lumotlarning izchilligi va ishlashi o'rtasida kelishuvlarni amalga oshirishingiz kerak. PostgreSQL izchillikdan uzoqlashadi, chunki standart konfiguratsiyani oldindan aytish mumkin va kutilmagan kutilmagan hodisalarsiz. Endi murosalarni ko'rib chiqaylik.

Savdo 1: ishlash

Agar PostgreSQL klasteri izchillikni talab qilmasa, u asenkron ishlashi mumkin. Yozish klaster rahbariga amalga oshiriladi va yangilanishlar uning nusxalariga bir necha millisekunddan keyin yuboriladi. PostgreSQL klasteri izchillikni talab qilganda, u sinxron ishlashi kerak. Yozish klaster rahbariga amalga oshiriladi, u replikalarga yangilanish yuboradi va yozishni boshlagan mijozga uning muvaffaqiyatli bo'lganligi to'g'risida tasdiqlashni yuborishdan oldin ularning har biri yozganligi tasdiqlanishini kutadi. Ushbu yondashuvlar orasidagi amaliy farq shundaki, asinxron usul ikkita tarmoq hoplarini talab qiladi, sinxron usul esa to'rttasini talab qiladi.

Tradeoff 2: izchillik

Ushbu ikki yondashuvda etakchi muvaffaqiyatsizlikka uchragan taqdirda ham natija boshqacha bo'ladi. Agar ish asinxron tarzda bajarilgan bo'lsa, unda bunday xatolik yuzaga kelsa, barcha yozuvlar replikalar tomonidan amalga oshirilmaydi. Qancha yo'qotiladi? Ilovaning o'ziga va replikatsiya samaradorligiga bog'liq. Replikatsiyani yaratish, agar undagi ma'lumotlarning hajmi yetakchiga qaraganda 1 MB kam bo'lsa, ya'ni asinxron operatsiya vaqtida 1 MB gacha yozuvlar yo'qolishi mumkin bo'lsa, replika yetakchi bo'lishiga to'sqinlik qiladi.

Bu sinxron rejimda sodir bo'lmaydi. Agar yetakchi muvaffaqiyatsiz bo'lsa, barcha nusxalar yangilanadi, chunki yetakchida tasdiqlangan har qanday yozuv replikalarda tasdiqlanishi kerak. Bu izchillik.

Sinxron xatti-harakat hisob-kitob ilovasida mantiqan to'g'ri keladi, bunda izchillik izchillik va samaradorlik o'rtasidagi muvozanatda aniq ustunlikka ega. Bunday dastur uchun eng muhim narsa haqiqiy ma'lumotlardir. Endi ijtimoiy tarmoq haqida o'ylab ko'ring, unda asosiy vazifa so'rovlarga imkon qadar tezroq javob berish orqali foydalanuvchining e'tiborini jalb qilishdir. Bunday holda, kamroq tarmoq sakrashlari va kamroq kutish bilan ishlash ustuvor bo'ladi. Biroq, ishlash va izchillik o'rtasidagi kelishuv siz o'ylashingiz kerak bo'lgan yagona narsa emas.

Savdo 3: Buzilishlar

Muvaffaqiyatsizlik paytida klaster o'zini qanday tutishini tushunish juda muhimdir. Bir yoki bir nechta replika muvaffaqiyatsiz bo'lgan vaziyatni ko'rib chiqing. Qachonki, topshiriqlar asinxron tarzda qayta ishlangan bo'lsa, rahbar o'z faoliyatini davom ettiradi, ya'ni etishmayotgan replikalarni kutmasdan yozishni qabul qiladi va qayta ishlaydi. Replikalar klasterga qaytganda, ular yetakchiga yetib olishadi. Sinxron replikatsiyada, agar replikatsiyalar javob bermasa, rahbarning tanlovi qolmaydi va replika klasterga qaytgunicha va yozishni qabul qilib, topshira olmaguncha, majburiyatni tasdiqlashni kutishda davom etadi.

Bitta tranzaksiyaga ulanishmi?

Har bir ilova izchillik va unumdorlikning turli xil kombinatsiyasini talab qiladi. Albatta, bu bizning to'lovni to'lovchi ilovamiz bo'lmasa, biz uni butunlay izchil deb tasavvur qilamiz yoki bizning deyarli vaqtinchalik ijtimoiy tarmoq ilovamiz. Boshqa barcha holatlarda, ba'zi operatsiyalar sinxron, ba'zilari esa asinxron bo'lishi kerak bo'lgan vaqtlar bo'ladi. Chatga yuborilgan xabar qabul qilinmaguncha tizim kutishini xohlamasligingiz mumkin, lekin agar to'lov xuddi shu dasturda amalga oshirilsa, siz kutishingiz kerak bo'ladi.

Bu qarorlarning barchasi, albatta, dastur ishlab chiqaruvchisi tomonidan qabul qilinadi. Har bir yondashuvdan qachon foydalanish haqida to'g'ri qaror qabul qilish sizning klasteringizdan maksimal darajada foydalanishga yordam beradi. Ishlab chiquvchi ulanishlar va tranzaktsiyalar uchun SQL darajasida ular o'rtasida almashishi muhim ahamiyatga ega.

Amalda nazoratni ta'minlash

Odatiy bo'lib, PostgreSQL izchillikni ta'minlaydi. Bu server parametri tomonidan boshqariladi synchronous_commit. Odatiy bo'lib, u holatda on, lekin yana uchta variant mavjud: local, remote_write yoki off.

Parametrni o'rnatishda off barcha sinxron topshiriqlar, hatto mahalliy tizimda ham to'xtatiladi. Mahalliy parametr mahalliy tizim uchun sinxron rejimni belgilaydi, lekin replikalarga yozish asinxron tarzda amalga oshiriladi. Remote_write yanada davom etadi: replikalarga yozish asinxron tarzda amalga oshiriladi, lekin replika yozishni qabul qilganda, lekin uni diskga yozmaganida qaytariladi.

Mavjud variantlarni hisobga olgan holda, biz xatti-harakatni tanlaymiz va buni yodda tutamiz on - bu sinxron yozuvlar, biz tanlaymiz local tarmoq orqali asinxron topshiriqlar uchun, mahalliy topshiriqlarni esa sinxron qoldirib.

Endi biz buni bir zumda qanday sozlashni aytamiz, lekin biz sozlaganimizni tasavvur qiling synchronous_commit в local server uchun. Parametrni o'zgartirish mumkinmi, deb hayron bo'ldik synchronous_commit parvozda va bu nafaqat mumkin, balki buni qilishning ikkita usuli borligi ma'lum bo'ldi. Birinchisi, ulanish seansini quyidagicha o'rnatish:

SET SESSION synchronous_commit TO ON;  
// Your writes go here

Seansdagi barcha keyingi yozuvlar ulangan mijozga ijobiy natijani qaytarishdan oldin replikalarga yozilganlarni tasdiqlaydi. Albatta, siz sozlamalarni o'zgartirmasangiz synchronous_commit yana. Siz qismni o'tkazib yuborishingiz mumkin SESSION buyruqda, chunki u standart qiymatda bo'ladi.

Ikkinchi usul, agar siz bitta tranzaksiya uchun sinxron replikatsiya olishingizga ishonch hosil qilishni xohlasangiz yaxshi bo'ladi. Ko'pgina NoSQL avlod ma'lumotlar bazalarida tranzaktsiyalar tushunchasi mavjud emas, lekin PostgreSQLda mavjud. Bunday holda siz tranzaksiyani boshlaysiz va keyin o'rnatasiz synchronous_commit в on tranzaktsiyaga kirishni amalga oshirishdan oldin. COMMIT har qanday parametr qiymatidan foydalangan holda tranzaktsiyani amalga oshiradi synchronous_commit, bu o'sha paytda o'rnatilgan edi, lekin boshqa ishlab chiquvchilar yozishlar asinxron emasligini tushunishlariga ishonch hosil qilish uchun o'zgaruvchini oldindan belgilash yaxshidir.

BEGIN;  
SET LOCAL synchronous_commit TO ON;  
// Your writes go here
COMMIT;  

Barcha tranzaksiya majburiyatlari endi ma'lumotlar bazasi ulangan mijozga ijobiy javob qaytarishidan oldin replikalarga yozilgani tasdiqlanadi.

PostgreSQL-ni sozlash

Bundan oldin biz PostgreSQL tizimini tasavvur qildik synchronous_commit, ichiga oʻrnatilgan local. Buni server tomonida real qilish uchun siz ikkita server konfiguratsiyasi opsiyasini o'rnatishingiz kerak bo'ladi. Yana bir parametr synchronous_standby_names qachon o'z holiga keladi synchronous_commit bo'ladi on. Qaysi replikalar sinxron topshiriqlar uchun mos ekanligini aniqlaydi va biz uni o'rnatamiz *, bu barcha replikalar ishtirok etishini anglatadi. Ushbu qiymatlar odatda sozlangan konfiguratsiya fayli qo'shish orqali:

synchronous_commit = local  
synchronous_standby_names='*'

Parametrni o'rnatish orqali synchronous_commit ma'noga kiradi local, biz mahalliy disklar sinxron bo'lib qoladigan tizimni yaratamiz, lekin tarmoq replikatsiyasi majburiyatlari sukut bo'yicha asinxrondir. Albatta, biz yuqorida ko'rsatilganidek, bu majburiyatlarni sinxronlashtirishga qaror qilmasak.

Agar siz rivojlanishni kuzatib borgan bo'lsangiz Gubernator loyihasi, siz so'nggi o'zgarishlarni sezgan bo'lishingiz mumkin (1, 2), bu gubernator foydalanuvchilariga ushbu parametrlarni sinab ko'rish va ularning izchilligini kuzatish imkonini berdi.

Yana bir necha so'z ...

Bir hafta oldin men sizga PostgreSQL-ni juda nozik sozlashning iloji yo'qligini aytgan bo'lardim. O‘shanda Compose platformasi jamoasi a’zosi Kurt bunday imkoniyat mavjudligini ta’kidlagan. U mening e'tirozlarimni tinchlantirdi va PostgreSQL hujjatlarida topdi quyidagi:

PostgreSQL va ulanishga xos yozish izchilligi sozlamalari

Ushbu sozlamani istalgan vaqtda o'zgartirish mumkin. Har qanday tranzaksiyaning xatti-harakati uni amalga oshirish vaqtida amalda bo'lgan sozlama bilan belgilanadi. Shuning uchun, ba'zi operatsiyalar uchun sinxron, boshqalari uchun asinxron tarzda amalga oshirilishi mumkin va foydalidir. Masalan, majburlash multistatement Parametrning standart qiymati qarama-qarshi bo'lganda, asinxron tarzda bajariladigan tranzaksiya o'rnatiladi SET LOCAL synchronous_commit TO OFF tranzaktsiyada.

Konfiguratsiya faylidagi ushbu kichik o'zgartirish bilan biz foydalanuvchilarga ularning izchilligi va ishlashi ustidan nazoratni berdik.

Manba: www.habr.com

a Izoh qo'shish