مصروف منصوبن ۾ ڪيف سان ڪم ڪرڻ لاءِ صلاحون ۽ چالون

مصروف منصوبن ۾ ڪيف سان ڪم ڪرڻ لاءِ صلاحون ۽ چالون

سيف کي مختلف لوڊن سان منصوبن ۾ نيٽ ورڪ اسٽوريج طور استعمال ڪندي، اسان مختلف ڪمن کي منهن ڏئي سگهون ٿا جيڪي پهرين نظر ۾ سادو يا معمولي نه ٿا لڳي. مثال طور:

  • ڊيٽا جي لڏپلاڻ پراڻي Ceph کان نئين کي نئين ڪلستر ۾ پوئين سرور جي جزوي استعمال سان؛
  • Ceph ۾ ڊسڪ اسپيس مختص جي مسئلي جو حل.

اهڙين مسئلن کي منهن ڏيڻ، اسان کي ڊيٽا کي وڃائڻ کان سواء او ايس ڊي کي صحيح طور تي هٽائڻ جي ضرورت آهي، جيڪو خاص طور تي اهم آهي جڏهن ڊيٽا جي وڏي مقدار سان معاملو ڪيو وڃي. هن مضمون ۾ بحث ڪيو ويندو.

هيٺ بيان ڪيل طريقا ڪيف جي ڪنهن به نسخي لاءِ لاڳاپيل آهن. ان کان علاوه، حقيقت اها آهي ته Ceph ڊيٽا جي وڏي مقدار کي ذخيرو ڪري سگهي ٿو حساب ۾ رکيو ويندو: ڊيٽا جي نقصان ۽ ٻين مسئلن کي روڪڻ لاء، ڪجهه عملن کي ڪيترن ئي ٻين ۾ "ورهايو" ويندو.

OSD بابت اڳڀرائي

ڇو ته بحث ڪيل ٽن ترڪيب مان ٻه او ايس ڊي لاءِ وقف آهن (آبجیکٹ اسٽوريج ڊيمون)، عملي حصي ۾ ڊائيونگ ڪرڻ کان اڳ - مختصر طور تي ان بابت ڇا آهي سيف ۾ ۽ ڇو اهو تمام ضروري آهي.

سڀ کان پهريان، اهو چوڻ گهرجي ته سڄو ڪيف ڪلستر ڪيترن ئي او ايس ڊيز تي مشتمل آهي. وڌيڪ اتي آهن، سيف ۾ وڌيڪ مفت ڊيٽا حجم. هتي کان سمجهڻ آسان آهي مکيه OSD فنڪشن: اهو سڀني ڪلستر نوڊس جي فائل سسٽم تي Ceph اعتراض ڊيٽا کي ذخيرو ڪري ٿو ۽ ان کي نيٽ ورڪ رسائي فراهم ڪري ٿو (پڙهڻ، لکڻ، ۽ ٻين درخواستن لاء).

ساڳئي سطح تي، نقل جا پيرا ميٽر مقرر ڪيا ويا آهن نقل ڪندي شيون مختلف OSDs جي وچ ۾. ۽ هتي توهان مختلف مسئلن کي منهن ڏئي سگهو ٿا، جن جو حل هيٺ بحث ڪيو ويندو.

ڪيس نمبر 1. ڊيٽا وڃائڻ کان سواءِ سيف ڪلسٽر مان او ايس ڊي کي محفوظ طور تي هٽايو

او ايس ڊي کي هٽائڻ جي ضرورت شايد سرور کي ڪلستر مان هٽائڻ جي ڪري ٿي سگھي ٿي - مثال طور، ان کي ٻئي سرور سان تبديل ڪرڻ - جيڪو اسان سان ٿيو، هن مضمون جي لکڻ کي جنم ڏنو. اهڙيء طرح، هٿيارن جو آخري مقصد هڪ ڏنل سرور تي سڀني او ايس ڊي ۽ مون کي ڪڍڻ آهي ته جيئن ان کي روڪي سگهجي.

سهولت لاءِ ۽ اهڙي صورتحال کان بچڻ لاءِ جتي، حڪمن تي عمل ڪرڻ دوران، اسان گهربل OSD کي ظاهر ڪرڻ ۾ غلطي ڪريون ٿا، اسان هڪ الڳ متغير مقرر ڪنداسين، جنهن جي قيمت ختم ٿيڻ واري OSD جو تعداد هوندو. اچو ته هن کي سڏين ${ID} - هتي ۽ هيٺ، اهڙو متغير OSD جو نمبر مٽائي ٿو جنهن سان اسان ڪم ڪري رهيا آهيون.

