Бид Sportmaster -ийг хэрхэн, юугаар хянадаг

Бид бүтээгдэхүүний багийг бүрдүүлэх үе шатанд хяналтын системийг бий болгох талаар бодсон. Манай бизнес - мөлжлөг эдгээр багуудад хамаарахгүй нь тодорхой болсон. Яагаад тэр вэ?

Баримт нь манай бүх багууд бие даасан мэдээллийн систем, микро үйлчилгээ, фронтын эргэн тойронд бүтээгдсэн байдаг тул багууд бүхэл бүтэн системийн эрүүл мэндийг бүхэлд нь хардаггүй. Жишээлбэл, гүн арын хэсэг дэх зарим жижиг хэсэг нь урд хэсэгт хэрхэн нөлөөлж байгааг мэдэхгүй байж магадгүй юм. Тэдний сонирхлын хүрээ нь тэдний системийг нэгтгэсэн системүүдээр хязгаарлагддаг. Хэрэв баг болон түүний А үйлчилгээ нь В үйлчилгээтэй бараг ямар ч холбоогүй бол ийм үйлчилгээ багт бараг харагдахгүй болно.

Бид Sportmaster -ийг хэрхэн, юугаар хянадаг

Манай баг эргээд бие биетэйгээ маш хүчтэй нэгдсэн системүүдтэй ажилладаг: тэдгээрийн хооронд олон холболт байдаг, энэ бол маш том дэд бүтэц юм. Мөн онлайн дэлгүүрийн үйл ажиллагаа нь эдгээр бүх системээс хамаардаг (бидэнд маш олон тоо байгаа).

Тэгэхээр манай хэлтэс аль нэг багт харьяалагддаггүй, арай хажууд байрладаг юм байна. Энэ бүх түүхэнд бидний даалгавар бол мэдээллийн систем хэрхэн ажилладаг, тэдгээрийн функциональ байдал, интеграци, програм хангамж, сүлжээ, техник хангамж, энэ бүхэн хоорондоо хэрхэн холбогдож байгааг цогцоор нь ойлгох явдал юм.

Манай онлайн дэлгүүрүүд ажилладаг платформ нь дараах байдалтай байна.

  • урд
  • дунд оффис
  • арын алба

Бид хичнээн их хүсч байгаагаас үл хамааран бүх систем жигд, өөгүй ажилладаг гэж байдаггүй. Гол нь дахин систем, интеграцчлалын тоо юм - манайхтай адил туршилтын чанараас үл хамааран зарим осол гарах нь гарцаагүй. Түүгээр ч зогсохгүй тусдаа системийн хүрээнд болон тэдгээрийн нэгдмэл байдлын хувьд. Мөн та платформын аль нэг хэсгийг биш, харин бүхэл бүтэн платформын төлөв байдлыг сайтар хянах хэрэгтэй.

Хамгийн тохиромжтой нь платформ даяар эрүүл мэндийн хяналтыг автоматжуулсан байх ёстой. Мөн бид хяналт тавих нь энэ үйл явцын зайлшгүй нэг хэсэг болсон. Эхэндээ энэ нь зөвхөн урд талын хэсэгт зориулагдсан байсан бол сүлжээний мэргэжилтнүүд, програм хангамж, техник хангамжийн администраторууд өөрсдийн давхаргын хяналтын системтэй байсан бөгөөд одоо ч байсаар байна. Эдгээр хүмүүс бүгд хяналт шалгалтыг зөвхөн өөрсдийн түвшинд дагаж мөрдсөн, хэн ч цогц ойлголтгүй байсан.

Жишээлбэл, хэрэв виртуал машин эвдэрсэн бол ихэнх тохиолдолд зөвхөн техник хангамж болон виртуал машиныг хариуцдаг администратор энэ талаар мэддэг. Ийм тохиолдолд фронтын баг програмын сүйрлийн бодит үнэнийг харсан боловч виртуал машин сүйрсэн тухай мэдээлэл байхгүй байв. Администратор нь үйлчлүүлэгч гэж хэн болохыг мэдэж, энэ нь ямар нэгэн том төсөл байгаа тохиолдолд энэ виртуал машин дээр яг юу ажиллаж байгааг олж мэдэх боломжтой. Тэр бяцхан хүүхдүүдийн талаар мэдэхгүй байх магадлалтай. Ямар ч тохиолдолд администратор эзэн дээр очиж, энэ машин дээр юу байсан, юуг сэргээх, юуг өөрчлөх шаардлагатайг асуух хэрэгтэй. Хэрэв үнэхээр ноцтой зүйл эвдэрсэн бол тэд тойрон гүйж эхлэв - учир нь хэн ч системийг бүхэлд нь хараагүй.

Эцсийн эцэст ийм ялгаатай түүхүүд нь бүхэл бүтэн нүүр хуудас, хэрэглэгчид болон бидний бизнесийн үндсэн чиг үүрэг болох онлайн борлуулалтад нөлөөлдөг. Бид нэг багийн нэг хэсэг биш, харин онлайн дэлгүүрийн нэг хэсэг болгон цахим худалдааны бүх программуудыг ажиллуулдаг тул цахим худалдааны платформын иж бүрэн хяналтын системийг бий болгох үүрэг хүлээсэн.

Системийн бүтэц, стек

Бид системийнхээ хэд хэдэн хяналтын давхаргыг тодорхойлж, тэдгээрийн хүрээнд хэмжүүр цуглуулах шаардлагатай болсон. Энэ бүгдийг нэгтгэх шаардлагатай байсан бөгөөд энэ нь бидний эхний шатанд хийсэн зүйл юм. Одоо энэ үе шатанд бид уялдаа холбоог бий болгож, системүүд бие биедээ хэрхэн нөлөөлж байгааг ойлгохын тулд бүх давхаргад хэмжүүрийн хамгийн өндөр чанартай цуглуулгыг дуусгаж байна.

Аппликейшнийг эхлүүлэх эхний үе шатанд иж бүрэн хяналт байхгүй байсан нь (ихэнх системийг үйлдвэрлэж байх үед бид үүнийг бүтээж эхэлсэн) платформыг бүхэлд нь хянах техникийн их өртэй болоход хүргэсэн. Үлдсэн системүүд хэсэг хугацаанд хяналтгүй үлдэх тул бид нэг IS-д мониторинг хийх, түүний мониторингийг нарийвчлан боловсруулахад анхаарлаа төвлөрүүлэх боломжгүй байсан. Энэ асуудлыг шийдэхийн тулд бид мэдээллийн системийн төлөв байдлыг үе шаттайгаар үнэлэхэд шаардлагатай хэмжүүрүүдийн жагсаалтыг гаргаж, хэрэгжүүлж эхэлсэн.

Тиймээс тэд зааныг хэсэг хэсгээр нь идэхээр шийджээ.

Манай систем нь:

  • техник хангамж;
  • үйлдлийн систем;
  • програм хангамж;
  • Хяналтын програм дахь UI хэсгүүд;
  • бизнесийн хэмжүүр;
  • нэгтгэх програмууд;
  • мэдээллийн нууцлал;
  • сүлжээ;
  • замын хөдөлгөөний тэнцвэржүүлэгч.

Бид Sportmaster -ийг хэрхэн, юугаар хянадаг

Энэ системийн төвд өөрөө хяналт тавьдаг. Бүхэл системийн төлөв байдлыг ерөнхийд нь ойлгохын тулд та эдгээр бүх давхарга болон бүх программуудын программуудад юу болж байгааг мэдэх хэрэгтэй.

Тэгэхээр, стекийн тухай.

Бид Sportmaster -ийг хэрхэн, юугаар хянадаг

Бид нээлттэй эхийн програм хангамж ашигладаг. Манай төвд Zabbix байдаг бөгөөд бид үүнийг голчлон дохиоллын систем болгон ашигладаг. Энэ нь дэд бүтцийн мониторинг хийхэд тохиромжтой гэдгийг хүн бүр мэднэ. Энэ юу гэсэн үг вэ? Өөрийнхөө мэдээллийн төвийг ажиллуулдаг компани бүрт байдаг (мөн Sportmaster нь өөрийн мэдээллийн төвтэй) яг ийм доод түвшний хэмжүүрүүд - серверийн температур, санах ойн байдал, дайралт, сүлжээний төхөөрөмжийн хэмжүүрүүд.

