Oracle RAC болон AccelStor Shared-Nothing архитектур дээр суурилсан алдааг тэсвэрлэх шийдлийг бий болгох

Олон тооны аж ахуйн нэгжийн програмууд болон виртуалчлалын системүүд нь алдаа гаргахад тэсвэртэй шийдлүүдийг бий болгох өөрийн гэсэн механизмтай байдаг. Тодруулбал, Oracle RAC (Oracle Real Application Cluster) нь сервер/програмын түвшинд ачааллыг тэнцвэржүүлж, алдааг тэсвэрлэх зорилгоор хамтран ажилладаг хоёр ба түүнээс дээш Oracle мэдээллийн сангийн серверүүдийн кластер юм. Энэ горимд ажиллахын тулд танд дундын санах ой хэрэгтэй бөгөөд энэ нь ихэвчлэн хадгалах систем юм.

Бид аль нэгэнд нь аль хэдийн хэлэлцсэн шиг нийтлэл, хадгалах систем нь өөрөө давхардсан бүрэлдэхүүн хэсгүүд (хянагчдыг оруулаад) байгаа хэдий ч бүтэлгүйтсэн цэгүүд хэвээр байна - голчлон нэг багц өгөгдөл хэлбэрээр. Тиймээс найдвартай байдлын өндөр шаардлага бүхий Oracle шийдлийг бүтээхийн тулд "N сервер - нэг хадгалах систем" схемийг нарийн төвөгтэй болгох шаардлагатай.

Oracle RAC болон AccelStor Shared-Nothing архитектур дээр суурилсан алдааг тэсвэрлэх шийдлийг бий болгох

Мэдээж юун түрүүнд ямар эрсдэлээс даатгуулах гэж байгаагаа шийдэх хэрэгтэй. Энэ нийтлэлд бид "солир ирлээ" гэх мэт аюулаас хамгаалах талаар авч үзэхгүй. Тиймээс газарзүйн хувьд тархай бутархай гамшгаас хамгаалах шийдлийг бий болгох нь дараах нийтлэлүүдийн аль нэгний сэдэв хэвээр байх болно. Энд бид серверийн кабинетийн түвшинд хамгаалалт хийгдсэн үед Cross-Rack гамшгаас хамгаалах шийдлийг авч үзэх болно. Шүүгээнүүд нь нэг өрөөнд эсвэл өөр өөр байранд байрладаг боловч ихэвчлэн нэг байранд байрладаг.

Эдгээр кабинетууд нь "хөрш"-ийн төлөв байдлаас үл хамааран Oracle мэдээллийн санг ажиллуулахад шаардлагатай бүх тоног төхөөрөмж, програм хангамжийг агуулсан байх ёстой. Өөрөөр хэлбэл, Cross-Rack гамшгаас хамгаалах шийдлийг ашигласнаар бид бүтэлгүйтлийн эрсдлийг арилгана.

  • Oracle програмын серверүүд
  • Хадгалалтын систем
  • Шилжүүлэгч системүүд
  • Кабинет дахь бүх тоног төхөөрөмжийн бүрэн эвдрэл:
    • Эрчим хүчээс татгалзах
    • Хөргөлтийн системийн эвдрэл
    • Гадаад хүчин зүйлс (хүн, байгаль гэх мэт)

Oracle серверүүдийн давхардал нь Oracle RAC-ийн үйл ажиллагааны зарчмыг илэрхийлдэг бөгөөд програмаар дамжуулан хэрэгждэг. Сэлгэн залгах байгууламжийн давхардал нь бас асуудал биш юм. Гэхдээ хадгалах системийг давхардсанаар бүх зүйл тийм ч хялбар биш юм.

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

Илүү төвөгтэй сонголт бол програм хангамж ба/эсвэл техник хангамжийн хадгалалтын "виртуалжуулагч" бөгөөд тогтвортой байдлын асуудал, гарын авлагын хөндлөнгийн оролцоог арилгах болно. Гэхдээ байршуулах, дараагийн удирдлагын нарийн төвөгтэй байдал, ийм шийдлүүдийн маш зохисгүй зардал нь олон хүнийг айлгадаг.

AccelStor NeoSapphire™ All Flash массивын шийдэл нь Cross-Rack гамшгийн нөхөн сэргээлт гэх мэт хувилбаруудад төгс тохирно. H710 Хуваалцсан-Юу ч биш архитектурыг ашиглах. Энэ загвар нь флаш дисктэй ажиллахад эзэмшлийн FlexiRemap® технологийг ашигладаг хоёр зангилаа бүхий хадгалах систем юм. Баярлалаа FlexiRemap® NeoSapphire™ H710 нь 600K IOPS@4K санамсаргүй бичих, 1M+ IOPS@4K санамсаргүй уншилт зэрэг гүйцэтгэлийг хүргэх чадвартай бөгөөд энэ нь сонгодог RAID-д суурилсан хадгалах системийг ашиглахад боломжгүй юм.

Гэхдээ NeoSapphire™ H710-ийн гол онцлог нь хоёр зангилаа тусдаа кейс хэлбэрээр гүйцэтгэх явдал бөгөөд тус бүр нь өөрийн гэсэн мэдээллийн хуулбартай байдаг. Зангилааны синхрончлолыг гадаад InfiniBand интерфейсээр дамжуулан гүйцэтгэдэг. Энэхүү архитектурын ачаар зангилааг өөр өөр байршилд 100м хүртэлх зайд хуваарилах боломжтой бөгөөд ингэснээр Cross-Rack гамшгаас хамгаалах шийдлийг гаргаж өгдөг. Хоёр зангилаа бүрэн синхроноор ажилладаг. Хостын талаас H710 нь энгийн хос удирдлагатай хадгалах систем шиг харагдаж байна. Тиймээс нэмэлт програм хангамж, техник хангамжийн сонголтууд эсвэл ялангуяа нарийн төвөгтэй тохиргоог хийх шаардлагагүй болно.

Хэрэв бид дээр дурдсан Cross-Rack гамшгаас хамгаалах бүх шийдлүүдийг харьцуулж үзвэл AccelStor-ийн сонголт бусад зүйлсээс мэдэгдэхүйц ялгардаг.

AccelStor NeoSapphire ™ Архитектурыг юу ч хуваалцаагүй
Програм хангамж эсвэл техник хангамжийн "виртуалжуулагч" хадгалах систем
Хуулбар дээр суурилсан шийдэл

Бэлэн байдал

Серверийн алдаа
Сул зогсолтгүй
Сул зогсолтгүй
Сул зогсолтгүй

Шилжүүлгийн алдаа
Сул зогсолтгүй
Сул зогсолтгүй
Сул зогсолтгүй

Хадгалах системийн алдаа
Сул зогсолтгүй
Сул зогсолтгүй
Цаг хугацаа

Засгийн газрын бүхэл бүтэн доголдол
Сул зогсолтгүй
Сул зогсолтгүй
Цаг хугацаа

Зардал ба нарийн төвөгтэй байдал

Шийдлийн зардал
Бага*
Высокая
Высокая

Байршуулах нарийн төвөгтэй байдал
Бага байна
Высокая
Высокая

*AccelStor NeoSapphire™ нь All Flash массив хэвээр байгаа бөгөөд тодорхойлолтоороо "3 копейк"-ын үнэтэй биш, ялангуяа энэ нь давхар багтаамжтай нөөцтэй тул. Гэсэн хэдий ч үүн дээр суурилсан шийдлийн эцсийн өртөгийг бусад үйлдвэрлэгчдийн ижил төстэй шийдэлтэй харьцуулахдаа өртөг бага гэж үзэж болно.

Програмын серверүүд болон бүх Flash массивын зангилаануудыг холбох топологи дараах байдалтай байна.

Oracle RAC болон AccelStor Shared-Nothing архитектур дээр суурилсан алдааг тэсвэрлэх шийдлийг бий болгох

Топологийг төлөвлөхдөө удирдлагын свичийг давхардуулж, серверүүдийг хооронд нь холбохыг зөвлөж байна.

Энд болон цаашдаа бид Fiber сувгаар холбогдох талаар ярих болно. Хэрэв та iSCSI ашигладаг бол бүх зүйл ижил байх бөгөөд ашигласан унтраалга, массивын тохиргоо бага зэрэг өөр байх болно.

Массив дээрх бэлтгэл ажил

Ашигласан тоног төхөөрөмж, программ хангамж

Сервер ба шилжүүлэгчийн үзүүлэлтүүд

Бүрэлдэхүүн хэсгүүд
Тайлбар

Oracle Database 11g серверүүд
Хоёр

Серверийн үйлдлийн систем
Oracle Линукс

Oracle мэдээллийн сангийн хувилбар
11г (RAC)

Нэг серверийн процессорууд
Хоёр 16 цөмт Intel® Xeon® CPU E5-2667 v2 @ 3.30GHz

Нэг серверийн физик санах ой
128GB

FC сүлжээ
Олон замтай 16Gb/s FC

FC HBA
Emulex Lpe-16002B

Кластер удирдахад зориулагдсан нийтийн 1GbE портууд
Intel Ethernet адаптер RJ45

16Gb/s FC шилжүүлэгч
Brocade 6505

Өгөгдлийг синхрончлоход зориулагдсан хувийн 10GbE портууд
Intel X520

AccelStor NeoSapphire™ Бүх флаш массивын тодорхойлолт

Бүрэлдэхүүн хэсгүүд
Тайлбар

Хадгалах систем
NeoSapphire™ өндөр хүртээмжтэй загвар: H710

Зургийн хувилбар
4.0.1

Драйверуудын нийт тоо
48

Драйвын хэмжээ
1.92TB

Драйвын төрөл
SSD

FC зорилтот портууд
16x 16Gb порт (нэг зангилаа бүрт 8)

Удирдлагын портууд
Ethernet шилжүүлэгчээр дамжуулан хостуудтай холбогддог 1GbE ethernet кабель

Зүрхний цохилтын порт
Хоёр хадгалах цэгийг холбодог 1GbE ethernet кабель

Өгөгдлийн синхрончлолын порт
56Gb/s InfiniBand кабель

Массив ашиглахын өмнө та үүнийг эхлүүлэх ёстой. Анхдагч байдлаар, хоёр зангилааны хяналтын хаяг ижил байна (192.168.1.1). Та тэдэнтэй нэг нэгээр нь холбогдож, шинэ (аль хэдийн өөр) удирдлагын хаягуудыг тохируулж, цагийн синхрончлолыг тохируулах хэрэгтэй бөгөөд үүний дараа Удирдлагын портуудыг нэг сүлжээнд холбож болно. Дараа нь Interlink холболтын дэд сүлжээг хуваарилах замаар зангилаануудыг HA хос болгон нэгтгэдэг.

Oracle RAC болон AccelStor Shared-Nothing архитектур дээр суурилсан алдааг тэсвэрлэх шийдлийг бий болгох

Ажиллаж дууссаны дараа та массивыг дурын зангилаанаас удирдах боломжтой.

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

Oracle RAC болон AccelStor Shared-Nothing архитектур дээр суурилсан алдааг тэсвэрлэх шийдлийг бий болгох

Oracle ASM-д зориулж олон боть үүсгэхийг зөвлөж байна, учир нь энэ нь серверүүдийн зорилтот тоог нэмэгдүүлэх бөгөөд энэ нь эцсийн дүндээ ерөнхий гүйцэтгэлийг сайжруулах болно (өөр нэг дэх дарааллын талаар илүү дэлгэрэнгүй) нийтлэл).

Туршилтын тохиргоо

Хадгалалтын эзлэхүүний нэр
Эзлэхүүний хэмжээ

Мэдээлэл01
200GB

Мэдээлэл02
200GB

Мэдээлэл03
200GB

Мэдээлэл04
200GB

Мэдээлэл05
200GB

Мэдээлэл06
200GB

Мэдээлэл07
200GB

Мэдээлэл08
200GB

Мэдээлэл09
200GB

Мэдээлэл10
200GB

Сүлжээ 01
1GB

Сүлжээ 02
1GB

Сүлжээ 03
1GB

Сүлжээ 04
1GB

Сүлжээ 05
1GB

Сүлжээ 06
1GB

Дахин хий 01
100GB

Дахин хий 02
100GB

Дахин хий 03
100GB

Дахин хий 04
100GB

Дахин хий 05
100GB

Дахин хий 06
100GB

Дахин хий 07
100GB

Дахин хий 08
100GB

Дахин хий 09
100GB

Дахин хий 10
100GB

Массивын ажиллах горим, онцгой байдлын үед тохиолддог үйл явцын талаархи зарим тайлбар

Oracle RAC болон AccelStor Shared-Nothing архитектур дээр суурилсан алдааг тэсвэрлэх шийдлийг бий болгох

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

  • Зангилааны аль нэгийг дахин ачаалах хуваарьтай
  • Гэнэт унтрах (цахилгаан хангамж, хэт халалт гэх мэт) улмаас зангилааны нэг дээр осол гарсан.
  • Синхрончлох боломжгүй InfiniBand холболт тасарсан
  • Өгөгдлийн эвдрэлийн улмаас зангилааны аль нэгэнд гэмтэл гарсан. Энд та шинэ HA бүлэг үүсгэж, мэдээллийн багцыг бүрэн синхрончлох хэрэгтэй болно.

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

Хэрэв Ethernet холбоосоор холболт тасарсан бол Heartbeat түр хугацаанд InfiniBand руу шилжиж, сэргээгдэх үед 10 секундын дотор буцаж ирнэ.

Хостуудыг тохируулж байна

Гэмтлийг тэсвэрлэх, гүйцэтгэлийг сайжруулахын тулд массивын MPIO дэмжлэгийг идэвхжүүлэх ёстой. Үүнийг хийхийн тулд та /etc/multipath.conf файлд мөр нэмж, олон замт үйлчилгээг дахин эхлүүлэх хэрэгтэй.

Нуугдсан тексттөхөөрөмжүүд {
төхөөрөмж {
борлуулагч "AStor"
зам_бүлэглэх_бодлого "бүлэглэлээр_prio"
path_selector "дарааллын урт 0"
зам шалгагч "тур"
онцлог "0"
техник хангамжийн_харуулагч "0"
prio "const"
шууд буцаах
fast_io_fail_tmo 5
dev_loss_tmo 60
хэрэглэгчдэд ээлтэй_нэр тийм
илрүүлэх_prio тийм
rr_min_io_rq 1
зам_дахин_оролдохгүй 0
}
}

Дараа нь ASM нь ASMLib-ээр дамжуулан MPIO-тэй ажиллахын тулд та /etc/sysconfig/oracleasm файлыг өөрчилж, дараа нь /etc/init.d/oracleasm скан дискүүдийг ажиллуулах хэрэгтэй.

Нуугдсан текст

# ORACLEASM_SCANORDER: Диск сканнердах захиалгад тохирсон загварууд
ORACLEASM_SCANORDER = "dm"

# ORACLEASM_SCANEXCLUDE: Дискийг скан хийхээс хасахын тулд тохирох загварууд
ORACLEASM_SCANEXCLUDE="sd"

тайлбар

Хэрэв та ASMLib-ийг ашиглахыг хүсэхгүй байгаа бол ASMLib-ийн үндэс болсон UDEV дүрмийг ашиглаж болно.

Oracle мэдээллийн сангийн 12.1.0.2 хувилбараас эхлэн уг сонголтыг ASMFD програм хангамжийн нэг хэсэг болгон суулгах боломжтой.

Oracle ASM-д зориулж бүтээсэн дискүүд нь массивын физикийн хувьд (4K) ажилладаг блокийн хэмжээтэй нийцэж байгаа эсэхийг баталгаажуулах нь чухал юм. Үгүй бол гүйцэтгэлийн асуудал гарч болзошгүй. Тиймээс тохирох параметр бүхий эзлэхүүнийг бий болгох шаардлагатай.

parted /dev/mapper/device-name mklabel gpt mkpart main 2048s 100% align-check оновчтой 1

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

Хадгалалтын эзлэхүүний нэр
Эзлэхүүний хэмжээ
LUN-ийн эзлэхүүний зураглал
ASM дууны төхөөрөмжийн дэлгэрэнгүй
Хуваарилалтын нэгжийн хэмжээ

Мэдээлэл01
200GB
Хадгалалтын бүх эзлэхүүнийг хадгалах системийн бүх өгөгдлийн порттой харьцуулна уу
Илүүдэл: хэвийн
Нэр: DGDATA
Зорилго: Өгөгдлийн файлууд

4MB

Мэдээлэл02
200GB

Мэдээлэл03
200GB

Мэдээлэл04
200GB

Мэдээлэл05
200GB

Мэдээлэл06
200GB

Мэдээлэл07
200GB

Мэдээлэл08
200GB

Мэдээлэл09
200GB

Мэдээлэл10
200GB

Сүлжээ 01
1GB
Илүүдэл: хэвийн
Нэр: DGGRID1
Зорилго:Сүлжээ: CRS ба санал хураалт

4MB

Сүлжээ 02
1GB

Сүлжээ 03
1GB

Сүлжээ 04
1GB
Илүүдэл: хэвийн
Нэр: DGGRID2
Зорилго:Сүлжээ: CRS ба санал хураалт

4MB

Сүлжээ 05
1GB

Сүлжээ 06
1GB

Дахин хий 01
100GB
Илүүдэл: хэвийн
Нэр: DGREDO1
Зорилго: 1-р хэлхээний бүртгэлийг дахин хийх

4MB

Дахин хий 02
100GB

Дахин хий 03
100GB

Дахин хий 04
100GB

Дахин хий 05
100GB

Дахин хий 06
100GB
Илүүдэл: хэвийн
Нэр: DGREDO2
Зорилго: 2-р хэлхээний бүртгэлийг дахин хийх

4MB

Дахин хий 07
100GB

Дахин хий 08
100GB

Дахин хий 09
100GB

Дахин хий 10
100GB

Өгөгдлийн сангийн тохиргоо

  • Блокны хэмжээ = 8K
  • Солих зай = 16 ГБ
  • AMM (санах ойн автомат удирдлага)-г идэвхгүй болгох
  • Ил тод том хуудсыг идэвхгүй болгох

Бусад тохиргоо

# vi /etc/sysctl.conf
✓ fs.aio-max-nr = 1048576
✓ fs.file-max = 6815744
✓ kernel.shmmax 103079215104
✓ kernel.shmal 31457280
✓ kernel.shmmn 4096
✓ kernel.sem = 250 32000 100 128
✓ net.ipv4.ip_local_port_range = 9000 65500
✓ net.core.rmem_default = 262144
✓ net.core.rmem_max = 4194304
✓ net.core.wmem_default = 262144
✓ net.core.wmem_max = 1048586
✓vm.swappiness=10
✓ vm.min_free_kbytes=524288 # Хэрэв та Linux x86 ашиглаж байгаа бол үүнийг бүү тохируул
✓ vm.vfs_cache_pressure=200
✓ vm.nr_hugepages = 57000

# vi /etc/security/limits.conf
✓ зөөлөн сүлжээ nproc 2047
✓ сүлжээ хатуу nproc 16384
✓ сүлжээ зөөлөн nofile 1024
✓ grid hard nofile 65536
✓ тор зөөлөн стек 10240
✓ сүлжээний хатуу стек 32768
✓ oracle soft nproc 2047
✓ oracle hard nproc 16384
✓ oracle soft nofile 1024
✓ oracle hard nofile 65536
✓ oracle зөөлөн стек 10240
✓ oracle хатуу стек 32768
✓ зөөлөн memlock 120795954
✓ hard memlock 120795954

sqlplus "/ sysdba байдлаар"
системийн багц процессыг өөрчлөх=2000 хамрах хүрээ=spfile;
системийн багцыг өөрчлөх open_cursors=2000 хамрах хүрээ=spfile;
системийн багцыг өөрчлөх session_cached_cursors=300 scope=spfile;
системийн багцыг өөрчлөх db_files=8192 хамрах хүрээ=spfile;

Амжилтгүй байдлын тест

Үзүүлэх зорилгоор HammerDB-ийг OLTP ачааллыг дуурайхад ашигласан. HammerDB тохиргоо:

Агуулахын тоо
256

Хэрэглэгчийн нийт гүйлгээ
1000000000000

Виртуал хэрэглэгчид
256

Үр дүн нь 2.1M TPM болсон бөгөөд энэ нь массивын гүйцэтгэлийн хязгаараас хол байна H710, гэхдээ серверүүдийн одоогийн техник хангамжийн тохиргоо (ялангуяа процессоруудаас шалтгаалсан) болон тэдгээрийн дугаарт зориулсан "тааз" юм. Энэхүү туршилтын зорилго нь хамгийн их гүйцэтгэлд хүрэхийн тулд шийдлийн алдааг тэсвэрлэх чадварыг бүхэлд нь харуулах явдал юм. Тиймээс бид энэ тоон дээр тулгуурлах болно.

Oracle RAC болон AccelStor Shared-Nothing архитектур дээр суурилсан алдааг тэсвэрлэх шийдлийг бий болгох

Зангилааны аль нэгний эвдрэлийг шалгах

Oracle RAC болон AccelStor Shared-Nothing архитектур дээр суурилсан алдааг тэсвэрлэх шийдлийг бий болгох

Oracle RAC болон AccelStor Shared-Nothing архитектур дээр суурилсан алдааг тэсвэрлэх шийдлийг бий болгох

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

Бүх тоног төхөөрөмжтэй кабинетийн эвдрэлийн туршилт

Oracle RAC болон AccelStor Shared-Nothing архитектур дээр суурилсан алдааг тэсвэрлэх шийдлийг бий болгох

Oracle RAC болон AccelStor Shared-Nothing архитектур дээр суурилсан алдааг тэсвэрлэх шийдлийг бий болгох

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

Хэрэв Oracle-д боломжийн үнээр, бага зэрэг байршуулах/захиргааны хүчин чармайлтаар гэмтэлд тэсвэртэй Cross-Rack гамшгаас хамгаалах шийдлийг хэрэгжүүлэх шаардлагатай бол Oracle RAC болон архитектур хамтран ажилладаг. AccelStor Shared-Юу ч биш хамгийн сайн сонголтуудын нэг байх болно. Oracle RAC-ийн оронд кластер, ижил DBMS эсвэл виртуалчлалын системийг хангадаг өөр ямар ч програм хангамж байж болно. Шийдлийг бүтээх зарчим нь хэвээр байх болно. Мөн доод шугам нь RTO болон RPO-ийн хувьд тэг байна.

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

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