Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Artem Denisov ( bo0rsh201, Badoo)

Badoo mangrupikeun situs dating panggedéna di dunya. Ayeuna urang gaduh sakitar 330 juta pangguna anu kadaptar di dunya. Tapi anu langkung penting dina kontéks paguneman urang ayeuna nyaéta yén urang nyimpen kira-kira 3 petabytes poto pangguna. Saban poé pamaké urang unggah ngeunaan 3,5 juta poto anyar, sarta beban bacaan ngeunaan 80 rébu pamundut per detik. Ieu cukup loba pikeun backend urang, sarta kadangkala aya kasusah jeung ieu.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Kuring bakal ngobrol ngeunaan desain sistem ieu, anu nyimpen sareng ngirim poto sacara umum, sareng kuring bakal ningali tina sudut pandang pamekar. Bakal aya retrospektif ringkes ngeunaan kumaha éta dimekarkeun, dimana kuring bakal ngagariskeun tonggak utama, tapi kuring ngan ukur bakal nyarios langkung rinci ngeunaan solusi anu ayeuna urang anggo.

Ayeuna hayu urang ngamimitian.


Salaku Cenah mah, ieu bakal retrospective a, sarta dina urutan pikeun ngamimitian eta wae, hayu urang nyandak conto paling umum.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Urang boga tugas umum, urang kudu nampa, nyimpen jeung ngirim poto pamaké. Dina bentuk ieu, tugas umum, urang tiasa nganggo naon waé:

  • panyimpen awan modern,
  • solusi boxed, nu aya ogé loba ayeuna;
  • Urang tiasa nyetél sababaraha mesin di pusat data urang sareng nempatkeun hard drive ageung dina éta sareng nyimpen poto di dinya.

Badoo sajarahna - duanana ayeuna lajeng (dina waktu éta ngan di infancy na) - hirup dina server sorangan, di jero DC urang sorangan. Ku alatan éta, pilihan ieu optimal pikeun urang.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Urang ngan nyokot sababaraha mesin, disebutna "poto", sarta kami meunang klaster nu nyimpen poto. Tapi sigana aya anu leungit. Supados sadayana ieu jalan, urang kudu kumaha bae nangtukeun dina mesin nu urang bakal nyimpen poto nu. Sareng di dieu, ogé, henteu kedah muka Amérika.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Urang nambahkeun sababaraha widang ka gudang urang kalawan informasi ngeunaan pamaké. Ieu bakal janten konci sharding. Dina kasus urang, kami disebut place_id, sarta id tempat ieu nunjuk ka tempat dimana poto pamaké disimpen. Urang nyieun peta.

Dina tahap kahiji, ieu malah bisa dipigawé sacara manual - urang nyebutkeun yén poto pamaké kalawan tempat ieu bakal darat dina server misalna. Hatur nuhun kana peta ieu, urang salawasna terang lamun pamaké unggah poto, dimana nyimpen eta, sarta kami nyaho dimana masihan ti.

Ieu mangrupikeun skéma anu teu pati penting, tapi gaduh kaunggulan anu cukup signifikan. Anu kahiji nyaéta saderhana, sakumaha anu kuring nyarios, sareng anu kadua nyaéta kalayan pendekatan ieu urang tiasa sacara gampil skala horisontal ku ngan ukur nganteurkeun mobil anyar sareng nambihanana kana peta. Anjeun teu kedah ngalakukeun nanaon sejenna.

Éta kumaha éta pikeun urang pikeun sababaraha waktos.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Ieu kira-kira 2009. Aranjeunna nganteurkeun mobil, dikirimkeun ...

Sarta di sawatara titik urang mimiti perhatikeun yén skéma ieu boga kalemahan tangtu. Naon kalemahanana?

Anu mimiti, aya kapasitas kawates. Urang teu bisa cram saloba hard drive kana hiji server fisik sakumaha urang hoyong. Sareng ieu parantos janten masalah anu tangtu kana waktosna sareng kamekaran set data.

Jeung kadua. Ieu mangrupikeun konfigurasi mesin atypical, sabab mesin sapertos sesah dianggo deui dina sababaraha klaster anu sanés, aranjeunna rada spésifik, nyaéta. aranjeunna kedah lemah dina pagelaran, tapi dina waktos anu sareng hard drive badag.

Ieu kabeh pikeun 2009, tapi, prinsipna mah, sarat ieu masih relevan kiwari. Simkuring gaduh retrospective a, jadi dina 2009 sagalana éta sagemblengna goréng kalayan ieu.

Jeung titik panungtungan nyaéta harga.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

harga éta pisan lungkawing dina waktu éta, sarta kami kudu néangan sababaraha alternatif. Jelema. urang kedah kumaha waé langkung saé ngagunakeun rohangan dina pusat data sareng server fisik dimana sadayana ieu ayana. Sareng insinyur sistem kami ngamimitian studi anu ageung dimana aranjeunna marios sababaraha pilihan anu béda. Éta ogé ningali sistem file clustered sapertos PolyCeph sareng Lustre. Aya masalah kinerja sarta operasi rada hese. Aranjeunna nampik. Urang diusahakeun Gunung sakabéh dataset via NFS on unggal mobil guna kumaha bae age eta nepi. Maca ogé janten goréng, kami nyobian solusi anu béda ti padagang anu béda.

Sarta dina tungtungna, urang netep dina ngagunakeun disebut Panyimpenan Area Network.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Ieu mangrupikeun SHD ageung anu dirarancang khusus pikeun nyimpen data anu ageung. Éta rak jeung disk nu dipasang dina mesin kaluaran optik final. Anu. urang boga sababaraha jenis kolam renang mesin, rada leutik, sarta SHDs ieu, nu transparan pikeun logika ngirim urang, i.e. kanggo nginx urang atanapi saha waé anu nyayogikeun pamundut pikeun poto ieu.

Kaputusan ieu ngagaduhan kauntungan anu jelas. Ieu SHD. Tujuanana pikeun nyimpen poto. Ieu jalan kaluar langkung mirah ti saukur equipping mesin jeung hard drive.

tambah kadua.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Ieu nu kapasitas geus jadi loba nu leuwih gede, i.e. urang tiasa nampung langkung seueur panyimpenan dina volume anu langkung alit.

Tapi aya ogé kalemahan anu muncul cukup gancang. Nalika jumlah pangguna sareng beban dina sistem ieu ningkat, masalah kinerja mimiti timbul. Sareng masalahna di dieu cukup atra - naon waé SHD anu dirancang pikeun nyimpen seueur poto dina volume anu alit, sakumaha aturan, ngalaman bacaan anu intensif. Ieu saleresna leres pikeun neundeun awan atanapi anu sanés. Ayeuna kami henteu ngagaduhan panyimpen anu idéal anu tiasa skala anu teu terbatas, anjeun tiasa ngeusian naon waé, sareng éta bakal toleran bacaan anu saé. Utamana bacaan kasual.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Saperti dina kasus poto urang, sabab poto dipénta inconsistently, sarta ieu bakal greatly mangaruhan kinerja maranéhanana.

Malahan numutkeun inohong dinten ieu, lamun urang meunang leuwih ti 500 RPS pikeun poto dina mesin dimana gudang disambungkeun, masalah geus dimimitian. Sareng éta cukup goréng pikeun urang, sabab jumlah pangguna naék, hal-hal bakal langkung parah. Ieu perlu dioptimalkeun kumaha bae.

Pikeun ngaoptimalkeun, kami mutuskeun dina waktos éta, écés, ningali profil beban - naon, sacara umum, kajantenan, naon anu kedah dioptimalkeun.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Sarta di dieu sagalana muterkeun kana leungeun urang.

Kuring geus ngomong dina slide munggaran: urang boga 80 sarébu requests bacaan per detik kalayan ngan 3,5 juta unggah per poé. Hartina, ieu bédana tina tilu ordo gedéna. Éta écés yén bacaan kedah dioptimalkeun sareng sacara praktis jelas kumaha.

Aya hiji deui titik leutik. Spésifik tina jasa nyaéta yén jalma ngadaptarkeun, unggah poto, teras mimiti aktip ningali jalma sanés, sapertos aranjeunna, sareng aktip ditingalikeun ka jalma sanés. Lajeng anjeunna manggihan jodoh atawa teu manggihan jodoh, eta gumantung kumaha tétéla, sarta eureun ngagunakeun jasa bari. Dina waktos ayeuna, nalika anjeunna nganggo éta, poto-potona panas pisan - aranjeunna dipénta, seueur jalma ningaliana. Pas anjeunna lirén ngalakukeun ieu, lumayan gancang anjeunna kaluar tina seueur paparan ka jalma sanés sapertos sateuacanna, sareng poto-potona ampir henteu kantos dipénta.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Jelema. Simkuring boga dataset panas pisan leutik. Tapi dina waktos anu sami aya seueur paménta pikeun anjeunna. Sareng solusi anu atra di dieu nyaéta nambihan cache.

A cache kalawan LRU bakal ngajawab sagala masalah urang. Keur naon urang?

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Urang tambahkeun hiji deui relatif leutik di hareup klaster badag urang jeung gudang, nu disebut photocaches. Ieu dasarna ngan proxy cache.

Kumaha gawéna ti jero? Ieu pangguna urang, ieu mangrupikeun panyimpenan. Sagalana sarua jeung saméméhna. Naon anu urang tambahkeun di antara?

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Ieu ngan mesin jeung disk lokal fisik, nu gancang. Ieu sareng SSD, contona. Sareng sababaraha jinis cache lokal disimpen dina disk ieu.

Kumaha rupana? Pamaké ngirimkeun pamundut poto. NGINX milarian heula dina cache lokal. Upami henteu, teras kantun proxy_pass ka panyimpenan kami, unduh poto ti dinya sareng pasihan ka pangguna.

Tapi anu ieu pisan banal sareng henteu écés naon anu kajantenan di jero. Gawéna sapertos kieu.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Cache sacara logis dibagi kana tilu lapisan. Lamun kuring ngomong "tilu lapisan", ieu lain hartosna yén aya sababaraha jenis sistem kompléks. Henteu, ieu ngan ukur tilu diréktori dina sistem file:

  1. Ieu mangrupikeun panyangga dimana poto anu nembé diunduh tina proxy.
  2. Ieu mangrupikeun cache panas anu nyimpen poto anu ayeuna dipénta aktip.
  3. Jeung cache tiis, dimana poto laun kadorong kaluar tina cache panas lamun requests pangsaeutikna datang ka aranjeunna.

Jang ngalampahkeun ieu, urang kudu kumaha bae ngatur cache ieu, urang kudu nyusun ulang poto di dinya, jsb. Ieu ogé prosés pisan primitif.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Nginx ngan saukur nyerat ka RAMDisk access.log pikeun tiap pamundut, dimana éta nunjukkeun jalur ka poto anu ayeuna parantos dilayanan (jalur relatif, tangtosna), sareng partisi mana anu dilayanan. Jelema. eta bisa disebutkeun "poto 1" lajeng boh panyangga, atawa cache panas, atawa cache tiis, atawa proxy a.

Gumantung kana ieu, urang kudu kumaha bae mutuskeun naon anu kudu dipigawé kalayan poto.

Simkuring boga daemon leutik ngajalankeun on unggal mesin nu terus maca log ieu sareng nyimpen statistik dina pamakéan poto tangtu dina mémori na.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Anjeunna saukur ngumpulkeun aya, ngajaga counters na périodik ngalakukeun handap. Anjeunna ngalir aktip dipénta poto, nu aya loba requests, ka cache panas, dimana wae aranjeunna.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Poto anu dipénta jarang sareng parantos jarang dipénta sacara laun-laun didorong kaluar tina cache panas kana anu tiis.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Sareng nalika urang kaluar tina rohangan dina cache, urang ngan saukur ngamimitian ngahapus sadayana tina cache tiis sacara teu kahaja. Jeung ku jalan kitu, ieu jalan ogé.

Supados poto disimpen geuwat nalika proxying kana panyangga, kami nganggo diréktif proxy_store sarta panyangga oge RAMDisk a, i.e. pikeun pamaké gawéna pisan gancang. Ieu masalah internal tina server cache sorangan.

Patarosan sésana nyaéta kumaha carana ngadistribusikaeun requests sakuliah server ieu.

Hayu urang nyebutkeun aya klaster dua puluh mesin gudang sarta tilu server cache (ieu kumaha kajadian).

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Urang kudu kumaha bae nangtukeun requests nu mana poto jeung dimana darat aranjeunna.

Pilihan anu paling umum nyaéta Round Robin. Atawa ngalakukeun eta ku kacilakaan?

Ieu écés boga sababaraha kalemahan sabab urang bakal ngagunakeun cache pisan inefficiently dina kaayaan kitu. Requests bakal darat dina sababaraha mesin acak: didieu ieu sindangan, tapi dina hiji salajengna geus euweuh. Sareng upami sadayana ieu jalan, éta bakal parah pisan. Malah ku sajumlah leutik mesin dina kluster.

Urang kudu kumaha bae unambiguously nangtukeun mana server ka darat nu menta.

Aya cara banal. Kami nyandak hash tina URL atanapi hash tina konci sharding kami, anu aya dina URL, sareng bagikeun ku jumlah server. Bakal dianggo? Bakal.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Jelema. Simkuring gaduh pamundut 2%, contona, pikeun sababaraha "example_url" bakal salawasna darat dina server kalawan indéks "XNUMX", sarta cache bakal terus disposed of sabisa.

Tapi aya masalah sareng resharding dina skéma sapertos kitu. Resharding - Maksad abdi ngarobah jumlah server.

Hayu urang nganggap yén klaster cache urang teu bisa Cope deui jeung urang mutuskeun pikeun nambahkeun mesin sejen.

Hayu urang tambahkeun.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Ayeuna sagalana geus dibeulah teu ku tilu, tapi ku opat. Ku kituna, ampir kabéh konci nu urang dipaké pikeun mibanda, ampir sakabéh URL ayeuna hirup dina server séjén. Sakabéh cache ieu invalidated ngan sakedap. Kabéh requests murag kana klaster gudang urang, éta janten unwell, gagal layanan sarta pamaké sugema. Abdi henteu hoyong ngalakukeun éta.

Pilihan ieu ogé henteu cocog sareng urang.

Anu. urang kudu kumaha? Urang kudu kumaha bae ngagunakeun efisien cache nu, darat pamundut sarua dina server sarua leuwih sarta leuwih deui, tapi jadi tahan ka resharding. Sareng aya solusi sapertos kitu, éta sanés pajeulit. Ieu disebut hashing konsisten.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Kumaha rupana?

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Kami nyandak sababaraha fungsi tina konci sharding sareng nyebarkeun sadaya nilaina dina bunderan. Jelema. dina titik 0, nilai minimum jeung maksimum na konvergen. Salajengna, urang nempatkeun sadaya server kami dina bunderan anu sami dina cara kieu:

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Unggal server diartikeun ku hiji titik, jeung sektor nu mana jarum jam ka dinya, sasuai, dilayanan ku host ieu. Nalika requests datang ka kami, urang langsung ningali yén, contona, pamundut A - eta boga hash aya - sarta dilayanan ku server 2. Request B - ku server 3. Jeung saterusna.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Naon anu lumangsung dina kaayaan ieu nalika resharding?

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Kami henteu ngabatalkeun sadayana cache, sapertos sateuacanna, sareng henteu mindahkeun sadaya konci, tapi urang mindahkeun unggal séktor jarak pondok supados, sacara rélatif nyarios, server kagenep urang, anu urang hoyong tambahkeun, pas kana rohangan bébas, sareng urang tambahkeun di dinya.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Tangtu, dina kaayaan kitu konci ogé pindah kaluar. Tapi aranjeunna kaluar langkung lemah tibatan sateuacanna. Sarta kami ningali yén dua konci munggaran urang tetep dina server maranéhanana, sarta server cache robah ngan pikeun konci panungtungan. Ieu jalan rada éfisién, sarta lamun nambahkeun host anyar incrementally, teras teu aya masalah badag di dieu. Anjeun nambahkeun jeung nambahkeun saeutik dina hiji waktu, antosan dugi cache pinuh deui, jeung sagalana jalan ogé.

Hiji-hijina patarosan tetep ku panolakan. Hayu urang nganggap yén sababaraha jenis mobil téh kaluar tina urutan.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Sarta kami moal rék regenerate peta ieu dina momen ieu, invalidate bagian tina cache, jeung saterusna, lamun, contona, mesin ieu rebooted, sarta kami kudu kumaha bae jasa requests. Urang ngan nyimpen hiji cache poto cadangan dina unggal situs, nu tindakan minangka gaganti pikeun sagala mesin nu ayeuna turun. Sareng upami ujug-ujug salah sahiji server kami henteu sayogi, lalu lintas bakal aya. Alami, urang teu boga cache wae aya, i.e. éta tiis, tapi sahenteuna requests pamaké keur diolah. Upami ieu mangrupikeun interval anu pondok, maka urang ngalaman éta kalayan tenang. Ngan aya deui beban dina panyimpenan. Upami interval ieu panjang, maka urang parantos tiasa nyandak kaputusan - pikeun ngahapus server ieu tina peta atanapi henteu, atanapi panginten ngagentos ku anu sanés.

Ieu ngeunaan sistem cache. Hayu urang nempo hasilna.

Ieu bakal sigana nu aya nanaon pajeulit di dieu. Tapi metoda ieu pikeun ngatur cache masihan kami tingkat trik sakitar 98%. Jelema. kaluar tina ieu 80 sarébu requests per detik, ngan 1600 ngahontal gudang, sarta ieu beban sagemblengna normal, aranjeunna kalem endure eta, urang salawasna boga cadangan a.

Kami nempatkeun server ieu dina tilu DC kami, sareng nampi tilu titik ayana - Praha, Rajana sareng Hong Kong.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Anu. aranjeunna langkung atanapi kirang lokal lokasina pikeun unggal target pasar urang.

Sareng salaku bonus anu saé, kami ngagaduhan proxy cache ieu, dimana CPUna leres-leres dianggurkeun, sabab henteu diperyogikeun pikeun ngalayanan kontén. Sareng di dinya, nganggo NGINX + Lua, kami ngalaksanakeun seueur logika utilitarian.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Salaku conto, urang tiasa ékspérimén sareng webp atanapi jpeg progresif (ieu format modern anu épéktip), tingali kumaha mangaruhan lalu lintas, nyandak sababaraha kaputusan, ngaktifkeun pikeun sababaraha nagara, jsb. nyieun ukuran dinamis atawa motong poto on laleur.

Ieu mangrupikeun pamakean anu saé nalika, contona, anjeun gaduh aplikasi sélulér anu nampilkeun poto, sareng aplikasi sélulér henteu hoyong miceunan CPU klien nalika nyuhunkeun poto anu ageung teras ngatur ukuranana kana ukuran anu tangtu pikeun nyorong kana. pintonan. Urang saukur bisa dinamis tangtukeun sababaraha parameter dina URL kondisional UPort, sarta cache poto bakal ngarobah ukuran poto sorangan. Sakumaha aturan, éta bakal milih ukuran anu urang sacara fisik dina disk, sacaket-gancangna ka anu dipénta, sareng nyéépkeunana dina koordinat khusus.

Ku jalan kitu, kami parantos ngadamel rekaman pidéo anu sayogi pikeun umum tina lima taun ka pengker tina konperénsi pamekar sistem beban tinggi. HighLoad ++. Tonton, diajar, bagikeun sareng ngalanggan Saluran YouTube.

Urang ogé tiasa nambihan seueur logika produk di dinya. Contona, urang bisa nambahkeun watermarks béda ngagunakeun parameter URL, urang tiasa blur, blur atanapi pixelate poto. Ieu nalika urang rék némbongkeun poto hiji jalma, tapi urang teu hayang némbongkeun beungeutna, ieu jalan ogé, éta sadayana dilaksanakeun di dieu.

Naon anu urang meunang? Kami ngagaduhan tilu titik ayana, tingkat trik anu saé, sareng dina waktos anu sami kami henteu gaduh CPU dianggurkeun dina mesin ieu. Anjeunna ayeuna parantos janten, tangtosna, langkung penting tibatan sateuacanna. Urang kedah masihan mobil anu langkung kuat, tapi éta patut.

Ieu masalah balikna poto. Sagalana di dieu cukup jelas tur atra. Jigana mah teu manggihan Amérika, ampir sagala CDN jalan cara kieu.

Sareng, paling dipikaresep, pendengar anu canggih tiasa gaduh patarosan: naha henteu ngan ukur ngarobih sadayana kana CDN? Éta bakal sami; sadaya CDN modern tiasa ngalakukeun ieu. Tur aya sababaraha alesan.

Anu kahiji nyaéta poto.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Ieu mangrupikeun salah sahiji titik konci infrastruktur urang, sareng urang peryogi seueur kontrol anu jéntré. Lamun ieu téh sababaraha jenis leyuran ti ngajual pihak-katilu, jeung anjeun teu boga kakuatan naon leuwih eta, bakal rada hésé pikeun anjeun hirup kalawan eta mun anjeun boga dataset badag, sarta mun anjeun boga aliran anu kacida gedéna. tina pamundut pamaké.

Hayu atuh masihan anjeun conto. Ayeuna, kalayan infrastruktur urang, urang tiasa, contona, dina kasus sababaraha masalah atanapi knocks bawah tanah, buka mesin jeung mess sabudeureun dinya, rélatif diomongkeun. Urang tiasa nambihan koleksi sababaraha métrik anu urang peryogikeun, urang tiasa ékspérimén kumaha waé, tingali kumaha ieu mangaruhan grafik, sareng saterasna. Ayeuna seueur statistik anu dikumpulkeun dina klaster cache ieu. Sarta kami périodik kasampak di dinya sarta méakkeun lila Ngajalajah sababaraha anomali. Lamun éta di sisi CDN, eta bakal jadi loba harder ngadalikeun. Atanapi, contona, upami aya kacilakaan, urang terang naon anu kajantenan, urang terang kumaha hirup sareng kumaha cara ngatasina. Ieu kacindekan munggaran.

Kacindekan kadua oge rada sajarah, sabab sistem geus ngembang pikeun lila, tur aya loba syarat bisnis béda dina tahap béda, sarta aranjeunna henteu salawasna cocog kana konsép CDN.

Jeung titik nu kieu ti saméméhna nyaéta

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Ieu kusabab dina caches poto urang boga loba logika husus, nu teu salawasna bisa ditambahkeun kana pamundut. Teu mungkin yén CDN mana waé bakal nambihan sababaraha hal khusus ka anjeun dina pamundut anjeun. Contona, énkripsi URL upami anjeun henteu hoyong klien tiasa ngarobih hiji hal. Naha anjeun hoyong ngarobih URL dina server sareng énkripsi, teras kirimkeun sababaraha parameter dinamis di dieu.

Naon kacindekan ieu nyarankeun? Dina kasus urang, CDN sanes alternatif anu saé pisan.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Sareng dina kasus anjeun, upami anjeun ngagaduhan syarat bisnis khusus, maka anjeun tiasa gampang ngalaksanakeun naon anu kuring nunjukkeun ka anjeun sorangan. Sareng ieu bakal tiasa dianggo sampurna sareng profil beban anu sami.

Tapi lamun boga sababaraha jenis leyuran umum, sarta tugas teu pisan husus, anjeun tiasa leres-leres nyandak CDN a. Atawa lamun waktu jeung sumber leuwih penting pikeun anjeun ti kontrol.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Sareng CDN modern gaduh ampir sadayana anu kuring nyarioskeun ka anjeun ayeuna. Iwal tambah atawa minus sababaraha fitur.

Ieu ngeunaan méré poto.

Hayu urang ayeuna maju saeutik dina retrospective urang jeung ngobrol ngeunaan neundeun.

2013 geus kaliwat.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

server cache ditambahkeun, masalah kinerja indit jauh. Sagalana geus rupa. Dataset ngembang. Salaku 2013, urang tadi ngeunaan 80 server disambungkeun ka gudang, sarta ngeunaan 40 caches di unggal DC. Ieu 560 terabytes data dina unggal DC, i.e. ngeunaan hiji petabyte dina total.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Sareng ku kamekaran set data, biaya operasi mimiti naék sacara signifikan. Naon ieu hartosna?

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Dina diagram ieu anu digambar - kalawan SAN, kalawan mesin sarta caches disambungkeun ka dinya - aya loba titik gagal. Upami urang parantos diurus kagagalan server cache sateuacana, sadayana langkung seueur tiasa diprediksi sareng kaharti, tapi dina sisi panyimpen sadayana langkung parah.

Firstly, Network Area Panyimpenan (SAN) sorangan, nu bisa gagal.

Bréh, éta disambungkeun via optik ka mesin tungtung. Bisa jadi aya masalah sareng kartu optik jeung busi.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Tangtosna, henteu seueur di antarana sapertos SAN sorangan, tapi, sanaos, ieu ogé titik gagal.

Salajengna nyaéta mesin sorangan, nu disambungkeun ka gudang. Éta ogé tiasa gagal.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Dina total, urang gaduh tilu titik gagal.

Salajengna, sajaba titik gagal, aya pangropéa beurat tina gudang sorangan.

Ieu mangrupikeun sistem multikomponén anu kompleks, sareng insinyur sistem tiasa sesah damel sareng éta.

Jeung panungtungan, titik pangpentingna. Upami aya kagagalan dina salah sahiji tina tilu titik ieu, urang gaduh kasempetan anu henteu nol pikeun kaleungitan data pangguna sabab sistem file tiasa ngadat.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Sebutkeun sistem file urang rusak. Firstly, recovery na nyokot lila - bisa nyandak saminggu kalayan jumlah badag data. Sareng kadua, dina tungtungna urang bakal paling dipikaresep mungkas ku kebat file anu teu kaharti anu kedah kumaha waé digabungkeun kana poto pangguna. Sareng urang résiko kaleungitan data. Résiko rada luhur. Sareng langkung sering kaayaan sapertos kitu kajantenan, sareng langkung seueur masalah timbul dina sadaya ranté ieu, langkung luhur résiko ieu.

Aya anu kedah dilakukeun ngeunaan ieu. Sareng urang mutuskeun yén urang ngan ukur kedah nyadangkeun data. Ieu sabenerna ngarupakeun solusi atra tur alus. Naon anu urang lakukeun?

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Ieu naon server kami kasampak kawas nalika eta disambungkeun ka gudang sateuacan. Ieu salah sahiji bagian utama, éta ngan hiji alat block nu sabenerna ngagambarkeun Gunung pikeun neundeun jauh via élmu optik.

Urang ngan ditambahkeun hiji bagian kadua.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Urang ditempatkeun gudang kadua gigireun eta (untung teu jadi mahal dina hal duit), sarta disebut partisi cadangan. Éta ogé dihubungkeun via élmu optik sareng ayana dina mesin anu sami. Tapi urang kudu kumaha bae nyingkronkeun data antara aranjeunna.

Di dieu urang ngan nyieun hiji antrian Asynchronous caket dieu.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Manehna teu pisan sibuk. Kami terang kami henteu gaduh catetan anu cekap. Antrian ngan ukur tabel dina MySQL dimana garis sapertos "anjeun kedah nyadangkeun poto ieu" ditulis. Kalayan parobihan atanapi unggah, urang nyalin tina partisi utama pikeun nyadangkeun nganggo asynchronous atanapi ngan ukur sababaraha jinis tukang tukang.

Ku kituna urang salawasna boga dua bagian konsisten. Malah lamun salah sahiji bagian tina sistem ieu gagal, urang salawasna bisa ngarobah partisi utama kalawan cadangan, sarta sagalana bakal neruskeun jalan.

Tapi kusabab ieu, beban bacaan naék pisan, sabab ... sajaba ti klien nu maca ti bagian utama, sabab mimiti kasampak di poto aya (éta leuwih anyar aya), lajeng néangan dina cadangan, lamun maranéhna teu kapanggih (tapi NGINX ngan ngalakukeun ieu). Sistim urang oge cadangan tambah ayeuna maos ti partisi utama. Henteu yén ieu bottleneck, tapi kuring henteu hoyong ningkatkeun beban, dasarna, sapertos kitu.

Sarta kami ditambahkeun disk katilu, nu SSD leutik, sarta disebut panyangga a.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Kumaha gawéna ayeuna.

Pamaké unggah poto ka panyangga, teras hiji acara dialungkeun kana antrian anu nunjukkeun yén éta kedah disalin kana dua bagian. Ieu disalin, sarta poto hirup dina panyangga pikeun sawatara waktu (sebutkeun, sapoé), sarta ngan lajeng geus purged ti dinya. Ieu greatly ngaronjatkeun pangalaman pamaké, sabab pamaké unggah poto, sakumaha aturan, requests geuwat ngawitan nuturkeun, atawa manehna sorangan ngamutahirkeun kaca na refreshed eta. Tapi éta sadayana gumantung kana aplikasi anu ngadamel unggah.

Atanapi, contona, jalma-jalma sanés anu anjeunna mimiti nunjukkeun dirina langsung ngirim pamundut saatos poto ieu. Éta henteu acan aya dina cache; pamundut anu munggaran lumangsung gancang pisan. Intina sami sareng tina cache poto. Panyimpen anu lambat henteu kalibet dina hal ieu. Sareng nalika dinten saatosna dibersihkeun, éta parantos disimpen dina lapisan cache urang, atanapi, sigana, teu aya anu peryogi deui. Jelema. Pangalaman pangguna di dieu parantos ningkat pisan kusabab manipulasi saderhana sapertos kitu.

Nya, sareng anu paling penting: urang lirén kaleungitan data.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Hayu urang lirén berpotensi leungit data, sabab urang teu bener leungit eta. Tapi aya bahaya. Urang nempo yén solusi ieu, tangtosna, alus, tapi éta saeutik kawas smoothing kaluar gejala masalah, tinimbang ngarengsekeun eta lengkep. Sareng sababaraha masalah tetep di dieu.

Anu mimiti, ieu mangrupikeun titik kagagalan dina bentuk host fisik sorangan dimana sadaya mesin ieu dijalankeun; éta henteu musna.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Bréh, aya kénéh masalah jeung SANs, pangropéa beurat maranéhanana, jsb tetep. Éta henteu yén éta mangrupikeun faktor kritis, tapi kuring hoyong nyobian kumaha waé hirup tanpa éta.

Sarta kami dijieun versi katilu (dina kanyataanana, kadua dina kanyataanana) - versi reservations. Kumaha rupana?

Ieu naon éta -

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Masalah utama urang nyaéta kanyataan yén ieu mangrupikeun host fisik.

Anu mimiti, urang ngahapus SAN sabab urang hoyong ékspérimén, urang hoyong nyobian hard drive lokal.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Ieu parantos 2014-2015, sareng dina waktos éta kaayaan disk sareng kapasitasna dina hiji host janten langkung saé. Urang mutuskeun naha henteu coba eta.

Teras we saukur nyandak partisi cadangan urang jeung mindahkeun fisik ka mesin misah.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Ku kituna, urang meunang diagram ieu. Kami gaduh dua mobil anu nyimpen set data anu sami. Aranjeunna nyadangkeun silih lengkep sareng nyingkronkeun data dina jaringan ngaliwatan antrian asinkron dina MySQL anu sami.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Naha ieu jalanna saé kusabab urang gaduh sababaraha rékaman. Jelema. lamun nulis éta comparable maca, sugan urang bakal boga sababaraha jenis overhead jaringan jeung masalah. Aya saeutik tulisan, loba bacaan - metoda ieu jalan ogé, i.e. Urang jarang nyalin poto antara dua server ieu.

Kumaha gawéna ieu, lamun kasampak saeutik leuwih jéntré.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

unggah. Balancer ngan saukur milih host acak sareng pasangan sareng unggah kana éta. Dina waktos anu sami, anjeunna sacara alami ngalakukeun pamariksaan kaséhatan sareng mastikeun mobilna henteu murag. Jelema. anjeunna unggah poto ngan ka server live, lajeng ngaliwatan antrian Asynchronous eta sadayana disalin ka tatangga na. Kalayan unggah sadayana saderhana pisan.

Tugasna rada hese.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Lua ngabantosan kami di dieu, sabab tiasa sesah ngadamel logika sapertos kitu dina vanili NGINX. Urang mimiti menta ka server kahiji, tingali lamun poto eta aya, sabab berpotensi eta bisa diunggah, contona, ka tatangga, tapi teu acan anjog ka dieu. Upami potona aya, éta saé. Urang langsung masihan ka klien tur, jigana, cache eta.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Upami teu aya, urang ngan saukur menta ka tatangga urang sareng dijamin nampi ti dinya.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Anu. deui urang bisa nyebutkeun: meureun aya masalah jeung kinerja, sabab aya konstan perjalanan buleud - poto ieu diunggah, teu di dieu, urang nyieun dua requests tinimbang hiji, ieu kedah dianggo lalaunan.

Dina kaayaan urang, ieu teu jalan lalaunan.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Kami ngumpulkeun sajumlah métrik dina sistem ieu, sareng tingkat pinter kondisional mékanisme sapertos sakitar 95%. Jelema. Keterlambatan cadangan ieu leutik, sareng kusabab ieu kami ampir dijamin, saatos poto diunggah, kami bakal nyandak heula sareng henteu kedah angkat ka mana waé dua kali.

Janten naon deui anu urang ngagaduhan anu saé pisan?

Saméméhna, urang boga partisi cadangan utama, sarta kami maca ti aranjeunna sequentially. Jelema. Kami salawasna milarian dina anu utama heula, teras dina cadangan. Ieu hiji move.