اچو ته ڪم شروع ڪرڻ کان پهرين حالت ڏسو:

root@hv-1 ~ # ceph osd tree
ID CLASS WEIGHT  TYPE NAME      STATUS REWEIGHT PRI-AFF
-1       0.46857 root default
-3       0.15619      host hv-1
-5       0.15619      host hv-2
 1   ssd 0.15619      osd.1     up     1.00000  1.00000
-7       0.15619      host hv-3
 2   ssd 0.15619      osd.2     up     1.00000  1.00000

او ايس ڊي هٽائڻ شروع ڪرڻ لاءِ، توهان کي آسانيءَ سان انجام ڏيڻ جي ضرورت پوندي reweight ان تي صفر تائين. اهڙيءَ طرح اسان او ايس ڊي ۾ ڊيٽا جي مقدار کي گھٽائي ان کي ٻين او ايس ڊيز جي برابر ڪري ڇڏيندا آهيون. هن کي ڪرڻ لاء، هيٺين حڪمن کي هلائڻ:

ceph osd reweight osd.${ID} 0.98
ceph osd reweight osd.${ID} 0.88
ceph osd reweight osd.${ID} 0.78

... ۽ ائين ئي صفر تائين.

هموار توازن جي ضرورت آهيجيئن ڊيٽا وڃائڻ نه. اهو خاص طور تي صحيح آهي جيڪڏهن OSD ڊيٽا جي وڏي مقدار تي مشتمل آهي. حڪمن تي عمل ڪرڻ کان پوء پڪ ڪرڻ لاء reweight سڀ ڪجھ ٺيڪ ٿي ويو، توھان ان کي مڪمل ڪري سگھو ٿا ceph -s يا الڳ ٽرمينل ونڊو ۾ ceph -w حقيقي وقت ۾ تبديلين کي ڏسڻ لاء.

جڏهن OSD "خالي" آهي، توهان ان کي هٽائڻ لاء معياري آپريشن سان اڳتي وڌائي سگهو ٿا. هن کي ڪرڻ لاء، گهربل او ايس ڊي کي رياست ڏانهن منتقل ڪريو down:

ceph osd down osd.${ID}

اچو ته او ايس ڊي کي ڪلستر مان ٻاهر ڪڍون:

ceph osd out osd.${ID}

اچو ته او ايس ڊي سروس کي بند ڪريون ۽ ان جي ورهاڱي کي FS ۾ ختم ڪريون:

systemctl stop ceph-osd@${ID}
umount /var/lib/ceph/osd/ceph-${ID}

مان OSD هٽايو CRUSH نقشو:

ceph osd crush remove osd.${ID}

اچو ته او ايس ڊي استعمال ڪندڙ کي ختم ڪريون:

ceph auth del osd.${ID}

۽ نيٺ، اچو ته او ايس ڊي کي هٽائي ڇڏيون:

ceph osd rm osd.${ID}

ويچاري: جيڪڏھن توھان استعمال ڪري رھيا آھيو Ceph Luminous ورجن يا ان کان وڌيڪ، پوءِ مٿيون او ايس ڊي ختم ڪرڻ جا مرحلا ٻن حڪمن تي گھٽائي سگھجن ٿا:

ceph osd out osd.${ID}
ceph osd purge osd.${ID}

جيڪڏهن، مٿي بيان ڪيل قدمن کي مڪمل ڪرڻ کان پوء، توهان حڪم هلائيندا آهيو ceph osd tree، پوءِ اهو واضح ٿيڻ گهرجي ته سرور تي جتي ڪم ڪيو ويو هو اتي هاڻي او ايس ڊي نه آهن جن لاءِ مٿيون آپريشن ڪيا ويا آهن:

root@hv-1 ~ # ceph osd tree
ID CLASS WEIGHT  TYPE NAME     STATUS REWEIGHT PRI-AFF
-1       0.46857      root default
-3       0.15619      host hv-1
-5       0.15619      host hv-2
-7       0.15619      host hv-3
 2   ssd 0.15619      osd.2    up     1.00000  1.00000

رستي ۾، نوٽ ڪريو ته ڪيف ڪلستر جي رياست ڏانهن ويندي HEALTH_WARN، ۽ اسان او ايس ڊي جي تعداد ۾ گهٽتائي ۽ دستياب ڊسڪ اسپيس جي مقدار ۾ پڻ ڏسندا.

ھيٺ ڏنل قدمن کي بيان ڪندو جيڪي گھربل آھن جيڪڏھن توھان چاھيو ٿا مڪمل طور تي سرور کي بند ڪريو ۽، مطابق، ان کي ڪيف مان هٽايو. هن معاملي ۾، ان کي ياد ڪرڻ ضروري آهي سرور کي بند ڪرڻ کان پهريان، توهان کي لازمي طور تي سڀني او ايس ڊي کي هٽائڻ گهرجي هن سرور تي.

جيڪڏهن هن سرور تي وڌيڪ او ايس ڊي نه بچيا آهن، ته پوءِ انهن کي هٽائڻ کان پوءِ توهان کي او ايس ڊي نقشي مان سرور کي خارج ڪرڻو پوندو. hv-2هيٺ ڏنل حڪم هلائڻ سان:

ceph osd crush rm hv-2

ختم ڪريو mon سرور کان hv-2ٻئي سرور تي هيٺ ڏنل حڪم هلائڻ سان (يعني هن صورت ۾، تي hv-1):

ceph-deploy mon destroy hv-2

ان کان پوء، توهان سرور کي روڪي سگهو ٿا ۽ ايندڙ ڪارناما شروع ڪري سگهو ٿا (ان کي ٻيهر ترتيب ڏيڻ، وغيره).

ڪيس نمبر 2. اڳ ۾ ئي ٺهيل Ceph ڪلستر ۾ ڊسڪ اسپيس جي ورڇ

مان ٻي ڪهاڻي شروع ڪندس PG بابت اڳڪٿي سان (جڳھ جا گروپ). Ceph ۾ PG جو بنيادي ڪردار بنيادي طور تي Ceph شين کي گڏ ڪرڻ ۽ انھن کي OSD ۾ وڌيڪ نقل ڪرڻ آھي. فارمولا جنهن سان توهان حساب ڪري سگهو ٿا PG جي گهربل مقدار ۾ آهي لاڳاپيل سيڪشن Ceph دستاويز. اهو مسئلو به اتي خاص مثالن سان بحث ڪيو ويو آهي.

تنهن ڪري: عام مسئلن مان هڪ جڏهن Ceph استعمال ڪندي آهي سيف ۾ تلاء جي وچ ۾ OSD ۽ PG جو غير متوازن تعداد.

پهرين، انهي جي ڪري، هڪ صورتحال پيدا ٿي سگهي ٿي جڏهن تمام گهڻا PGs هڪ ننڍڙي تلاء ۾ بيان ڪيا ويا آهن، جيڪو بنيادي طور تي ڪلستر ۾ ڊسڪ اسپيس جو غير معقول استعمال آهي. ٻيو، عملي طور تي ھڪڙو وڌيڪ سنگين مسئلو آھي: ڊيٽا اوور فلو ھڪڙي او ايس ڊي ۾. هي رياست ۾ ڪلستر پهريون منتقلي داخل ڪري ٿو HEALTH_WARN، ۽ پوءِ HEALTH_ERR. هن جو سبب اهو آهي ته ڪيف، جڏهن ڊيٽا جي دستياب مقدار جي حساب سان (توهان ان کي ڳولي سگهو ٿا MAX AVAIL حڪم جي پيداوار ۾ ceph df هر پول لاءِ الڳ) او ايس ڊي ۾ موجود ڊيٽا جي مقدار تي ٻڌل آهي. جيڪڏهن گهٽ ۾ گهٽ هڪ OSD ۾ ڪافي جڳهه نه آهي، وڌيڪ ڊيٽا نه لکي سگهجي ٿي جيستائين ڊيٽا سڀني OSDs ۾ صحيح طرح ورهائي نه وڃي.

