Apache Ignite-da ma'lumotlarni siqish. Sber tajribasi

Apache Ignite-da ma'lumotlarni siqish. Sber tajribasiKatta hajmdagi ma'lumotlar bilan ishlashda ba'zida diskda bo'sh joy etishmasligi muammosi paydo bo'lishi mumkin. Ushbu muammoni hal qilishning bir usuli - siqishni, buning yordamida siz xuddi shu uskunada saqlash hajmini oshirishingiz mumkin. Ushbu maqolada biz Apache Ignite-da ma'lumotlarni siqish qanday ishlashini ko'rib chiqamiz. Ushbu maqolada faqat mahsulot ichida amalga oshirilgan diskni siqish usullari tasvirlangan. Ma'lumotlarni siqishning boshqa usullari (tarmoq orqali, xotirada), amalga oshirilgan yoki qilinmaganligidan qat'i nazar, qo'llash doirasi tashqarisida qoladi.

Shunday qilib, doimiylik rejimi yoqilgan bo'lsa, keshlardagi ma'lumotlarning o'zgarishi natijasida Ignite diskga yozishni boshlaydi:

  1. Keshlarning tarkibi
  2. Oldindan yozish jurnali (bundan buyon matnda WAL)

Ancha vaqtdan beri WAL siqish mexanizmi mavjud bo'lib, WAL siqish deb ataladi. Yaqinda chiqarilgan Apache Ignite 2.8 diskdagi ma'lumotlarni siqish imkonini beruvchi yana ikkita mexanizmni taqdim etdi: keshlar tarkibini siqish uchun disk sahifalarini siqish va ba'zi WAL yozuvlarini siqish uchun WAL sahifasining oniy tasvirini siqish. Quyida ushbu uchta mexanizm haqida batafsil ma'lumot.

Disk sahifalarini siqish

U qanday ishlaydi

Birinchidan, Ignite ma'lumotlarni qanday saqlashini qisqacha ko'rib chiqamiz. Sahifa xotirasi saqlash uchun ishlatiladi. Sahifa o'lchami tugunning boshida o'rnatiladi va uni keyingi bosqichlarda o'zgartirib bo'lmaydi; shuningdek, sahifa o'lchami fayl tizimi blokining o'lchamidan ikki va ko'p bo'lishi kerak. Sahifalar kerak bo'lganda diskdan operativ xotiraga yuklanadi; diskdagi ma'lumotlar hajmi ajratilgan RAM miqdoridan oshib ketishi mumkin. Agar sahifani diskdan yuklash uchun operativ xotirada joy yetarli bo‘lmasa, eski, endi ishlatilmaydigan sahifalar operativ xotiradan chiqarib tashlanadi.

Ma'lumotlar diskda quyidagi shaklda saqlanadi: har bir kesh guruhining har bir bo'limi uchun alohida fayl yaratiladi; bu faylda sahifalar o'sib borayotgan indeks tartibida birin-ketin paydo bo'ladi. To'liq sahifa identifikatorida kesh guruhi identifikatori, bo'lim raqami va fayldagi sahifa indeksi mavjud. Shunday qilib, to'liq sahifa identifikatoridan foydalanib, biz har bir sahifa uchun fayl va fayldagi ofsetni noyob tarzda aniqlashimiz mumkin. Apache Ignite Wiki maqolasida peyjing xotirasi haqida ko'proq o'qishingiz mumkin: Ignite Persistent Store - kaput ostida.

Disk sahifalarini siqish mexanizmi, siz nomidan taxmin qilganingizdek, sahifa darajasida ishlaydi. Ushbu mexanizm yoqilgan bo'lsa, RAMdagi ma'lumotlar hech qanday siqilishsiz qayta ishlanadi, lekin sahifalar operativ xotiradan diskka saqlanganida ular siqiladi.

Lekin har bir sahifani alohida-alohida siqish muammoning yechimi emas, natijada olingan ma'lumotlar fayllari hajmini qandaydir tarzda kamaytirish kerak. Agar sahifa o'lchami endi aniqlanmagan bo'lsa, biz faylga sahifalarni birin-ketin yoza olmaymiz, chunki bu bir qator muammolarni keltirib chiqarishi mumkin:

  • Sahifa indeksidan foydalanib, biz faylda joylashgan ofsetni hisoblay olmaymiz.
  • Faylning oxirida bo'lmagan va ularning hajmini o'zgartiradigan sahifalar bilan nima qilish kerakligi aniq emas. Agar sahifa hajmi kamaysa, u bo'shatgan bo'sh joy yo'qoladi. Agar sahifa hajmi kattalashgan bo'lsa, u uchun faylda yangi joy izlashingiz kerak.
  • Agar sahifa fayl tizimi blokining oʻlchamiga koʻp boʻlmagan bir necha bayt bilan harakatlansa, uni oʻqish yoki yozish uchun yana bitta fayl tizimi blokiga tegish kerak boʻladi, bu esa unumdorlikning pasayishiga olib kelishi mumkin.

Ushbu muammolarni o'z darajasida hal qilmaslik uchun Apache Ignite-da disk sahifalarini siqish siyrak fayllar deb ataladigan fayl tizimi mexanizmidan foydalanadi. Siyrak fayl - bu nol bilan to'ldirilgan ba'zi hududlarni "teshiklar" sifatida belgilash mumkin bo'lgan fayl. Bunday holda, ushbu teshiklarni saqlash uchun fayl tizimi bloklari ajratilmaydi, bu esa disk maydonini tejash imkonini beradi.

Fayl tizimi blokini bo'shatish uchun teshikning o'lchami fayl tizimi blokidan kattaroq yoki unga teng bo'lishi mantiqan to'g'ri keladi, bu sahifa o'lchamiga va Apache Ignite-ga qo'shimcha cheklovlar qo'yadi: siqishni har qanday ta'sirga ega bo'lishi uchun, sahifa o'lchami fayl tizimi blokining o'lchamidan qat'iy kattaroq bo'lishi kerak. Agar sahifa o'lchami blok hajmiga teng bo'lsa, biz hech qachon bitta blokni bo'shata olmaymiz, chunki bitta blokni bo'shatish uchun siqilgan sahifa 0 baytni egallashi kerak. Agar sahifa o'lchami 2 yoki 4 blok o'lchamiga teng bo'lsa, bizning sahifamiz mos ravishda kamida 50% yoki 75% ga siqilgan bo'lsa, biz allaqachon kamida bitta blokni bo'shatishimiz mumkin.

Shunday qilib, mexanizm qanday ishlashining yakuniy tavsifi: Diskga sahifa yozishda sahifani siqish uchun harakat qilinadi. Agar siqilgan sahifaning o'lchami bir yoki bir nechta fayl tizimi bloklarini bo'shatishga imkon bersa, u holda sahifa siqilgan shaklda yoziladi va bo'shatilgan bloklar o'rniga "teshik" ochiladi (tizim chaqiruvi amalga oshiriladi). fallocate() teshigi bayrog'i bilan). Agar siqilgan sahifaning o'lchami bloklarni bo'shatishga imkon bermasa, sahifa siqilmagan holda saqlanadi. Barcha sahifa ofsetlari siqilishsiz, sahifa indeksini sahifa o'lchamiga ko'paytirish orqali hisoblab chiqiladi. O'z-o'zidan sahifalarni ko'chirish talab qilinmaydi. Sahifa ofsetlari, xuddi siqilishsiz, fayl tizimi bloklari chegaralariga to'g'ri keladi.

Apache Ignite-da ma'lumotlarni siqish. Sber tajribasi

Joriy dasturda Ignite faqat Linux OS ostida siyrak fayllar bilan ishlashi mumkin; shunga ko'ra, disk sahifalarini siqish faqat ushbu operatsion tizimda Ignite-dan foydalanilganda yoqilishi mumkin.

Disk sahifalarini siqish uchun ishlatilishi mumkin bo'lgan siqish algoritmlari: ZSTD, LZ4, Snappy. Bundan tashqari, ish rejimi (SKIP_GARBAGE) mavjud bo'lib, unda qolgan ma'lumotlarga siqishni qo'llamasdan sahifadagi faqat foydalanilmagan bo'sh joy tashlanadi, bu esa ilgari sanab o'tilgan algoritmlarga nisbatan CPU yukini kamaytiradi.

Ishlash ta'siri

Afsuski, men haqiqiy stendlarda haqiqiy ishlash o'lchovlarini o'tkazmadim, chunki biz ushbu mexanizmni ishlab chiqarishda qo'llashni rejalashtirmayapmiz, ammo biz qaerda yutqazishimiz va qayerda g'alaba qozonishimizni nazariy jihatdan taxmin qilishimiz mumkin.

Buning uchun sahifalarga kirishda qanday o'qilishi va yozilishini eslab qolishimiz kerak:

  • O'qish operatsiyasini bajarayotganda, u birinchi navbatda RAMda qidiriladi, agar qidiruv muvaffaqiyatsiz bo'lsa, sahifa o'qishni amalga oshiradigan bir xil ip orqali diskdan RAMga yuklanadi.
  • Yozish operatsiyasi bajarilganda, RAMdagi sahifa iflos deb belgilanadi, lekin sahifa yozishni amalga oshiruvchi ip tomonidan darhol diskda jismonan saqlanmaydi. Barcha iflos sahifalar diskda keyinchalik nazorat punkti jarayonida alohida mavzularda saqlanadi.

Shunday qilib, o'qish operatsiyalariga ta'siri:

  • Ijobiy (disk IO), o'qilgan fayl tizimi bloklari sonining kamayishi tufayli.
  • Salbiy (CPU), siyrak fayllar bilan ishlash uchun operatsion tizim tomonidan talab qilinadigan qo'shimcha yuk tufayli. Bundan tashqari, murakkabroq siyrak fayl tuzilmasini saqlash uchun qo'shimcha IO operatsiyalari bu erda yashirin ravishda paydo bo'lishi mumkin (afsuski, men siyrak fayllar qanday ishlashining barcha tafsilotlari bilan tanish emasman).
  • Salbiy (CPU), sahifalarni ochish zarurati tufayli.
  • Yozish operatsiyalariga ta'siri yo'q.
  • Tekshirish punkti jarayoniga ta'siri (bu erda hamma narsa o'qish operatsiyalariga o'xshaydi):
  • Ijobiy (disk IO), yozma fayl tizimi bloklari sonining kamayishi tufayli.
  • Salbiy (CPU, ehtimol disk IO), siyrak fayllar bilan ishlash tufayli.
  • Sahifani siqish zarurati tufayli salbiy (CPU).

Tarozining qaysi tomoni o'lchovni ag'daradi? Bularning barchasi atrof-muhitga bog'liq, lekin men diskdagi sahifalarni siqish ko'pchilik tizimlarda ishlashning pasayishiga olib kelishiga ishonaman. Bundan tashqari, siyrak fayllar bilan shunga o'xshash yondashuvdan foydalanadigan boshqa ma'lumotlar bazalari bo'yicha testlar siqishni yoqilganda ishlashning pasayishini ko'rsatadi.

Qanday yoqish va sozlash

Yuqorida aytib o'tilganidek, disk sahifalarini siqishni qo'llab-quvvatlaydigan Apache Ignite-ning minimal versiyasi 2.8 va faqat Linux operatsion tizimi qo'llab-quvvatlanadi. Quyidagi tarzda yoqing va sozlang:

  • Sinf yo'lida ateşleme-siqish moduli bo'lishi kerak. Odatiy bo'lib, u libs/ixtiyoriy katalogdagi Apache Ignite taqsimotida joylashgan va sinf yo'liga kiritilmagan. Siz shunchaki katalogni bir daraja yuqoriga ko'chirishingiz mumkin, keyin uni ignite.sh orqali ishga tushirganingizda u avtomatik ravishda yoqiladi.
  • Qat'iylik yoqilgan bo'lishi kerak (. orqali yoqilgan DataRegionConfiguration.setPersistenceEnabled(true)).
  • Sahifaning o'lchami fayl tizimi blokining o'lchamidan kattaroq bo'lishi kerak (siz uni o'rnatishingiz mumkin DataStorageConfiguration.setPageSize() ).
  • Ma'lumotlari siqilishi kerak bo'lgan har bir kesh uchun siz siqish usulini va (ixtiyoriy) siqish darajasini (usullar) sozlashingiz kerak. CacheConfiguration.setDiskPageCompression() , CacheConfiguration.setDiskPageCompressionLevel()).

