Komprési data dina Apache Ignite. pangalaman Sber urang

Komprési data dina Apache Ignite. pangalaman Sber urangNalika damel sareng volume data anu ageung, masalah kurangna rohangan disk kadang tiasa timbul. Hiji cara pikeun ngajawab masalah ieu téh komprési, hatur nuhun nu, dina alat nu sarua, anjeun bisa mampuh pikeun ngaronjatkeun volume gudang. Dina tulisan ieu, urang bakal ningali kumaha komprési data dianggo dina Apache Ignite. Artikel ieu bakal ngajelaskeun ukur metode komprési disk anu dilaksanakeun dina produk. Métode séjén pikeun komprési data (ngaliwatan jaringan, dina mémori), naha dilaksanakeun atanapi henteu, bakal tetep di luar ruang lingkup.

Janten, kalayan mode kegigihan diaktipkeun, salaku hasil tina parobihan data dina cache, Ignite mimiti nyerat kana disk:

  1. Eusi caches
  2. Tulis Ahead Log (saterusna saukur WAL)

Aya mékanisme pikeun komprési WAL pikeun sababaraha waktos ayeuna, disebut kompaksi WAL. Apache Ignite 2.8 anu nembe dileupaskeun ngenalkeun dua deui mékanisme anu ngamungkinkeun anjeun pikeun ngompres data dina disk: komprési halaman disk pikeun ngompresi eusi cache sareng komprési snapshot halaman WAL pikeun ngompres sababaraha éntri WAL. Langkung rinci ngeunaan tilu mékanisme ieu di handap.

Komprési kaca disk

Kumaha teu karya ieu

Kahiji, hayu urang nyandak katingal pondok pisan kumaha Ignite nyimpen data. Mémori kaca dipaké pikeun neundeun. Ukuran kaca disetél dina mimiti titik jeung teu bisa dirobah dina tahap saterusna; ogé, ukuran kaca kudu kakuatan dua jeung sababaraha ukuran blok sistem file. Halaman dimuat kana RAM tina disk upami diperyogikeun; ukuran data dina disk tiasa ngaleuwihan jumlah RAM anu dialokasikeun. Upami teu aya cukup rohangan dina RAM pikeun ngamuat halaman tina disk, halaman anu lami, henteu dianggo deui bakal digusur tina RAM.

Data disimpen dina disk dina bentuk ieu: file anu misah didamel pikeun tiap partisi unggal grup cache; dina file ieu, halaman muncul hiji-hiji dina urutan indéks naek. Identifier halaman pinuh ngandung identifier grup cache, nomer partisi, sareng indéks halaman dina file. Ku kituna, ngagunakeun identifier kaca pinuh, urang uniquely bisa nangtukeun file jeung offset dina file pikeun tiap halaman. Anjeun tiasa maca langkung seueur ngeunaan mémori paging dina artikel Apache Ignite Wiki: Ngahurungkeun Persistent Store - handapeun tiung.

Mékanisme komprési halaman disk, sakumaha anu anjeun tingali tina nami, tiasa dianggo dina tingkat halaman. Nalika mékanisme ieu diaktipkeun, data dina RAM diolah sakumaha anu kasebut, tanpa komprési wae, tapi lamun kaca disimpen tina RAM ka disk, aranjeunna dikomprés.

Tapi compressing unggal kaca individual sanes solusi pikeun masalah; Anjeun kudu kumaha bae ngurangan ukuran file data hasilna. Lamun ukuran kaca geus teu tetep, urang teu bisa deui nulis kaca kana file hiji-hiji, sabab ieu bisa nyieun sababaraha masalah:

  • Nganggo indéks halaman, urang moal tiasa ngitung offset dimana éta aya dina file.
  • Henteu écés naon anu kudu dilakukeun sareng halaman anu henteu aya dina tungtung file sareng robih ukuranana. Upami ukuran halamanna ngirangan, rohangan anu dibébaskeun bakal ngaleungit. Upami ukuran halaman naék, anjeun kedah milarian tempat énggal dina file éta.
  • Lamun kaca pindah ku sajumlah bait nu lain kali ganda tina ukuran blok sistem file, teras maca atawa nulis eta bakal merlukeun noel hiji blok sistem file deui, nu bisa ngakibatkeun degradasi kinerja.