اهو واضح ڪرڻ جي قابل آهي ته اهي مسئلا سيف ڪلستر جي ترتيب جي اسٽيج تي گهڻو ڪري فيصلو ڪيو ويو آهي. ھڪڙو اوزار توھان استعمال ڪري سگھو ٿا Ceph PGCalc. ان جي مدد سان، PG جي گهربل رقم واضح طور تي ڳڻپيو ويو آهي. تنهن هوندي به، توهان به هڪ اهڙي صورتحال ۾ ان کي استعمال ڪري سگهو ٿا جتي Ceph ڪلستر اڳ ۾ ئي غلط ترتيب ڏنل. هتي اهو واضح ڪرڻ جي قابل آهي ته فيڪس ڪم جي حصي جي طور تي توهان کي گهڻو ڪري پي جي جي تعداد کي گهٽائڻ جي ضرورت پوندي، ۽ اها خاصيت ڪيف جي پراڻن ورزن ۾ موجود ناهي (اهو صرف ورزن ۾ ظاهر ٿيو. Nautilus).

تنهن ڪري، اچو ته هيٺ ڏنل تصوير کي تصور ڪريو: ڪلستر جي حيثيت رکي ٿي HEALTH_WARN هڪ او ايس ڊي جي جاءِ ختم ٿيڻ سبب. اهو هڪ غلطي جي طرف اشارو ڪيو ويندو HEALTH_WARN: 1 near full osd. هن صورتحال مان نڪرڻ لاء هيٺ ڏنل هڪ الگورتھم آهي.

سڀ کان پهريان، توهان کي باقي او ايس ڊي جي وچ ۾ موجود ڊيٽا کي ورهائڻ جي ضرورت آهي. اسان اڳ ۾ ئي پهرين صورت ۾ ساڳيو آپريشن ڪيو آهي، جڏهن اسان نوڊ کي "خراب" ڪيو - صرف فرق سان ته هاڻي اسان کي ٿورو گھٽ ڪرڻو پوندو. reweight. مثال طور، 0.95 تائين:

ceph osd reweight osd.${ID} 0.95

هي او ايس ڊي ۾ ڊسڪ اسپيس کي آزاد ڪري ٿو ۽ سيف صحت ۾ غلطي کي درست ڪري ٿو. بهرحال، جيئن اڳ ۾ ئي ذڪر ڪيو ويو آهي، اهو مسئلو بنيادي طور تي ابتدائي مرحلن ۾ Ceph جي غلط ترتيب جي ڪري ٿئي ٿو: اهو تمام ضروري آهي ته ٻيهر ترتيب ڏيڻ لاء، انهي ڪري ته اهو مستقبل ۾ ظاهر نه ٿئي.

اسان جي خاص صورت ۾، اهو سڀ هيٺ آيو:

  • قدر تمام گھڻو replication_count هڪ تلاءُ ۾،
  • هڪ تلاءَ ۾ تمام گهڻو پي جي ۽ ٻئي ۾ تمام ٿورو.

اچو ته اڳ ۾ ئي ذڪر ڪيل ڳڻپيوڪر استعمال ڪريون. اهو واضح طور تي ڏيکاري ٿو ته ڇا داخل ٿيڻ جي ضرورت آهي ۽، اصول ۾، ڪجھ به پيچيده ناهي. ضروري معيارن کي مقرر ڪرڻ کان پوء، اسان ھيٺ ڏنل سفارشون حاصل ڪريون ٿا:

ويچاري: جيڪڏهن توهان شروع کان هڪ Ceph ڪلستر قائم ڪري رهيا آهيو، ڳڻپيوڪر جو هڪ ٻيو مفيد ڪم حڪمن جو نسل آهي جيڪو ٽيبل ۾ بيان ڪيل پيرا ميٽرز سان شروع کان پول ٺاهيندو.

آخري ڪالم توهان کي نيويگيٽ ڪرڻ ۾ مدد ڪري ٿو - تجويز ڪيل پي جي ڳڻپ. اسان جي حالت ۾، ٻيو پڻ ڪارائتو آهي، جتي نقل جي پيٽرولر کي اشارو ڪيو ويو آهي، ڇو ته اسان ريپليڪشن ضرب کي تبديل ڪرڻ جو فيصلو ڪيو آهي.

تنهن ڪري، پهرين توهان کي نقل ڪرڻ جي ماپ کي تبديل ڪرڻ جي ضرورت آهي - اهو پهريون ڪم ڪرڻ جي قابل آهي، ڇاڪاڻ ته ضرب کي گهٽائڻ سان، اسان ڊسڪ جي جاء خالي ڪنداسين. جيئن حڪم تي عمل ٿئي ٿو، توهان کي خبر پوندي ته دستياب ڊسڪ اسپيس وڌندي:

ceph osd pool $pool_name set $replication_size

۽ ان جي مڪمل ٿيڻ کان پوء، اسان پيٽرولر جي قيمت کي تبديل ڪندا آهيون pg_num и pgp_num جيئن ته:

ceph osd pool set $pool_name pg_num $pg_number
ceph osd pool set $pool_name pgp_num $pg_number

اهم: اسان کي لازمي طور تي هر پول ۾ PGs جو تعداد تبديل ڪرڻ گهرجي ۽ ٻين پولن ۾ قدر تبديل نه ڪرڻ گهرجي جيستائين ڊيڄاريندڙ غائب ٿي وڃن "خراب ٿيل ڊيٽا بيڪار" и "ن-نمبر جي پي ايس بي ترتيب".

توھان پڻ چيڪ ڪري سگھو ٿا ته ڪمانڊ آئوٽ استعمال ڪندي سڀ ڪجھ ٺيڪ ٿي ويو ceph health detail и ceph -s.

ڪيس نمبر 3. لڏپلاڻ هڪ مجازي مشين LVM کان Ceph RBD ڏانهن

اهڙي صورتحال ۾ جتي هڪ پروجيڪٽ استعمال ڪري ٿو ورچوئل مشينون رينجر ٿيل بيئر ميٽل سرورز تي نصب ٿيل آهن، غلطي برداشت ڪرڻ واري اسٽوريج جو مسئلو اڪثر پيدا ٿئي ٿو. اهو پڻ تمام ضروري آهي ته هن اسٽوريج ۾ ڪافي جڳهه آهي ... هڪ ٻي عام صورتحال: سرور تي مقامي اسٽوريج سان گڏ هڪ مجازي مشين آهي ۽ توهان کي ڊسڪ کي وڌائڻ جي ضرورت آهي، پر اتي وڃڻ لاء ڪٿي به ناهي، ڇاڪاڻ ته اتي موجود ناهي. مفت ڊسڪ اسپيس سرور تي ڇڏي ويو.

مسئلو مختلف طريقن سان حل ڪري سگھجي ٿو - مثال طور، ٻئي سرور ڏانھن لڏڻ (جيڪڏھن ھڪڙو آھي) يا سرور ۾ نئين ڊسڪ شامل ڪرڻ. پر اهو هميشه ممڪن ناهي ته اهو ڪرڻ لاء، تنهنڪري لڏپلاڻ LVM کان Ceph ڏانهن هن مسئلي جو بهترين حل ٿي سگهي ٿو. ھن اختيار کي چونڊڻ سان، اسان سرورز جي وچ ۾ لڏپلاڻ جي وڌيڪ عمل کي پڻ آسان بڻائي سگھون ٿا، ڇو ته مقامي اسٽوريج کي ھڪڙي ھائيپرائزر کان ٻئي ڏانھن منتقل ڪرڻ جي ڪا ضرورت نه پوندي. صرف پڪڙي اهو آهي ته توهان کي VM کي روڪڻو پوندو جڏهن ڪم ڪيو پيو وڃي.

هيٺ ڏنل ترڪيب مان ورتو ويو آهي هن بلاگ مان آرٽيڪل، جن جي هدايتن کي عمل ۾ آزمايو ويو آهي. ايئن ته، بغير تڪليف جي لڏپلاڻ جو طريقو پڻ بيان ڪيو ويو آهيجڏهن ته، اسان جي صورت ۾ اها ضرورت نه هئي، تنهنڪري اسان ان کي چيڪ نه ڪيو. جيڪڏھن اھو توھان جي منصوبي لاءِ نازڪ آھي، اسان کي تبصرن ۾ نتيجن بابت ٻڌي خوشي ٿيندي.

اچو ته عملي حصو ڏانهن وڃو. مثال ۾ اسان استعمال ڪريون ٿا virsh ۽، مطابق، libvirt. پهرين، پڪ ڪريو ته Ceph پول جنهن ڏانهن ڊيٽا لڏپلاڻ ڪئي ويندي libvirt سان ڳنڍيل آهي:

virsh pool-dumpxml $ceph_pool

تلاءَ جي تفصيل ۾ لازمي آھي ته ڪنيڪشن ڊيٽا کي ڪيف سان اختيار ڪرڻ واري ڊيٽا سان.

