Mysql varundamine LVM abil

From ICO wiki
Revision as of 13:55, 13 January 2013 by Ckallas (talk | contribs)
Jump to navigationJump to search

Sissejuhatus

Antud kirjatüki eesmärgiks on tutvustada LVM-i 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 alt text
LVM

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
 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 on „pv“ ehk physical volume.

pvcreate disk1 disk2 disk3
pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created

Kui kõik läks hästi siis peaks tulemus olemas selline:

pvdisplay
 "/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 kettagrupi_nimi /dev/sdb1 /dev/sdc1 /dev/sdd1
vgcreate mysql /dev/sdb1
  Volume group "mysql" successfully created
vgdisplay
  --- 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

lvcreate --size 1G --name loogilise_ketta_nimi kettagrupi_nimi
lvcreate -n data -L 1GB mysql
Logical volume "data" created

Kontrollime tulemust:

lvdisplay
  --- 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
mysql stop/waiting

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ülitama. Lihtsalt protseduuri ajaks oleks vajalik keelata ära andmete kirjutamine „FLUSH TABLES WITH READ LOCK;“ käsuga, lisaks võiks tühjendada ka logid „FLUSH LOGS;“ käsuga. Snapshoti tegemise protsess on äärmiselt kiire ja andmete lugemine andmebaasist toimib endiselt edasi. Samas andmete kirjutamise protsess viibib seni, kui 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: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 75 Server version: 5.5.28-0ubuntu0.12.04.2 (Ubuntu)

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH LOGS; Query OK, 0 rows affected (0.00 sec)

Tõmmise tegemine

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
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
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
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
  --- 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
  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

Viimati muudetud: 13.01.2013