Pikeun nyingkahan ngarengsekeun masalah ieu dina tingkat sorangan, komprési kaca disk di Apache Ignite ngagunakeun mékanisme sistem file disebut sparse file. A file sparse mangrupakeun salah sahiji nu sababaraha wewengkon enol-kaeusi bisa ditandaan salaku "liang". Dina hal ieu, euweuh blok sistem file bakal disadiakeun pikeun nyimpen liang ieu, hasilna tabungan on spasi disk.

Logis yén pikeun ngosongkeun blok sistem file, ukuran liang kedah langkung ageung atanapi sami sareng blok sistem file, anu maksakeun watesan tambahan dina ukuran halaman sareng Apache Ignite: pikeun komprési ngagaduhan pangaruh, ukuran kaca kudu mastikeun leuwih badag batan ukuran blok sistem file. Upami ukuran halaman sami sareng ukuran blok, maka urang moal tiasa ngabebaskeun blok tunggal, sabab pikeun ngabebaskeun blok tunggal, halaman anu dikomprés kedah ngeusian 0 bait. Lamun ukuran kaca sarua jeung ukuran 2 atawa 4 blok, urang geus bisa ngosongkeun sahanteuna hiji blok lamun kaca urang dikomprés sahenteuna 50% atawa 75% masing-masing.

Ku kituna, katerangan ahir kumaha mékanisme jalan: Nalika nulis kaca kana disk, hiji usaha dilakukeun pikeun niiskeun kaca. Upami ukuran halaman anu dikomprés ngamungkinkeun hiji atanapi langkung blok sistem file dibébaskeun, teras halamanna ditulis dina bentuk anu dikomprés, sareng "liang" dilakukeun pikeun ngagentos blok anu dibébaskeun (panggilan sistem dieksekusi. fallocate() kalayan bandéra punch hole). Upami ukuran halaman anu dikomprés henteu ngamungkinkeun blok dibébaskeun, halaman éta disimpen sapertos kitu, henteu dikomprés. Sadaya kaca offsets diitung cara sarua salaku tanpa komprési, ku cara ngalikeun indéks kaca ku ukuran kaca. Henteu aya relokasi halaman anu diperyogikeun nyalira. Page offsets, kawas tanpa komprési, ragrag dina wates blok sistem file.

Komprési data dina Apache Ignite. pangalaman Sber urang

Dina palaksanaan ayeuna, Ignite ngan tiasa dianggo sareng file jarang dina OS Linux; sasuai, komprési halaman disk ngan tiasa diaktipkeun nalika nganggo Ignite dina sistem operasi ieu.

Algoritma komprési anu tiasa dianggo pikeun komprési halaman disk: ZSTD, LZ4, Snappy. Salaku tambahan, aya mode operasi (SKIP_GARBAGE), dimana ngan ukur rohangan anu henteu kapake dina halaman dibuang tanpa nerapkeun komprési kana data sésana, anu ngirangan beban CPU dibandingkeun sareng algoritma anu didaptarkeun sateuacana.

Dampak Performance

Hanjakalna, kuring henteu ngalaksanakeun pangukuran kinerja anu saleresna dina lapak nyata, sabab kami henteu ngarencanakeun ngagunakeun mékanisme ieu dina produksi, tapi sacara téoritis urang tiasa ngaduga dimana urang bakal leungit sareng dimana urang bakal meunang.

Jang ngalampahkeun ieu, urang kedah nginget kumaha halaman dibaca sareng ditulis nalika diakses:

  • Nalika ngalakukeun operasi maca, éta munggaran dipilarian dina RAM; upami pamilarian gagal, halamanna dimuat kana RAM tina disk ku benang anu sami anu ngalaksanakeun bacaan.
  • Nalika operasi nulis dipigawé, kaca dina RAM ditandaan salaku kotor, tapi kaca teu fisik disimpen langsung kana disk ku thread ngalakukeun nulis. Sadaya halaman kotor disimpen kana disk engké dina prosés pamariksaan dina benang anu misah.

Janten dampak kana operasi maca nyaéta:

  • Positif (disk IO), kusabab panurunan dina jumlah blok sistem file anu dibaca.
  • Negatip (CPU), alatan beban tambahan diperlukeun ku sistem operasi pikeun digawe sareng file sparse. Ieu oge mungkin yen operasi IO tambahan implicitly bakal muncul di dieu pikeun ngahemat struktur file sparse leuwih kompleks (hanjakalna, Kami teu wawuh jeung sagala rinci ngeunaan kumaha karya sparse file).
  • Negatip (CPU), kusabab kedah nga-decompress halaman.
  • Henteu aya pangaruh kana operasi nulis.
  • Dampak kana prosés pamariksaan (sadayana di dieu sami sareng operasi maca):
  • Positif (disk IO), alatan panurunan dina jumlah blok sistem file ditulis.
  • Négatip (CPU, meureun disk IO), alatan gawé bareng file sparse.
  • Negatip (CPU), kusabab peryogi komprési halaman.

