Database snapshots
m (++ default data vol size) |
(→Setting up) |
||
| Line 12: | Line 12: | ||
pvcreate /dev/sda6 | pvcreate /dev/sda6 | ||
vgcreate tank /dev/sda6 | vgcreate tank /dev/sda6 | ||
| − | lvcreate -L | + | lvcreate -L 1670G -n data tank |
lvcreate -L 100G -n tmp tank | lvcreate -L 100G -n tmp tank | ||
mkfs.xfs -d sunit=512,swidth=4096 /dev/tank/data | mkfs.xfs -d sunit=512,swidth=4096 /dev/tank/data | ||
Latest revision as of 07:00, 6 February 2012
Says Domas on 2009-03-18:
- 'lvcreate -s', every eight hours, two snapshots are held. reaching them is mounting it, copying data somewhere and running mysql instance on top of that.
[edit] Setting up
To set up snapshot capabilities one has to rebuild filesystem on top of LVM. On a standard wikimedia machine it would look like this:
vi /etc/fstab # remove /a umount /a apt-get install lvm2 xfsprogs modprobe dm-snapshot pvcreate /dev/sda6 vgcreate tank /dev/sda6 lvcreate -L 1670G -n data tank lvcreate -L 100G -n tmp tank mkfs.xfs -d sunit=512,swidth=4096 /dev/tank/data mkfs.xfs -d sunit=512,swidth=4096 /dev/tank/tmp echo /dev/tank/data /a xfs noatime,nobarrier 0 2 >> /etc/fstab echo /dev/tank/tmp /a/tmp xfs noatime,nobarrier 0 2 >> /etc/fstab mount /a mkdir /a/tmp mount /a/tmp
Then, the actual snapshot rotation has to be deployed. Currently we use a heavily modified version of (OH I HACKED OUT READONLY SNAPSHOT PERMISSION CAREFUL --domas): http://fbq.hamal.nl/blobs/snaprotate.pl that is installed on new db's via puppet to /usr/local/sbin/snaprotate.pl - then manually add this to root's crontab when ready:
18 */8 * * * /usr/local/sbin/snaprotate.pl -a swap -V tank -s data -L 100G
(Maintain two snapshots with rotation every 8 hours).
[edit] Using a snapshot
I hope we never need this :)
One can found active snapshots using 'lvs':
root@db24:~# lvs
LV VG Attr LSize Origin Snap% Move Log Copy%
data tank owi-ao 500.00G
snap03200018 tank sri-a- 100.00G data 20.23
snap03200818 tank sri-a- 100.00G data 9.47
Then it is as easy as:
mount -o noatime,nobarrier,nouuid /dev/tank/snap03200018 /mnt/snap rsync /mnt/ someotherhost:/.../
For small data recovery needs one can run MySQL on snapshot locally (need to have my.cnf adjusted to use snapshot paths, different ports/sockets etc), or just run mysqld_safe with alternative settings, e.g:
/usr/local/mysql/bin/mysqld_safe --socket=/tmp/mysql.3307 --port=3307 --innodb_buffer_pool_size=1G --datadir=/mnt/snap/sqldata/ --pid-file=/tmp/3307.pid
This will edit the snapshot - so it may be necessary to resize the snapshot area first.
Do note, instances with snapshots usually have smaller buffer pool (to allow some headroom for in-memory LVM tracking) and transaction log sizes (faster recovery) defined - it may be easier to use my.cnf of snapshot hosts.