በተጫኑ ፕሮጀክቶች ውስጥ ከሴፍ ጋር ለመስራት ጠቃሚ ምክሮች እና ዘዴዎች

በተጫኑ ፕሮጀክቶች ውስጥ ከሴፍ ጋር ለመስራት ጠቃሚ ምክሮች እና ዘዴዎች

የተለያዩ ሸክሞች ባሉባቸው ፕሮጀክቶች ውስጥ Cephን እንደ የአውታረ መረብ ማከማቻ በመጠቀም በመጀመሪያ እይታ ቀላል ወይም ቀላል የማይመስሉ የተለያዩ ስራዎች ሊያጋጥሙን ይችላሉ። ለምሳሌ:

  • በአዲሱ ክላስተር ውስጥ የቀድሞ አገልጋዮችን በከፊል በመጠቀም ከአሮጌው ሴፍ ወደ አዲስ የመረጃ ሽግግር;
  • በሴፍ ውስጥ የዲስክ ቦታ ምደባ ችግር መፍትሄ.

ከእንደዚህ አይነት ችግሮች ጋር በመገናኘት, ውሂብን ሳናጠፋ OSD ን በትክክል የማስወገድ አስፈላጊነት አጋጥሞናል, በተለይም ከፍተኛ መጠን ያለው መረጃን በሚመለከት በጣም አስፈላጊ ነው. ይህ በጽሁፉ ውስጥ ይብራራል.

ከዚህ በታች የተገለጹት ዘዴዎች ለማንኛውም የሴፍ ስሪት ተስማሚ ናቸው. በተጨማሪም, Ceph ከፍተኛ መጠን ያለው መረጃ ማከማቸት መቻሉ ግምት ውስጥ ይገባል-የውሂብ መጥፋት እና ሌሎች ችግሮችን ለመከላከል አንዳንድ ድርጊቶች ወደ ሌሎች "የተከፋፈሉ" ይሆናሉ.

ስለ OSD መግቢያ

ከተብራሩት ሶስት የምግብ አዘገጃጀቶች ውስጥ ሁለቱ ለኦኤስዲ የተሰጡ ስለሆኑ (የነገር ማከማቻ ዴሞን), ወደ ተግባራዊው ክፍል ከመጥለቅዎ በፊት - በአጭሩ በሴፍ ውስጥ ምን እንዳለ እና ለምን በጣም አስፈላጊ እንደሆነ.

በመጀመሪያ ደረጃ, ሁሉም የሴፍ ክላስተር ብዙ ኦኤስዲዎችን ያቀፈ ነው ሊባል ይገባል. በበዙ ቁጥር፣ በሴፍ ውስጥ ያለው የነጻ የውሂብ መጠን ይበልጣል። ከዚህ ለመረዳት ቀላል ነው። ዋና የ OSD ተግባርበሁሉም የክላስተር ኖዶች የፋይል ሲስተሞች ላይ የሴፍ ነገር መረጃን ያከማቻል እና የአውታረ መረብ መዳረሻን ይሰጣል (ለማንበብ፣ ለመፃፍ እና ለሌሎች ጥያቄዎች)።

በተመሳሳይ ደረጃ, የማባዛት መለኪያዎች የሚዘጋጁት ዕቃዎችን በተለያዩ OSD መካከል በመገልበጥ ነው. እና እዚህ የተለያዩ ችግሮች ሊያጋጥሙዎት ይችላሉ, መፍትሄዎች ከዚህ በታች ይብራራሉ.

ጉዳይ ቁጥር 1 ውሂብ ሳያጡ OSDን ከሴፍ ክላስተር በደህና ያስወግዱት።

OSD ን የማስወገድ አስፈላጊነት አገልጋዩን ከክላስተር በማንሳት ሊሆን ይችላል - ለምሳሌ በሌላ አገልጋይ ለመተካት - በእኛ ላይ የደረሰው ለዚህ ጽሑፍ መፃፍ ምክንያት ነው። ስለዚህ የማታለል የመጨረሻ ግብ በአንድ አገልጋይ ላይ ሁሉንም OSDs እና mons ማውጣቱ እንዲቆም ማድረግ ነው።

ለመመቻቸት እና ሁኔታዎችን ለማስወገድ, ትዕዛዞችን በሚፈጽምበት ጊዜ, አስፈላጊውን 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

OSD ማስወገድን ለመጀመር፣ በተቀላጠፈ ሁኔታ ማከናወን ያስፈልግዎታል reweight በእሱ ላይ ወደ ዜሮ. በዚህ መንገድ በ OSD ውስጥ ያለውን የውሂብ መጠን ከሌሎች ኦኤስዲዎች ጋር በማመጣጠን እንቀንሳለን። ይህንን ለማድረግ የሚከተሉትን ትዕዛዞችን ያሂዱ:

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 "ባዶ" በሚሆንበት ጊዜ, እሱን ለማስወገድ መደበኛውን አሠራር መቀጠል ይችላሉ. ይህንን ለማድረግ የተፈለገውን OSD ወደ ስቴቱ ያስተላልፉ down:

ceph osd down osd.${ID}

OSDን ከጥቅሉ ውስጥ “እናውጣው”፡-

ceph osd out osd.${ID}

የ OSD አገልግሎቱን እናቁመው እና ክፍፍሉን በ FS ውስጥ እናንቀል፡

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

OSD ን ያስወግዱ CRUSH ካርታ:

ceph osd crush remove osd.${ID}

የ OSD ተጠቃሚን እንሰርዘው፡-

ceph auth del osd.${ID}

እና በመጨረሻም፣ OSD ን እራሱ እናስወግደው፡-

ceph osd rm osd.${ID}

አመለከተCeph Luminous ስሪት ወይም ከዚያ በላይ እየተጠቀሙ ከሆነ ከላይ ያሉት የ OSD ማስወገጃ እርምጃዎች ወደ ሁለት ትዕዛዞች ሊቀነሱ ይችላሉ፡

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, እና እንዲሁም የኦኤስዲዎች ቁጥር መቀነስ እና የሚገኘውን የዲስክ ቦታ መጠን እናያለን.

የሚከተለው አገልጋዩን ሙሉ በሙሉ ለማቆም ከፈለጉ የሚያስፈልጉትን እርምጃዎች ይገልፃል እና በዚህ መሠረት ከሴፍ ያስወግዱት። በዚህ ሁኔታ, ያንን ማስታወስ አስፈላጊ ነው አገልጋዩን ከማጥፋትዎ በፊት ሁሉንም ኦኤስዲዎች ማስወገድ አለብዎት በዚህ አገልጋይ ላይ.

በዚህ አገልጋይ ላይ ምንም ተጨማሪ ኦኤስዲዎች ከሌሉ እነሱን ካስወገዱ በኋላ አገልጋዩን ከ OSD ካርታ ማግለል ያስፈልግዎታል hv-2የሚከተለውን ትዕዛዝ በማሄድ፡-

ceph osd crush rm hv-2

ሰርዝ mon ከአገልጋዩ hv-2ከዚህ በታች ያለውን ትዕዛዝ በሌላ አገልጋይ ላይ በማስኬድ (ማለትም በዚህ አጋጣሚ በ ላይ hv-1):

ceph-deploy mon destroy hv-2

ከዚህ በኋላ አገልጋዩን ማቆም እና ተከታታይ እርምጃዎችን (እንደገና ማሰማራት, ወዘተ) መጀመር ይችላሉ.

ጉዳይ ቁጥር 2. አስቀድሞ በተፈጠረ የሴፍ ክላስተር ውስጥ የዲስክ ቦታ ስርጭት

ሁለተኛውን ታሪክ ስለ ፒጂ (ፒጂ) በሚለው መቅድም እጀምራለሁምደባ ቡድኖች). በሴፍ ውስጥ ያለው የPG ዋና ሚና በዋናነት የሴፍ ነገሮችን ማሰባሰብ እና ተጨማሪ በ OSD ውስጥ መድገም ነው። የሚፈለገውን የፒጂ መጠን ማስላት የሚችሉበት ቀመር አለ። ተዛማጅ ክፍል የሴፍ ሰነድ. ይህ ጉዳይ ከተወሰኑ ምሳሌዎች ጋር እዚያም ተብራርቷል.

ስለዚህ: ሴፍ ሲጠቀሙ ከተለመዱት ችግሮች አንዱ በሴፍ ውስጥ ባሉ ገንዳዎች መካከል ያለው ሚዛናዊ ያልሆነ የኦኤስዲ እና ፒጂ ቁጥር ነው።

