Dzisiaj chciałem się podzielić z wszystkimi moim sposobem na backup najważniejszych plików mojego malutkiego serwera domowego. Na serwerze mam kilka baz danych w MySQL oraz całą masę plików, które chciałbym żeby były zabezpieczone tak aby szybko można odpalić kopię zapasową (wiem, wiem – zawsze jest RAID ale nie każdy ma pieniądze na takie rozwiązanie, a rozwiązanie programowe nie do końca do mnie przemawia…) Postanowiłem więc odpalić starego PC-ta i zainstalować na nim linux-a (CentOS był pod ręką). Serwer na, którym znajdują się pliki, które chcę backupować jest postawiony na systemie linux Debian. Założyłem sobie, że pliki powinny backupować się raz dziennie – najlepiej w nocy, natomiast bazy danych powinny być backupowane na bieżąco. Rozwiązanie jest banalne, mianowicie:
- do tworzenia kopii w czasie rzeczywistym baz danych posłuży mi mechanizm replikacji bazy danych MySQL
- do backupowania plików użyję rcync-a + crontab
Najpierw zaprezentuję w jaki sposób skonfigurowałem replikację baz MySQL:
Na serwerze, który chcę backupować (Debian) wykonałem następującą konfigurację:
- Skopiowałem plik /etc/mysql/my.cnf tak dla bezpieczeństwa -> cp /etc/mysql/my.cnf /etc/mysql/my.cnf.copy
- Następnie owtorzyłem plik my.cnf do edycji -> nano /etc/mysql/my.cnf
- W sekcji [mysqld] wprowadziłem następujące wpisy:
log-bin = /var/log/mysql/master.log
server-id = 1
binlog-do-db = baza_danych_1
binlog-do-db = baza_danych_2
- Restartujemy bazę danych -> /etc/init.d/mysql restart
- Następnie logujemy się do bazy danych i tworzymy specjalne konto użytkownika dla serwera, na którym będzie kopia zapasowa (SLAVE):
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.1.11' IDENTIFIED BY 'haslo';
- Kolejnym krokiem jest zrobienie dump-a baz danych które chcemy backupować. W tym celu logujemy się do bazy danych i wykonujemy zapytanie
FLUSH TABLES WITH READ LOCK;
następnie wykonujemy backup:
mysqldump -u root -p –databases baza_danych_1 > baza_danych_1.sql
mysqldump -u root -p –databases baza_danych_2 > baza_danych_2.sql
teraz logujemy się do bazy danych i odblokowujemy tabele:
UNLOCK TABLES;
- Kopiujemy wykonane bazy danych na serwer SLAVE
- Na serwerze backupowym też musimy skonfigurować odpowiednio bazę danych. W tym celu też kopiujemy plik konfiguracyjny – w systemie CentOS znajduje się on w lokalizacji /etc/my.cnf czyli cp /etc/my.cnf /etc/my.cnf.copy
- Otwieramy plik my.cnf do edycji -> nano /etc/my.cnf
- w sekcji [mysqld] wpisujemy następujące ustawienia:
server-id = 2
master-host = 192.168.1.10
master-user = slave
master-password = haslo
replicate-do-db = baza_danych_1
replicate-do-db = baza_danych_2
- Wgrywamy dump-y baz danych:
mysql -u root -p baza_danych_1 < baza_danych_1.sql
mysql -u root -p baza_danych_2 < baza_danych_2.sql
- Następnie restartujemy usługę -> /etc/init.d/mysqld restart
- Jeśli serwer SLAVE nie może nawiązać połączenia z bazą danych serwera MASTER to należy sprawdzić, czy na serwerze MASTER (Debian) nie mamy w pliku my.cnf wpisanego ustawienia:
bind-address = 127.0.0.1
jeśli mamy to trzeba go zakomentować:
#bind-address = 127.0.0.1
i ponownie restartujemy usługę
- Teraz na serwerze MASTER wykonujemy następujące zapytanie:
SHOW MASTER STATUS\G;
Odczytujemy wartość File oraz Position.
- Na serwerze SLAVE wykonujemy następujące zapytania:
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='192.168.1.10', MASTER_USER='slave', MASTER_PASSWORD='haslo', MASTER_LOG_FILE='wartosc File', MASTER_LOG_POS=wartość Position;
START SLAVE;
- Aby zdiagnozować czy wszystko jest w porządku należy na serwerze MASTER wykonać zapytanie:
SHOW MASTER STATUS\G;
a na serwerze SLAVE:
SHOW SLAVE STATUS\G;
Podane wartości File i Position powinny się zgadzać. Na serwerze SLAVE dodatkowo wyświetlone zostaną dane na temat połączenia z serwerem MASTER.
To by było na tyle jeśli chodzi o tworzenie kopii zapasowych baz danych. Teraz czas na kopie plików:
- Na serwerze, który chce backupować dane instaluję rsync-a -> apt-get install rsync
- Następnie aby przesyłać pliki na serwer z kopią zapasową bez podawania hasła musimy wykonać następujące czynności:
ssh-keygen -t rsa -> zostaniemy zapytani o trzy wartości – wciskamy 3xENTER – zostaną przyjęte wartości domyślne
przesyłamy wygenerowany plik na drugi serwer: scp /root/.ssh/id_rsa.pub login@192.168.1.11
Po wysłaniu pliku logujemy się na drugi serwer (CentOS) i wykonujemy następujące operacje:
mkdir .ssh
cat id_rsa.pub >> .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
Jeśli wszystko poszło dobrze to można się już logować z serwera głównego na backupowy bez podawania hasła
- Teraz aby stworzyć kopię interesujących nas plików wykonujemy następujące polecenie:
rsync -avz /home/login/jakis_plik login@192.168.1.11:/home/login/backup/ -> oczywiście odpowiednia struktura katalogów musi istnieć na serwerze backupowym
Użycie rsync-a pozwoli backupować tylko nowe pliki lub takie, które się zmieniły od ostatniego backupu.
- Ja chcę aby takie kopiowanie wykonywało się automatycznie o wybranej porze w tym celu tworzę prosty skrypt bash:nano backup.sh
i wpisuję w nim następujący kod:
#!/bin/bash
rsync -avz /home/login/jakis_plik login@192.168.1.11:/home/login/backup/
Zapisujemy i dodajemy odpowiedni wpis w crontab-ie. W tym celu wpisujemy w konsoli:
crontab -e
i w otwartym oknie wpisujemy:
10 03 * * * /bin/bash /home/login/backup.sh
- Jeśli chcemy backupować większą ilość plików/katalogów to należy dodać odpowiednie wpisy w pliku backup.sh
- Zapisujemy wprowadzone zmiany i to by było na tyle – mamy gotowy mechanizm backupu plików
- Jeśli chcemy aby backup wykonywał się częściej to wystarczy dopisać odpowiednie reguły w crontab-ie – w moim przypadku backup jest wykonywany dziennie o godzinie 3.10 w nocy.
To by było na tyle. Może komuś się przyda.