Database snapshots

From Wikitech
(Difference between revisions)
Jump to: navigation, search
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 1200G -n data tank
+
  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.

[edit] Current snapshot machines

Personal tools
Namespaces

Variants
Actions
Navigation
Ops documentation
Wiki
Toolbox