WAL siqilishi

U qanday ishlaydi

WAL nima va u nima uchun kerak? Juda qisqacha: bu oxir-oqibat sahifa xotirasini o'zgartiradigan barcha voqealarni o'z ichiga olgan jurnal. Bu, birinchi navbatda, yiqilgan taqdirda tiklanish imkoniyatiga ega bo'lish uchun kerak. Har qanday operatsiya foydalanuvchiga boshqaruvni berishdan oldin, avval WAL-da hodisani yozib olishi kerak, shunda muvaffaqiyatsiz bo'lsa, u jurnalda o'ynalishi va foydalanuvchi muvaffaqiyatli javob olgan barcha operatsiyalarni tiklashi mumkin, hatto ushbu operatsiyalar bajarilgan bo'lsa ham. diskdagi sahifani saqlashda aks ettirishga vaqtlari yo'q edi (yuqorida sahifa do'koniga haqiqiy yozish alohida mavzular tomonidan biroz kechikish bilan "tekshirish nuqtasi" deb nomlangan jarayonda amalga oshirilganligi tasvirlangan).

WAL-dagi yozuvlar mantiqiy va jismoniy bo'linadi. Mantiqiy kalitlar kalit va qadriyatlardir. Jismoniy - sahifalar do'konidagi sahifalardagi o'zgarishlarni aks ettiradi. Mantiqiy yozuvlar ba'zi boshqa holatlar uchun foydali bo'lishi mumkin bo'lsa-da, jismoniy yozuvlar faqat avariya holatida tiklash uchun kerak bo'ladi va yozuvlar faqat oxirgi muvaffaqiyatli nazorat punktidan keyin kerak bo'ladi. Bu erda biz batafsil ma'lumot bermaymiz va nima uchun bu shunday ishlashini tushuntirmaymiz, ammo qiziquvchilar Apache Ignite Wiki-da yuqorida aytib o'tilgan maqolaga murojaat qilishlari mumkin: Ignite Persistent Store - kaput ostida.

Ko'pincha har bir mantiqiy yozuvda bir nechta jismoniy yozuvlar mavjud. Ya'ni, masalan, keshga bitta qo'yish operatsiyasi sahifa xotirasidagi bir nechta sahifalarga ta'sir qiladi (ma'lumotlarning o'zi bo'lgan sahifa, indeksli sahifalar, bepul ro'yxatli sahifalar). Ba'zi sintetik testlarda jismoniy yozuvlar WAL faylining 90% ni egallaganligini aniqladim. Biroq, ular juda qisqa vaqt uchun kerak bo'ladi (sukut bo'yicha, nazorat punktlari orasidagi interval 3 minut). O'z ahamiyatini yo'qotgandan so'ng, bu ma'lumotlardan qutulish mantiqan to'g'ri bo'ladi. WAL siqishni mexanizmi aynan shunday qiladi: u jismoniy yozuvlardan xalos bo'ladi va zip yordamida qolgan mantiqiy yozuvlarni siqib chiqaradi, shu bilan birga fayl hajmi sezilarli darajada kamayadi (ba'zan o'nlab marta).

Jismoniy jihatdan WAL o'rnatilgan o'lchamdagi (sukut bo'yicha 10 MB) bir nechta segmentlardan (sukut bo'yicha 64 ta) iborat bo'lib, ular dumaloq tarzda ustiga yoziladi. Joriy segment to'ldirilgandan so'ng, keyingi segment joriy sifatida tayinlanadi va to'ldirilgan segment alohida ip bilan arxivga ko'chiriladi. WAL siqish allaqachon arxiv segmentlari bilan ishlaydi. Bundan tashqari, alohida ip sifatida u nazorat nuqtasining bajarilishini nazorat qiladi va jismoniy yozuvlar endi kerak bo'lmagan arxiv segmentlarida siqishni boshlaydi.

Apache Ignite-da ma'lumotlarni siqish. Sber tajribasi

Ishlash ta'siri

WAL siqilishi alohida ip sifatida ishlayotganligi sababli, bajarilayotgan operatsiyalarga bevosita ta'sir ko'rsatmasligi kerak. Lekin u hali ham CPU (siqish) va diskka qo'shimcha fon yukini qo'yadi (har bir WAL segmentini arxivdan o'qish va siqilgan segmentlarni yozish), shuning uchun tizim maksimal quvvatda ishlayotgan bo'lsa, bu ham ishlashning pasayishiga olib keladi.

Qanday yoqish va sozlash

Mulk yordamida WAL siqishni yoqishingiz mumkin WalCompactionEnabled в DataStorageConfiguration (DataStorageConfiguration.setWalCompactionEnabled(true)). Bundan tashqari, DataStorageConfiguration.setWalCompactionLevel() usulidan foydalanib, siz standart qiymatdan (BEST_SPEED) qoniqmasangiz, siqish darajasini belgilashingiz mumkin.

WAL sahifasining suratini siqish

U qanday ishlaydi

Biz allaqachon WAL yozuvlari mantiqiy va jismoniy bo'linganligini bilib oldik. Har bir sahifaga har bir o'zgartirish uchun sahifa xotirasida jismoniy WAL yozuvi yaratiladi. Jismoniy yozuvlar, o'z navbatida, 2 kichik turga bo'linadi: sahifaning oniy tasviri va delta yozuvi. Har safar sahifadagi biror narsani o'zgartirganimizda va uni toza holatdan iflos holatga o'tkazganimizda, ushbu sahifaning to'liq nusxasi WAL (sahifaning oniy surati yozuvi) da saqlanadi. WAL-da faqat bitta baytni o'zgartirgan bo'lsak ham, yozuv sahifa hajmidan biroz kattaroq bo'ladi. Agar biz allaqachon iflos sahifada biror narsani o'zgartirsak, WAL-da delta yozuvi hosil bo'ladi, bu faqat sahifaning oldingi holatiga nisbatan o'zgarishlarni aks ettiradi, lekin butun sahifani emas. Sahifalar holatini iflosdan tozalashga qaytarish nazorat punkti jarayonida amalga oshirilganligi sababli, nazorat punkti boshlangandan so'ng, deyarli barcha jismoniy yozuvlar faqat sahifalarning suratlaridan iborat bo'ladi (chunki nazorat punkti boshlangandan keyin barcha sahifalar toza). , keyin keyingi nazorat punktiga yaqinlashganda, delta rekord qismi o'sishni boshlaydi va keyingi nazorat punkti boshida yana qayta tiklanadi. Ba'zi sintetik testlardagi o'lchovlar jismoniy yozuvlarning umumiy hajmida sahifa suratlarining ulushi 90% ga etishini ko'rsatdi.

WAL sahifasining oniy tasvirini siqish g'oyasi tayyor sahifani siqish vositasidan foydalangan holda sahifa suratlarini siqishdir (disk sahifalarini siqish qarang). Shu bilan birga, WAL-da yozuvlar faqat qo'shish rejimida ketma-ket saqlanadi va yozuvlarni fayl tizimi bloklari chegaralariga bog'lashning hojati yo'q, shuning uchun bu erda, disk sahifalarini siqish mexanizmidan farqli o'laroq, bizga siyrak fayllar kerak emas. Shunga ko'ra, bu mexanizm nafaqat Linux OS da ishlaydi. Bundan tashqari, sahifani qanchalik siqib chiqara olganimiz endi biz uchun muhim emas. Agar biz 1 baytni bo'shatgan bo'lsak ham, bu allaqachon ijobiy natija va biz diskdagi sahifani siqishdan farqli o'laroq, siqilgan ma'lumotlarni WAL-da saqlashimiz mumkin, bu erda biz siqilgan sahifani faqat 1 dan ortiq fayl tizimi blokini bo'shatgan bo'lsak saqlaymiz.

Sahifalar juda siqiladigan ma'lumotlardir, ularning umumiy WAL hajmidagi ulushi juda yuqori, shuning uchun WAL fayl formatini o'zgartirmasdan biz uning hajmini sezilarli darajada kamaytirishimiz mumkin. Mantiqiy yozuvlarni o'z ichiga olgan siqishni formatni o'zgartirishni va moslikni yo'qotishni talab qiladi, masalan, mantiqiy yozuvlarga qiziqishi mumkin bo'lgan tashqi iste'molchilar uchun, lekin fayl hajmining sezilarli darajada qisqarishiga olib kelmaydi.

Disk sahifalarini siqishda bo'lgani kabi, WAL sahifasining suratini siqish ZSTD, LZ4, Snappy siqish algoritmlaridan, shuningdek, SKIP_GARBAGE rejimidan foydalanishi mumkin.

Ishlash ta'siri

To'g'ridan-to'g'ri WAL sahifa snapshotlarini siqishni yoqish faqat sahifa xotirasiga ma'lumotlarni yozadigan, ya'ni keshlardagi ma'lumotlarni o'zgartiradigan oqimlarga ta'sir qilishini payqash qiyin emas. WAL-dan jismoniy yozuvlarni o'qish faqat bir marta sodir bo'ladi, hozirgi vaqtda tugun yiqilgandan keyin ko'tariladi (va faqat nazorat punkti paytida tushib qolsa).

Bu ma'lumotlarni o'zgartiruvchi iplarga quyidagi tarzda ta'sir qiladi: biz har safar diskga yozishdan oldin sahifani siqish zarurati tufayli salbiy ta'sir (CPU) va miqdorining kamayishi tufayli ijobiy ta'sir (disk IO) olamiz. ma'lumotlar yozilgan. Shunga ko'ra, bu erda hamma narsa oddiy: agar tizimning ishlashi protsessor tomonidan cheklangan bo'lsa, biz ozgina degradatsiyaga ega bo'lamiz, agar u disk I/U bilan cheklangan bo'lsa, biz o'sishni olamiz.

Bilvosita, WAL hajmini kamaytirish WAL segmentlarini arxivga va WAL siqishni oqimlariga tashlaydigan oqimlarga ham (ijobiy) ta'sir qiladi.

Sintetik ma'lumotlardan foydalangan holda bizning muhitimizdagi haqiqiy ishlash testlari biroz o'sishni ko'rsatdi (o'tkazish 10% -15% ga oshdi, kechikish 10% -15% ga kamaydi).

Qanday yoqish va sozlash

Minimal Apache Ignite versiyasi: 2.8. Quyidagi tarzda yoqing va sozlang:

  • Sinf yo'lida ateşleme-siqish moduli bo'lishi kerak. Odatiy bo'lib, u libs/ixtiyoriy katalogdagi Apache Ignite taqsimotida joylashgan va sinf yo'liga kiritilmagan. Siz shunchaki katalogni bir daraja yuqoriga ko'chirishingiz mumkin, keyin uni ignite.sh orqali ishga tushirganingizda u avtomatik ravishda yoqiladi.
  • Qat'iylik yoqilgan bo'lishi kerak (. orqali yoqilgan DataRegionConfiguration.setPersistenceEnabled(true)).
  • Usul yordamida siqish rejimi o'rnatilishi kerak DataStorageConfiguration.setWalPageCompression(), siqish sukut bo'yicha o'chirilgan (DISABLED rejimi).
  • Majburiy emas, siz usul yordamida siqish darajasini belgilashingiz mumkin DataStorageConfiguration.setWalPageCompression(), har bir rejim uchun haqiqiy qiymatlar uchun usul uchun javadoc-ga qarang.

xulosa

Apache Ignite-da ko'rib chiqilgan ma'lumotlarni siqish mexanizmlari bir-biridan mustaqil ravishda ishlatilishi mumkin, ammo ularning har qanday kombinatsiyasi ham maqbuldir. Ularning qanday ishlashini tushunish sizning muhitingizdagi vazifalaringizga qanchalik mos kelishini va ulardan foydalanishda nimani qurbon qilishingiz kerakligini aniqlash imkonini beradi. Disk sahifalarini siqish asosiy xotirani siqish uchun mo'ljallangan va o'rtacha siqish nisbatini berishi mumkin. WAL sahifasining oniy tasvirini siqish WAL fayllari uchun o'rtacha siqilish darajasini beradi va hatto ish faoliyatini yaxshilaydi. WAL siqilishi ishlashga ijobiy ta'sir ko'rsatmaydi, lekin jismoniy yozuvlarni olib tashlash orqali WAL fayllari hajmini imkon qadar qisqartiradi.

Manba: www.habr.com

a Izoh qo'shish