د CEPH سره تجربه

کله چې په یو ډیسک کې د فټ کیدو څخه ډیر ډیټا شتون ولري ، نو دا د RAID په اړه فکر کولو وخت دی. د ماشوم په توګه، ما ډیری وختونه د خپلو مشرانو څخه اوریدلي دي: "یوه ورځ به د تیر وخت شی وي، د شیانو ذخیره به نړۍ ډکه کړي، او تاسو حتی نه پوهیږئ چې CEPH څه دی،" نو زما په خپلواک ژوند کې لومړی شی. زما خپل کلستر جوړ کړم. د تجربې موخه دا وه چې د سیف داخلي جوړښت سره آشنا شي او د هغې د غوښتنلیک ساحه پوه شي. په متوسطه سوداګرۍ او کوچنیو کې د سیف پلي کول څومره توجیه دي؟ د څو کلونو عملیاتو او یو څو نه بدلیدونکي ډیټا له لاسه ورکولو وروسته ، د پیچلتیاو پوهه راپورته شوه چې هرڅه دومره ساده ندي. د CEPH ځانګړتیاوې د هغې په پراخه کچه د منلو په وړاندې خنډونه رامینځته کوي، او د دوی له امله، تجربې پای ته رسیدلي. لاندې د ټولو پورته شویو ګامونو توضیحات دي، ترلاسه شوي پایلې او پایلې یې ترلاسه کړې. که پوه خلک خپلې تجربې شریکې کړي او ځینې ټکي یې تشریح کړي، زه به مننه وکړم.

یادونه: تبصره کونکو په ځینو انګیرنو کې جدي غلطۍ په ګوته کړي چې د ټولې مقالې بیاکتنې ته اړتیا لري.

د CEPH ستراتیژي

د CEPH کلستر د خپل سري اندازې د ډیسکونو خپلمنځي شمیر K سره یوځای کوي او په دوی کې ډاټا ذخیره کوي، هره ټوټه (4 MB په ډیفالټ) د ورکړل شوي شمیر N ځله نقل کوي.

راځئ چې د دوه ورته ډیسکونو سره ساده قضیه په پام کې ونیسو. له دوی څخه تاسو کولی شئ RAID 1 یا د N=2 سره کلستر راټول کړئ - پایله به ورته وي. که چیرې درې ډیسکونه وي او دوی مختلف اندازې وي، نو د N=2 سره د کلستر راټولول اسانه دي: ځینې معلومات به په 1 او 2 ډیسکونو کې وي، ځینې به په 1 او 3 ډیسکونو کې وي، او ځینې به یې وي. په 2 او 3 کې، پداسې حال کې چې RAID به نه وي (تاسو کولی شئ دا ډول RAID راټول کړئ، مګر دا به یو ګډوډ وي). که چیرې حتی ډیر ډیسکونه شتون ولري ، نو بیا د RAID 5 رامینځته کول امکان لري؛ CEPH یو انلاګ لري - erasure_code ، کوم چې د پراختیا کونکو لومړني مفکورې سره مخالفت کوي ، او له همدې امله په پام کې نه نیول کیږي. RAID 5 داسې انګیرل کیږي چې لږ شمیر ډرایو شتون لري، چې ټول یې په ښه حالت کې دي. که یو ناکام شي، نور باید تر هغه وخته پورې ودریږي تر څو چې ډیسک ځای په ځای شوی نه وي او ډاټا بیرته راګرځي. CEPH، د N>=3 سره، د زړو ډیسکونو کارول هڅوي، په ځانګړې توګه، که تاسو د ډیټا یوه کاپي ذخیره کولو لپاره څو ښه ډیسکونه وساتئ، او پاتې دوه یا درې کاپي په ډیرو زړو ډیسکونو کې ذخیره کړئ، نو معلومات. خوندي به وي، ځکه چې د اوس لپاره نوي ډیسکونه ژوندي دي - هیڅ ستونزه شتون نلري، او که یو له دوی څخه مات شي، نو بیا د دریو ډیسکونو په ورته وخت کې ناکامي د پنځو کلونو څخه زیات د خدمت ژوند سره، په غوره توګه د مختلفو سرورونو څخه، خورا ناشونی دی. پیښه

د کاپي په ویش کې یو فرعي شتون شتون لري. په ډیفالټ ډول، داسې انګیرل کیږي چې ډاټا په ډیرو (~ 100 هر ډیسک) د PG توزیع ګروپونو ویشل شوي، چې هر یو یې په ځینو ډیسکونو کې نقل شوي. راځئ چې K = 6، N = 2 ووایو، نو که چیرې کوم دوه ډیسکونه ناکام شي، د معلوماتو د ورکیدو تضمین کیږي، ځکه چې د احتمالي تیوري له مخې، لږترلږه یو PG به وي چې په دې دوو ډیسکونو کې واقع وي. او د یوې ډلې له لاسه ورکول په حوض کې ټول معلومات شتون نلري. که چیرې ډیسکونه په دریو جوړو ویشل شوي وي او ډیټا یوازې په یوه جوړه کې دننه ډیسکونو کې ذخیره کولو اجازه وي ، نو دا ډول توزیع د یو ډیسک د ناکامۍ سره هم مقاومت لري ، مګر که دوه ډیسکونه ناکام شي ، د ډیټا ضایع کیدو احتمال شتون نلري. 100٪، مګر یوازې 3/15، او حتی د ناکامۍ په صورت کې درې ډیسکونه - یوازې 12/20. له همدې امله، د معلوماتو په ویش کې انټروپي د غلطۍ زغملو کې مرسته نه کوي. دا هم په یاد ولرئ چې د فایل سرور لپاره، وړیا رام د پام وړ د غبرګون سرعت زیاتوي. په هر نوډ کې څومره حافظه، او په ټولو نوډونو کې ډیر حافظه، دا به چټک وي. دا بې له شکه په یو واحد سرور کې د کلستر ګټه ده او حتی نور هم ، د هارډویر NAS ، چیرې چې د حافظې خورا لږ مقدار رامینځته شوی.

دا تعقیبوي چې CEPH د لسګونو TB لپاره د باور وړ ډیټا ذخیره کولو سیسټم رامینځته کولو لپاره یوه ښه لار ده چې د زاړه تجهیزاتو څخه لږترلږه پانګوونې سره اندازه کولو وړتیا سره (دلته ، البته ، لګښتونه به اړین وي ، مګر د سوداګریزو ذخیره کولو سیسټمونو په پرتله کوچني).

د کلستر پلي کول

د تجربې لپاره، راځئ چې یو غیر فعال کمپیوټر واخلو Intel DQ57TM + Intel core i3 540 + 16 GB RAM. موږ به د RAID2 په څیر څلور 10 TB ډیسکونه تنظیم کړو، د بریالي ازموینې وروسته به موږ دوهم نوډ او ورته ډیسکونه اضافه کړو.

د لینکس نصب کول. ویش د دودیز کولو او باثباته کولو وړتیا ته اړتیا لري. دبیان او سوس اړتیاوې پوره کوي. سوس یو ډیر انعطاف وړ انسټالر لري چې تاسو ته اجازه درکوي هر ډول کڅوړه غیر فعال کړئ؛ له بده مرغه، زه نشم کولی معلومه کړم چې کوم یو سیسټم ته زیان رسولو پرته غورځول کیدی شي. د debootstrap بسټر په کارولو سره Debian نصب کړئ. د مین بیس اختیار یو مات شوی سیسټم نصبوي چې چلوونکي نلري. د بشپړ نسخې په پرتله د اندازې توپیر دومره لوی ندی څومره چې ځورول کیږي. څرنګه چې کار په فزیکي ماشین کې ترسره کیږي، زه غواړم چې عکسونه واخلم، لکه په مجازی ماشینونو کې. دا اختیار د LVM یا btrfs لخوا چمتو شوی (یا xfs، یا zfs - توپیر لوی ندی). د LVM سنیپ شاټونه یو پیاوړی ټکی ندی. btrfs نصب کړئ. او بوټلوډر په MBR کې دی. د FAT برخې سره د 50 MB ډیسک ګډوډ کولو کې هیڅ معنی نشته کله چې تاسو کولی شئ دا د 1 MB برخې جدول ساحې ته فشار ورکړئ او د سیسټم لپاره ټول ځای تخصیص کړئ. په ډیسک کې 700 MB پورته کړل. زه په یاد نه یم چې د SUSE لومړني نصب څومره لري، زه فکر کوم چې دا د 1.1 یا 1.4 GB په اړه دی.