Бид Zabbix-ийг багуудад идэвхтэй ашигладаг Telegram мессенжер болон Microsoft Teams-тай нэгтгэсэн. Zabbix нь бодит сүлжээ, техник хангамж болон зарим програм хангамжийн давхаргыг хамардаг боловч энэ нь эм биш юм. Бид энэ мэдээллийг бусад үйлчилгээнүүдээс баяжуулж байна. Жишээлбэл, техник хангамжийн түвшинд бид виртуалчлалын системтэйгээ API-ээр шууд холбогдож, мэдээлэл цуглуулдаг.

Өөр юу. Zabbix-ээс гадна бид Prometheus-ийг ашигладаг бөгөөд энэ нь динамик орчинд хэмжигдэхүүнийг хянах боломжийг олгодог. Өөрөөр хэлбэл, бид HTTP төгсгөлийн цэгээр дамжуулан програмын хэмжигдэхүүнийг хүлээн авч, аль хэмжигдэхүүнийг ачаалах, аль нь ачаалахгүй байх талаар санаа зовохгүй байж болно. Эдгээр өгөгдөл дээр үндэслэн аналитик асуулга боловсруулж болно.

Бусад давхаргын өгөгдлийн эх сурвалжууд, жишээлбэл бизнесийн хэмжүүрүүд нь гурван бүрэлдэхүүн хэсэгт хуваагддаг.

Нэгдүгээрт, эдгээр нь Google Analytics гэсэн гадаад бизнесийн системүүд бөгөөд бид бүртгэлээс хэмжүүр цуглуулдаг. Тэдгээрээс бид идэвхтэй хэрэглэгчид, хөрвүүлэлт болон бизнестэй холбоотой бусад бүх зүйлийн мэдээллийг авдаг. Хоёрдугаарт, энэ бол UI хяналтын систем юм. Үүнийг илүү дэлгэрэнгүй тайлбарлах хэрэгтэй.

Нэгэн цагт бид гарын авлагын туршилтаас эхэлсэн бөгөөд энэ нь функциональ болон интеграцчлалын автомат тест болж хувирсан. Үүнээс бид зөвхөн үндсэн функцийг үлдээж, аль болох тогтвортой, цаг хугацааны явцад байнга өөрчлөгддөггүй маркерууд дээр тулгуурлан мониторинг хийсэн.

Багийн шинэ бүтэц нь хэрэглээний бүх үйл ажиллагаа нь бүтээгдэхүүний багуудад хязгаарлагддаг тул бид цэвэр туршилт хийхээ больсон. Үүний оронд бид Java, Selenium болон Jenkins (тайланг эхлүүлэх, гаргах систем болгон ашигладаг) дээр бичсэн тестүүдээс UI мониторинг хийсэн.

Бидэнд маш олон шалгалт байсан ч эцэст нь бид дээд түвшний хэмжүүр болох гол зам руу явахаар шийдсэн. Хэрэв бид олон тооны тусгай туршилтуудтай бол өгөгдлийг шинэчилж байх нь хэцүү байх болно. Дараагийн хувилбар бүр нь системийг бүхэлд нь эвдэж, бидний хийх зүйл бол үүнийг засах явдал юм. Тиймээс бид бараг өөрчлөгддөггүй маш суурь зүйлд анхаарлаа хандуулж, зөвхөн хяналт тавьдаг байсан.

Эцэст нь, гуравдугаарт, мэдээллийн эх сурвалж нь бүртгэлийн төвлөрсөн систем юм. Бид Elastic Stack-ийг бүртгэлд ашигладаг бөгөөд дараа нь бид энэ өгөгдлийг бизнесийн хэмжүүрийн хяналтын системдээ татаж авах боломжтой. Энэ бүхнээс гадна бид Python хэл дээр бичигдсэн өөрийн Monitoring API үйлчилгээтэй бөгөөд энэ нь API-ээр дамжуулан аливаа үйлчилгээнүүдийг асууж, тэдгээрээс Zabbix руу өгөгдөл цуглуулдаг.

