Взялся поставить SMB кластер на Ubuntu server 12.04 LTS. Один сервер уже был поставлен раньше, ещё во время Alpha1 и показал себя очень и очень хорошо. Установил второй сервер с аналогичной или весьма близкой конфигурацией, создал аналогичный SMB -конфиг, просинхронизировал с помощью rsync. На сервере есть директория /shares, в которой хранятся периодически архивируемые директории пользователей /shares/user/… и некоторые другие директории /shares/… например, системная /shares/lost+found, которую нам синхронизировать будет ни к чему.
Из чего и как будет сделан кластер?
1. Ноды кластера будут иметь разные ip адреса и тот кластер, который будет становиться основным, будет поднимать на сетевом интерфейсе алиас с «рабочим» ip кластера, на который будут подключаться люди.
2. Информация будет синхронизироваться с помощью rsync, так что при не слишком больших изменениях хранимой информации и регулярных обновлениях, обновляться будет реально не много.
3. Исчезновение сети на кластере будет проверяться по пропадению «маршрутизатора по умолчанию».
4. Подъём кластера будет производиться по пропадению его основного ip в зоне видимости остальных нодов при наличии «маршрутизатора по умолчанию».
5. Описанная модель кластера предполагает реализацию, скорее, «наиболее дешёвого в реализации кластера, дающего удовлетворительные параметры по доступности и сохранности информации», чем «гарантирующий сохранность информации при относительной доступности и высокой цене кластер».
1. Конфигурация rsync.
/etc/default/rsync:
====фрагмент====
RSYNC_ENABLE=true
====фрагмент====
sudo touch /etc/rsyncd.conf
sudo nano /etc/rsyncd.conf
В файле настройки rsync пишем:
====начало====
[shares]
comment = All files
path = /shares
use chroot = false
uid = backup
gid = backup
log file = /var/log/rsyncd/shares.log
read only = true
write only = false
hosts allow = здесь пишем адрес нашей подсети с маской (или подсети нашего кластера — более параноидальный вариант)
hosts deny = *
transfer logging = false
====конец====
sudo touch /etc/rsync_password
sudo nano /etc/rsync_password
В файле пароля rsync_password пишем:
====начало====
123456 (или что там у вас будет в качестве пароля?)
====конец====
Просто так, одной строкой и больше ничего!
sudo chmod 600 /etc/rsync_password
sudo mkdir /var/log/rsyncd
sudo touch /etc/logrotate.d/rsyncd
sudo nano /etc/logrotate.d/rsyncd
В файле настройки ротации логов rsync пишем:
====начало====
/var/log/rsyncd/shares.log {
rotate 6
weekly
compress
missingok
notifempty
}
====конец====
sudo service rsync start
В принципе, сервис настроен и должен запуститься с сообщением [OK], убедиться в его работе можно командой:
rsync rsync://localhost
Должен быть показан ресурс с комментарием:
shares All files
2. Настройка кластера.
Для основных кластерных служб мы создадим директорию в общем серверном доступе (в которой, разумеется, не будет пароля, см. п.1):
sudo mkdir /shares/user/backup
sudo chown root:root /shares/user/backup
sudo touch /shares/user/backup/cluster.pl
sudo nano /shares/user/backup/cluster.pl
sudo chmod +x /shares/user/backup/cluster.pl
На данный момент (2012-05-29) программа управления кластером у меня такая:
====начало====
#!/usr/bin/perl
#
# basic config
#
$cluster_ip=»основной ip адрес кластера«;
$cluster_ip_mask=»маска ip адреса кластера«;
$defaultrouter_ip=»ip адрес маршрутизатора по умолчанию«;
$iface=»имя сетевого интерфейса«;
$timeout=7;# этот параметр (в секундах) нужен чтобы кластер не глючил на время переходных процессов в сетевых интерфейсах. В отдельных «тяжёлых» (cisco detected!) случаях может потребоваться величина 60 или даже 80. Чем величина меньше, тем переключение «шустрее», но небезопаснее.
$logfile=»/var/log/cluster.log»;
#
# ping
#
use Net::Ping;
$p=Net::Ping->new();
#
# force not master if rebooted
#
`ifconfig $iface\:0 down 2>/dev/null`;
`service rsync stop`;
#
# logging
#
$date=`date`;
chop ($date);
`echo $date Cluster started as node>>$logfile`;
`echo rsync daemon stopped>>$logfile`;
`ifconfig $iface>>$logfile`;
#
$master=0;
$lan=0;
$count=0;
#
while (TRUE){
#
# ping testing
#
if ($p->ping($defaultrouter_ip,3) gt 0){$lan=1;$count++;}else{$lan=0;$count=0;}
#
# testing if need to move master->node
#
if ($lan eq 0 && $master eq 1){
$master=0;
$count=0;
`ifconfig $iface\:0 down 2>/dev/null`;
`service rsync stop`;
$date=`date`;
chop ($date);
`echo $date Cluster state: master->node>>$logfile`;
`echo rsync daemon stopped>>$logfile`;
`ifconfig $iface>>$logfile`;
}
#
# testing if need to move node->master
#
if ($lan eq 1 && $p->ping($cluster_ip,3) lt 1 && $master eq 0 && $count gt $timeout){
$master++;
`ifconfig $iface\:0 inet $cluster_ip/$cluster_ip_mask `;
`killall -INT rsync`;
`service rsync start`;
$date=`date`;
chop ($date);
`echo $date Cluster state: node->master>>$logfile`;
`echo rsync daemon started>>$logfile`;
`ifconfig $iface>>$logfile`;
}
#
#print «lan=$lan count=$count master=$master\n»;
#
# timeout
#
$c=`ps ax|grep rsync|grep avz|grep -v grep`;
chop ($c);
if ($c eq «» && $master eq 0){ `/shares/user/backup/sync.sh`;}
`sleep 1`;
}
====конец====
Почти в самом конце ширным выделен скрипт, который будет запускать ресинхронизацию нода с текущего активного кластера. Эта самая ресинхронизация будет прерываться командой killall в тот момент, когда нода превратится в активный кластерный элемент.
3. Синхронизация.
Как это не чудовищно, но нам придётся синхронизировать все ноды с активным кластерным элементом. Постоянно, 24/7. Делать это будет простенький скрипт.
sudo touch /shares/user/backup/sync.sh
sudo chmod +x /shares/user/backup/sync.sh
sudo nano /shares/user/backup/sync.sh
Вот что будет внутри:
====начало====
#!/bin/sh
rsync —password-file=/etc/rsync_password -avz —delete —exclude lost+found —exclude user/backup —exclude user/bk rsync://username@cluster_ip:/shares/ /shares>/dev/null 2>/dev/null
====конец====
Именно для этого username мы и сохраняли пароль в п.1. Разумеется, username и пароль должны быть одинаковыми для всех нодов нашего кластера. Директория user/bk, упомянутая в этом файле — хранилище резервных копий документов, которые у меня делаются средствами нода, и потому в синхронизации не участвует.
4. Автостарт.
Запускаться всё это безобразие будет из стартовых скриптов.
sudo touch /etc/init.d/cl-daemon
sudo chmod +x /etc/init.d/cl-daemon
sudo nano /etc/init.d/cl-daemon
Вот что будет внутри:
====начало====
#!/bin/sh
#/shares/user/backup/bk.pl&
/shares/user/backup/cluster.pl&
====конец====
sudo ln -s /etc/init.d/cl-daemon /etc/rc2.d/S99cl-daemon
Аналогично настраиваем второй (другие) нод кластера. Устанавливаем в серверный шкаф…