በመጀመሪያ ፣ በዚህ ምክንያት ፣ በትንሽ ገንዳ ውስጥ በጣም ብዙ ፒጂዎች ሲገለጹ አንድ ሁኔታ ሊፈጠር ይችላል ፣ ይህ በመሠረቱ በክላስተር ውስጥ ያለው የዲስክ ቦታ ምክንያታዊ ያልሆነ አጠቃቀም ነው። በሁለተኛ ደረጃ, በተግባር የበለጠ ከባድ ችግር አለ-በአንድ ኦኤስዲዎች ውስጥ የውሂብ መፍሰስ. ይህ ክላስተር መጀመሪያ ወደ ስቴት መሸጋገርን ያካትታል HEALTH_WARN, እና ከዛ HEALTH_ERR. ይህ የሆነበት ምክንያት Ceph, ያለውን የውሂብ መጠን ሲያሰሉ (ሊያገኙት ይችላሉ በ MAX AVAIL በትእዛዝ ውፅዓት ceph df ለእያንዳንዱ ገንዳ በተናጠል) በ OSD ውስጥ ባለው የውሂብ መጠን ላይ የተመሰረተ ነው. ቢያንስ በአንድ OSD ውስጥ በቂ ቦታ ከሌለ ውሂቡ በትክክል በሁሉም ኦኤስዲዎች መካከል እስኪሰራጭ ድረስ ምንም ተጨማሪ መረጃ መፃፍ አይቻልም።

እነዚህን ችግሮች ግልጽ ማድረግ ተገቢ ነው በአብዛኛው የሚወሰኑት በሴፍ ክላስተር ውቅረት ደረጃ ነው።. ሊጠቀሙባቸው ከሚችሉት መሳሪያዎች ውስጥ አንዱ ነው ሴፍ ፒጂካልክ. በእሱ እርዳታ አስፈላጊው የ PG መጠን በግልጽ ይሰላል. ሆኖም፣ የሴፍ ክላስተር ባለበት ሁኔታም ወደ እሱ ሊጠቀሙበት ይችላሉ። ገና በስህተት የተዋቀረ። እዚህ ላይ ማብራራት ተገቢ ነው እንደ የጥገና ሥራው አካል የፒጂዎችን ብዛት መቀነስ ያስፈልግዎታል ፣ እና ይህ ባህሪ በቀድሞው የ Ceph ስሪቶች ውስጥ አይገኝም (በስሪት ውስጥ ብቻ ነው የሚታየው) Nautilus).

እንግዲያው, የሚከተለውን ስዕል እናስብ: ክላስተር ደረጃ አለው HEALTH_WARN በአንደኛው OSD ቦታ በማለቁ ምክንያት። ይህ በስህተት ይገለጻል። HEALTH_WARN: 1 near full osd. ከዚህ በታች ከዚህ ሁኔታ ለመውጣት ስልተ ቀመር ነው.

በመጀመሪያ ደረጃ, ያለውን መረጃ በቀሪዎቹ ኦኤስዲዎች መካከል ማሰራጨት ያስፈልግዎታል. በመጀመሪያው ጉዳይ ላይ ተመሳሳይ ቀዶ ጥገና አደረግን ፣ መስቀለኛ መንገድን “ስናፈስስ” - ብቸኛው ልዩነት አሁን በትንሹ መቀነስ አለብን። reweight. ለምሳሌ፣ እስከ 0.95፡-

ceph osd reweight osd.${ID} 0.95

ይህ በኦኤስዲ ውስጥ የዲስክ ቦታን ያስለቅቃል እና በ ceph ጤና ላይ ያለውን ስህተት ያስተካክላል። ሆኖም ፣ ቀደም ሲል እንደተገለፀው ፣ ይህ ችግር በዋነኝነት የሚከሰተው በመጀመሪያዎቹ ደረጃዎች ላይ በሴፍ የተሳሳተ ውቅር ምክንያት ነው-ወደፊት እንዳይታይ እንደገና ማዋቀር በጣም አስፈላጊ ነው።

በእኛ ሁኔታ፣ ሁሉም ወደዚህ መጣ፡-

  • ዋጋ በጣም ከፍተኛ replication_count በአንደኛው ገንዳ ውስጥ ፣
  • በአንድ ገንዳ ውስጥ በጣም ብዙ PG እና በሌላ ውስጥ በጣም ትንሽ።

ቀደም ሲል የተጠቀሰውን ካልኩሌተር እንጠቀም። ምን ማስገባት እንዳለበት በግልፅ ያሳያል እና በመርህ ደረጃ, ምንም የተወሳሰበ ነገር የለም. አስፈላጊዎቹን መለኪያዎች ካዘጋጀን በኋላ የሚከተሉትን ምክሮች እናገኛለን:

አመለከተ: የ Ceph ክላስተር ከባዶ እያዘጋጁ ከሆነ፣ ሌላው ጠቃሚ የካልኩሌተሩ ተግባር በሠንጠረዡ ውስጥ ከተገለጹት መለኪያዎች ጋር ከባዶ ገንዳዎችን የሚፈጥሩ ትዕዛዞችን ማመንጨት ነው።

የመጨረሻው አምድ ለመዳሰስ ይረዳዎታል - የተጠቆመ የPG ቆጠራ. በእኛ ሁኔታ, ሁለተኛው ደግሞ ጠቃሚ ነው, የማባዛት መለኪያው በተጠቆመበት, የማባዛት ብዜት ለመለወጥ ስለወሰንን.

ስለዚህ በመጀመሪያ የማባዛት መለኪያዎችን መለወጥ ያስፈልግዎታል - ይህ በመጀመሪያ ማድረግ ተገቢ ነው ፣ ምክንያቱም ማባዣውን በመቀነስ የዲስክ ቦታን ነፃ እናደርጋለን። ትዕዛዙ ሲሰራ, ያለው የዲስክ ቦታ እንደሚጨምር ያስተውላሉ.

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

ከፍተኛበእያንዳንዱ ገንዳ ውስጥ የፒጂዎችን ቁጥር በቅደም ተከተል መለወጥ እና ማስጠንቀቂያዎቹ እስኪጠፉ ድረስ በሌሎች ገንዳዎች ውስጥ ያሉትን እሴቶች መለወጥ የለብንም። "የተበላሸ የውሂብ ድግግሞሽ" и "n-የገጽ ቁጥር ተዋርዷል".

እንዲሁም የትዕዛዝ ውጤቶችን በመጠቀም ሁሉም ነገር በጥሩ ሁኔታ እንደሄደ ማረጋገጥ ይችላሉ። ceph health detail и ceph -s.

ጉዳይ ቁጥር 3. ምናባዊ ማሽንን ከ LVM ወደ Ceph RBD ማዛወር

አንድ ፕሮጀክት በተከራዩት በባዶ ብረት ሰርቨሮች ላይ የተጫኑ ቨርቹዋል ማሽኖችን በሚጠቀምበት ሁኔታ ብዙ ጊዜ ስህተትን የሚቋቋም ማከማቻ ጉዳይ ይነሳል። በተጨማሪም በዚህ ማከማቻ ውስጥ በቂ ቦታ መኖሩ በጣም የሚፈለግ ነው ... ሌላ የተለመደ ሁኔታ: በአገልጋዩ ላይ የአካባቢያዊ ማከማቻ ያለው ቨርቹዋል ማሽን አለ እና ዲስኩን ማስፋት ያስፈልግዎታል, ነገር ግን የሚሄዱበት ቦታ የለም, ምክንያቱም ምንም የለም. በአገልጋዩ ላይ የቀረው ነፃ የዲስክ ቦታ።

ችግሩ በተለያየ መንገድ ሊፈታ ይችላል - ለምሳሌ ወደ ሌላ አገልጋይ (አንድ ካለ) በመሰደድ ወይም አዲስ ዲስክ ወደ አገልጋዩ በመጨመር. ነገር ግን ይህንን ማድረግ ሁልጊዜ አይቻልም, ስለዚህ ከኤልቪኤም ወደ ሴፍ መዘዋወር ለዚህ ችግር ጥሩ መፍትሄ ሊሆን ይችላል. ይህን አማራጭ በመምረጥ፣ የአካባቢ ማከማቻን ከአንድ ሃይፐርቫይዘር ወደ ሌላ ማንቀሳቀስ ስለሌለ በአገልጋዮች መካከል ያለውን ተጨማሪ የፍልሰት ሂደት እናቀላልለን። ብቸኛው የሚይዘው ስራው በሚካሄድበት ጊዜ ቪኤምን ማቆም አለብዎት.

የሚከተለው የምግብ አሰራር የተወሰደ ነው ከዚህ ብሎግ የመጣ ጽሑፍ, መመሪያዎቹ በተግባር ተፈትነዋል. በነገራችን ላይ, ከችግር ነጻ የሆነ የስደት ዘዴም በዚያ ተብራርቷል።, ነገር ግን, በእኛ ሁኔታ, በቀላሉ አያስፈልግም ነበር, ስለዚህ እኛ አላጣራነውም. ይህ ለፕሮጀክትዎ ወሳኝ ከሆነ በአስተያየቶቹ ውስጥ ስለ ውጤቶቹ ስንሰማ ደስተኞች ነን።

ወደ ተግባራዊ ክፍል እንሂድ። በምሳሌው ውስጥ ቪርሽ እና, በዚህ መሠረት, ሊብቪርት እንጠቀማለን. በመጀመሪያ፣ ውሂቡ የሚፈልስበት የሴፍ ገንዳ ከሊብቨርት ጋር መገናኘቱን ያረጋግጡ፡-

virsh pool-dumpxml $ceph_pool

የመዋኛ ገንዳው መግለጫ ከሴፍ ጋር የግንኙነት ውሂብ ከፍቃድ ውሂብ ጋር መያዝ አለበት።

ቀጣዩ ደረጃ የኤል.ኤም.ኤም ምስል ወደ Ceph RBD ይቀየራል. የማስፈጸሚያ ጊዜ በዋነኝነት በምስሉ መጠን ላይ የተመሰረተ ነው-

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

ከተቀየረ በኋላ የኤል.ኤም.ኤም ምስል ይቀራል፣ ይህም ቪኤም ወደ 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 ውስጥ ያለው የማከማቻ አድራሻ ተጠቁሟል (ይህ በመጀመርያ ደረጃ ላይ የተወሰነው የሴፍ ገንዳ እና የ RBD ምስል ስም የሚያመለክት አድራሻ ነው).
  2. በብሎክ ውስጥ secret ዓይነት ይጠቁማል ceph, እንዲሁም ከእሱ ጋር ለመገናኘት የምስጢር UUID. የእሱ uid ትዕዛዙን በመጠቀም ሊገኝ ይችላል virsh secret-list.
  3. በብሎክ ውስጥ host የ Ceph ማሳያዎች አድራሻዎች ተጠቁመዋል።

የማዋቀሪያ ፋይሉን አርትዕ ካደረጉ እና LVM ወደ RBD ልወጣ ከጨረሱ በኋላ የተሻሻለውን የውቅር ፋይል በመተግበር ቨርቹዋል ማሽኑን መጀመር ይችላሉ።

virsh define $vm_name.xml
virsh start $vm_name

ቨርቹዋል ማሽኑ በትክክል መጀመሩን ለመፈተሽ ጊዜው አሁን ነው፡- ለምሳሌ ከሱ ጋር በSSH በኩል በማገናኘት ማወቅ ይችላሉ። virsh.

ቨርቹዋል ማሽኑ በትክክል እየሰራ ከሆነ እና ምንም አይነት ችግር ካላገኙ ከአሁን በኋላ ጥቅም ላይ ያልዋለውን የLVM ምስል መሰረዝ ይችላሉ፡

lvremove main/$vm_image_name

መደምደሚያ

ሁሉንም የተገለጹትን ጉዳዮች በተግባር አጋጥሞናል - መመሪያው ሌሎች አስተዳዳሪዎች ተመሳሳይ ችግሮችን ለመፍታት እንደሚረዳቸው ተስፋ እናደርጋለን. Ceph ን በመጠቀም ካሎት ልምድ አስተያየቶች ወይም ሌሎች ተመሳሳይ ታሪኮች ካሉ በአስተያየቶቹ ውስጥ በማየታችን ደስተኞች ነን!

PS

በብሎጋችን ላይ ያንብቡ፡-

ምንጭ: hab.com

አስተያየት ያክሉ