Хяналтын өөр нэг зайлшгүй шинж чанар бол дүрслэл юм. Манайх бол Графана дээр суурилсан. Энэ нь хяналтын самбар дээрх янз бүрийн мэдээллийн эх сурвалжаас хэмжигдэхүүнийг дүрслэх боломжийг олгодогоороо бусад дүрслэлийн системүүдээс ялгардаг. Бид онлайн дэлгүүрийн дээд түвшний хэмжүүрүүдийг цуглуулж болно, тухайлбал, DBMS-ээс сүүлийн нэг цагийн дотор хийсэн захиалгын тоо, Zabbix-с энэ онлайн дэлгүүр ажиллаж байгаа үйлдлийн системийн гүйцэтгэлийн хэмжигдэхүүн, мөн энэ програмын жишээнүүдийн хэмжүүрүүдийг цуглуулж болно. Прометейгээс. Мөн энэ бүхэн нэг хяналтын самбар дээр байх болно. Тодорхой бөгөөд хүртээмжтэй.

Аюулгүй байдлын талаар энд тэмдэглэе - бид одоо системийг эцэслэн боловсруулж байгаа бөгөөд дараа нь дэлхийн хяналтын системтэй нэгтгэх болно. Миний бодлоор мэдээллийн аюулгүй байдлын салбарт цахим худалдаанд тулгардаг гол бэрхшээлүүд нь робот, задлан шинжлэх, харгис хүчтэй холбоотой байдаг. Энэ бүхэн нь бидний хэрэглээний программуудын үйл ажиллагаа болон бизнесийн үүднээс бидний нэр хүндэд ихээхэн нөлөөлж болзошгүй тул бид үүнийг анхаарч үзэх хэрэгтэй. Сонгосон стекийн тусламжтайгаар бид эдгээр даалгавруудыг амжилттай гүйцэтгэдэг.

Өөр нэг чухал зүйл бол хэрэглээний давхаргыг Prometheus угсардаг. Тэр өөрөө бас Zabbix-тэй нэгдсэн. Мөн манай хуудасны ачаалах хурд, бөглөрөл, хуудасны дүрслэл, скрипт ачаалах гэх мэт параметрүүдийг харах боломжийг олгодог sitespeed үйлчилгээтэй бөгөөд энэ нь API-тай нэгдсэн. Тиймээс бидний хэмжүүрийг Zabbix-д цуглуулдаг бөгөөд үүний дагуу бид тэндээс сэрэмжлүүлдэг. Бүх сэрэмжлүүлгийг одоогоор үндсэн илгээх аргууд руу илгээж байна (одоогоор энэ нь имэйл болон телеграм, MS Teams мөн саяхан холбогдсон). Ухаалаг роботууд үйлчилгээ болж ажилладаг, сонирхсон бүтээгдэхүүний бүх багуудад мониторингийн мэдээллээр хангадаг болгосноор сэрэмжлүүлэгийг сайжруулахаар төлөвлөж байна.

Бидний хувьд хэмжүүрүүд нь зөвхөн мэдээллийн системд төдийгүй программуудын ашигладаг бүх дэд бүтцийн ерөнхий хэмжүүрүүд юм: виртуал машинууд ажилладаг физик серверүүдийн кластерууд, замын хөдөлгөөний тэнцвэржүүлэгчид, сүлжээний ачааллыг тэнцвэржүүлэгчид, сүлжээ өөрөө, харилцаа холбооны сувгийн ашиглалт. . Манай мэдээллийн төвүүдэд зориулсан хэмжүүрүүд (бидэнд хэд хэдэн байдаг бөгөөд дэд бүтэц нь нэлээд том).

Бид Sportmaster -ийг хэрхэн, юугаар хянадаг

Манай хяналтын системийн давуу тал нь түүний тусламжтайгаар бид бүх системийн эрүүл мэндийн байдлыг харж, тэдгээрийн бие биедээ болон хамтын нөөцөд үзүүлэх нөлөөллийг үнэлэх боломжтой юм. Эцсийн эцэст энэ нь бидэнд нөөцийн төлөвлөлтөд оролцох боломжийг олгодог бөгөөд энэ нь бидний үүрэг хариуцлага юм. Бид серверийн нөөцийг удирддаг - цахим худалдаа, шинэ тоног төхөөрөмжийг ашиглалтад оруулах, ашиглалтаас гаргах, нэмэлт шинэ тоног төхөөрөмж худалдан авах, нөөцийн ашиглалтын аудит хийх гэх мэт. Жил бүр багууд шинэ төсөл төлөвлөж, системээ хөгжүүлдэг бөгөөд тэднийг нөөцөөр хангах нь бидний хувьд чухал юм.

Мөн хэмжүүрийн тусламжтайгаар бид мэдээллийн системийнхээ нөөцийн хэрэглээний хандлагыг хардаг. Мөн тэдгээрт үндэслэн бид ямар нэг зүйлийг төлөвлөж чадна. Виртуалчлалын түвшинд бид өгөгдөл цуглуулж, дата төвөөр байгаа нөөцийн хэмжээг хардаг. Дата төв дотроос нөөцийн дахин боловсруулалт, бодит хуваарилалт, зарцуулалтыг харж болно. Түүгээр ч зогсохгүй бие даасан серверүүд болон виртуал машинууд болон эдгээр бүх виртуал машинууд эрчимтэй эргэлддэг физик серверүүдийн кластерууд.

Ойрын ирээдүй

Одоо бид системийн гол цөмийг бүхэлд нь бэлэн болгочихсон байгаа ч ажиллах шаардлагатай олон зүйл байсаар байна. Наад зах нь энэ нь мэдээллийн аюулгүй байдлын давхарга боловч сүлжээнд холбогдох, дохиолол боловсруулах, харилцан хамаарлын асуудлыг шийдвэрлэх нь чухал юм. Бидэнд олон давхарга, систем байдаг бөгөөд давхарга бүр дээр өөр олон хэмжүүрүүд байдаг. Энэ нь матрешкагийн зэрэгтэй матрешка болж хувирдаг.

Бидний даалгавар бол эцсийн эцэст зөв дохио өгөх явдал юм. Жишээлбэл, хэрэв техник хангамжид асуудал гарсан бол дахин виртуал машинтай холбоотой асуудал гарсан бөгөөд чухал програм байгаа бөгөөд үйлчилгээг ямар ч байдлаар нөөцлөөгүй. Виртуал машин нас барсныг бид олж мэдэв. Дараа нь бизнесийн хэмжүүрүүд танд анхааруулах болно: хэрэглэгчид хаа нэгтээ алга болсон, хөрвүүлэлт байхгүй, интерфэйс дэх UI ашиглах боломжгүй, програм хангамж, үйлчилгээ мөн үхсэн.

Энэ тохиолдолд бид сэрэмжлүүлгээс спам хүлээн авах бөгөөд энэ нь зохих хяналтын системийн форматад тохирохгүй болсон. Корреляцийн тухай асуулт гарч ирнэ. Тиймээс, хамгийн тохиромжтой нь манай хяналтын систем: "Залуус аа, таны физик машин үхсэн, үүнтэй зэрэгцэн энэ программ болон эдгээр хэмжигдэхүүнүүд" гэж биднийг зуун дохиогоор ууртай бөмбөгдөхийн оронд нэг дохионы тусламжтайгаар хэлэх ёстой. Энэ нь гол зүйл болох шалтгааныг мэдээлэх ёстой бөгөөд энэ нь түүний нутагшуулалтын улмаас асуудлыг хурдан арилгахад тусалдаг.

Манай мэдэгдлийн систем болон сэрэмжлүүлгийн боловсруулалт нь XNUMX цагийн шуурхай утасны үйлчилгээг тойрон бүтээгдсэн. Зайлшгүй байх ёстой гэж үзсэн, хяналтын хуудсанд орсон бүх сэрэмжлүүлэг тэнд очдог. Сэрэмжлүүлэг бүр тайлбартай байх ёстой: юу болсон, энэ нь юу гэсэн үг, юунд нөлөөлдөг. Мөн түүнчлэн хяналтын самбарын холбоос, энэ тохиолдолд юу хийх талаар зааварчилгаа.

Энэ нь сэрэмжлүүлэг үүсгэхэд тавигдах шаардлагуудын тухай юм. Дараа нь нөхцөл байдал хоёр чиглэлд хөгжиж болно - асуудал байгаа бөгөөд үүнийг шийдвэрлэх шаардлагатай, эсвэл хяналтын системд алдаа гарсан. Гэхдээ ямар ч тохиолдолд та очоод үүнийг олж мэдэх хэрэгтэй.

Сэрэмжлүүлгийн хамаарлыг хараахан зөв тохируулаагүй байгааг харгалзан бид өдөрт дунджаар зуу орчим дохио хүлээн авдаг. Хэрэв бид техникийн ажил хийх шаардлагатай бол ямар нэг зүйлийг хүчээр унтраавал тэдний тоо мэдэгдэхүйц нэмэгддэг.

Хяналтын систем нь бидний ажиллаж буй системүүдийг хянаж, манай талд чухал гэж үздэг хэмжигдэхүүнүүдийг цуглуулахаас гадна бүтээгдэхүүний багуудад мэдээлэл цуглуулах боломжийг олгодог. Эдгээр нь бидний хянадаг мэдээллийн систем дэх хэмжүүрийн бүтцэд нөлөөлж чадна.

Манай хамт олон ирж, бидэнд болон багийн аль алинд нь хэрэг болох хэмжүүр нэмэхийг хүсч магадгүй юм. Эсвэл, жишээ нь, багт бидэнд байгаа үндсэн хэмжүүрүүд хангалтгүй байж магадгүй, тэд зарим тодорхой үзүүлэлтүүдийг хянах хэрэгтэй. Grafana-д бид баг бүрт орон зай гаргаж, админы эрхийг олгодог. Мөн хэрэв багт хяналтын самбар хэрэгтэй ч өөрсдөө үүнийг хийх боломжгүй/яаж мэдэхгүй байгаа бол бид тэдэнд тусалдаг.

Бид багийн үнэ цэнийг бий болгох, тэдгээрийг гаргах, төлөвлөх урсгалаас гадуур байгаа тул бүх системийн хувилбарууд нь саадгүй бөгөөд бидэнтэй зохицуулалтгүйгээр өдөр бүр гаргах боломжтой гэсэн дүгнэлтэд аажмаар хүрч байна. Эдгээр хувилбаруудыг хянах нь бидний хувьд чухал, учир нь тэдгээр нь програмын үйл ажиллагаанд нөлөөлж, ямар нэг зүйлийг эвдэж болзошгүй бөгөөд энэ нь маш чухал юм. Хувилбаруудыг удирдахын тулд бид Bamboo ашигладаг бөгөөд эндээс API-ээр дамжуулан өгөгдөл хүлээн авч, аль мэдээллийн системд ямар хувилбарууд гарсан, тэдгээрийн статусыг харах боломжтой. Мөн хамгийн чухал зүйл бол хэдэн цагт. Бид суллах тэмдэглэгээг гол чухал хэмжигдэхүүн дээр тавьдаг бөгөөд энэ нь асуудал гарсан тохиолдолд маш сайн харагддаг.

Ингэснээр бид шинэ хувилбарууд болон шинээр гарч ирж буй асуудлуудын хоорондын хамаарлыг харж болно. Гол санаа нь систем бүх давхаргад хэрхэн ажилладагийг ойлгож, асуудлыг хурдан тодорхойлж, хурдан засах явдал юм. Эцсийн эцэст, хамгийн их цаг хугацаа шаарддаг зүйл бол асуудлыг шийдэх биш харин шалтгааныг хайх явдал юм.

Цаашид бид энэ чиглэлээр идэвхтэй ажиллахыг хүсч байна. Асуудлыг шийдэхийн оронд урьдчилан сэргийлэхийн тулд, дараа нь биш харин ойртож буй асуудлын талаар урьдчилан мэдэхийг хүсч байна. Заримдаа хяналтын системийн буруу дохиолол нь хүний ​​буруугаас болоод програмын өөрчлөлтөөс шалтгаалж байдаг.Бид үүн дээр ажиллаж, дибаг хийж, хяналтын системд ямар нэгэн заль мэх хийхээс өмнө үүнийг ашигладаг хэрэглэгчдэд анхааруулахыг хичээдэг. , эсвэл эдгээр үйл ажиллагааг техникийн цонхонд хийх.

Ингээд хаврын эхэн үеэс системээ эхлүүлж, амжилттай ажиллаж байна... маш бодитой ашиг үзүүлж байна. Мэдээжийн хэрэг, энэ бол эцсийн хувилбар биш, бид илүү олон ашигтай функцуудыг танилцуулах болно. Гэхдээ яг одоо маш олон интеграцчлал, программууд байгаа тул хяналтын автоматжуулалтаас зайлсхийх боломжгүй юм.

Хэрэв та олон тооны интеграцчилал бүхий томоохон төслүүдийг хянадаг бол үүнд зориулж ямар мөнгөн сум олсоноо сэтгэгдэл дээр бичээрэй.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх