Eòlas obrach CEPH

Nuair a tha barrachd dàta ann na dh’ fhaodadh a bhith air aon diosc, tha an t-àm ann smaoineachadh air RAID. Mar phàiste, chuala mi gu tric bho na seanairean agam: “aon latha bidh RAID na rud san àm a dh’ fhalbh, lìonaidh stòradh stuthan an saoghal, agus chan eil fios agad eadhon dè a th’ ann an CEPH, ”mar sin a’ chiad rud nam bheatha neo-eisimeileach bha e airson mo bhuidheann fhèin a chruthachadh. B’ e adhbhar an deuchainn eòlas fhaighinn air structar a-staigh ceph agus tuigse fhaighinn air farsaingeachd a chleachdadh. Dè cho reusanta ‘s a tha buileachadh ceph ann an gnìomhachasan meadhanach mòr agus ann an gnìomhachasan beaga? Às deidh grunn bhliadhnaichean de dh ’obair agus call dàta neo-atharrachail, dh’ èirich tuigse air na duilgheadasan nach eil a h-uile dad cho sìmplidh. Tha feartan sònraichte CEPH nan cnapan-starra a thaobh gabhail ris gu farsaing, agus air an sgàth sin, tha deuchainnean air tighinn gu crìch. Gu h-ìosal tha tuairisgeul air a h-uile ceum a chaidh a ghabhail, an toradh a fhuaireadh agus na co-dhùnaidhean a chaidh a tharraing. Ma bhios daoine eòlach a’ roinn an cuid eòlais agus a’ mìneachadh cuid de phuingean, bidh mi taingeil.

Nota: Tha luchd-aithris air fìor mhearachdan a chomharrachadh ann an cuid de na barailean a dh’ fheumas ath-sgrùdadh a dhèanamh air an artaigil gu lèir.

Ro-innleachd CEPH

Bidh an cruinneachadh CEPH a’ cothlamadh àireamh neo-riaghailteach K de dhioscan de mheud neo-riaghailteach agus a’ stòradh dàta orra, a’ dùblachadh gach pìos (4 MB gu bunaiteach) àireamh ainmichte N uair.

Beachdaichidh sinn air a 'chùis as sìmplidh le dà dhiosca co-ionann. Bhon iad faodaidh tu an dàrna cuid RAID 1 no cruinneachadh le N = 2 a chruinneachadh - bidh an toradh mar an ceudna. Ma tha trì diosgan ann agus gu bheil iad de dhiofar mheudan, tha e furasta cruinneachadh le N = 2 a chruinneachadh: bidh cuid den dàta air diosgan 1 agus 2, bidh cuid air diosgan 1 agus 3, agus bidh cuid eile air 2 agus 3, fhad ‘s nach dèan RAID (faodaidh tu a leithid de RAID a chruinneachadh, ach bhiodh e na bhuaireadh). Ma tha eadhon barrachd diosgan ann, tha e comasach RAID 5 a chruthachadh; Tha analogue - erasure_code aig CEPH, a tha an-aghaidh bun-bheachdan tràth an luchd-leasachaidh, agus mar sin chan eilear a ’beachdachadh. Tha RAID 5 a’ gabhail ris gu bheil àireamh bheag de dhràibhearan ann, agus iad uile ann an deagh staid. Ma dh’ fhailicheas aon, feumaidh an fheadhainn eile cumail a-mach gus an tèid an diosc a chuir na àite agus an dàta a thoirt air ais dha. Tha CEPH, le N> = 3, a’ brosnachadh cleachdadh seann diosc, gu sònraichte ma chumas tu grunn dhioscaichean math airson aon leth-bhreac de dhàta a stòradh, agus an dhà no trì leth-bhreacan a tha air fhàgail a stòradh air àireamh mhòr de sheann diosc, an uairsin am fiosrachadh Bidh e sàbhailte, oir airson a-nis tha diosgan ùra beò - chan eil duilgheadasan ann, agus ma bhriseas aon dhiubh, tha e gu math eu-coltach gun tèid trì diosgan a bhriseadh aig an aon àm le beatha seirbheis nas fhaide na còig bliadhna, agus as fheàrr bho luchd-frithealaidh eadar-dhealaichte. tachartas.

Tha mì-chinnt ann mu sgaoileadh leth-bhreacan. Gu gnàthach, thathas a’ gabhail ris gu bheil an dàta air a roinn ann am barrachd (~ 100 gach diosc) buidhnean cuairteachaidh PG, agus gach fear dhiubh air a dhùblachadh air cuid de dhiosg. Canaidh sinn K = 6, N = 2, an uairsin ma dh’ fhailicheas dà dhiosca sam bith, tha cinnt ann gun tèid dàta a chall, oir a rèir teòiridh coltachd, bidh co-dhiù aon PG ann a bhios air a shuidheachadh air an dà dhiosca seo. Agus tha call aon bhuidheann a’ fàgail nach eil an dàta gu lèir san linne ri fhaighinn. Ma tha na diosgan air an roinn ann an trì paidhrichean agus ma tha cead dàta a bhith air a stòradh a-mhàin air diosgan taobh a-staigh aon phaidhir, tha an leithid de chuairteachadh cuideachd an aghaidh fàilligeadh aon diosc, ach ma dh’ fhailicheas dà dhiosca, chan eil an coltachd gun tèid dàta a chall. 100%, ach a-mhàin 3/15, agus fiù 's ann an cùis fàilligeadh trì diosgan - a-mhàin 12/20. Mar sin, chan eil entropy ann an cuairteachadh dàta a’ cur ri fulangas sgàinidhean. Thoir an aire cuideachd, airson frithealaiche faidhle, gu bheil RAM an-asgaidh ag àrdachadh astar freagairt gu mòr. Mar as motha de chuimhne anns gach nód, agus mar as motha de chuimhne anns a h-uile nod, is ann as luaithe a bhios e. Chan eil teagamh nach eil seo na bhuannachd do bhuidheann thairis air aon fhrithealaiche agus, eadhon nas motha na sin, NAS bathar-cruaidh, far a bheil glè bheag de chuimhne air a thogail a-steach.

Tha e a’ leantainn gu bheil CEPH na dhòigh math air siostam stòraidh dàta earbsach a chruthachadh airson deichean de TB le comas sgèile le glè bheag de thasgadh bho uidheamachd seann-fhasanta (an seo, gu dearbh, bidh feum air cosgaisean, ach beag an taca ri siostaman stòraidh malairteach).

Cur an gnìomh buidheann

Airson an deuchainn, leig leinn coimpiutair dì-choimiseanadh Intel DQ57TM + Intel core i3 540 + 16 GB de RAM. Cuiridh sinn ceithir diosc 2 TB air dòigh ann an rudeigin mar RAID10, às deidh deuchainn shoirbheachail cuiridh sinn dàrna nód agus an aon àireamh de dhioscaichean.

Linux a stàladh. Feumaidh an cuairteachadh comas gnàthachadh agus a bhith seasmhach. Bidh Debian agus Suse a’ coinneachadh ris na riatanasan. Tha stàlaichear nas sùbailte aig Suse a leigeas leat pasgan sam bith a chuir dheth; Gu mì-fhortanach, cha b 'urrainn dhomh obrachadh a-mach dè an fheadhainn a dh' fhaodadh a bhith air an tilgeil air falbh gun a bhith a 'dèanamh cron air an t-siostam. Stàlaich Debian a’ cleachdadh debootstrap buster. Bidh an roghainn min-base a’ stàladh siostam briste anns nach eil draibhearan. Chan eil an eadar-dhealachadh ann am meud an taca ris an dreach slàn cho mòr ri dragh. Leis gu bheil an obair ga dhèanamh air inneal corporra, tha mi airson dealbhan a thogail, mar air innealan brìgheil. Tha an roghainn seo air a thoirt seachad le LVM no btrfs (no xfs, no zfs - chan eil an diofar mòr). Chan e puing làidir a th’ ann an dealbhan LVM. Stàlaich btrfs. Agus tha an bootloader anns an MBR. Chan eil adhbhar ann a bhith a’ bearradh diosc 50 MB le sgaradh FAT nuair as urrainn dhut a phutadh a-steach do raon clàr sgaradh 1 MB agus an àite gu lèir airson an t-siostam a riarachadh. Luchdaich a-nuas 700 MB air an diosg. Chan eil cuimhne agam dè an ìre a tha aig an stàladh bunaiteach SUSE, tha mi a’ smaoineachadh gu bheil e mu dheidhinn 1.1 no 1.4 GB.

Stàlaich CEPH. Bidh sinn a’ seachnadh dreach 12 anns an stòr debian agus a’ ceangal gu dìreach bhon làrach 15.2.3. Bidh sinn a’ leantainn an stiùiridh bhon earrainn “Stàlaich CEPH le làimh” leis na h-uaighean a leanas:

  • Mus ceangail thu an stòr, feumaidh tu gnupg wget ca-certificates a stàladh
  • Às deidh dhut an stòr a cheangal, ach mus cuir thu a-steach am brabhsair, thèid pacaidean a chuir a-steach fhàgail air falbh: apt -y --no-install-moladh stàlaich ceph-common ceph-mon ceph-osd ceph-mds ceph-mgr
  • Nuair a stàlaicheas tu CEPH, airson adhbharan neo-aithnichte, feuchaidh e ri lvm2 a stàladh. Ann am prionnsapal, chan eil e duilich, ach tha an stàladh a’ fàiligeadh, agus mar sin cha stàlaich CEPH an dàrna cuid.

    Chuidich am paiste seo:

    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
    

Sealladh farsaing air buidheann

ceph-osd - an urra ri stòradh dàta air diosc. Airson gach diosc, thèid seirbheis lìonra a chuir air bhog a ghabhas ri agus a chuireas an gnìomh iarrtasan airson leughadh no sgrìobhadh gu nithean. Tha dà sgaradh air an cruthachadh air an diosg. Ann an aon dhiubh tha fiosrachadh mun bhuidheann, àireamh diosc, agus iuchraichean a’ bhraisle. Tha am fiosrachadh 1KB seo air a chruthachadh aon uair nuair a chuireas tu diosc ris agus cha deach mothachadh a-riamh atharrachadh. Chan eil siostam faidhle aig an dàrna sgaradh agus bidh e a’ stòradh dàta binary CEPH. Chruthaich stàladh fèin-ghluasadach ann an dreachan roimhe seo sgaradh 100MB xfs airson fiosrachadh seirbheis. Thionndaidh mi an diosc gu MBR agus cha tug mi ach 16MB - chan eil an t-seirbheis a’ gearan. Tha mi a’ smaoineachadh gun gabhadh xfs a chuir na àite gun duilgheadas sam bith. Tha an sgaradh seo air a chuir suas ann an /var/lib/…, far a bheil an t-seirbheis a’ leughadh fiosrachadh mun OSD agus cuideachd a’ lorg iomradh air an inneal bloca far a bheil an dàta binary air a stòradh. Gu teòiridheach, faodaidh tu faidhlichean taice a chuir sa bhad ann an /var/lib/…, agus an diosc gu lèir a riarachadh airson dàta. Nuair a chruthaicheas tu OSD tro ceph-deploy, thèid riaghailt a chruthachadh gu fèin-ghluasadach gus an sgaradh a chuir suas ann an / var / lib /…, agus tha còir aig an neach-cleachdaidh ceph cuideachd an inneal bloca a tha thu ag iarraidh a leughadh. Ma stàlaicheas tu le làimh, feumaidh tu seo a dhèanamh leat fhèin; chan eil na sgrìobhainnean ag ràdh seo. Tha e ciallach cuideachd am paramadair targaid cuimhne osd a shònrachadh gus am bi cuimhne corporra gu leòr ann.

ceph-mds. Aig ìre ìosal, tha CEPH na stòradh stuthan. Tha an comas stòradh a bhacadh a’ tighinn sìos gu bhith a’ stòradh gach bloca 4MB mar nì. Bidh stòradh faidhle ag obair air an aon phrionnsapal. Tha dà amar air an cruthachadh: aon airson meata-dàta, am fear eile airson dàta. Tha iad air an cur còmhla ann an siostam faidhle. Aig an àm seo, tha seòrsa de chlàr air a chruthachadh, mar sin ma sguabas tu às an t-siostam faidhle, ach ma chumas tu an dà amar, cha bhith e comasach dhut a thoirt air ais. Tha dòigh-obrach ann airson faidhlichean a tharraing le blocaichean, chan eil mi air deuchainn a dhèanamh air. Tha uallach air an t-seirbheis ceph-mds airson faighinn chun t-siostam faidhle. Feumaidh gach siostam faidhle eisimpleir air leth den t-seirbheis. Tha roghainn “clàr-amais” ann, a leigeas leat coltas grunn shiostaman faidhle a chruthachadh ann an aon - cuideachd gun deuchainn.

Ceph-mon - Bidh an t-seirbheis seo a’ stòradh mapa den bhuidheann. Tha e a’ toirt a-steach fiosrachadh mu gach OSD, algairim airson a bhith a’ cuairteachadh PGn ann an OSDs agus, nas cudromaiche, fiosrachadh mu gach nì (chan eil mion-fhiosrachadh mun uidheamachd seo soilleir dhomh: tha eòlaire ann /var/lib/ceph/mon/…/ store.db, tha mòr ann tha am faidhle 26MB, agus ann am buidheann de nithean 105K, tha e coltach gu bheil e beagan a bharrachd air 256 bytes gach nì - tha mi a’ smaoineachadh gu bheil an monitor a’ stòradh liosta de na nithean gu lèir agus na PGs anns a bheil tha iad suidhichte). Mar thoradh air milleadh air an eòlaire seo caillear a h-uile dàta sa bhuidheann. Mar sin chaidh an co-dhùnadh a tharraing gu bheil CRUSH a’ sealltainn mar a tha PGs suidhichte air an OSD, agus mar a tha nithean suidhichte air PGs - tha iad air an stòradh sa mheadhan taobh a-staigh an stòr-dàta, ge bith dè an ìre a bhios an luchd-leasachaidh a’ seachnadh am facal seo. Mar thoradh air an sin, an toiseach, chan urrainn dhuinn an siostam a chuir a-steach air flash drive ann am modh RO, leis gu bheil an stòr-dàta an-còmhnaidh ga chlàradh, tha feum air diosc a bharrachd airson iad sin (cha mhòr nas motha na 1 GB), san dàrna àite, feumar a dèan lethbhreac ann an àm fìor den bhunait seo. Ma tha grunn sgrùdairean ann, tha fulangas locht air a dhèanamh cinnteach gu fèin-ghluasadach, ach anns a ’chùis againn chan eil ann ach aon monitor, dhà aig a’ char as àirde. Tha modh teòiridheach ann airson monitor ath-nuadhachadh stèidhichte air dàta OSD, thàinig mi thuige trì tursan airson diofar adhbharan, agus trì tursan cha robh teachdaireachdan mearachd ann, a bharrachd air gun dàta. Gu mì-fhortanach, chan eil an uidheamachd seo ag obair. An dàrna cuid bidh sinn ag obrachadh sgaradh beag air an OSD agus a’ cruinneachadh RAID gus an stòr-dàta a stòradh, a bheir gu cinnteach droch bhuaidh air coileanadh, no bidh sinn a’ riarachadh co-dhiù dà mheadhan corporra earbsach, USB mas fheàrr leat, gus nach gabh sinn puirt.

rados-gw - às-mhalairt stòradh stuthan tro phròtacal S3 agus a leithid. A 'cruthachadh mòran amaran, chan eil e soilleir carson. Cha do rinn mi mòran deuchainn.

ceph-mgr - Nuair a stàlaicheas tu an t-seirbheis seo, thèid grunn mhodalan a chuir air bhog. Is e aon dhiubh sgèile fèin-ghluasadach nach gabh a chiorramachadh. Bidh e a’ feuchainn ris an ìre cheart de PG/OSD a chumail. Ma tha thu airson smachd a chumail air a’ cho-mheas le làimh, faodaidh tu an sgèileadh airson gach amar a dhì-cheadachadh, ach sa chùis seo tuitidh am modal le roinneadh le 0, agus thig inbhe a’ chnuasachd gu bhith ERROR. Tha am modal sgrìobhte ann am Python, agus ma bheir thu beachd air an loidhne riatanach a th’ ann, leanaidh seo gu bhith air a dhì-chomasachadh. Ro leisg airson cuimhneachadh air na mion-fhiosrachadh.

Liosta de na stòran a chaidh a chleachdadh:

Stàladh CEPH
Faigh air ais bho fhàilligeadh monitor iomlan

Clàran sgriobtaichean:

Stàladh an t-siostam tro 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

Cruthaich brabhsair

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

A' cur OSD (pàirt) ris

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

Geàrr-chunntas

Is e prìomh bhuannachd margaidheachd CEPH CRUSH - algorithm airson suidheachadh dàta obrachadh a-mach. Bidh sgrùdairean a’ sgaoileadh an algairim seo gu teachdaichean, agus às deidh sin bidh teachdaichean gu dìreach ag iarraidh an nód a tha iad ag iarraidh agus an OSD a tha thu ag iarraidh. Bidh CRUSH a’ dèanamh cinnteach nach eil meadhanachadh ann. Is e faidhle beag a th’ ann a dh’ fhaodas tu eadhon a chlò-bhualadh agus a chrochadh air a’ bhalla. Tha cleachdadh air sealltainn nach e mapa iomlan a th’ ann an CRUSH. Ma sgriosas tu agus ath-chruthaich thu na sgrùdairean, a 'cumail a h-uile OSD agus CRUSH, chan eil seo gu leòr airson a' bhuidheann a thoirt air ais. Bhon seo thathas a’ co-dhùnadh gu bheil gach monitor a’ stòradh beagan mheata-dàta mun bhuidheann gu lèir. Chan eil an ìre bheag den mheata-dàta seo a’ cur bacadh air meud a’ bhraisle, ach feumar dèanamh cinnteach à sàbhailteachd, a chuireas às do shàbhalaidhean diosc le bhith a’ stàladh an t-siostam air draibh-flash agus a’ dùnadh a-mach cruinneachaidhean le nas lugha na trì nodan. Poileasaidh ionnsaigheach an leasaiche a thaobh feartan roghainneil. Fada bho minimalism. Tha na sgrìobhainnean aig ìre “taing airson na th’ againn, ach tha e glè, glè bheag. ” Tha comas eadar-obrachadh le seirbheisean aig ìre ìosal air a thoirt seachad, ach tha na sgrìobhainnean a’ suathadh air a’ chuspair seo ro uachdarach, agus mar sin tha e nas dualtaiche gun a bhith na tha. Cha mhòr nach eil cothrom ann dàta fhaighinn air ais bho shuidheachadh èiginneach.

Roghainnean airson tuilleadh gnìomh: trèig CEPH agus cleachd na btrfs ioma-diosg banal (no xfs, zfs), faigh a-mach fiosrachadh ùr mu CEPH, a leigeas leat obrachadh fo na cumhaichean ainmichte, feuch ri do stòradh fhèin a sgrìobhadh mar adhartach trèanadh.

Source: www.habr.com

Cuir beachd ann