Ayeuna urang ngagunakeun bacaan tina dua mesin sakaligus. Urang ngadistribusikaeun requests maké Babak Robin. Dina perséntase leutik kasus urang nyieun dua requests. Tapi sacara umum, urang ayeuna gaduh dua kali langkung seueur saham bacaan sapertos sateuacana. Jeung beban ieu greatly ngurangan duanana dina mesin ngirim tur langsung dina mesin gudang, nu urang ogé kungsi dina waktu éta.

Sedengkeun pikeun toleransi kasalahan. Sabenerna, ieu anu urang utamana diperjuangkeun. Kalawan toleransi lepat, sagalana tétéla hébat dieu.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Hiji mobil mogok.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Henteu masalah! Insinyur sistem malah moal hudang wengi, anjeunna bakal ngantosan dugi ka énjing, moal aya anu goréng.

Upami mesin ieu gagal, antrian henteu teratur, teu aya masalah ogé, log ngan ukur bakal akumulasi heula dina mesin hirup, teras éta bakal ditambah kana antrian, teras kana mobil anu bakal. balik kana operasi sanggeus sababaraha waktu.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Hal anu sami sareng pangropéa. Urang ngan saukur mareuman salah sahiji mesin, sacara manual narik eta kaluar tina sagala pools, eta eureun narima lalulintas, urang ngalakukeun sababaraha jenis pangropéa, urang ngédit hal, lajeng urang balikkeun ka layanan, sarta cadangan ieu nyekel up rada gancang. Jelema. per poé, downtime hiji mobil nyekel up dina sababaraha menit. Ieu bener pisan saeutik. Kalayan kasabaran kasalahan, kuring nyarios deui, sadayana di dieu.

Naon conclusions bisa dicokot tina skéma redundancy ieu?

Kami ngagaduhan toleransi kasalahan.

Gampang dianggo. Kusabab mesin gaduh hard drive lokal, ieu langkung merenah tina sudut pandang operasional pikeun insinyur anu damel sareng éta.

Simkuring nampi sangu bacaan ganda.

Ieu bonus pohara alus salian kasabaran sesar.

Tapi aya ogé masalah. Ayeuna urang gaduh pamekaran anu langkung kompleks tina sababaraha fitur anu aya hubunganana sareng ieu, sabab sistemna parantos 100% antukna konsisten.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Urang kedah, sebutkeun, dina sababaraha padamelan latar, teras-terasan mikir: "Server naon anu urang jalankeun ayeuna?", "Naha leres-leres aya poto ayeuna di dieu?" jsb. Ieu, tangtosna, sadayana dibungkus, sareng pikeun programer anu nyerat logika bisnis, éta transparan. Tapi, sanajan kitu, lapisan kompléks badag ieu geus mucunghul. Tapi kami siap nempatkeun up kalawan ieu di tukeran pikeun goodies nu urang nampi ti eta.

Sarta di dieu deui sababaraha konflik timbul.

Cenah mah di awal nu nyimpen sagalana dina hard drive lokal goréng. Tur ayeuna kuring nyebutkeun yen urang resep eta.

Leres, memang, kana waktosna kaayaan parantos robih, sareng ayeuna pendekatan ieu ngagaduhan seueur kauntungan. Firstly, urang meunang operasi leuwih basajan.

Bréh, éta leuwih produktif, sabab urang teu boga ieu controller otomatis atawa sambungan kana rak disk.

Aya jumlah badag mesin aya, sarta ieu ngan sababaraha disk nu dirakit dieu dina mesin kana razia a.

Tapi aya ogé kalemahan.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Ieu kirang langkung 1,5 kali langkung mahal tibatan nganggo SAN bahkan dina harga ayeuna. Ku alatan éta, urang mutuskeun teu boldly ngarobah sakabéh klaster badag urang kana mobil jeung hard drive lokal sarta mutuskeun ninggalkeun solusi hibrid.

Satengah tina mesin urang tiasa dianggo sareng hard drive (saé, sanés satengah - sigana 30 persen). Sareng sésana mangrupikeun mobil kuno anu ngagaduhan skéma reservasi munggaran. Urang ngan saukur remounted aranjeunna, saprak urang teu butuh data anyar atawa nanaon sejenna, urang ngan dipindahkeun mounts ti hiji host fisik ka dua.

Sarta kami ayeuna boga stock badag bacaan, sarta kami dilegakeun eta. Lamun saméméhna urang dipasang hiji gudang dina hiji mesin, ayeuna urang Gunung opat, contona, dina hiji pasangan. Sarta gawéna rupa.

Hayu urang nyandak kasimpulan ringkes naon anu urang laksanakeun, naon anu urang perjuangkeun, sareng naha urang suksés.

hasil

Urang boga pamaké - saloba 33 juta.

Kami ngagaduhan tilu titik ayana - Praha, Rajana, Hong Kong.

Éta ngandung lapisan cache, nu diwangun ku mobil jeung disk lokal gancang (SSDs), nu mesin basajan ti NGINX, access.log na Python daemons ngajalankeun, nu ngolah sagala ieu jeung ngatur cache nu.

Upami anjeun hoyong, anjeun aya dina proyék anjeun, upami poto henteu kritis pikeun anjeun sapertos aranjeunna pikeun kami, atanapi upami kontrol trade-off versus laju pamekaran sareng biaya sumber daya aya dina arah anu sanés pikeun anjeun, maka anjeun tiasa aman ngagentosana. kalawan CDN a, CDNs modern aranjeunna lakukeun ogé.

Salajengna asalna lapisan panyimpen, dimana urang gaduh klaster pasang mesin anu nyadangkeun silih, file asynchronously disalin ti hiji ka nu sejen iraha wae aranjeunna robah.

Sumawona, sababaraha mesin ieu tiasa dianggo sareng hard drive lokal.

Sababaraha mesin ieu disambungkeun ka SANs.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Sareng, di hiji sisi, éta langkung gampang dianggo sareng sakedik langkung produktif, di sisi anu sanés, éta merenah dina hal dénsitas panempatan sareng harga per gigabyte.

Ieu mangrupikeun gambaran ringkes ngeunaan arsitéktur naon anu urang kéngingkeun sareng kumaha éta sadayana dikembangkeun.

Sababaraha tips deui ti kaptén, basajan pisan.

Kahiji, lamun ujug-ujug mutuskeun yén anjeun urgently kudu ningkatkeun sagalana dina infrastruktur poto Anjeun, ngukur heula, sabab sugan nanaon kudu ningkat.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Hayu atuh masihan anjeun conto. Simkuring boga klaster mesin nu ngirim poto ti kantétan dina obrolan, sarta skéma geus digawé di dinya saprak 2009, sarta taya sahijieun nalangsara ti eta. Sadayana saé, sadayana resep sadayana.

Pikeun ngukur, mimiti ngagantung sakumpulan métrik, tingali aranjeunna, teras mutuskeun naon anu anjeun henteu resep sareng naon anu kedah dironjatkeun. Dina raraga ngukur ieu, urang boga alat tiis disebut Pinba.

Éta ngamungkinkeun anjeun pikeun ngumpulkeun statistik anu detil pisan tina NGINX pikeun unggal pamundut sareng kode réspon, sareng distribusi waktos - naon waé anu anjeun pikahoyong. Éta gaduh beungkeutan kana sagala jinis sistem analitik anu béda, teras anjeun tiasa ningal sadayana kalayan saé.

Mimiti urang ngukur éta, teras urang ningkatkeun éta.

Salajengna. Kami ngaoptimalkeun maca nganggo cache, nyerat nganggo sharding, tapi ieu mangrupikeun titik anu jelas.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Salajengna. Upami anjeun nembé mimiti ngawangun sistem anjeun, langkung saé ngajantenkeun poto salaku file anu teu tiasa dirobih. Kusabab anjeun langsung leungit sakabeh kelas masalah sareng invalidation cache, kalawan kumaha logika kudu manggihan versi bener poto, jeung saterusna.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Anggap anjeun unggah saratus, teras puterkeun, jantenkeun éta file anu béda sacara fisik. Jelema. teu kudu mikir: ayeuna kuring bakal ngahemat spasi saeutik, nulis ka file sarua, ngarobah versi. Ieu salawasna teu dianggo ogé sarta ngabalukarkeun loba headaches engké.

titik salajengna. Ngeunaan ukuran dina laleur.

Saméméhna, nalika pamaké diunggah poto, urang geuwat motong kebat sakabeh ukuran pikeun sakabéh kali, pikeun klien béda, sarta aranjeunna sadayana dina disk. Ayeuna kami parantos ngantunkeun ieu.

Urang ngan ukur tinggalkeun tilu ukuran utama: leutik, sedeng sareng ageung. Urang saukur downscale sagalana sejenna tina ukuran nu aya di tukangeun hiji nu ditanya ka kami di Uport, urang saukur ngalakukeun downscale tur masihan ka pamaké.

CPU tina lapisan cache di dieu tétéla langkung mirah tibatan upami urang terus-terusan ngarobih ukuran ieu dina unggal panyimpenan. Hayu urang nyebutkeun urang hoyong tambahkeun nu anyar, ieu bakal butuh sabulan - ngajalankeun skrip madhab anu bakal ngalakukeun sagala ieu rapih, tanpa ngancurkeun klaster. Jelema. Upami Anjeun gaduh kasempetan pikeun milih ayeuna, eta leuwih hade nyieun sababaraha ukuran fisik sabisa, tapi ku kituna sahenteuna sababaraha sebaran, sebutkeun, tilu. Sareng sadaya anu sanésna tiasa ngan ukur ukuranana dina laleur nganggo modul anu siap-siap. Éta sadayana gampang pisan sareng tiasa diaksés ayeuna.

Sareng cadangan asynchronous incremental saé.

Sakumaha anu dipidangkeun ku prakték urang, skéma ieu tiasa dianggo saé kalayan nyalin file anu tos ditunda.

Arsitéktur pikeun nyimpen sareng ngabagi poto dina Badoo

Titik panungtungan ogé atra. Upami infrastruktur anjeun henteu ngagaduhan masalah sapertos ayeuna, tapi aya anu tiasa rusak, éta pasti bakal rusak nalika janten sakedik deui. Ku alatan éta, leuwih sae pikeun mikir ngeunaan ieu sateuacanna jeung teu ngalaman masalah jeung eta. Sakitu waé anu kuring hoyong nyarios.

kontak

» bo0rsh201
» Blog Badoo

Laporan ieu mangrupikeun transkrip salah sahiji pidato anu pangsaéna dina konperénsi pamekar sistem beban tinggi HighLoad ++. Aya kirang ti sabulan ditinggalkeun nepi ka HighLoad ++ 2017 konferensi.

Kami parantos siap program Konférénsi, jadwal ayeuna keur aktip kabentuk.

Taun ieu urang terus ngajalajah topik arsitéktur sareng skala:

Urang ogé ngagunakeun sababaraha bahan ieu dina kursus palatihan online urang dina ngamekarkeun sistem beban tinggi HighLoad.Panungtun mangrupa ranté tina hurup husus dipilih, artikel, bahan, video. Buku ajar urang parantos ngandung langkung ti 30 bahan anu unik. Nyambung!

sumber: www.habr.com

Tambahkeun komentar