One-cloud - OS tingkat pusat data ing Odnoklassniki

One-cloud - OS tingkat pusat data ing Odnoklassniki

Aloha, wong! Jenengku Oleg Anastasyev, aku kerja ing Odnoklassniki ing tim Platform. Lan saliyane aku, ana akeh hardware sing digunakake ing Odnoklassniki. Kita duwe papat pusat data kanthi udakara 500 rak kanthi luwih saka 8 ewu server. Ing titik tartamtu, kita nyadari yen introduksi sistem manajemen anyar bakal ngidini kita mbukak peralatan kanthi luwih efisien, nggampangake manajemen akses, ngotomatisasi (re) distribusi sumber daya komputasi, nyepetake peluncuran layanan anyar, lan nyepetake respon. kanggo kacilakan gedhe-gedhe.

Apa teka saka iku?

Saliyane aku lan akeh hardware, ana uga wong sing nggarap hardware iki: insinyur sing langsung ana ing pusat data; jaringan sing nyiyapake piranti lunak jaringan; administrator, utawa SRE, sing nyedhiyakake ketahanan infrastruktur; lan tim pangembangan, saben wong tanggung jawab kanggo bagean saka fungsi portal. Piranti lunak sing digawe kaya mangkene:

One-cloud - OS tingkat pusat data ing Odnoklassniki

Panjaluk pangguna ditampa loro ing ngarep portal utama www.ok.ru, lan liyane, contone ing ngarep API music. Kanggo ngolah logika bisnis, dheweke nelpon server aplikasi, sing, nalika ngolah panjaluk kasebut, nelpon layanan mikro khusus sing dibutuhake - grafik siji (grafik sambungan sosial), cache pangguna (cache profil pangguna), lsp.

Saben layanan kasebut disebarake ing akeh mesin, lan saben wong duwe pangembang sing tanggung jawab kanggo fungsi modul, operasi lan pangembangan teknologi. Kabeh layanan kasebut mbukak ing server hardware, lan nganti saiki, kita ngluncurake siji tugas saben server, yaiku khusus kanggo tugas tartamtu.

Kok ngono? Pendekatan iki nduweni sawetara kaluwihan:

  • lega manajemen massa. Ayo dadi tugas mbutuhake sawetara perpustakaan, sawetara setelan. Lan banjur server diutus kanggo persis siji klompok tartamtu, kabijakan cfengin kanggo grup iki diterangake (utawa wis diterangake), lan konfigurasi iki tengah lan otomatis mbalek metu kanggo kabeh server ing grup iki.
  • Sederhana diagnostik. Ayo dadi ngomong sing katon ing mbukak tambah ing prosesor tengah lan éling sing mbukak iki mung bisa kui dening tugas sing mlaku ing prosesor hardware iki. Panelusuran kanggo wong kanggo nyalahke ends banget cepet.
  • Sederhana ngawasi. Yen ana sing salah karo server, monitor laporan, lan sampeyan ngerti persis sing kudu disalahake.

Layanan sing dumadi saka sawetara replika diparengake sawetara server - siji kanggo saben. Banjur sumber daya komputasi kanggo layanan kasebut diparengake kanthi gampang: jumlah server sing diduweni layanan, jumlah maksimum sumber daya sing bisa dikonsumsi. "Gampang" ing kene ora ateges gampang digunakake, nanging yen alokasi sumber daya ditindakake kanthi manual.

Pendekatan iki uga ngidini kita nindakake konfigurasi wesi khusus kanggo tugas mlaku ing server iki. Yen tugas nyimpen akeh data, banjur kita nggunakake server 4U karo sasis karo 38 disk. Yen tugas kasebut murni komputasi, mula kita bisa tuku server 1U sing luwih murah. Iki efisien komputasi. Antarane liyane, pendekatan iki ngidini kita nggunakake mesin kaping papat luwih sithik kanthi beban sing bisa dibandhingake karo jaringan sosial sing ramah.

Efisiensi kasebut ing panggunaan sumber daya komputasi uga kudu njamin efisiensi ekonomi, yen kita nerusake saka premis sing paling larang yaiku server. Kanggo dangu, hardware paling larang, lan kita sijine akèh efforts kanggo ngurangi rega hardware, teka munggah karo kalkulus toleransi fault kanggo nyuda syarat linuwih hardware. Lan dina iki kita wis tekan tataran ing ngendi rega server wis mandhek kanggo nemtokake. Yen sampeyan ora nganggep eksotik paling anyar, mula konfigurasi spesifik server ing rak ora masalah. Saiki kita duwe masalah liyane - rega papan sing dikuwasani server ing pusat data, yaiku papan ing rak.

Sadhar sing iki cilik, kita mutusaké kanggo ngetung carane èfèktif kita padha nggunakake rak.
Kita njupuk rega server paling kuat saka sing bisa ditrapake kanthi ekonomi, ngitung jumlah server sing bisa dilebokake ing rak, pira tugas sing bakal ditindakake adhedhasar model lawas "siji server = siji tugas" lan pira. tugas bisa nggunakake peralatan. Padha ngetung lan ngeculaké luh. Pranyata efisiensi kita nggunakake rak kira-kira 11%. Kesimpulane jelas: kita kudu nambah efisiensi nggunakake pusat data. Mesthine solusi kasebut jelas: sampeyan kudu nindakake sawetara tugas ing siji server sekaligus. Nanging ing kene angel diwiwiti.

Konfigurasi massa dadi luwih rumit - saiki ora bisa nemtokake klompok siji menyang server. Sawise kabeh, saiki sawetara tugas saka perintah sing beda bisa diluncurake ing siji server. Kajaba iku, konfigurasi bisa uga bertentangan kanggo macem-macem aplikasi. Diagnosis uga dadi luwih rumit: yen sampeyan ndeleng tambah konsumsi CPU utawa disk ing server, sampeyan ora ngerti tugas sing nyebabake masalah.

Nanging sing utama yaiku ora ana pamisahan ing antarane tugas sing mlaku ing mesin sing padha. Ing kene, contone, minangka grafik wektu respon rata-rata tugas server sadurunge lan sawise aplikasi komputasi liyane diluncurake ing server sing padha, ora ana hubungane karo sing pisanan - wektu nanggepi tugas utama wis tambah akeh.

One-cloud - OS tingkat pusat data ing Odnoklassniki

Temenan, sampeyan kudu mbukak tugas ing wadhah utawa ing mesin virtual. Amarga meh kabeh tugas kita mlaku ing siji OS (Linux) utawa diadaptasi kanggo iku, kita ora perlu ndhukung akeh sistem operasi beda. Mulane, virtualisasi ora dibutuhake amarga overhead tambahan, bakal kurang efisien tinimbang containerization.

Minangka implementasine saka wadhah kanggo mbukak tugas langsung ing server, Docker minangka calon sing apik: gambar sistem file ngatasi masalah karo konfigurasi sing bertentangan kanthi apik. Kasunyatan manawa gambar bisa dumadi saka sawetara lapisan ngidini kita nyuda jumlah data sing dibutuhake kanggo nyebarake ing infrastruktur kasebut, misahake bagean umum dadi lapisan dhasar sing kapisah. Banjur lapisan dhasar (lan paling akeh) bakal di-cache kanthi cepet ing kabeh infrastruktur, lan kanggo ngirim macem-macem jinis aplikasi lan versi, mung lapisan cilik sing kudu ditransfer.

Kajaba iku, registri sing wis siap lan tag gambar ing Docker menehi kita primitif sing wis siap kanggo versi lan ngirim kode menyang produksi.

Docker, kaya teknologi liyane sing padha, nyedhiyakake sawetara tingkat isolasi wadhah metu saka kothak. Contone, isolasi memori - saben wadhah diwenehi watesan ing nggunakake memori mesin, ngluwihi kang ora bakal nganggo. Sampeyan uga bisa ngisolasi kontaner adhedhasar panggunaan CPU. Nanging, kanggo kita, insulasi standar ora cukup. Nanging luwih ing ngisor iki.

Kontainer sing langsung mlaku ing server mung dadi masalah. Sisih liyane ana gandhengane karo wadah hosting ing server. Sampeyan kudu ngerti sing wadhah bisa diselehake ing server. Iki dudu tugas sing gampang, amarga kontaner kudu diselehake ing server kanthi padhet tanpa nyuda kacepetan. Penempatan kasebut uga bisa angel saka sudut pandang toleransi kesalahan. Asring kita pengin nyelehake replika layanan sing padha ing rak sing beda-beda utawa malah ing macem-macem kamar ing pusat data, supaya yen rak utawa kamar gagal, kita ora langsung ilang kabeh replika layanan.

Distribusi kontaner kanthi manual ora dadi pilihan yen sampeyan duwe 8 ewu server lan 8-16 ewu kontaner.

Kajaba iku, kita pengin menehi pangembang kamardikan luwih akeh babagan alokasi sumber daya supaya bisa dadi tuan rumah layanan ing produksi dhewe, tanpa bantuan administrator. Ing wektu sing padha, kita pengin njaga kontrol supaya sawetara layanan cilik ora nggunakake kabeh sumber daya pusat data kita.

Temenan, kita butuh lapisan kontrol sing bakal nindakake iki kanthi otomatis.

Dadi kita teka menyang gambar prasaja lan dingerteni sing kabeh arsitek Sungkem: telung kothak.

One-cloud - OS tingkat pusat data ing Odnoklassniki

master siji-awan minangka kluster failover sing tanggung jawab kanggo orkestrasi awan. Pangembang ngirim manifest menyang master, sing ngemot kabeh informasi sing dibutuhake kanggo dadi tuan rumah layanan kasebut. Adhedhasar kasebut, master menehi prentah marang minions sing dipilih (mesin sing dirancang kanggo mbukak wadhah). Minion duwe agen kita, sing nampa perintah kasebut, ngetokake perintah kasebut menyang Docker, lan Docker ngonfigurasi kernel linux kanggo mbukak wadhah sing cocog. Saliyane nglakokake perintah, agen terus-terusan nglaporake marang master babagan owah-owahan ing kahanan mesin minion lan wadhah sing mlaku.

Alokasi sumber daya

Saiki ayo goleki masalah alokasi sumber daya sing luwih rumit kanggo akeh minions.

Sumber daya komputasi ing awan siji yaiku:

  • Jumlah daya prosesor sing digunakake kanggo tugas tartamtu.
  • Jumlah memori kasedhiya kanggo tugas.
  • lalu lintas jaringan. Saben minions duwe antarmuka jaringan tartamtu kanthi bandwidth winates, saengga ora bisa nyebarake tugas tanpa njupuk jumlah data sing dikirim liwat jaringan.
  • Disk. Kajaba iku, kanthi jelas, kanggo papan kanggo tugas kasebut, kita uga nyedhiyakake jinis disk: HDD utawa SSD. Disk bisa nglayani sawetara panjalukan per detik - IOPS. Mulane, kanggo tugas sing ngasilake IOPS luwih akeh tinimbang sing bisa ditangani siji disk, kita uga nyedhiyakake "spindles" - yaiku, piranti disk sing kudu dilindhungi undhang-undhang khusus kanggo tugas kasebut.

Banjur kanggo sawetara layanan, contone kanggo cache pangguna, kita bisa ngrekam sumber daya sing dikonsumsi kanthi cara iki: 400 inti prosesor, memori 2,5 TB, lalu lintas 50 Gbit / s ing loro arah, ruang HDD 6 TB sing ana ing 100 spindle. Utawa ing wangun sing luwih akrab kaya iki:

alloc:
    cpu: 400
    mem: 2500
    lan_in: 50g
    lan_out: 50g
    hdd:100x6T

Sumber daya layanan pangguna-cache mung nggunakake bagean saka kabeh sumber daya sing kasedhiya ing infrastruktur produksi. Mulane, aku pengin mesthekake yen dumadakan, amarga kesalahan operator utawa ora, pangguna-cache ora nggunakake sumber daya luwih akeh tinimbang sing diparengake. Tegese, kita kudu mbatesi sumber daya. Nanging apa sing bisa kita dasi kuota?

Ayo bali menyang diagram interaksi komponen sing disederhanakake lan gambar maneh kanthi rincian liyane - kaya iki:

One-cloud - OS tingkat pusat data ing Odnoklassniki

Apa sing narik mripat:

  • Frontend web lan musik nggunakake klompok terisolasi saka server aplikasi sing padha.
  • Kita bisa mbedakake lapisan logis sing kalebu klompok kasebut: ngarep, cache, panyimpenan data lan lapisan manajemen.
  • Frontend iku heterogen; kasusun saka subsistem fungsional sing beda.
  • Cache uga bisa kasebar ing subsistem sing data sing disimpen.

Ayo gambar maneh gambar kasebut:

One-cloud - OS tingkat pusat data ing Odnoklassniki

Bah! Ya, kita ndeleng hirarki! Iki tegese sampeyan bisa nyebarake sumber daya ing potongan luwih gedhe: nemtokake pangembang sing tanggung jawab menyang simpul hirarki iki sing cocog karo subsistem fungsional (kayata "musik" ing gambar), lan masang kuota menyang tingkat hirarki sing padha. Hierarki iki uga ngidini kita ngatur layanan kanthi luwih fleksibel supaya gampang ngatur. Contone, kita dibagi kabeh web, amarga iki minangka klompok server sing akeh banget, dadi sawetara klompok cilik, ditampilake ing gambar minangka grup1, grup2.

Kanthi mbusak garis ekstra, kita bisa nulis saben simpul gambar ing wangun sing luwih rata: grup1.web.ngarep, api.music.front, pangguna-cache.cache.

Iki carane kita teka menyang konsep "antri hirarkis". Wis jeneng kaya "group1.web.front". Kuota kanggo sumber daya lan hak pangguna ditugasake. Kita bakal menehi wong saka DevOps hak kanggo ngirim layanan menyang antrian, lan pegawe kuwi bisa miwiti soko ing antrian, lan wong saka OpsDev bakal duwe hak admin, lan saiki bisa ngatur antrian, nemtokake wong ana, menehi hak wong iki, etc. Layanan mlaku ing antrian iki bakal mbukak ing kuota antrian kang. Yen kuota komputasi antrian ora cukup kanggo nglakokake kabeh layanan bebarengan, banjur bakal dieksekusi kanthi urutan, saéngga mbentuk antrian kasebut.

Ayo ndeleng kanthi luwih rinci babagan layanan kasebut. A layanan duwe jeneng lengkap qualified, kang tansah kalebu jeneng antrian. Banjur layanan web ngarep bakal duwe jeneng ok-web.group1.web.front. Lan layanan server aplikasi sing diakses bakal disebut ok-app.group1.web.front. Saben layanan nduweni manifest, sing nemtokake kabeh informasi sing perlu kanggo panggonan ing mesin tartamtu: carane akeh sumber daya sing digunakake kanggo tugas iki, apa konfigurasi dibutuhake, carane akeh replika kudu ana, sifat kanggo nangani gagal layanan iki. Lan sawise layanan diselehake langsung ing mesin, kedadeyan kasebut katon. Dheweke uga dijenengi kanthi jelas - minangka nomer conto lan jeneng layanan: 1.ok-web.group1.web.front, 2.ok-web.group1.web.front, …

Iki trep banget: kanthi ndeleng mung jeneng wadah sing mlaku, kita bisa langsung ngerteni akeh.

Saiki ayo ndeleng kanthi luwih rinci babagan apa sing ditindakake kedadeyan kasebut: tugas.

Kelas Isolasi Tugas

Kabeh tugas ing OK (lan, mbokmenawa, ing endi wae) bisa dipérang dadi klompok:

  • Tugas Latency Short - prod. Kanggo tugas lan layanan kasebut, wektu tundha respon (latency) penting banget, sepira cepet saben panjalukan bakal diproses dening sistem. Conto tugas: ngarep web, cache, server aplikasi, panyimpenan OLTP, lsp.
  • Masalah pitungan - batch. Ing kene, kacepetan pangolahan saben panyuwunan tartamtu ora penting. Kanggo wong-wong mau, iku penting carane akeh petungan tugas iki bakal nindakake ing tartamtu (dawa) wektu (throughput). Iki bakal dadi tugas MapReduce, Hadoop, pembelajaran mesin, statistik.
  • Tugas latar mburi - nganggur. Kanggo tugas kasebut, latensi utawa throughput ora penting banget. Iki kalebu macem-macem tes, migrasi, recalculations, lan konversi data saka siji format liyane. Ing tangan siji, padha karo sing diwilang, ing tangan liyane, ora masalah kanggo kita sepira cepet rampung.

Ayo ndeleng carane tugas kuwi nggunakake sumber daya, contone, prosesor tengah.

Tugas tundha cendhak. Tugas kasebut bakal duwe pola konsumsi CPU sing padha karo iki:

One-cloud - OS tingkat pusat data ing Odnoklassniki

Panjalukan saka pangguna ditampa kanggo diproses, tugas kasebut wiwit nggunakake kabeh inti CPU sing kasedhiya, ngolah, ngasilake respon, ngenteni panjaluk sabanjure lan mandheg. Panjaluk sabanjure teka - maneh kita milih kabeh sing ana, ngitung, lan ngenteni sing sabanjure.

Kanggo njamin latensi minimal kanggo tugas kasebut, kita kudu njupuk sumber daya maksimum sing dikonsumsi lan nylametake jumlah inti sing dibutuhake ing minion (mesin sing bakal nglakokake tugas kasebut). Banjur rumus reservasi kanggo masalah kita bakal kaya ing ngisor iki:

alloc: cpu = 4 (max)

lan yen kita duwe mesin minion karo 16 intine, banjur persis papat tugas kuwi bisa diselehake ing. We utamané Wigati sing konsumsi prosesor rata-rata tugas kuwi asring banget kurang - kang ketok, wiwit bagean pinunjul saka wektu tugas ngenteni panjalukan lan ora nindakake apa-apa.

Tugas pitungan. Pola kasebut bakal rada beda:

One-cloud - OS tingkat pusat data ing Odnoklassniki

Konsumsi sumber daya CPU rata-rata kanggo tugas kasebut cukup dhuwur. Asring kita pengin tugas pitungan rampung ing wektu tartamtu, supaya kita kudu cadangan nomer minimal pemroses perlu supaya kabeh pitungan rampung ing wektu ditrima. Rumus reservasi bakal katon kaya iki:

alloc: cpu = [1,*)

"Mangga diselehake ing minion sing paling ora ana siji inti gratis, banjur akeh sing ana, bakal mangan kabeh."

Ing kene efisiensi panggunaan wis luwih apik tinimbang tugas kanthi wektu tundha sing cendhak. Nanging gain bakal luwih akeh yen sampeyan gabungke loro jinis tugas ing siji mesin minion lan disebaraké sumber daya ing Go. Nalika tugas karo wektu tundha cendhak mbutuhake prosesor, iku langsung ditampa, lan nalika sumber daya ora perlu maneh, padha ditransfer kanggo tugas komputasi, IE kaya iki:

One-cloud - OS tingkat pusat data ing Odnoklassniki

Nanging kepiye carane nggawe?

Pisanan, ayo kang katon ing prod lan alloc sawijining: cpu = 4. We kudu cadangan papat intine. Ing Docker run iki bisa ditindakake kanthi rong cara:

  • Nggunakake pilihan --cpuset=1-4, IE nyedhiakke papat intine tartamtu ing mesin kanggo tugas.
  • Gunakake --cpuquota=400_000 --cpuperiod=100_000, nemtokake kuota kanggo wektu prosesor, IE nunjukaké sing saben 100 ms wektu nyata tugas nganggo ora luwih saka 400 ms wektu prosesor. Papat inti padha dijupuk.

Nanging endi saka metode kasebut sing cocog?

cpuset katon cukup atraktif. Tugas kasebut duwe papat intine khusus, tegese cache prosesor bakal bisa digunakake kanthi efisien. Iki uga duwe kekurangan: kita kudu nindakake tugas nyebarake kalkulasi ing intine mesin sing dibongkar tinimbang OS, lan iki minangka tugas sing ora pati penting, utamane yen kita nyoba nglebokake tugas batch kaya ngono. mesin. Tes wis nuduhake yen pilihan karo kuota luwih cocog ing kene: kanthi cara iki sistem operasi luwih bebas milih inti kanggo nindakake tugas ing wektu saiki lan wektu prosesor disebarake kanthi luwih efisien.

Ayo ngerteni carane nggawe reservasi ing Docker adhedhasar jumlah inti minimal. Kuota kanggo tugas batch wis ora ditrapake maneh, amarga ora perlu mbatesi maksimal, cukup mung njamin minimal. Lan ing kene pilihan cocok docker run --cpushares.

Kita sarujuk yen kumpulan mbutuhake jaminan kanggo paling siji inti, banjur kita nunjukaké --cpushares=1024, lan yen ana ing paling loro intine, banjur kita nunjukaké --cpushares=2048. Enggo bareng CPU ora ngganggu ing sembarang cara karo distribusi wektu prosesor anggere ana cukup. Mangkono, yen prod saiki ora nggunakake kabeh papat intine, ora ana sing mbatesi tugas kumpulan, lan bisa nggunakake wektu prosesor tambahan. Nanging ing kahanan sing ana kekurangan prosesor, yen prod wis ngonsumsi kabeh papat inti lan wis tekan kuota, wektu prosesor sing isih bakal dipérang proporsional kanggo cpushares, yaiku ing kahanan telung inti gratis, siji bakal dadi. diwenehi tugas karo 1024 cpushares, lan loro isih bakal diwenehi tugas karo 2048 cpushares.

Nanging nggunakake kuota lan saham ora cukup. Kita kudu mesthekake yen tugas karo wektu tundha cendhak nampa prioritas saka tugas kumpulan nalika allocating wektu prosesor. Tanpa prioritization kuwi, tugas kumpulan bakal njupuk kabeh wektu prosesor ing wayahe nalika dibutuhake dening prod. Ora ana pilihan prioritas wadhah ing Docker run, nanging kabijakan panjadwal CPU Linux migunani. Sampeyan bisa maca babagan dheweke kanthi rinci kene, lan ing kerangka artikel iki kita bakal ngrembug kanthi ringkes:

  • SCHED_OTHER
    Kanthi gawan, kabeh pangolahan pangguna normal ing mesin Linux nampa.
  • SCHED_BATCH
    Dirancang kanggo proses intensif sumber daya. Nalika nempatake tugas ing prosesor, sing diarani paukuman aktivasi dienalake: tugas kasebut kurang kamungkinan kanggo nampa sumber daya prosesor yen saiki digunakake dening tugas karo SCHED_OTHER
  • SCHED_IDLE
    Proses latar mburi kanthi prioritas kurang, malah luwih murah tinimbang -19. Kita nggunakake perpustakaan open source siji-nio, kanggo nyetel kabijakan sing dibutuhake nalika miwiti wadhah kanthi nelpon

one.nio.os.Proc.sched_setscheduler( pid, Proc.SCHED_IDLE )

Nanging sanajan sampeyan ora program ing Jawa, bab sing padha bisa rampung nggunakake printah chrt:

chrt -i 0 $pid

Ayo ngringkes kabeh tingkat isolasi dadi siji tabel supaya luwih jelas:

Kelas insulasi
Tuladha Alloc
Pilihan docker run
sched_setscheduler chrt*

Prod
cpu = 4
--cpuquota=400000 --cpuperiod=100000
SCHED_OTHER

Batch
Cpu = [1, *)
--cpushares=1024
SCHED_BATCH

Idle
Cpu = [2, *)
--cpushares=2048
SCHED_IDLE

* Yen sampeyan nindakake chrt saka njero wadhah, sampeyan butuh kemampuan sys_nice, amarga kanthi standar Docker mbusak kemampuan iki nalika miwiti wadhah kasebut.

Nanging tugas nganggo ora mung prosesor, nanging uga lalu lintas, sing mengaruhi latensi tugas jaringan malah luwih saka alokasi sumber daya prosesor sing salah. Mulane, kita mesthi pengin entuk gambar sing padha kanggo lalu lintas. Yaiku, nalika tugas prod ngirim sawetara paket menyang jaringan, kita mbatesi kacepetan maksimal (formula alloc: lan=[*,500mbps) ), karo prod sing bisa nindakake iki. Lan kanggo batch kita njamin mung throughput minimal, nanging ora mbatesi maksimal (formula alloc: lan=[10Mbps,*) ) Ing kasus iki, lalu lintas prod kudu entuk prioritas tinimbang tugas kumpulan.
Ing kene Docker ora duwe primitif sing bisa digunakake. Nanging teka kanggo bantuan kita Kontrol Lalu Lintas Linux. Kita bisa entuk asil sing dikarepake kanthi bantuan disiplin Kurva Layanan Adil Hierarkis. Kanthi bantuan, kita mbedakake rong kelas lalu lintas: prod prioritas dhuwur lan batch / idle prioritas kurang. Akibaté, konfigurasi kanggo lalu lintas metu kaya iki:

One-cloud - OS tingkat pusat data ing Odnoklassniki

kene 1: 0 punika "qdisc ROOT" saka disiplin hsfc; 1: 1 - kelas anak hsfc kanthi watesan bandwidth total 8 Gbit / s, ing ngendi kelas anak kabeh wadhah diselehake; 1: 2 - kelas anak hsfc umum kanggo kabeh tugas kumpulan lan nganggur kanthi watesan "dinamis", sing dibahas ing ngisor iki. Kelas anak hsfc sing isih ana yaiku kelas khusus kanggo kontainer prod sing saiki nganggo watesan sing cocog karo manifestasi - 450 lan 400 Mbit/s. Saben kelas hsfc diwenehi antrian qdisc fq utawa fq_codel, gumantung saka versi kernel Linux, supaya paket ora ilang nalika lalu lintas.

Biasane, disiplin tc dadi prioritas mung lalu lintas metu. Nanging kita uga pengin prioritize lalu lintas mlebu - sawise kabeh, sawetara tugas kumpulan bisa gampang milih kabeh saluran mlebu, nampa, contone, kumpulan gedhe saka data input kanggo map&reduce. Kanggo iki kita nggunakake modul yen, sing nggawe antarmuka virtual ifbX kanggo saben antarmuka jaringan lan ngarahake lalu lintas mlebu saka antarmuka menyang lalu lintas metu ing ifbX. Salajengipun, kanggo ifbX, kabeh disiplin sing padha bisa ngontrol lalu lintas metu, sing konfigurasi hsfc bakal padha banget:

One-cloud - OS tingkat pusat data ing Odnoklassniki

Sajrone nyobi, kita ketemu metu sing hsfc nuduhake asil paling apik nalika 1: 2 kelas non-prioritas kumpulan / lalu lintas meneng diwatesi ing mesin minion kanggo ora luwih saka free lane tartamtu. Yen ora, lalu lintas non-prioritas duwe pengaruh banget marang latensi tugas prod. miniond nemtokake jumlah bandwidth gratis saiki saben detik, ngukur konsumsi lalu lintas rata-rata kabeh prod-tugas saka minion tartamtu One-cloud - OS tingkat pusat data ing Odnoklassniki lan nyuda saka bandwidth antarmuka jaringan One-cloud - OS tingkat pusat data ing Odnoklassniki karo wates cilik, i.e.

One-cloud - OS tingkat pusat data ing Odnoklassniki

Band ditetepake kanthi mandiri kanggo lalu lintas mlebu lan metu. Lan miturut nilai anyar, miniond reconfigures watesan kelas non-prioritas 1:2.

Mangkono, kita ngetrapake kabeh telung kelas isolasi: prod, batch lan idle. Kelas-kelas kasebut nduwe pengaruh banget marang karakteristik kinerja tugas. Mulane, kita mutusake kanggo nyelehake atribut iki ing ndhuwur hirarki, supaya nalika ndeleng jeneng antrian hirarkis bakal langsung jelas apa sing kita tindakake:

One-cloud - OS tingkat pusat data ing Odnoklassniki

Kabeh kanca kita web и music ngarep banjur diselehake ing hirarki ing prod. Contone, ing batch, ayo nyelehake layanan kasebut katalog musik, sing sacara periodik nyusun katalog trek saka sakumpulan file mp3 sing diunggah menyang Odnoklassniki. Conto layanan ing nganggur bakal trafo musik, sing normalake tingkat volume musik.

Kanthi baris ekstra dibusak maneh, kita bisa nulis jeneng layanan kita flatter kanthi nambahake kelas isolasi tugas kanggo mburi jeneng layanan lengkap: web.front.prod, catalog.music.batch, transformer.music.idle.

Lan saiki, ndeleng jeneng layanan kasebut, kita ora mung ngerti apa fungsi sing ditindakake, nanging uga kelas isolasi, sing tegese kritis, lsp.

Kabeh apik, nanging ana siji bebener sing pahit. Ora bisa ngisolasi tugas sing mlaku ing siji mesin.

Apa sing bisa digayuh: yen batch nggunakake kanthi intensif mung sumber daya CPU, banjur dibangun ing Linux CPU panjadwal nindakake sawijining proyek banget, lan ana sacoro prakteke ora impact ing tugas prod. Nanging yen tugas kumpulan iki wiwit aktif nggarap memori, banjur pengaruh bebarengan wis katon. Iki kedadeyan amarga tugas prod "dikumbah" saka cache memori prosesor - minangka asil, cache ilang mundhak, lan prosesor ngolah tugas prod luwih alon. Tugas kumpulan kasebut bisa nambah latensi wadhah prod khas kita kanthi 10%.