ايندڙ قدم اهو آهي ته LVM تصوير Ceph RBD ۾ تبديل ٿي وئي آهي. عمل جو وقت بنيادي طور تي تصوير جي سائيز تي منحصر آهي:

qemu-img convert -p -O rbd /dev/main/$vm_image_name rbd:$ceph_pool/$vm_image_name

تبديليءَ کان پوءِ، ھڪ LVM تصوير رھندي، جيڪا ڪارآمد ٿيندي جيڪڏھن VM کي RBD ڏانھن لڏڻ ناڪام ٿئي ۽ توھان کي تبديلين کي واپس آڻڻو پوندو. انهي سان گڏ، جلدي تبديلين کي واپس آڻڻ جي قابل ٿي، اچو ته ورچوئل مشين جي ترتيب واري فائل جو بيڪ اپ ٺاهيو:

virsh dumpxml $vm_name > $vm_name.xml
cp $vm_name.xml $vm_name_backup.xml

... ۽ اصل ۾ ترميم ڪريو (vm_name.xml). اچو ته ڊسڪ جي وضاحت سان هڪ بلاڪ ڳوليون (لائن سان شروع ٿئي ٿو <disk type='file' device='disk'> ۽ ختم ٿئي ٿو </disk>) ۽ ان کي ھيٺ ڏنل شڪل ۾ گھٽايو:

<disk type='network' device='disk'>
<driver name='qemu'/>
<auth username='libvirt'>
  <secret type='ceph' uuid='sec-ret-uu-id'/>
 </auth>
<source protocol='rbd' name='$ceph_pool/$vm_image_name>
  <host name='10.0.0.1' port='6789'/>
  <host name='10.0.0.2' port='6789'/>
</source>
<target dev='vda' bus='virtio'/> 
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>

اچو ته ڪجهه تفصيل تي نظر رکون:

  1. پروٽوڪول ڏانهن source Ceph RBD ۾ اسٽوريج جو پتو ظاهر ڪيو ويو آهي (هي پتو ظاهر ڪري ٿو Ceph پول ۽ RBD تصوير جو نالو، جيڪو پهرين اسٽيج تي طئي ڪيو ويو هو).
  2. بلاڪ ۾ secret قسم جو اشارو ڏنو ويو آهي ceph, گڏو گڏ ان سان ڳنڍڻ لاء راز جي UUID. ان جو uuid ڪمانڊ استعمال ڪندي ڳولهي سگھجي ٿو virsh secret-list.
  3. بلاڪ ۾ host ڪيف مانيٽر ڏانهن ايڊريس ظاهر ڪيا ويا آهن.

ترتيب ڏيڻ واري فائل کي ايڊٽ ڪرڻ کان پوءِ ۽ LVM کي RBD جي تبادلي کي مڪمل ڪرڻ کان پوءِ، توهان لاڳو ڪري سگهو ٿا تبديل ٿيل ترتيب واري فائيل ۽ ورچوئل مشين کي شروع ڪريو:

virsh define $vm_name.xml
virsh start $vm_name

اهو چيڪ ڪرڻ جو وقت آهي ته مجازي مشين صحيح طور تي شروع ڪيو: توهان ڳولي سگهو ٿا، مثال طور، ان سان ڳنڍڻ سان SSH ذريعي يا ذريعي virsh.

جيڪڏهن مجازي مشين صحيح طريقي سان ڪم ڪري رهي آهي ۽ توهان کي ٻيو ڪو مسئلو نه مليو آهي، ته پوء توهان LVM تصوير کي حذف ڪري سگهو ٿا جيڪو هاڻي استعمال نه ڪيو ويو آهي:

lvremove main/$vm_image_name

ٿڪل

اسان سڀني بيان ڪيل ڪيسن کي عملي طور تي پيش ڪيو - اسان اميد ڪريون ٿا ته هدايتون ٻين منتظمين کي ساڳي مسئلن کي حل ڪرڻ ۾ مدد ڪندي. جيڪڏهن توهان ڪيف استعمال ڪندي توهان جي تجربي مان رايا يا ٻيون ساڳيون ڳالهيون آهن، اسان انهن کي تبصرن ۾ ڏسي خوش ٿيندا!

پي ايس

اسان جي بلاگ تي پڻ پڙهو:

جو ذريعو: www.habr.com

تبصرو شامل ڪريو