Mysql varundamine LVM abil
Sissejuhatus
Antud kirjatüki eesmärgiks on tutvustada Logical Volume Manageri kui abivahendit toimivast süsteemist tagavarakoopiate tegemisel. Kuigi failisüsteemi snapshotide tegemine ja nende kasutamine on ainult üks LVM-i pakutavatest võimalustest. LVM - i snapshotide tegemise võimalus pole ainult mysql -i varundamiseks, vaid kasutatav ka muude andmete varukoopiate tegemiseks. Antud juhul on MySQL siin ainult „reisija“ aga protsessi selgitamiseks ja LVM snapshoti kasutamiseks on MySQL näitena väga hea. Kogu seadistamise protsess toimub Ubuntu Linux Server 12.04.1 LTS operatsioonisüsteemis ja kasutab sellega kaasnevaid vahendeid.
Mis on mis?
Logical Volume Manager - LVM
Physical Volume - PV, plokkseade, füüsiline kettajagu
Volume Group - VG, kettagrupp
Logical Volume - LV, loogiline kettajagu
Snapshot - (hetk)tõmmis
LVM
LVM ehk „Logical Volume Manager“ on ketta partitsioonide haldusvahend Linuxi ja UNIX-i laadsete operatsioonisüsteemide juures. LVM moodustab vahekihi failisüsteemi ja füüsilise kõvaketta vahele. Esmapilgul võib tunduda, et LVM on sarnane RAID (Redundant Array of Independent Disks) kettamassiiviga, on ta siiski hoopis paindlikum viis kettajagudega toimetamiseks. RAID võimaldab kettaid omavahel liita, et saada paremaid tulemusi kiiruses, mahus või töökindluses. LVM seevastu võimaldab korraga hallata mitut (ka loogilist) kettajagu, neid vastavalt vajadusele ümber tõsta ja mahtu muuta. Seega on tihti hea mõte neid kahte hoopis koos kasutada (näiteks RAID 10 ja LVM). Lihtsustatult oleks ettekujutus eri kihtide tasemetest selline:
- Failisüsteemid
- LVM
- RAID (vajadusel)
- füüsilised plokkmäluseadmed (kõvakettad)
Omadused
LVM pakutavad võimalused on:
- Failisüsteemi suuruse muutmine
- Failisüsteemi snapshotide tegemine ja kasutamine (nii read-only kui ka read-write)
- Loodud/muudetud partitsioonide kohene kasutamine, kui ketas/partitsioon on mingil moel kasutusel. Fdisk-i kasutamisel tuleb OP-süsteem taaskäivitada.
- Väiksemate füüsiliste plokkseadmete kokku ühendamine, üheks suureks loogiliseks seadmeks. (Nagu RAID)
- Ketaste liigutamine ja ühendamine üle võrgu
Lisainfot LVM-i kohta: http://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux)
MySQL
MySQL on Oracle Corporation poolt hallatav relatsioonilise andmebaasi haldamise süsteem. On äärmiselt populaarne andmebaasisüsteem erinevates veebirakendustes aga ka mõningates suuremates süsteemides. Oma populaarsuse on ta saanud tänu äärmiselt lihtsale hallatavusele ja kasutajasõbralikkusele. Hetkel ei hakka MySQL-i omadustel ja võimalustel pikemalt peatuma. Rohkem informatsiooni leiab: http://www.mysql.com/
Eeldused
- Installeeritud Ubuntu Server (vähemalt 12.04 versioon)
- Tutvutud kettajagudega (kiire kordamine näiteks Osadmin spikker)
Viia kõik käsklused läbi sudo kasutaja alt
sudo -i
Ketaste lisamine
Kõigepealt on vaja lisada serverile kõvaketas, mida hiljem LVM-iga siduma hakata.
Luua uus 4GB ketas, mis on VirtualBox Disk Image (VDI) formaadis ning dünaamiliselt jagatud.
Vajaliku tarkvara installeerimine
Et LVM-i ja MySQL-i seadistada on vajalikud teadmised, kuidas toimub Linuxis ketaste ja partitisoonide haldamine ja baasteadmised MySQL-ist. Kõigepealt on vajalik installeerida lvm2 nimeline pakett, eelnevalt uuendada tarkvaravaramu nimekirja.
apt-get update apt-get install lvm2
Olenevalt operatsioonisüsteemist võib olla vajalikud paketid juba installeeritud, kontrollida saab nii:
lvm version
Lisaks on vajalik installeerida MySQL server ja klientprogramm serveriga ühendumiseks.
apt-get install mysql-server
NB! Kuna LVM-i kasutuselevõtmine vajab mõningast MySQL-i ümberseadistamist, tuleb arvestada asjaoluga, et MySQL-i data kausta ümbertõstmisel ei pruugi olemasolevad andmed säilida (InnoDB) ja vajalik oleks serveris olevatest andmetest enne .sql kujul tagavarakoopia teha.
LVM -i seadistamine
LVM ise jaguneb kolmeks eri kihiks: plokkseadmed (PV), kettagrupid (VG), millesse on organiseeritud füüsilised plokkseadmed ja loogilised kettajaod, mis on jagatud kettagrupid.
Iga kihiga toimetamisel on oma käsud, mis viitavad sellele, mis kihiga hetkel toimetatakse: pv*, vg* ning lv*. Näiteks pvcreate, vgcreate ja lvcreate.
Esimese asjana tuleb valida ketas/kettajagu, kus LVM-iga toimetama hakata. Uue ketta puhul oleks võimalusel mõtekas luua üks tervet ketast hõlmav partitsioon.
Operatsioonisüsteem tunnistab näites kasutatavat uut ketast kui /dev/sdb ja seega on näites kasutatavad ketta nimed/asukohad just sellised.
Kõikide olemasolevate partitsioonide kuvamine:
fdisk -l
(Kindla partitsiooni vaatamiseks lisada käsu lõppu see partitsioon:)
fdisk -l /dev/sda
fdisk -l 2> /dev/null | grep Disk
Tulemus:
Disk /dev/sda: 8589 MB, 8589934592 bytes Disk identifier: 0x000bd8b1 Disk /dev/sdb: 4294 MB, 4294967296 bytes Disk identifier: 0x11844f48
Füüsilise ketta väärtuse muutmine
Avada fdiskiga uue loodud ketta partitsioon ning luua uus primaarne kettajagu:
fdisk /dev/sdb Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-8388607, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-8388607, default 8388607): Using default value 8388607
Print käskluse abil kuvatakse kettajagu, algus, lõpp, blokid, id ning süsteem. Loodud partitsioon on 83 ehk Linux. Partitsiooni süsteemse id muutmiseks kasutatakse t.
Käsklus L kuvab kõik kaheksandikkoodid . Linux LVM kood on 8e, et muuta kettajagu Linux LVM-iks on vaja muuta kettajao id 83-lt 8e-ks.
Command (m for help): t Selected partition 1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
NB mitte väljuda q, mis väljub programmist muudatusi salvestamata!
Füüsiline kettajagu
Järgnevalt anname lvm-ile teada, et loodud partitsioon (/dev/sdb1) on „pv“ ehk physical volume.
pvcreate /dev/sdb1
Kui kõik läks hästi siis display käsk peaks kuvama sellise tulemuse:
pvdisplay
Tulemus:
"/dev/sdb1" is a new physical volume of "4.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb1 VG Name PV Size 4.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID EdmaX9-bXmQ-Oevp-p9W9-I2qY-gpMM-1w77aQ
Kettagrupp
Loome uue „volume group“ -i ja nimetame selle mysql -iks.
vgcreate mysql /dev/sdb1
Display käsu tulemus peaks olema sarnane:
vgdisplay
Tulemus:
--- Volume group --- VG Name mysql System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 4 VG Access read/write VG Status resizable MAX LV 0 Cur LV 2 Open LV 2 Max PV 0 Cur PV 1 Act PV 1 VG Size 4.00 GiB PE Size 4.00 MiB Total PE 1023 Alloc PE / Size 512 / 2.00 GiB Free PE / Size 511 / 2.00 GiB VG UUID s5AjT8-ss7D-Gm9m-XY6j-ULMv-RLbR-xdy0K6
Järgnevalt saame luua „volume group“ -ile „logical volumes“ ehk loogilised kettajaod. Need on justkui partitsioonid füüsilisel kõvakettal ja neid saab juba andmete talletamiseks kasutada. Nimetame kettajao nimega data ja määrame tema suuruseks 1GB (antud suurus sobib väga hästi katsetamiseks aga reaalsetes süsteemides tuleb muidugi oluliselt suuremaid numbreid kasutada. ). Suuruse seadistamisel tuleb arvestada, et sama „volume group“ peale tuleb mahutada veel vähemalt üks sama suur loogiline kettajagu, mis on loodava LV snapshot. Näide kui VG suurus on kokku 10GB siis on võimalik teha maksimaalselt 5GB suurune loogiline kettajagu. Vastasel ei mahu tema kõrvale, samale VG-le tehtud LV snapshot.
Loogiline kettajagu
Data nimelise 1GB loogilise kettajao loomine:
lvcreate -n data -L 1GB mysql
Kontrollime tulemust:
lvdisplay
Tulemus:
--- Logical volume --- LV Name /dev/mysql/data VG Name mysql LV UUID SL0yWI-Mc2b-KhkE-V8P1-bW7E-3iL8-8zD6Uf LV Write Access read/write LV Status available # open 0 LV Size 1.00 GiB Current LE 256 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 252:0
Teadmiseks: lvdisplay käsu käivitamisel on näha parameeter „LV Status“. See näitab, kas kettajagu on saadaval või mitte. Kasutada on võimalik ainult available olekus kettajagu. Eemaldada saab ainult NOT available olekus kettajagusid. Kettajao NOT available olekusse viimiseks saab kasutada käsku:
lvchange -a n /dev/mysql/data
ja tagasi:
lvchange -a y /dev/mysql/data
Failisüsteemi loomine ja ühendamine
Nüüd on loodud uus kettajagu, mida saab andmete säiltamiseks kasutada. Loome sellele kettajaole failisüsteemi:
mkfs -t ext4 /dev/mysql/data
Järgmisena tuleb loodud kettajagu kuhugile mountida. Mina teen sellejaoks /srv/mysql kausta ja haagin ketta sinna.
mkdir /srv/mysql mount /dev/mysql/data /srv/mysql
Lisame /etc/fstab faili lõppu kirje, et ka järgmisel süsteemi käivitamisel oleks ketas kohe külgehaagitud
<file system> <mount point> <type> <options> <dump> <pass> /dev/mysql/data /srv/mysql ext4 defaults 0 0
MySQL seadistamine
Muudame kausta õigused mysql-ile sobivaks (kausta omanik on kasutaja mysql ja kaustale on ligipääs ainult kausta omanikul)
chown mysql:mysql /srv/mysql chmod 0700 /srv/mysql
Nüüd tuleb olemasolev mysql data kaust liigutada /srv/mysql kausta. Esimese asjana peatada mysql server
service mysql stop
Kopeerime (!) kogu mysql-i data kausta loodud lvm kettajaole. Ubuntus (ilmselt ka paljudes teistes operatsioonisüsteemides) asub mysq-i data kaust /var/lib/mysql. Oleks vägagi soovitatav jätta andmed vanasse kausta alles ja kustuta see alles siis kui ollakse täiesti kindel, et server töötab tõrgeteta.
cp -ar /var/lib/mysql/. /srv/mysql
Seejärel tuleb mysql-i konfiguratsioonifailis (/etc/mysql/my.cnf) muuta ära „datadir“ parameeter
datadir = /var/lib/mysql -> datadir = /srv/mysql
Teadmiseks: alates Ubuntu 7.10 -st on operatsioonisüsteemiga kaasas programm nimega „AppArmor“ (Loe lähemalt: https://wiki.itcollege.ee/index.php/AppArmor). Tegemist on kerneli turvamooduliga, mis teatavate programmide puhul piirab nende ligipääsu failisüsteemile. Et MySQL server uuesti korrektselt käivituks, tuleb „AppArmor“ -is mysq-i seadistust muuta. Sobiva tekstieditoriga tuleb avada '/etc/apparmor.d/usr.sbin.mysqld konfifail ja teha seal vajalikud muudatused :
/var/lib/mysql/ r, -> /srv/mysql r, /var/lib/mysql/** rwk, -> /srv/mysql** rwk,
Seejärel on vaja teha AppArmorile restart
service apparmor restart
Osadel operatsioonisüsteemidel võib ka init skript ette anda, kus asub mysql-i datadir. Seega oleks mõistlik ka see /etc/init.d/mysql skriptist üle vaadata.
Käivitame uuesti mysql-i serveri:
service mysql start
Kontrollime mysql-i muutujaid:
mysqladmin -u [mysql-kasutaja] -p variables | grep datadir
Enter password: [mysql-parool] | datadir | /srv/mysql/
Lisaks tuleks sobiva mysql kliendiga serverisse sisse logida ja kontrollida üle, kas kõik jäi korrektselt tööle.
Nüüd, kui MySQL server on korrektselt tööle hakanud ja tekib vajadus varukoopiate tegemiseks. Töötavast serverist snapshoti tegemisel pole vajalik eelnev serveri väljalülitamine. Snapshoti tegemise protsess on äärmiselt kiire ja andmete lugemine andmebaasist toimib endiselt edasi. Samas andmete kirjutamise protsess viibib seni kuni andmebaasilt kirjutamise lukk maha võetakse (kõik kirjutamise käsud täidetakse kohe peale luku vabastamist). Ehkki varukoopia tegemise protsess ei tekita katkestusi serveri töös, oleks hea mõte teha varukoopiaid sellisel ajal kui serveril on kõige väiksem koormus. On vajalik teada, et andmebaas lukustatakse ainult selleks ajaks, kui mysql serverisse on sisse logitud. Kohe kui sessioon lõpetatakse, vabastatakse ka lukud. Seetõttu peab snaspshoti tegemise ajal olema serverisse sisse logitud. Variant on kasutada kahte terminali sessiooni aga vajalikke käske saab käivitada ka MySQL-i käsurealt (vajalik on mysql-i klient käivitada root kasutaja õigustes).
mysql -u [root] -p Enter password:
Protseduuri ajaks on vajalik keelata ära andmete kirjutamine:
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)
Lisaks võiks tühjendada ka logid:
mysql> FLUSH LOGS;
Query OK, 0 rows affected (0.00 sec)
Tõmmise tegemine
/sbin on standardne juurkataloogi alamkataloog Linuxis ja teistes Unix-taolistes operatsioonisüsteemides, mis sisaldab käivitamisvõimelisi programme. Seda on vaja, et saaks kasutada süsteemisiseseid faile.
mysql> SYSTEM /sbin/lvcreate -L 1G --snapshot -n sql_backup /dev/mysql/data
File descriptor 3 (socket:[15065]) leaked on lvcreate invocation. Parent PID 3514: sh Logical volume "sql_backup" created
Tabelite lukust vabastamine.
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.01 sec)
mysql> exit Bye
Snapshoti kettajagu nimetati kui sql_backup ja viide loogilisele seadmele asub /dev/mysql/sql_backup. Käivitades käsu „lvs“, saab näha, et lisaks mysql/data LV-le on juurde tekkinud mysql/sql_backup
lvs
Tulemus:
LV VG Attr LSize Origin Snap% Move Log Copy% Convert data mysql owi-ao 1.00g sql_backup mysql swi-a- 1.00g data 0.00
Kui nüüd haakida tehtud snapshoti kettajagu, on seal kättesaadav kogu mysql-i data sellel hetkel, kui snapshot tehti.
mkdir /mnt/bk mount /dev/mysql/sql_backup /mnt/bk ls -la /mnt/bk
Tulemus:
total 28720 drwx------ 8 mysql mysql 4096 Dec 12 15:59 . drwxr-xr-x 3 root root 4096 Dec 12 16:34 .. -rw-r--r-- 1 root root 0 Nov 30 17:18 debian-5.5.flag -rw-rw---- 1 mysql mysql 18874368 Dec 12 16:18 ibdata1 -rw-rw---- 1 mysql mysql 5242880 Dec 12 16:18 ib_logfile0 -rw-rw---- 1 mysql mysql 5242880 Nov 30 17:18 ib_logfile1 drwx------ 2 root root 16384 Dec 12 15:58 lost+found drwx------ 2 mysql root 4096 Nov 30 17:18 mysql -rw-rw---- 1 root root 6 Nov 30 17:18 mysql_upgrade_info drwx------ 2 mysql mysql 4096 Nov 30 17:18 performance_schema drwx------ 2 mysql mysql 4096 Nov 30 17:28 phpmyadmin drwx------ 2 mysql root 4096 Dec 12 16:18 test drwx------ 2 mysql mysql 4096 Nov 30 17:33 wp
MySQL-i server töötab peale snapshoti tegemist katkestusteta edasi. Tehtud snapshoti andmeid võib varundada arhiivi jaoks. Andmete varundamisel tuleb spashoti kettajagu failisüsteemi külge haakida ja selle sisu „tar“-i abil arhiveerida ja hiljem eemaldada snapshoti kettajagu
mkdir -p /var/teekond/arhiivi tar -cjf [/var/teekond/arhiivi/][kuupäev].tar.bz2 -C /mnt/bk umount /dev/mysql/sql_backup lvremove /dev/mysql/sql_backup Do you really want to remove active logical volume sql_backup? [y/n]: Y Logical volume "sql_backup" successfully removed
Tulemuseks nüüd loogilise kettajao vaatamisele on:
lvdisplay
Tulemus:
--- Logical volume --- LV Name /dev/mysql/data VG Name mysql LV UUID ZIMxmO-kUQR-u4gD-Wk9m-0MCK-kqwx-1kMaVP LV Write Access read/write LV snapshot status source of /dev/mysql/sql_backup [active] LV Status available # open 1 LV Size 1.00 GiB Current LE 256 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 252:1 --- Logical volume --- LV Name /dev/mysql/sql_backup VG Name mysql LV UUID XMqxEq-yRhp-u8lf-mZ9U-1R2F-fBlf-5hoEeR LV Write Access read/write LV snapshot status active destination for /dev/mysql/data LV Status available # open 0 LV Size 1.00 GiB Current LE 256 COW-table size 1.00 GiB COW-table LE 256 Allocated to snapshot 0.02% Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 252:3
Kuna tõmmis kasvab koos originaalkettajaoga on tähtis jälgida, et tõmmis protsentuaalselt täis ei saaks. Regulaarselt tuleb mahtuvust kontrollida lvs käsuga. 100% täitunud tõmmisele ei saa enam juurde kirjutada ning sellega andmeterviklikkus rikutakse ära!
lvs
Tulemus:
LV VG Attr LSize Origin Snap% Move Log Copy% Convert data mysql owi-ao 1.00g sql_backup mysql swi-a- 1.00g data 0.02
Kogu protseduuri automatiseerimiseks on võimalik koostada ka skript, mida saab käivitada sobival aja või kasutades „cron“ ajastamise vahendeid.
Lisaks on võimalik mysql-i data kaust haakida ümber snapshoti kettajaole ja taastada server sellesse seisu, mis oli snapshoti tegemise hetkel minimaalse katkestuse ajaga.
Kokkuvõte
LVM -i kasutamine varundamisel on väikestes ja mittekriitilistes süsteemides küllaltki hea lahendus. See ei nõua eriteadmisi ja kallist riistvara/tarkvara. Kuid suurematesse ja keerukamatesse lahendustesse see ei sobi, kuna see ainult aitab luua snapshoti hetke seisust aga ei paku võimalust seda eraldi salvestada. Arhiveerimiseks tuleb kasutada eraldi vahendeid ja selle protseduuri käigus võib minna kaduma vajalikke andmeid. Ka ei võistle LVM proffessionaalsete vahenditega nagu Arkeia (http://www.arkeia.com/) või BrightStor, mis on just varundamise lahenduste jaoks loodud ja muudavad antud tegemise mugavaks ja kiireks.
Kasutatud kirjandus
http://kuutorvaja.eenet.ee/wiki/LVM
http://www.web-manual.net/linux-3/logical-volume-manager-in-linux/
http://www.lullabot.com/articles/mysql-backups-using-lvm-snapshots
http://www.ubuntugeek.com/how-to-change-the-mysql-data-default-directory.html
https://wiki.ubuntu.com/Lvm
http://linuxconfig.org/Linux_lvm_-_Logical_Volume_Manager
Loodus, Katrin. Andmesalvestustehnoloogiad - loeng 4.1 Ülevaade Logical Volume Manager-ist [1]
"7 Linux fdisk Command Examples to Manage Hard Disk Partition" [2]
"LVM" [3]
Autor
Madis Lauri AK 31
Täiendamine:
Carolys Kallas A32
Aine: Linuxi administreerimine
Muutmine lõpetatud: 13.01.2013