Ngisolasi lalu lintas malah luwih angel amarga kasunyatane kertu jaringan modern duwe antrian paket internal. Yen paket saka tugas kumpulan teka ing kana, mula bakal dadi sing pertama dikirim liwat kabel, lan ora ana sing bisa ditindakake.

Kajaba iku, kita nganti saiki mung bisa ngatasi masalah prioritas lalu lintas TCP: pendekatan hsfc ora bisa digunakake kanggo UDP. Lan sanajan ing kasus lalu lintas TCP, yen tugas batch ngasilake akeh lalu lintas, iki uga nambah udakara 10% ing wektu tundha tugas prod.

toleransi kesalahan

Salah sawijining tujuan nalika ngembangake awan siji yaiku nambah toleransi kesalahan Odnoklassniki. Mula, sabanjure aku pengin nimbang luwih rinci babagan skenario kegagalan lan kacilakan. Ayo dadi miwiti karo skenario prasaja - Gagal wadhah.

Wadhah kasebut bisa gagal kanthi pirang-pirang cara. Iki bisa uga ana sawetara jinis eksperimen, bug utawa kesalahan ing manifest, amarga tugas prod wiwit nggunakake sumber daya luwih akeh tinimbang sing dituduhake ing manifest. Kita duwe kasus: pangembang ngetrapake siji algoritma sing rumit, ngolah maneh kaping pirang-pirang, mikirake awake dhewe lan dadi bingung nganti pungkasane masalah kasebut digulung kanthi cara sing ora pati penting. Lan wiwit tugas prod wis prioritas luwih saka kabeh liyane ing minions padha, iku wiwit nganggo kabeh sumber daya prosesor kasedhiya. Ing kahanan iki, isolasi, utawa luwih kuota wektu CPU, nyimpen dina. Yen tugas diwenehi kuota, tugas kasebut ora bakal luwih akeh. Mulane, kumpulan lan tugas prod liyane sing mlaku ing mesin sing padha ora weruh apa-apa.

Kapindho masalah bisa wadhah Mudhun. Lan ing kene miwiti maneh kabijakan nylametake kita, kabeh wong ngerti, Docker dhewe nindakake pakaryan sing apik. Meh kabeh tugas prod duwe kabijakan tansah miwiti maneh. Kadhangkala kita nggunakake on_failure kanggo tugas kumpulan utawa kanggo debugging wadhah prod.

Apa sampeyan bisa nindakake yen kabeh minion ora kasedhiya?

Temenan, mbukak wadhah ing mesin liyane. Sisih menarik ing kene yaiku apa sing kedadeyan ing alamat IP sing ditugasake ing wadhah kasebut.

Kita bisa nemtokake kontaner alamat IP sing padha karo mesin minion ing ngendi wadah kasebut mbukak. Banjur, nalika wadhah diluncurake ing mesin liyane, alamat IP kasebut ganti, lan kabeh klien kudu ngerti manawa wadhah kasebut wis pindhah, lan saiki kudu pindhah menyang alamat sing beda, sing mbutuhake layanan Penemuan Layanan sing kapisah.

Service Discovery trep. Ana akeh solusi ing pasar kanthi macem-macem tingkat toleransi kesalahan kanggo ngatur registri layanan. Asring solusi kasebut ngetrapake logika load balancer, nyimpen konfigurasi tambahan ing wangun panyimpenan KV, lsp.
Nanging, kita pengin ngindhari kabutuhan kanggo ngetrapake registri sing kapisah, amarga iki tegese ngenalake sistem kritis sing digunakake dening kabeh layanan ing produksi. Iki tegese iki titik potensial Gagal, lan sampeyan kudu milih utawa berkembang solusi banget fault-toleran, kang temenan banget angel, wektu-akeh lan larang.

Lan siji kekurangan liyane: supaya infrastruktur lawas bisa digunakake karo sing anyar, kita kudu nulis ulang kabeh tugas kanggo nggunakake sawetara sistem Penemuan Layanan. Ana LOT karya, lan ing sawetara panggonan iku meh mokal nalika nerangake piranti tingkat kurang sing bisa ing tingkat kernel OS utawa langsung karo hardware. Implementasi fungsi iki nggunakake pola solusi sing wis ditemtokake, kayata mobil sisih bakal tegese ing sawetara panggonan beban tambahan, ing liyane - komplikasi saka operasi lan skenario Gagal tambahan. Kita ora pengin nggawe rumit, mula kita mutusake nggunakake Service Discovery opsional.

Ing awan siji, IP ngetutake wadhah, yaiku saben conto tugas duwe alamat IP dhewe. Alamat iki "statis": ditugasake kanggo saben conto nalika layanan kasebut pisanan dikirim menyang awan. Yen layanan duwe sawetara kedadeyan sing beda-beda sajrone urip, banjur ing pungkasan bakal diwenehi alamat IP minangka akeh conto sing maksimal.

Sabanjure, alamat kasebut ora owah: ditugasake sapisan lan terus ana sajrone urip layanan ing produksi. Alamat IP ngetutake kontaner ing jaringan. Yen wadhah kasebut ditransfer menyang minion liyane, alamat kasebut bakal diterusake.

Dadi, pemetaan jeneng layanan menyang dhaptar alamat IP arang banget diganti. Yen sampeyan ndeleng maneh jeneng conto layanan sing wis kasebut ing wiwitan artikel (1.ok-web.group1.web.front.prod, 2.ok-web.group1.web.front.prod, …), kita bakal weruh manawa padha karo FQDN sing digunakake ing DNS. Sing bener, kanggo map jeneng conto layanan menyang alamat IP, kita nggunakake protokol DNS. Menapa malih, DNS iki ngasilake kabeh alamat IP sing dilindhungi saka kabeh kontaner - mlaku lan mandheg (umpamane telung replika digunakake, lan kita duwe limang alamat sing dilindhungi ing kono - kabeh lima bakal dibalekake). Klien, sawise nampa informasi iki, bakal nyoba kanggo nggawe sambungan karo kabeh limang réplika - lan kanthi mangkono nemtokake sing digunakake. Pilihan iki kanggo nemtokake kasedhiyan luwih dipercaya; ora kalebu DNS utawa Service Discovery, sing tegese ora ana masalah sing angel diatasi kanggo njamin relevansi informasi lan toleransi kesalahan sistem kasebut. Kajaba iku, ing layanan kritis sing gumantung saka operasi portal kabeh, kita ora bisa nggunakake DNS, nanging mung ngetik alamat IP menyang konfigurasi.

Ngleksanakake transfer IP kasebut ing mburi wadhah bisa uga ora pati penting - lan kita bakal ndeleng cara kerjane nganggo conto ing ngisor iki:

One-cloud - OS tingkat pusat data ing Odnoklassniki

Ayo dadi ngomong master siji-awan menehi printah kanggo minion M1 kanggo mbukak 1.ok-web.group1.web.front.prod karo alamat 1.1.1.1. Dianggo ing minion BIRD, sing ngiklanake alamat iki menyang server khusus reflektor rute. Sing terakhir duwe sesi BGP karo hardware jaringan, menyang rute alamat 1.1.1.1 ing M1 diterjemahake. M1 rute paket nang wadhah nggunakake Linux. Ana telung server reflektor rute, amarga iki minangka bagean kritis saka infrastruktur awan - tanpa kasebut, jaringan ing awan ora bakal bisa digunakake. Kita nyelehake ing rak sing beda-beda, yen bisa dumunung ing macem-macem kamar ing pusat data, kanggo nyuda kemungkinan kabeh telu gagal ing wektu sing padha.

Ayo saiki nganggep manawa sambungan antarane master awan siji lan minion M1 wis ilang. Master awan siji saiki bakal tumindak kanthi asumsi yen M1 wis gagal. Yaiku, bakal menehi prentah marang minion M2 kanggo diluncurake web.group1.web.front.prod karo alamat padha 1.1.1.1. Saiki kita duwe loro rute konflik ing jaringan kanggo 1.1.1.1: ing M1 lan ing M2. Kanggo ngatasi konflik kasebut, kita nggunakake Multi Exit Discriminator, sing ditemtokake ing woro-woro BGP. Iki minangka nomer sing nuduhake bobot rute sing diiklanake. Ing antarane rute sing bertentangan, rute kanthi nilai MED sing luwih murah bakal dipilih. Master siji-awan ndhukung MED minangka bagéan integral saka alamat IP wadhah. Kanggo pisanan, alamat kasebut ditulis kanthi MED sing cukup gedhe = 1 Ing kahanan transfer wadhah darurat kasebut, master nyuda MED, lan M000 bakal nampa prentah kanggo ngiklanake alamat 000 karo MED =. 2 Kayata mlaku ing M1.1.1.1 bakal tetep ing kasus iki ora ana sambungan, lan nasibe luwih kapentingan kita sethitik nganti sambungan karo master dibalèkaké, nalika bakal mandegake kaya njupuk lawas.

kacilakan

Kabeh sistem manajemen pusat data tansah nangani kegagalan cilik sing bisa ditampa. Wadhah overflow minangka norma meh ing endi wae.

Ayo goleki carane nangani darurat, kayata listrik mati ing siji utawa luwih kamar ing pusat data.

Apa tegese kacilakan kanggo sistem manajemen pusat data? Kaping pisanan, iki minangka kegagalan siji-wektu akeh mesin, lan sistem kontrol kudu migrasi akeh kontaner ing wektu sing padha. Nanging yen bencana gedhe banget, mula bisa uga kabeh tugas ora bisa dialokasikan maneh kanggo minions liyane, amarga kapasitas sumber daya pusat data mudhun ing ngisor 100% beban.

Asring kacilakan diiringi kegagalan lapisan kontrol. Iki bisa kedadeyan amarga gagal peralatan, nanging luwih asring amarga kasunyatane kacilakan ora dites, lan lapisan kontrol dhewe tiba amarga beban tambah.

Apa sampeyan bisa nindakake babagan kabeh iki?

Migrasi massal tegese ana akeh kegiatan, migrasi, lan penyebaran sing kedadeyan ing infrastruktur kasebut. Saben migrasi mbutuhake sawetara wektu kanggo ngirim lan mbongkar gambar wadhah menyang minions, miwiti lan miwiti kontaner, lan sapiturute. Mulane, luwih becik diluncurake tugas sing luwih penting sadurunge tugas sing kurang penting.

Ayo goleki maneh hirarki layanan sing kita kenal lan coba mutusake tugas sing arep ditindakake dhisik.

One-cloud - OS tingkat pusat data ing Odnoklassniki

Mesthi, iki minangka proses sing langsung melu ngolah panjaluk pangguna, yaiku prod. We nunjukaké iki karo prioritas panggonan - nomer sing bisa diutus kanggo antrian. Yen antrian nduweni prioritas sing luwih dhuwur, layanan kasebut dilebokake luwih dhisik.

Ing prod kita nemtokake prioritas sing luwih dhuwur, 0; ing batch - sethitik ngisor, 100; ing meneng - malah luwih murah, 200. Prioritas ditrapake hirarkis. Kabeh tugas sing luwih murah ing hirarki bakal duwe prioritas sing cocog. Yen kita pengin caches nang prod bakal dibukak sadurunge frontends, banjur kita nemtokake prioritas kanggo cache = 0 lan ing ngarep subqueues = 1. Yen, contone, kita pengin portal utama dibukak saka ngarep pisanan, lan music ngarep mung. banjur, banjur kita bisa nemtokake prioritas sing luwih murah kanggo sing terakhir - 10.

Masalah sabanjure yaiku kekurangan sumber daya. Dadi, akeh peralatan, kabeh aula pusat data, gagal, lan kita miwiti maneh akeh layanan sing saiki ora ana sumber daya sing cukup kanggo kabeh wong. Sampeyan kudu mutusake tugas sing kudu dikorbanake kanggo njaga layanan kritis utama.

One-cloud - OS tingkat pusat data ing Odnoklassniki

Ora kaya prioritas penempatan, kita ora bisa ngorbanake kabeh tugas batch kanthi sewenang-wenang, sawetara sing penting kanggo operasi portal. Mulane, kita wis disorot kanthi kapisah prioritas preemption tugas. Nalika diselehake, tugas prioritas sing luwih dhuwur bisa preempt, yaiku mungkasi, tugas prioritas sing luwih murah yen ora ana minions gratis maneh. Ing kasus iki, tugas karo prioritas kurang mbokmenawa bakal tetep unplaced, IE ora bakal ana maneh minion cocok kanggo karo sumber daya free cukup.

Ing hierarki kita, gampang banget kanggo nemtokake prioritas preemption kayata prod lan batch tugas preempt utawa mungkasi tugas nganggur, nanging ora saben liyane, kanthi nemtokake prioritas kanggo nganggur padha karo 200. Kaya ing kasus prioritas panggonan, kita bisa nggunakake hirarki kita kanggo njlèntrèhaké aturan sing luwih rumit. Contone, ayo nuduhake yen kita ngorbanake fungsi musik yen ora duwe sumber daya sing cukup kanggo portal web utama, nyetel prioritas kanggo simpul sing cocog ing ngisor: 10.

Kacilakan DC kabeh

Napa kabeh pusat data bisa gagal? unsur. Ana kiriman sing apik angin topan mengaruhi karya pusat data. Unsur kasebut bisa dianggep wong sing ora duwe omah sing nate ngobong optik ing manifold, lan pusat data ilang kontak karo situs liyane. Penyebab kegagalan uga bisa dadi faktor manungsa: operator bakal ngetokake prentah kasebut supaya kabeh pusat data bakal tiba. Iki bisa kedadeyan amarga bug gedhe. Umumé, pusat data ambruk ora umum. Iki kedadeyan saben sawetara wulan.

Lan iki sing ditindakake kanggo nyegah sapa wae saka tweeting #urip.

Strategi pisanan yaiku isolasi. Saben conto awan siji diisolasi lan bisa ngatur mesin mung ing siji pusat data. Tegese, mundhut awan amarga kewan omo utawa prentah operator sing salah yaiku kelangan mung siji pusat data. Kita siyap kanggo iki: kita duwe kabijakan redundansi sing replika aplikasi lan data ana ing kabeh pusat data. Kita nggunakake database fault-tolerant lan periodik nyoba kanggo gagal.
Wiwit dina iki, kita duwe papat pusat data, tegese patang prastawa awan siji sing kapisah lan terisolasi.

Pendekatan iki ora mung nglindhungi kegagalan fisik, nanging uga bisa nglindhungi kesalahan operator.

Apa maneh sing bisa ditindakake kanthi faktor manungsa? Nalika operator menehi awan sawetara prentah aneh utawa duweni potensi mbebayani, dumadakan bisa dijaluk kanggo ngatasi masalah cilik kanggo ndeleng carane uga panginten. Contone, yen iki sawetara jenis mandeg massa saka akeh réplika utawa mung prentah aneh - ngurangi jumlah replika utawa ngganti jeneng gambar, lan ora mung nomer versi ing manifest anyar.

One-cloud - OS tingkat pusat data ing Odnoklassniki

Hasil

Fitur khas saka awan siji:

  • Skema jeneng hirarkis lan visual kanggo layanan lan wadhah, sing ngidini sampeyan ngerteni kanthi cepet apa tugas kasebut, apa hubungane lan cara kerjane lan sapa sing tanggung jawab.
  • We aplikasi kita teknik gabungan prod dan batch-tugas ing minions kanggo nambah efficiency enggo bareng mesin. Tinimbang cpuset, kita nggunakake kuota CPU, saham, kabijakan penjadwal CPU lan QoS Linux.
  • Sampeyan ora bisa ngisolasi kontaner sing mlaku ing mesin sing padha, nanging pengaruhe tetep ana ing 20%.
  • Ngatur layanan menyang hirarki mbantu karo Recovery bilai otomatis nggunakake prioritas panggonan lan preemption.

FAQ

Napa kita ora njupuk solusi sing wis siap?

  • Kelas isolasi tugas sing beda-beda mbutuhake logika sing beda nalika diselehake ing minion. Yen tugas prod bisa diselehake kanthi mung ngreksa sumber daya, banjur tugas batch lan idle kudu diselehake, nelusuri panggunaan sumber daya ing mesin minion.
  • Perlu nimbang sumber daya sing digunakake kanggo tugas, kayata:
    • bandwidth jaringan;
    • jinis lan "spindles" saka disk.
  • Perlu kanggo nunjukake prioritas layanan sajrone respon darurat, hak lan kuota perintah kanggo sumber daya, sing ditanggulangi nggunakake antrian hirarkis ing awan siji.
  • Keperluan duwe jeneng manungsa kanggo wadhah kanggo nyuda wektu nanggepi kacilakan lan kedadeyan
  • Impossibility saka implementasine nyebar siji-wektu Service Discovery; perlu kanggo urip bebarengan kanggo dangu karo tugas tuan rumah hardware - soko sing ditanggulangi dening "statis" alamat IP ing ngisor iki kontaner, lan, minangka akibat, perlu kanggo integrasi unik karo infrastruktur jaringan gedhe.

Kabeh fungsi kasebut mbutuhake modifikasi sing signifikan saka solusi sing wis ana sing cocog karo kita, lan, sawise ngevaluasi jumlah karya, kita nyadari yen kita bisa ngembangake solusi dhewe kanthi biaya tenaga kerja sing padha. Nanging solusi sampeyan bakal luwih gampang dioperasi lan dikembangake - ora ngemot abstraksi sing ora perlu sing ndhukung fungsi sing ora dibutuhake.

Kanggo sing maca baris pungkasan, matur nuwun kanggo sabar lan manungsa waé!

Source: www.habr.com

Add a comment