CEPH نصب کړئ. موږ د دیبیان ذخیره کې 12 نسخه له پامه غورځوو او د 15.2.3 سایټ څخه مستقیم وصل شو. موږ د لاندې احتیاطونو سره "په لاسي ډول CEPH نصب کړئ" برخې لارښوونې تعقیب کوو:

  • مخکې له دې چې ذخیره وصل کړئ، تاسو باید د gnupg wget ca-certificates نصب کړئ
  • د ذخیره کولو وروسته ، مګر د کلسټر نصبولو دمخه ، د کڅوړو نصب کول پریښودل کیږي: apt -y --no-install-recommends install ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
  • کله چې د CEPH نصب کول، د نامعلومو دلیلونو لپاره، دا به هڅه وکړي چې lvm2 نصب کړي. په اصل کې، دا د افسوس خبره نه ده، مګر نصب کول ناکام شوي، نو CEPH به هم نصب نه کړي.

    دا پیچ مرسته وکړه:

    cat << EOF >> /var/lib/dpkg/status
    Package: lvm2
    Status: install ok installed
    Priority: important
    Section: admin
    Installed-Size: 0
    Maintainer: Debian Adduser Developers <[email protected]>
    Architecture: all
    Multi-Arch: foreign
    Version: 113.118
    Description: No-install
    EOF
    

د کلستر کتنه

ceph-osd - په ډیسک کې د معلوماتو ذخیره کولو مسؤل دی. د هر ډیسک لپاره، د شبکې خدمت پیل شوی چې د شیانو لوستلو یا لیکلو غوښتنې مني او اجرا کوي. په ډیسک کې دوه برخې جوړې شوې. یو له دوی څخه د کلستر، ډیسک شمیره، او کلستر ته کیلي په اړه معلومات لري. دا 1KB معلومات یوځل رامینځته کیږي کله چې ډیسک اضافه کوي او هیڅکله یې بدلون ته پام نه دی شوی. دویمه برخه د فایل سیسټم نلري او د CEPH بائنری ډیټا ذخیره کوي. په تیرو نسخو کې اتوماتیک نصب د خدماتو معلوماتو لپاره د 100MB xfs برخې رامینځته کړې. ما ډیسک MBR ته بدل کړ او یوازې 16MB یې تخصیص کړ - خدمت شکایت نه کوي. زه فکر کوم چې xfs پرته له کومې ستونزې د ext سره ځای په ځای کیدی شي. دا تقسیم په /var/lib/… کې نصب شوی، چیرې چې خدمت د OSD په اړه معلومات لوستل کوي او د بلاک وسیلې ته حواله هم پیدا کوي چیرې چې بائنری ډیټا زیرمه کیږي. په تیوریکي توګه، تاسو کولی شئ سمدستي معاون فایلونه په /var/lib/… کې ځای په ځای کړئ، او د ډیټا لپاره ټول ډیسک تخصیص کړئ. کله چې د ceph-deploy له لارې OSD رامینځته کړئ ، یو قاعده په اوتومات ډول رامینځته کیږي ترڅو په /var/lib/… کې د برخې نصبولو لپاره رامینځته شي ، او د سیف کارونکي ته د مطلوب بلاک وسیلې لوستلو حقونه هم ورکړل شوي. که تاسو په لاسي ډول نصب کړئ، تاسو باید دا پخپله ترسره کړئ؛ اسناد دا نه وايي. دا هم مشوره ورکول کیږي چې د osd حافظې هدف پیرامیټر مشخص کړئ ترڅو کافي فزیکي حافظه شتون ولري.

ceph-mds. په ټیټه کچه، CEPH د شیانو ذخیره ده. د بلاک ذخیره کولو وړتیا د هر 4MB بلاک د یو څیز په توګه ذخیره کولو لپاره غوړیږي. د فایل ذخیره په ورته اصولو کار کوي. دوه حوضونه جوړ شوي: یو د میټاډاټا لپاره، بل د معلوماتو لپاره. دوی د فایل سیسټم سره یوځای شوي. پدې وخت کې ، یو ډول ریکارډ رامینځته کیږي ، نو که تاسو د فایل سیسټم حذف کړئ ، مګر دواړه حوضونه وساتئ ، نو تاسو به نشئ کولی دا بحال کړئ. د بلاکونو په واسطه د فایلونو استخراج لپاره یو پروسیجر شتون لري، ما دا ازموینه نه ده کړې. د ceph-mds خدمت د فایل سیسټم ته د لاسرسي مسؤلیت لري. هر فایل سیسټم د خدمت جلا بیلګه ته اړتیا لري. دلته د "انډیکس" اختیار شتون لري ، کوم چې تاسو ته اجازه درکوي په یو کې د ډیری فایل سیسټمونو بیلانس رامینځته کړئ - هم ازمول شوي ندي.

Ceph-mon - دا خدمت د کلستر نقشه ذخیره کوي. پدې کې د ټولو OSDs په اړه معلومات شامل دي، په OSDs کې د PGs ویشلو لپاره الګوریتم او تر ټولو مهم، د ټولو شیانو په اړه معلومات (د دې میکانیزم توضیحات ما ته روښانه ندي: دلته یو لارښود شتون لري /var/lib/ceph/mon/…/ store.db، دا یو لوی فایل لري چې 26MB دی، او د 105K شیانو په کلستر کې، دا په هر اعتراض کې د 256 بایټ څخه لږ څه بدلیږي - زه فکر کوم چې مانیټور د ټولو شیانو لیست ذخیره کوي او PG په کوم کې دوی موقعیت لري). دې لارښود ته زیان په کلستر کې د ټولو معلوماتو له لاسه ورکولو پایله لري. له همدې امله پایله دا شوه چې CRUSH ښیي چې څنګه PGs په OSD کې موقعیت لري، او څنګه توکي په PGs کې موقعیت لري - دوی په مرکزي توګه د ډیټابیس دننه زیرمه شوي، پرته له دې چې پراختیا کونکي د دې کلمې څخه څومره ډډه وکړي. د پایلې په توګه، لومړی، موږ نشو کولی سیسټم په RO موډ کې په فلش ډرایو کې نصب کړو، ځکه چې ډیټابیس په دوامداره توګه ثبت کیږي، د دې لپاره اضافي ډیسک ته اړتیا ده (په سختۍ سره د 1 GB څخه ډیر)، دوهم، دا اړینه ده چې د RO موډ ولري. په ریښتیني وخت کې دا اساس کاپي کړئ. که چیرې ډیری څارونکي شتون ولري ، نو د غلطۍ زغم په اوتومات ډول تضمین کیږي ، مګر زموږ په قضیه کې یوازې یو څارونکی شتون لري ، اعظمي دوه. د OSD ډیټا پراساس د مانیټر بحالولو لپاره نظریاتي کړنلاره شتون لري ، ما د مختلف دلایلو لپاره درې ځله دې ته لاره هواره کړه ، او درې ځله د غلطۍ پیغامونه شتون نلري ، او همدارنګه هیڅ معلومات شتون نلري. له بده مرغه، دا میکانیزم کار نه کوي. یا خو موږ په OSD کې کوچنۍ برخه چلوو او د ډیټابیس ذخیره کولو لپاره RAID راټولوو ، کوم چې به یقینا په فعالیت خورا ناوړه اغیزه ولري ، یا موږ لږترلږه دوه معتبر فزیکي رسنۍ تخصیص کوو ، په غوره توګه USB ، ترڅو بندرونه اشغال نشي.

rados-gw - د S3 پروتوکول او ورته له لارې د اعتراض ذخیره صادروي. ډیری حوضونه جوړوي، دا معلومه نده چې ولې. ما ډیره تجربه نه ده کړې.

ceph-mgr - کله چې دا خدمت نصب کړئ، ډیری ماډلونه پیل شوي. یو له دوی څخه اتوماتیک دی چې غیر فعال کیدی نشي. دا هڅه کوي چې د PG/OSD سمه اندازه وساتي. که تاسو غواړئ تناسب په لاسي ډول کنټرول کړئ، تاسو کولی شئ د هر حوض لپاره اندازه کول غیر فعال کړئ، مګر پدې حالت کې ماډل د 0 لخوا ویشل کیږي، او د کلستر حالت ERROR کیږي. ماډل په Python کې لیکل شوی، او که تاسو په دې کې اړین کرښه تبصره وکړئ، دا د دې غیر فعال کیدو لامل کیږي. د جزیاتو په یادولو کې ډیر سست.

د کارول شویو سرچینو لیست:

د CEPH نصب کول
د بشپړ څارونکي ناکامۍ څخه رغونه

د سکریپټ لیستونه:

د debootstrap له لارې د سیسټم نصب کول

blkdev=sdb1
mkfs.btrfs -f /dev/$blkdev
mount /dev/$blkdev /mnt
cd /mnt
for i in {@,@var,@home}; do btrfs subvolume create $i; done
mkdir snapshot @/{var,home}
for i in {var,home}; do mount -o bind @${i} @/$i; done
debootstrap buster @ http://deb.debian.org/debian; echo $?
for i in {dev,proc,sys}; do mount -o bind /$i @/$i; done
cp /etc/bash.bashrc @/etc/

chroot /mnt/@ /bin/bash
echo rbd1 > /etc/hostname
passwd
uuid=`blkid | grep $blkdev | cut -d """ -f 2`
cat << EOF > /etc/fstab
UUID=$uuid / btrfs noatime,nodiratime,subvol=@ 0 1
UUID=$uuid /var btrfs noatime,nodiratime,subvol=@var 0 2
UUID=$uuid /home btrfs noatime,nodiratime,subvol=@home 0 2
EOF
cat << EOF >> /var/lib/dpkg/status
Package: lvm2
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 0
Maintainer: Debian Adduser Developers <[email protected]>
Architecture: all
Multi-Arch: foreign
Version: 113.118
Description: No-install

Package: sudo
Status: install ok installed
Priority: important
Section: admin
Installed-Size: 0
Maintainer: Debian Adduser Developers <[email protected]>
Architecture: all
Multi-Arch: foreign
Version: 113.118
Description: No-install
EOF

exit
grub-install --boot-directory=@/boot/ /dev/$blkdev
init 6

apt -yq install --no-install-recommends linux-image-amd64 bash-completion ed btrfs-progs grub-pc iproute2 ssh  smartmontools ntfs-3g net-tools man
exit
grub-install --boot-directory=@/boot/ /dev/$blkdev
init 6

یو کلستر جوړ کړئ

apt -yq install --no-install-recommends gnupg wget ca-certificates
echo 'deb https://download.ceph.com/debian-octopus/ buster main' >> /etc/apt/sources.list
wget -q -O- 'https://download.ceph.com/keys/release.asc' | apt-key add -
apt update
apt -yq install --no-install-recommends ceph-common ceph-mon

echo 192.168.11.11 rbd1 >> /etc/hosts
uuid=`cat /proc/sys/kernel/random/uuid`
cat << EOF > /etc/ceph/ceph.conf
[global]
fsid = $uuid
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
mon allow pool delete = true
mon host = 192.168.11.11
mon initial members = rbd1
mon max pg per osd = 385
osd crush update on start = false
#osd memory target = 2147483648
osd memory target = 1610612736
osd scrub chunk min = 1
osd scrub chunk max = 2
osd scrub sleep = .2
osd pool default pg autoscale mode = off
osd pool default size = 1
osd pool default min size = 1
osd pool default pg num = 1
osd pool default pgp num = 1
[mon]
mgr initial modules = dashboard
EOF

ceph-authtool --create-keyring ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'
ceph-authtool --create-keyring ceph.client.admin.keyring --gen-key -n client.admin --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow *' --cap mgr 'allow *'
cp ceph.client.admin.keyring /etc/ceph/
ceph-authtool --create-keyring bootstrap-osd.ceph.keyring --gen-key -n client.bootstrap-osd --cap mon 'profile bootstrap-osd' --cap mgr 'allow r'
cp bootstrap-osd.ceph.keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
ceph-authtool ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
ceph-authtool ceph.mon.keyring --import-keyring /var/lib/ceph/bootstrap-osd/ceph.keyring
monmaptool --create --add rbd1 192.168.11.11 --fsid $uuid monmap
rm -R /var/lib/ceph/mon/ceph-rbd1/*
ceph-mon --mkfs -i rbd1 --monmap monmap --keyring ceph.mon.keyring
chown ceph:ceph -R /var/lib/ceph
systemctl enable ceph-mon@rbd1
systemctl start ceph-mon@rbd1
ceph mon enable-msgr2
ceph status

# dashboard

apt -yq install --no-install-recommends ceph-mgr ceph-mgr-dashboard python3-distutils python3-yaml
mkdir /var/lib/ceph/mgr/ceph-rbd1
ceph auth get-or-create mgr.rbd1 mon 'allow profile mgr' osd 'allow *' mds 'allow *' > /var/lib/ceph/mgr/ceph-rbd1/keyring
systemctl enable ceph-mgr@rbd1
systemctl start ceph-mgr@rbd1
ceph config set mgr mgr/dashboard/ssl false
ceph config set mgr mgr/dashboard/server_port 7000
ceph dashboard ac-user-create root 1111115 administrator
systemctl stop ceph-mgr@rbd1
systemctl start ceph-mgr@rbd1

د OSD اضافه کول (برخه)

apt install ceph-osd

osdnum=`ceph osd create`
mkdir -p /var/lib/ceph/osd/ceph-$osdnum
mkfs -t xfs /dev/sda1
mount -t xfs /dev/sda1 /var/lib/ceph/osd/ceph-$osdnum
cd /var/lib/ceph/osd/ceph-$osdnum
ceph auth get-or-create osd.0 mon 'profile osd' mgr 'profile osd' osd 'allow *' > /var/lib/ceph/osd/ceph-$osdnum/keyring
ln -s /dev/disk/by-partuuid/d8cc3da6-02  block
ceph-osd -i $osdnum --mkfs
#chown ceph:ceph /dev/sd?2
chown ceph:ceph -R /var/lib/ceph
systemctl enable ceph-osd@$osdnum
systemctl start ceph-osd@$osdnum

لنډیز

د CEPH اصلي بازار موندنې ګټه کرش ده - د معلوماتو موقعیت محاسبه کولو لپاره الګوریتم. څارونکي دا الګوریتم پیرودونکو ته توزیع کوي ، وروسته له دې چې پیرودونکي مستقیم د مطلوب نوډ او مطلوب OSD غوښتنه کوي. CRUSH هیڅ مرکزیت نه تضمینوي. دا یو کوچنی فایل دی چې تاسو حتی چاپ کولی شئ او په دیوال کې ځړول کیدی شئ. تمرین ښودلې چې CRUSH یوه بشپړه نقشه نه ده. که تاسو څارونکي ویجاړ او بیا جوړ کړئ، ټول OSD او CRUSH ساتل، نو دا د کلستر بیا رغولو لپاره کافي ندي. له دې څخه دا نتیجه اخیستل کیږي چې هر څارونکی د ټول کلستر په اړه ځینې میټاډاټا ذخیره کوي. د دې میټاډاټا لږه اندازه د کلستر په اندازې محدودیتونه نه لګوي، مګر د دوی خوندیتوب ډاډمن کولو ته اړتیا لري، کوم چې په فلش ډرایو کې د سیسټم په نصبولو سره د ډیسک سپما له منځه وړي او له دریو څخه کم نوډونو سره کلسترونه خارجوي. د اختیاري ځانګړتیاو په اړه د پراختیا کونکي تیریدونکي پالیسي. له minimalism څخه لرې. اسناد د "هغه څه لپاره مننه چې موږ یې لرو، مګر دا خورا لږ دی." په ټیټه کچه د خدماتو سره د متقابل عمل کولو وړتیا چمتو شوې ، مګر اسناد پدې موضوع باندې خورا په ښکاره ډول لمس کوي ، نو دا احتمال د هو په پرتله نه دی. په عملي ډول د بیړني حالت څخه د معلوماتو بیرته ترلاسه کولو هیڅ امکان شتون نلري.

د نورو عملونو لپاره اختیارونه: CEPH پریږدئ او د بینال ملټي ډیسک btrfs (یا xfs، zfs) وکاروئ ، د CEPH په اړه نوي معلومات ومومئ ، کوم چې تاسو ته اجازه درکوي دا په ټاکلو شرایطو کې پرمخ وړئ ، هڅه وکړئ خپل ذخیره د پرمختللي په توګه ولیکئ. روزنه

سرچینه: www.habr.com

Add a comment