Skip to content
Snippets Groups Projects
Commit 39881334 authored by Per Cederqvist's avatar Per Cederqvist
Browse files

More backups, to separate partitions.

LYSrdiff can now backup up to separate partitions, creates more state
timestamp files, randomizes the backup order, and backs up most user
data.

* fetch-backup-work: Fetch all lsvn, lyscvs, lyswww and home tasks,
  not just a select few.  Fetch roxen tasks.

* backup-all: New arguments: a list of lysrdiffpart partitions to run.
  Check that the correct filesystems are mounted before doing
  anything.

* backup-one-task: New argument: lysrdiffpart.  That argument
  specifies which lysrdiff partition that the backup should be stored
  on.  It is a small integer.  Adjusted the paths to handle it.  Skip
  manhattan, since it is (temporarily) dead.  Store state information
  in a separate directory, and touch flag files for when a backup
  starts and ends, fails and is being attempted.

* distribute-tasks: New script.  This script is responsible for
  assigning new tasks to lysrdiff partitions.  It also randomizes the
  order of the tasks, to make the backup more fair.
parent 2dea8036
No related branches found
No related tags found
No related merge requests found
2006-10-23 Per Cederqvist <ceder@lysator.liu.se>
LYSrdiff can now backup up to separate partitions, creates more
state timestamp files, randomizes the backup order, and backs up
most user data.
* fetch-backup-work: Fetch all lsvn, lyscvs, lyswww and home
tasks, not just a select few. Fetch roxen tasks.
* backup-all: New arguments: a list of lysrdiffpart partitions to
run. Check that the correct filesystems are mounted before doing
anything.
* backup-one-task: New argument: lysrdiffpart. That argument
specifies which lysrdiff partition that the backup should be
stored on. It is a small integer. Adjusted the paths to handle
it. Skip manhattan, since it is (temporarily) dead. Store state
information in a separate directory, and touch flag files for when
a backup starts and ends, fails and is being attempted.
* distribute-tasks: New script. This script is responsible for
assigning new tasks to lysrdiff partitions. It also randomizes
the order of the tasks, to make the backup more fair.
2006-10-14 Per Cederqvist <ceder@lysator.liu.se> 2006-10-14 Per Cederqvist <ceder@lysator.liu.se>
Initial checkin of the proof-of-concept scripts used to backup Initial checkin of the proof-of-concept scripts used to backup
......
#!/bin/sh #!/bin/sh
df -h /nobackup/backup.lysator/backups PARTS="$@"
while read category subcategory server serverpath if [ "$PARTS" = "" ]
then
echo $0: you forgot to specify what parts to back up >&2
exit 1
fi
df -h /lysrdiff/0/perm | sed -n 1p
for lysrdiffpart in $PARTS
do
df -h /lysrdiff/$lysrdiffpart/perm | sed 1d
done
for lysrdiffpart in $PARTS
do
if [ "`cat /lysrdiff/$lysrdiffpart/perm/lysrdiff.id`" != "$lysrdiffpart perm" ]
then
echo lysrdiffpart $lysrdiffpart not found >&2
exit 1
fi
done
/nobackup/backup.lysator/bin/distribute-tasks
for lysrdiffpart in $PARTS
do do
/nobackup/backup.lysator/bin/backup-one-task \ while read category subcategory server serverpath
"$category" "$subcategory" "$server" "$serverpath" do
done < /nobackup/backup.lysator/var/tasks /nobackup/backup.lysator/bin/backup-one-task \
$lysrdiffpart "$category" "$subcategory" "$server" "$serverpath"
done < /lysrdiff/$lysrdiffpart/perm/lysrdiff/tasks
done
df -h /nobackup/backup.lysator/backups df -h /lysrdiff/0/perm /lysrdiff/1/perm
#!/bin/sh #!/bin/sh
if [ $# != 4 ] if [ $# != 5 ]
then then
echo $0: usage: $0 category subcategory server serverpath >&2 echo $0: usage: $0 lysrdiffpart category subcategory server serverpath >&2
echo Example: $0 home ceder inservitus /export/home/ceder >&2 echo Example: $0 0 home ceder inservitus /export/home/ceder >&2
exit 1 exit 1
fi fi
category="$1" lysrdiffpart="$1"
subcategory="$2" category="$2"
server="$3" subcategory="$3"
serverpath="$4" server="$4"
serverpath="$5"
case "$server" in case "$server" in
manhattan) remoterdiff=/usr/bin/rdiff-backup;; manhattan) remoterdiff=/usr/bin/rdiff-backup;;
...@@ -18,19 +19,46 @@ case "$server" in ...@@ -18,19 +19,46 @@ case "$server" in
*) remoterdiff=/usr/local/bin/rdiff-backup;; *) remoterdiff=/usr/local/bin/rdiff-backup;;
esac esac
base="/nobackup/backup.lysator/backups/$category/$subcategory" lysrdiff="/lysrdiff/$lysrdiffpart/perm/lysrdiff"
base="$lysrdiff/backups/$category/$subcategory"
exclude="$base"/exclude exclude="$base"/exclude
files="$base"/files files="$base"/files
state="$lysrdiff"/state
mkdir -p "$files" mkdir -p "$files"
rm -f "$exclude"
statebase="$state"/"$category"-"$subcategory"
#if [ ! -f "$statebase"-fail ]
#then
# exit 0
#fi
if [ "$server" = manhattan ]
then
exit 0
fi
# Fetch an up-to-date exclude file. # Fetch an up-to-date exclude file.
rm -f "$exclude"
scp -i /root/.ssh/backupkey "$server":"$serverpath"/.lysbackupexclude \ scp -i /root/.ssh/backupkey "$server":"$serverpath"/.lysbackupexclude \
"$exclude" "$exclude"
rdiff-backup --exclude-other-filesystems --null-separator \ touch "$base"/backup-attempt-start
--remote-schema \ touch "$statebase"-attempt
'ssh -a -k -x -i /root/.ssh/backupkey %s '$remoterdiff' --server' \
"$server"::"$serverpath" "$files" \ if rdiff-backup --exclude-other-filesystems --null-separator \
&& touch "$base"/last-good-backup --remote-schema \
'ssh -a -k -x -i /root/.ssh/backupkey %s '$remoterdiff' --server' \
"$server"::"$serverpath" "$files"
then
touch "$base"/last-good-backup
mv "$base"/backup-attempt-start "$base"/last-good-start
touch "$statebase"-end
mv "$statebase"-attempt "$statebase"-start
rm -f "$base"/last-failure
rm -f "$statebase"-fail
else
mv "$base"/backup-attempt-start "$base"/last-failure
mv "$statebase"-attempt "$statebase"-fail
fi
#!/usr/bin/env python
import os
import sys
import random
ROOT = "/lysrdiff"
class JobInfo(object):
def __init__(self, category, subcategory, host, directory,
lysrdiffpart=None):
self.__category = category
self.__subcategory = subcategory
self.__host = host
self.__directory = directory
self.__lysrdiffpart = lysrdiffpart
def set_lysrdiffpart(self, part):
self.__lysrdiffpart = part
def category(self):
return self.__category
def subcategory(self):
return self.__subcategory
def host(self):
return self.__host
def directory(self):
return self.__directory
def lysrdiffpart(self):
return self.__lysrdiffpart
def source(self):
return (self.host(), self.directory())
def rdiff_dest(self):
return "/lysrdiff/%d/perm/lysrdiff/backups/%s/%s" % (
self.lysrdiffpart(), self.category(), self.subcategory())
def task_desc(self):
return "%s %s %s %s" % (
self.category(), self.subcategory(),
self.host(), self.directory())
def newtasks():
return int(open("/nobackup/backup.lysator/var/newtasks").read())
# key: (host, directory)
# value: JobInfo
tasks_per_source = {}
fatal = False
def tasklist_file(lysrdiffpart):
return "/lysrdiff/%d/perm/lysrdiff/tasks" % lysrdiffpart
def parse_line(line, lysrdiffpart=None):
[category, subcategory, host, directory] = line.split()
info = JobInfo(category, subcategory, host, directory, lysrdiffpart)
return info
def read_tasks(lysrdiffpart):
global fatal
for line in file(tasklist_file(lysrdiffpart), "r"):
info = parse_line(line, lysrdiffpart)
if (info.host(), info.directory()) in tasks_per_source:
sys.stderr.write("Duplicate backup detected!\n %s\n %s\n" % (
tasks_per_source[info.source()].task_desc(),
info.task_desc()))
fatal = True
tasks_per_source[info.source()] = info
def read_new_tasks():
new_found = False
for line in file("/nobackup/backup.lysator/var/tasks"):
info = parse_line(line)
if (info.host(), info.directory()) not in tasks_per_source:
info.set_lysrdiffpart(newtasks())
tasks_per_source[(info.host(), info.directory())] = info
new_found = True
return new_found
def write_task_lists():
jobs = tasks_per_source.values()
random.shuffle(jobs)
files = {}
for job in jobs:
if job.lysrdiffpart() not in files:
files[job.lysrdiffpart()] = file(
tasklist_file(job.lysrdiffpart()) + ".new", "w")
files[job.lysrdiffpart()].write(job.task_desc() + "\n")
for lysrdiffpart, fp in files.items():
fp.close()
fn = tasklist_file(lysrdiffpart)
os.rename(fn + ".new", fn)
def main():
global fatal
for lysrdiffpart in range(2):
read_tasks(lysrdiffpart)
read_new_tasks()
if not fatal:
write_task_lists()
if __name__ == '__main__':
main()
...@@ -4,14 +4,14 @@ rm /nobackup/backup.lysator/var/tasks ...@@ -4,14 +4,14 @@ rm /nobackup/backup.lysator/var/tasks
ssh stalingrad ls -1 /svnroot \ ssh stalingrad ls -1 /svnroot \
| sort \ | sort \
| head -10 \ | awk '$1 == "lost+found" { next }
| awk '{print "lsvn", $1, "stalingrad /svnroot/" $1}' \ {print "lsvn", $1, "stalingrad /svnroot/" $1}' \
>> /nobackup/backup.lysator/var/tasks >> /nobackup/backup.lysator/var/tasks
ssh stalingrad ls -1 /cvsroot \ ssh stalingrad ls -1 /cvsroot \
| sort \ | sort \
| head -10 \ | awk '$1 == "lost+found" { next }
| awk '{print "lyscvs", $1, "stalingrad /cvsroot/" $1}' \ {print "lyscvs", $1, "stalingrad /cvsroot/" $1}' \
>> /nobackup/backup.lysator/var/tasks >> /nobackup/backup.lysator/var/tasks
ssh uhumhummy ls -1 /lysator/lyswww/users/common \ ssh uhumhummy ls -1 /lysator/lyswww/users/common \
...@@ -19,17 +19,42 @@ ssh uhumhummy ls -1 /lysator/lyswww/users/common \ ...@@ -19,17 +19,42 @@ ssh uhumhummy ls -1 /lysator/lyswww/users/common \
| grep -v THIS_IS_USERWEB \ | grep -v THIS_IS_USERWEB \
| grep -v '^cap\.fm$' \ | grep -v '^cap\.fm$' \
| sort \ | sort \
| grep -v '^a' \
| grep -v '^b' \
| head -50 \
| awk '{print "lyswww", $1, "uhumhummy /lysator/lyswww/users/common/" $1}' \ | awk '{print "lyswww", $1, "uhumhummy /lysator/lyswww/users/common/" $1}' \
>> /nobackup/backup.lysator/var/tasks >> /nobackup/backup.lysator/var/tasks
ssh uhumhummy ls -1 /lysator/lyswww/users/roxen_only \
| sort \
| awk '{print "roxen", $1, "uhumhummy /lysator/lyswww/users/roxen_only/" $1}'\
>> /nobackup/backup.lysator/var/tasks
ssh nema.lysator.liu.se ypcat -k auto_home \ ssh nema.lysator.liu.se ypcat -k auto_home \
| sort \ | sort \
| grep -v DELETE \ | grep -v DELETE \
| grep -v '^ *$' \ | grep -v '^ *$' \
| head -75 \
| sed 's/:/ /' \ | sed 's/:/ /' \
| awk '$1 == "mailman" { next }
$1 == "patrick" { next }
$1 == "snapshot" { next }
$1 == "u1" { next }
$1 == "u2" { next }
$1 == "u3" { next }
$1 == "u4" { next }
$1 == "u5" { next }
$1 == "u6" { next }
$1 == "lysdisk1" { next }
$1 == "lysdisk2" { next }
$1 == "lysdisk3" { next }
$1 == "lysdisk4" { next }
$1 == "lysdisk5" { next }
$1 == "lysdisk6" { next }
$1 == "lysdisk7" { next }
$1 == "lysdisk8" { next }
$1 == "lysdisk9" { next }
$1 == "lysdisk10" { next }
$1 == "lysdisk11" { next }
$1 == "kheldar" { next }
$1 == "quota1" { next }
$1 == "sge" { next }
{ print }' \
| sed 's/^/home /' \ | sed 's/^/home /' \
>> /nobackup/backup.lysator/var/tasks >> /nobackup/backup.lysator/var/tasks
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment