Various ZFS scripts. Most notably, zfs-auto-snapshot, a ruby clone of OpenSolaris auto snapshotting
Ruby Gherkin
Clone or download
Permalink
Failed to load latest commit information.
bin
features
lib
spec
.document
.gitignore
.rspec
Gemfile
Gemfile.lock Update dependencies Sep 11, 2015
LICENSE.txt Switch to BSD license Feb 3, 2013
README.md
README.rdoc
Rakefile
VERSION
zfstools.gemspec

README.md

ZFS Tools

Various scripts for administrating ZFS. Modeled after time-sliderd and ZFS Automatic Snapshots from OpenSolaris

Setup

Install the gem.

Production version

gem install zfstools

Development version

rake install

Setup crontab entries for scripts wanted. See below.

Scripts

zfs-auto-snapshot

This will handle automatically snapshotting datasets similar to time-sliderd from OpenSolaris. Setup allows you to define your own intervals, snapshot names, and how many to keep for each interval. Zero-sized snapshots will automatically be cleaned up.

Usage

/usr/local/bin/zfs-auto-snapshot INTERVAL KEEP
  • INTERVAL - The interval for the snapshot. This is something such as frequent, hourly, daily, weekly, monthly, etc.
  • KEEP - How many to keep for this INTERVAL. Older ones will be destroyed.

Crontab

15,30,45 * * * * root /usr/local/bin/zfs-auto-snapshot frequent  4
0        * * * * root /usr/local/bin/zfs-auto-snapshot hourly   24
7        0 * * * root /usr/local/bin/zfs-auto-snapshot daily     7
14       0 * * 7 root /usr/local/bin/zfs-auto-snapshot weekly    4
28       0 1 * * root /usr/local/bin/zfs-auto-snapshot monthly  12

Dataset setup

Only datasets with the com.sun:auto-snapshot property set to true will be snapshotted.

zfs set com.sun:auto-snapshot=true DATASET
MySQL Support

Setting a MySQL dataset's property to mysql will hook it into the zfs-snapshot-mysql script. See its section for setup instructions.

zfs set com.sun:auto-snapshot=mysql DATASET
PostgreSQL Support

Setting a PostgreSQL dataset's property to postgresql will cause zfs-auto-snapshot to put postgresql in online backup mode for the snapshot.

zfs set com.sun:auto-snapshot=postgresql DATASET

The user executing zfs-auto-snapshot will require passwordless login to the postgres database and will require either REPLICATION or SUPERUSER privileges. The easiest approach is to set up a trust or ident record in your pg_hba.conf. The zfs-auto-snapshot script will execute pg_start_backup() prior to saving the snapshot and execute pg_stop_backup() afterwards.

Overrides

You can override a child dataset to use, or not use auto snapshotting by settings its flag with the given interval.

zfs set com.sun:auto-snapshot:weekly=false DATASET

zfs-snapshot-mysql

Snapshots a mysql server's databases. This requires that mysql's datadir/innodb_data_home_dir/innodb_log_group_home_dir be a ZFS dataset.

Example MySQL+ZFS Setup

Datasets
tank/db/mysql
tank/db/mysql/bin-log
tank/db/mysql/data
tank/db/mysql/innodb
tank/db/mysql/innodb/data
tank/db/mysql/innodb/log
ZFS Settings

These settings should be set before importing any data.

zfs set primarycache=metadata tank/db/mysql/innodb
zfs set recordsize=16K tank/db/mysql/innodb/data
zfs set recordsize=8K tank/db/mysql/data
zfs set compression=lzjb tank/db/mysql/data
MySQL Settings
innodb_data_home_dir = /tank/db/mysql/innodb/data
innodb_log_group_home_dir = /tank/db/mysql/innodb/log
datadir = /tank/db/mysql/data
log-bin = /tank/db/mysql/bin-log/mysql-bin

Script Usage

Setup a /root/.my.cnf with the relevant information on where to connect to, with the proper username/password that has access to FLUSH LOGS and FLUSH TABLES WITH READ LOCK. The zfs-auto-snapshot script will automatically flush the tables before saving the snapshots.

zfs-cleanup-snapshots

Cleans up zero-sized snapshots. This ignores snapshots created by zfs-auto-snapshot as it handles zero-sized in its own special way.

Usage

Crontab

*/20 * * * * /usr/local/bin/zfs-cleanup-snapshots