Sisi mana tina skala bakal tip skala? Ieu sadayana gumantung pisan kana lingkungan, tapi kuring condong yakin yén komprési halaman disk paling dipikaresep bakal ngakibatkeun degradasi kinerja dina kalolobaan sistem. Leuwih ti éta, tés dina DBMSs séjén anu ngagunakeun pendekatan sarupa jeung file sparse némbongkeun turunna kinerja nalika komprési diaktipkeun.

Kumaha ngaktipkeun sareng ngonpigurasikeun

Sakumaha didadarkeun di luhur, versi minimum Apache Ignite anu ngadukung komprési halaman disk nyaéta 2.8 sareng ngan ukur sistem operasi Linux anu dirojong. Aktipkeun sareng konpigurasikeun sapertos kieu:

  • Kudu aya modul ignite-komprési dina kelas-jalur. Sacara standar, lokasina di distribusi Apache Ignite dina libs / diréktori pilihan sareng henteu kalebet dina jalur kelas. Anjeun ngan saukur tiasa mindahkeun diréktori ka luhur hiji tingkat ka libs lajeng nalika anjeun ngajalankeun eta ngaliwatan ignite.sh eta bakal otomatis diaktipkeun.
  • Persistence kedah diaktipkeun (Diaktipkeun via DataRegionConfiguration.setPersistenceEnabled(true)).
  • Ukuran halaman kedah langkung ageung tibatan ukuran blok sistem file (anjeun tiasa nyetél nganggo DataStorageConfiguration.setPageSize() ).
  • Pikeun unggal cache anu datana kedah dikomprés, anjeun kedah ngonpigurasikeun metode komprési sareng (opsional) tingkat komprési (métode). CacheConfiguration.setDiskPageCompression() , CacheConfiguration.setDiskPageCompressionLevel()).

kompaksi WAL

Kumaha teu karya ieu

Naon WAL sareng naha éta diperyogikeun? Sakedap pisan: ieu mangrupikeun log anu ngandung sadaya kajadian anu pamustunganana ngarobih neundeun halaman. Ieu diperlukeun utamana pikeun bisa cageur bisi ragrag. Sakur operasi, sateuacan masihan kadali ka pangguna, kedah ngarékam heula acara dina WAL, supados upami gagal, éta tiasa dicoo deui dina log sareng malikkeun sadaya operasi dimana pangguna nampi réspon anu suksés, sanaos operasi ieu. teu boga waktu pikeun jadi reflected dina gudang kaca dina disk (geus di luhur Geus dijelaskeun yén tulisan sabenerna ka toko kaca dipigawé dina prosés nu disebut "checkpointing" kalawan sababaraha reureuh ku threads misah).

Éntri dina WAL dibagi kana logis sareng fisik. Boolean mangrupikeun konci sareng nilai sorangan. Fisik - ngagambarkeun parobahan kaca dina toko kaca. Nalika rékaman logis tiasa mangpaat pikeun sababaraha kasus sanés, rékaman fisik ngan ukur diperyogikeun pikeun pamulihan upami aya kacilakaan sareng rékaman ngan ukur diperyogikeun ti titik pamariksaan anu suksés. Di dieu urang moal ngajentrekeun sareng ngajelaskeun naha éta tiasa dianggo ku cara kieu, tapi anu kabetot tiasa ngarujuk kana tulisan anu parantos disebatkeun dina Apache Ignite Wiki: Ngahurungkeun Persistent Store - handapeun tiung.

Aya sering sababaraha rékaman fisik per catetan logis. Hartina, contona, hiji nempatkeun operasi kana cache mangaruhan sababaraha kaca dina mémori kaca (kaca kalawan data sorangan, kaca kalawan indéks, kaca kalawan bébas-daptar). Dina sababaraha tés sintétik, kuring manggihan yén rékaman fisik nempatan nepi ka 90% tina file WAL. Sanajan kitu, aranjeunna diperlukeun pikeun waktu anu pohara pondok (sacara standar, interval antara checkpoints nyaéta 3 menit). Éta logis pikeun ngaleungitkeun data ieu saatos kaleungitan relevansi na. Ieu persis naon mékanisme compaction WAL: éta ngaleungitkeun rékaman fisik sareng ngompres sésa rékaman logis nganggo zip, sedengkeun ukuran file diréduksi sacara signifikan (kadang-kadang ku puluhan kali).

Sacara fisik, WAL diwangun ku sababaraha bagéan (sacara standar 10) ukuran tetep (sacara standar 64MB), anu ditimpa ku cara sirkular. Pas bagean ayeuna dieusian, bagean salajengna ditugaskeun salaku ayeuna, sarta bagean dieusian disalin kana arsip ku thread misah. WAL compaction parantos dianggo sareng bagéan arsip. Ogé, salaku benang anu misah, éta ngawas palaksanaan pamariksaan sareng ngamimitian komprési dina bagéan arsip anu rékaman fisik henteu diperyogikeun deui.

Komprési data dina Apache Ignite. pangalaman Sber urang

Dampak Performance

Kusabab kompaksi WAL dijalankeun salaku benang anu misah, teu kedah aya dampak langsung kana operasi anu dilaksanakeun. Tapi tetep nempatkeun beban tukang tambahan dina CPU (komprési) jeung disk (maca unggal bagéan WAL tina arsip jeung nulis bagéan dikomprés), jadi lamun sistem ngajalankeun dina kapasitas maksimum na, éta ogé bakal ngakibatkeun degradasi kinerja.

Kumaha ngaktipkeun sareng ngonpigurasikeun

Anjeun tiasa ngaktipkeun WAL compaction ngagunakeun harta WalCompactionEnabled в DataStorageConfiguration (DataStorageConfiguration.setWalCompactionEnabled(true)). Ogé, ngagunakeun métode DataStorageConfiguration.setWalCompactionLevel (), Anjeun tiasa nyetel tingkat komprési lamun teu puas ku nilai standar (BEST_SPEED).

WAL komprési snapshot kaca

Kumaha teu karya ieu

Kami parantos mendakan yén dina catetan WAL dibagi kana logis sareng fisik. Pikeun unggal parobahan ka unggal kaca, rékaman WAL fisik dihasilkeun dina mémori kaca. Rékaman fisik, kahareupna ogé dibagi jadi 2 subtipe: catetan snapshot halaman sareng rékaman délta. Unggal waktos urang ngarobah hal dina kaca sarta mindahkeun tina kaayaan bersih kana kaayaan kotor, salinan lengkep kaca ieu disimpen dina WAL (kaca catetan snapshot). Malah lamun urang robah ngan hiji bait dina WAL, catetan bakal rada leuwih badag batan ukuran kaca. Lamun urang ngarobah hal dina kaca geus kotor, rékaman délta kabentuk dina WAL, nu ngagambarkeun ukur parobahan dibandingkeun kaayaan kaca saméméhna, tapi teu sakabéh kaca. Kusabab ngareset kaayaan halaman tina kotor ka bersih dilaksanakeun nalika prosés pamariksaan, langsung saatos ngamimitian pamariksaan, ampir sadaya rékaman fisik ngan ukur diwangun ku snapshot halaman (sabab sadaya halaman langsung saatos ngamimitian pamariksaan beresih) , Lajeng nalika urang ngadeukeutan ka pos pamariksaan salajengna, fraksi catetan délta dimimitian tumuwuh tur ngareset deui dina awal pos pamariksaan salajengna. Pangukuran dina sababaraha tés sintétik nunjukkeun yén pangsa jepretan halaman dina total volume rékaman fisik ngahontal 90%.

Gagasan komprési jepretan halaman WAL nyaéta pikeun ngompres jepretan halaman nganggo alat komprési halaman anu siap-siap (tingali komprési halaman disk). Dina waktos anu sami, dina WAL, rékaman disimpen sacara berurutan dina modeu ngan ukur sareng henteu kedah ngabeungkeut rékaman kana wates blok sistem file, janten di dieu, teu sapertos mékanisme komprési halaman disk, urang henteu peryogi file anu jarang dina. sadayana; sasuai, mékanisme ieu bakal dianggo henteu ngan dina OS Linux. Salaku tambahan, éta henteu penting deui pikeun urang sabaraha urang tiasa ngompres halaman éta. Sanaos urang ngabébaskeun 1 bait, ieu mangrupikeun hasil anu positif sareng urang tiasa nyimpen data anu dikomprés dina WAL, teu sapertos komprési halaman disk, dimana urang ngahémat halaman anu dikomprés ngan upami urang ngabébaskeun langkung ti 1 blok sistem file.

Kaca mangrupikeun data anu tiasa dikomprés, pangsa na dina total volume WAL pisan tinggi, janten tanpa ngarobih format file WAL urang tiasa nampi pangurangan anu signifikan dina ukuranana. Komprési, kaasup rékaman logis, bakal merlukeun parobahan dina format jeung leungitna kasaluyuan, Contona, pikeun konsumén éksternal anu bisa jadi kabetot dina rékaman logis, tapi moal ngakibatkeun hiji réduksi signifikan dina ukuran file.

Sapertos sareng komprési halaman disk, komprési snapshot halaman WAL tiasa nganggo algoritma komprési ZSTD, LZ4, Snappy, ogé mode SKIP_GARBAGE.

Dampak Performance

Henteu hese perhatikeun yén sacara langsung ngaktipkeun komprési snapshot halaman WAL ngan ukur mangaruhan benang anu nyerat data kana mémori halaman, nyaéta, benang anu ngarobih data dina cache. Maca rékaman fisik ti WAL lumangsung ngan sakali, dina momen titik diangkat sanggeus ragrag (jeung ngan lamun ragrag salila papariksaan a).

Ieu mangaruhan threads nu ngarobah data ku cara kieu: urang meunang éfék négatif (CPU) alatan kudu niiskeun kaca unggal waktu saméméh nulis ka disk, sarta pangaruh positif (disk IO) alatan panurunan dina jumlah data ditulis. Sasuai, sagalana geus basajan dieu: lamun kinerja sistem diwatesan ku CPU, urang meunang degradasi slight, lamun diwatesan ku disk I / O, urang meunang kanaékan.

Sacara teu langsung, ngurangan ukuran WAL ogé mangaruhan (positif) aliran nu dump bagéan WAL kana arsip jeung aliran compaction WAL.

Tes kinerja nyata di lingkungan urang ngagunakeun data sintétik némbongkeun ngaronjat slight (throughput ngaronjat ku 10% -15%, latency turun ku 10% -15%).

Kumaha ngaktipkeun sareng ngonpigurasikeun

Vérsi Apache Ignite minimum: 2.8. Aktipkeun sareng konpigurasikeun sapertos kieu:

  • Kudu aya modul ignite-komprési dina kelas-jalur. Sacara standar, lokasina di distribusi Apache Ignite dina libs / diréktori pilihan sareng henteu kalebet dina jalur kelas. Anjeun ngan saukur tiasa mindahkeun diréktori ka luhur hiji tingkat ka libs lajeng nalika anjeun ngajalankeun eta ngaliwatan ignite.sh eta bakal otomatis diaktipkeun.
  • Persistence kedah diaktipkeun (Diaktipkeun via DataRegionConfiguration.setPersistenceEnabled(true)).
  • Modeu komprési kedah diatur nganggo metodeu DataStorageConfiguration.setWalPageCompression(), komprési ditumpurkeun sacara standar (mode disabled).
  • Opsional, anjeun tiasa nyetél tingkat komprési nganggo metodeu DataStorageConfiguration.setWalPageCompression(), tingali javadoc pikeun métode pikeun nilai valid pikeun tiap mode.

kacindekan

Mékanisme komprési data anu dianggap dina Apache Ignite tiasa dianggo sacara mandiri, tapi kombinasi mana waé ogé tiasa ditampi. Ngartos kumaha aranjeunna tiasa dianggo bakal ngamungkinkeun anjeun pikeun nangtoskeun kumaha cocogna aranjeunna pikeun tugas anjeun di lingkungan anjeun sareng naon anu anjeun kedah korbankeun nalika ngagunakeunana. Komprési kaca disk dirancang pikeun niiskeun gudang utama sarta bisa méré rasio komprési sedeng. WAL komprési snapshot kaca bakal masihan hiji gelar rata-rata komprési pikeun file WAL, sarta paling dipikaresep malah ngaronjatkeun kinerja. WAL compaction moal boga pangaruh positif kana kinerja, tapi bakal ngurangan ukuran file WAL saloba mungkin ku nyoplokkeun rékaman fisik.

sumber: www.habr.com

Tambahkeun komentar