Создание бюджетных отказоустойчивых UNIX решений

Опубликовано: 2018-06-08

Бозовые настройки сети:


FreeBSD

[gateN:~]# nano /etc/rc.conf

moused_enable="YES"
keyrate="fast"

hostname="gateN.corpX.un"
ifconfig_em0="inet 192.168.X.N/24"
ifconfig_em1="inet 172.16.1.N*100+X/24"
defaultrouter="172.16.1.254"
gateway_enable="YES"

sshd_enable="YES"

[gateN:~]# nano /etc/resolv.conf

domain corpX.un
nameserver 172.16.1.254

[gateN:~]# nano /etc/hosts

127.0.0.1          localhost      localhost.corpX.un

192.168.X.1      gate1.corpX.un      gate1
192.168.X.2      gate2.corpX.un      gate2

172.16.1.254     proxy
172.16.1.254     nfs
172.16.1.254     rep

[gateN:~]# init 6


Ubuntu

gateN:~# nano /etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
     address 192.168.X.N
     netmask 255.255.255.0

auto eth1
iface eth1 inet static
     address 172.16.1.N*100+X
     netmask 255.255.255.0
     gateway 172.16.1.254

gateN:~# nano /etc/hostname

gateN.corpX.un

gateN:~# nano /etc/resolv.conf

search           corpX.un
nameserver    172.16.1.254

gateN:~# nano /etc/hosts

127.0.0.1          localhost      localhost.corpX.un

192.168.X.1      gate1.corpX.un      gate1
192.168.X.2      gate2.corpX.un      gate2

172.16.1.254     proxy
172.16.1.254     nfs
172.16.1.254     rep

gateN:~# nano /etc/sysctl.conf

...
net.ipv4.ip_forward=1
...

gateN:~# init 6

.....

gateN:~# apt-get update


Проверки

gateN:~# ping gate1

gateN:~# ping gate2

gateN:~# ping ya.ru


Настройка сервера точного времени NTP:


FreeBSD

[gateN:~]# nano /etc/rc.conf

...
ntpd_enable="YES"

Ubuntu

gateN:~# apt-get install ntp


FreeBSD/Ubuntu

gateN:~# nano /etc/ntp.conf

server 0.ru.pool.ntp.org
server 1.ru.pool.ntp.org
server 2.ru.pool.ntp.org
server 3.ru.pool.ntp.org
restrict 10.0.0.0 mask 255.255.255.0 nomodify notrap

Через 30 минут проверяем:

gateN:~# ntpq -p

gateN:~# ntptrace


Синхронизация файлов конфигураций:


gateN:~# apt-get update

gateN:~# apt-get install ssh


Настройка доступа по протоколу ssh пользователя root:

gate2:~# nano sshd_config

...
Match Address 192.168.X.1
PermitRootLogin yes

gate1:~# scp /CHANGE/DIR/file.config gate2:/CHANGE/DIR/file.config


(аутентификация_с_использованием_ключей_ssh):

gate1:~# ssh-keygen

...
Enter passphrase (empty for no passphrase): Пароль на ключ пустой!!!
...

для убунты

gate1:~# ssh-copy-id gate2

или

gate1:~# ssh gate2 "mkdir .ssh"

gate1:~# scp .ssh/id_rsa.pub gate2:.ssh/authorized_keys


Настраиваем DNS:


FreeBSD

[gateN:~]# nano /etc/namedb/named.conf

options {
     directory      "/etc/namedb";
     pid-file         "/var/run/named/pid";

     allow-recursion { any; };

     forwarders {
         172.16.1.254;
     };
};

view "inside" {
     match-clients {
         192.168.X/24;
         127/8;
     };

     zone "corpX.un" {
         type master;
         file "master/corpX.un";
     };

     zone "X.168.192. in-addr.arpa " {
         type master;
         file "master/corpX.rev";
     };
};

view "outside" {
     zone "corpX.un" {
         type master;
         file "master/corpX.un.out";
     };
};

[gateN:~]# cd /etc/namedb/master/


Ubuntu

gateN:~# apt-get install bind9

gateN:~# nano /etc/bind/named.conf

options {
     directory "/var/cache/bind";

     allow-recursion { any; };

     forwarders {
         172.16.1.254;
     };
};

view "inside" {
     match-clients {
         192.168.X/24;
         127/8;
     };

     zone "corpX.un" {
         type master;
         file "/var/cache/bind/corpX.un";
     };

     zone "X.168.192.in-addr.arpa" {
         type master;
         file "/var/cache/bind/corpX.rev";
     };
};

view "outside" {
     zone "corpX.un" {
         type master;
         file "/var/cache/bind/corpX.un.out";
     };
};

gateN:~# cd /var/cache/bind/


FreeBSD/Ubuntu

gateN:~# nano corpX.un

$TTL3h
@ SOA gate root.gate 1 1d 12h 1w 3h
NS ns

ns A 192.168.X.1
ns A 192.168.X.2

gate1 A 192.168.X.1
gate2 A 192.168.X.2
gate A 192.168.X.254

gateN:~# nano corpX.rev

$TTL 3h
@ SOA gate.corpX.un. root. gate.corpX.un. 1 1d 12h 1w 3h
NS gate.corpX.un.

254 PTR gate.corpX.un.

1 PTR gate1.corpX.un.
2 PTR gate2.corpX.un.

gateN:~# nano corpX.un.out

$TTL 3h
@ SOA ns root.ns 1 1d 12h 1w 3h
NS ns

ns A 172.16.1.X
gate A 172.16.1.X

gateN:~# named-checkconf -z


Запуск или перезапуск сервиса

FreeBSD

[gateN:~]# nano /etc/rc.conf

...
named_enable="YES"

[gateN:~]# /etc/rc.d/named start


Ubuntu

предпочтительно перечитать конфиги

gateN:~# rndc reload

или

gateN:~# /etc/init.d/bind9 restart


Настраиваем DHCP сервер:


Установка

FreeBSD

[gateN:~]# pkg_add -r isc-dhcp31-server

[gateN:~]# nano /etc/rc.conf

...
dhcpd_ifaces="em0"
dhcpd_enable=yes

[gateN:~]# rehash

[gateN:~]# cd /usr/local/etc/


Ubuntu

gateN:~# apt-get install dhcp3-server

gateN:~# nano /etc/default/dhcp3-server

INTERFACES="eth0"

gateN:~# cd /etc/dhcp3/

gateN:~# nano dhcpd.general

ddns-update-style none;

log-facility local7;

subnet 192.168.X.0 netmask 255.255.255.0 {
     pool {
         failover peer "dhcp";
         range 192.168.X.101 192.168.X.199;
     }

     option routers 192.168.X.254;
     option domain-name "corpX.un";
     option domain-name-servers 192.168.X.1, 192.168.X.2;
     default-lease-time 600;
     max-lease-time 7200;
}

gate1:~# nano dhcpd.conf

failover peer "dhcp" {
     primary;
     address 192.168.X.1;
     port 519;
     peer address 192.168.X.2;
     peer port 520;
     max-response-delay 60;
     max-unacked-updates 10;
     mclt 600;
     split 128;
     load balance max seconds 3;
}
include "/CORRECT/ETC/DIR/dhcpd.general";

gate2:~# nano dhcpd.conf

failover peer "dhcp" {
     secondary;
     address 192.168.X.2;
     port 520;
     peer address 192.168.X.1;
     peer port 519;
     max-response-delay 60;
     max-unacked-updates 10;
}
include "/CORRECT/ETC/DIR/dhcpd.general";

Проверка конфигурации и запуск

FreeBSD


[gateN:~]# dhcpd -t

[gateN:~]# /usr/local/etc/rc.d/isc-dhcpd start


Ubuntu

gateN:~# dhcpd3 -t

Примечания: В качестве шлюза указан не существующий ip адрес 192.168.X.254, он будет назначаться в следующей лабораторной работе. В первый момент необходимо запустить оба сервера чтобы они синхронизировались.

Проверка: перезагружаем WinXP по очереди останавливая и запуская серверы. Должен выдаваться один и тот же адрес (можно отключать интерфейс XP, ipconfig /renew не использовать)

gateN:~# tail -f /var/log/messages


Сервис Gateway/NAT


CARP

FreeBSD (user land)

[gateN:~]# pkg_add -r ucarp

[gate1:~]# nano /etc/rc.conf

...
ucarp_enable="YES"
ucarp_vhid="1"
ucarp_if="em0"
ucarp_src="192.168.X.1"
ucarp_addr="192.168.X.254"
# ucarp_advskew="50"
# ucarp_preempt="YES" # For always use master with lover advskew
ucarp_pass="secret"
ucarp_upscript="/usr/local/etc/vip-up.sh"
ucarp_downscript="/usr/local/etc/vip-down.sh"

[gate2:~]# nano /etc/rc.conf

...
ucarp_enable="YES"
ucarp_vhid="1"
ucarp_if="em0"
ucarp_src="192.168.X.2"
ucarp_addr="192.168.X.254"
# ucarp_advskew="100"
# ucarp_preempt="YES"
ucarp_pass="secret"
ucarp_upscript="/usr/local/etc/vip-up.sh"
ucarp_downscript="/usr/local/etc/vip-down.sh"

[gateN:~]# nano /usr/local/etc/vip-up.sh

#!/bin/sh
ifconfig em0 inet 192.168.X.254/32 alias

[gateN:~]# chmod +x /usr/local/etc/vip-up.sh

[gateN:~]# nano /usr/local/etc/vip-down.sh

#!/bin/sh
ifconfig em0 inet 192.168.X.254/32 -alias

[gateN:~]# chmod +x /usr/local/etc/vip-down.sh

[gateN:~]# /usr/local/etc/rc.d/ucarp start


Ubuntu

Установка

gateN:~# apt-get install ucarp


Настройка

gateN:~# nano /etc/vip-up.sh

#!/bin/sh
/sbin/ip addr add 192.168.X.254/32 dev "$1"

gateN:~# nano /etc/vip-down.sh

#!/bin/sh
/sbin/ip addr del 192.168.X.254/32 dev "$1"

gateN:~# chmod +x /etc/vip-up.sh /etc/vip-down.sh


Запуск (можно прописать в /etc/rc.local)
gate1:~#
...
ucarp -i eth0 -s 192.168.X.1 -v 1 -p secret -a 192.168.X.254 \
         -u /etc/vip-up.sh -d /etc/vip-down.sh -z -B

gate2:~#
...
ucarp -i eth0 -s 192.168.X.2 -v 1 -p secret -a 192.168.X.254 \
         -u /etc/vip-up.sh -d /etc/vip-down.sh -z -B

Проверка

gateN:~# ip addr show eth0

Остановка

gateN:~# killall ucarp

Запуск

gateN:~# ifup eth0

Проверка

gateN:~# ifconfig eth0:ucarp

работает ли ucarp

gateN:~# ps ax | grep ucarp


FreeBSD + UCARP

[gateN:~]# nano /usr/local/etc/vip-up.sh

#!/bin/sh ifconfig em0 inet 192.168.X.254/32 alias
ifconfig em1 inet 172.16.1.X/24 alias

route delete default
route add default 172.16.1.254

[gateN:~]# nano /usr/local/etc/vip-down.sh

#!/bin/sh
ifconfig em0 inet 192.168.X.254/32 -alias
ifconfig em1 inet 172.16.1.X/24 -alias

route delete default
route add default 192.168.X.254

Ubuntu + UCARP

Назначаем у удаляем соответствующие адреса и маршруты

gateN:~# apt-get install fake

gateN:~# nano /etc/vip-up.sh

#!/bin/sh
ip addr add 192.168.X.254/32 dev "$1"
ip addr add 172.16.1.X/24 dev eth1

route delete default
route add default gw 172.16.1.254

gateN:~# nano /etc/vip-down.sh

#!/bin/sh
ip addr del 192.168.X.254/32 dev "$1"
ip addr del 172.16.1.X/24 dev eth1

route delete default
route add default gw 192.168.X.254

Настроить NAT простейший вариант (для примера)


Очистка таблицы nat

gateN:~# iptables -t nat --flush

Заполнение таблицы nat (eth1 - внешний интерфейс)

gateN:~# iptables -t nat -A POSTROUTING -o eth1
     -s 192.168.X.0/24 -j MASQUERADE

в нашем случае используем SNAT т.к в случае маскарадинга трафик пойдет через IP присвоеный карте eth1, а єто нас не устраивает, т.к у нас там стыренные у провайдера адреса.

gateN:~# iptables -t nat -A POSTROUTING -o eth1
     -s 192.168.X.0/24 -j SNAT --to-source 172.16.1.X


Сохранение состояния iptables

gateN:~# iptables-save -c > /etc/iptables.rules


Восстановление состояния iptables

gateN:~# iptables-restore -c < /etc/iptables.rules


Восстановление состояния iptables при загрузке

gateN:~# nano /etc/network/interfaces

...
auto eth1
iface eth1 inet static
     pre-up iptables-restore -c < /etc/iptables.rules

Сервис HTTP:


Сценарий: cоздаем отказоустойчивый www хостинг. Содержимое домашних каталогов мастер сервера периодически копируется на резервный. В случае временной остановки или выхода из строя главного сервера автоматически становится доступным резервный. Не преднамеренный запуск мастер сервера не должен менять ролей серверов.

Подготовка (1-й этап):
Настройка серверов для зон corpX.un. и X.168.192.in-addr.arpa., добавляем запись о веб сервере в BIND

gateN:~# nano /var/cache/bind/corpX.un

...
www A 192.168.X.10

На обоих узлах устанавливаем и запускаем http сервер с поддержкой домашних каталогов
Установка и запуск сервера Apache:

FreeBSD

[gateN]# pkg_add -r apache22

[gateN]# nano /etc/rc.conf

...
apache22_enable="YES"
...

[gateN]# /usr/local/etc/rc.d/apache22 start


Использование домашних каталогов

[gateN]# nano /usr/local/etc/apache22/httpd.conf

...
Include etc/apache22/extra/httpd-userdir.conf
...

Ubuntu

gateN:~# apt-get install apache2


Использование домашних каталогов

gateN:~# a2enmod userdir

gateN:~# /etc/init.d/apache2 restart


FreeBSD/Ubuntu

gateN:~# mkdir ~user1/public_html/

gateN:~# nano ~user1/public_html/index.html

<h1>Hello World from user1</h1>

gateN:~# chown -R user1 ~user1/public_html/


Проверяем подключившись с браузера клиента на www

На обоих узлах создаем пользователя user1 с одинаковым uid=10001

gateN:~# adduser --uid=10001 user

проверяем создался ли пользователь с необходимыми параметрами

gateN:~# id user

проверяем запущен ли апач

gateN:~# ps ax | grep apach


Устанавливаем сервер ftp на gate1 и запускаем его

FreeBSD

[gateN:~]# nano /etc/rc.conf

ftpd_enable="YES"

[gateN:~]# /etc/rc.d/ftpd start

Starting ftpd.

Ubuntu

gateN:~# apt-get install proftpd

Run proftpd: standalone

Создаем тестовую www страницу для пользователя user1 используя протокол ftp на gate1 (через winscp)
Периодически синхронизируем (Планирование выполнения заданий в Linux) содержимое домашних каталогов на резервный сервер

Использование rsync сервера


Установка

FreeBSD

[gateN:~]# pkg_add -r rsync

[gate2:~]# /usr/local/etc/rc.d/rsyncd rcvar


Ubuntu

gateN:~# apt-get install rsync

gate2:~# nano /etc/default/rsync

...
RSYNC_ENABLE=true
...

FreeBSD/Ubuntu

gate2:~# nano /etc/rsyncd.conf

pid file = /var/run/rsyncd.pid

# Название ресурса
[home]
     # Кем подключаться
     uid = root

     use chroot = yes

     # Что доступно
     path = /home

     # Доступно на запись
     read only = no

     # Коме разрешено подключаться
     hosts allow = gate1.corpX.un

Какие ресурсы доступны

gate1:~# rsync gate2::

home
Посмотреть

gate1:~# rsync gate2::home

...

gate1:~# rsync gate2::home/user1/

...

Архивировать выдавая подробную информацию(-av), удаляя(--delete), что(/home/), куда(gate2::home)

gate1:~# rsync -av --delete /home/ gate2::home


Менеджер узлов (кластара) HEARTBEAT


Подготовка (2-й этап):
Устанавливаем ftp сервис на gate2 == gate1.
На обоих узлах отключаем автоматический запуск ftp сервиса.

gateN:~# ls /etc/rc2.d/

gateN:~# update-rc.d -f ftp remove


Если надо вернуть атозапуск:

gateN:~# update-rc.d ftp defaults


Добавляем сетевые адаптеры, которые будут соединены кросс кабелем и использоваться для мониторинга состояния узлов (Ethernet 3 - VMnet4).
Настраиваем IP адреса адаптеров 10.0.0.1/24 на gate1 и 10.0.0.2/24 на gate2.

Установка и настройка

FreeBSD

[gateN:~]# pkg_add -r heartbeat

[gateN:~]# ls /usr/local/share/doc/heartbeat/

[gateN:~]# cd /usr/local/etc/ha.d/


Ubuntu

gateN:~# apt-get install heartbeat

gateN:~# zless /usr/share/doc/heartbeat/ha.cf.gz

gateN:~# cd /etc/ha.d/


FreeBSD/Ubuntu

gateN:~# nano ha.cf

# Сетевой интерфейс, вариант для фри
# bcast le2

# Сетевой интерфейс, вариант для убунты
# bcast eth2

# ucast eth1 192.168.1.2

# Сколько слейв ожидает мастера
deadtime 30

# Сколько секунд ждут друг друга
initdead 120

# Не возвращает мастера в случае поднятия упавшего серв
auto_failback off

# Список узлов
node gate1.corpX.un

# Список узлов
node gate2.corpX.un

debugfile /var/log/ha-debug
logfile /var/log/ha-log

gateN:~# nano authkeys

auth 1 # Для первой группы узлов
1 sha1 testpass123 # Ключ для первуй группы узлов

gateN:~# chmod 600 authkeys

gateN:~# nano resource.d/ftpserv

#!/bin/sh
# Don't forget disable autostart service
# Uncomment starting services compatible with FreeBSD/Ubuntu

# Передаем первую переменную
case $1 in
start)
     # Вариант для фри
     # /etc/rc.d/ftpd onestart

     # Вариант для убунты
     # /etc/init.d/proftpd start
     ;;
stop)
     # Вариант для фри
     # /etc/rc.d/ftpd onestop

     # Вариант для убунты
     # /etc/init.d/proftpd stop
     ;;
esac

exit 0

Даем бит исполнения

gateN:~# chmod +x resource.d/ftpserv

gateN:~# nano haresources

gate1.corpX.un \
     IPaddr::192.168.X.10 \
     ftpserv
# Пока пропустим
# gate2.corpX.un \
     # IPaddr::192.168.X.20 \
     # smbserv

Пробелы после \ пробелы и пустые строки не допустимы!!!

Запуск:

FreeBSD

[gateN:~]# /usr/local/etc/rc.d/heartbeat rcvar

[gateN:~]# /usr/local/etc/rc.d/heartbeat start


Ubuntu

gateN:~# /etc/init.d/heartbeat start


Проверка (смотрим логи):

gateN:~# tail -f /var/log/ha-debug

gateN:~# tail -f /var/log/ha-log


gateN:~# cl_status nodestatus gateN.corpX.un


Настроить автоматическую синхронизацию домашних каталогов с мастер узла на резервный с использованием сети кросс кабеля.
Запустить rsync на gate1.

Указываем в файле /etc/hosts имя slave указывающее на соседний сервер

gate1:~# nano /etc/hosts

...
10.0.0.2 slave
...

gate2:~# nano /etc/hosts

...
10.0.0.1 slave
...

Устанавливаем на gate1 Пакет RSYNC
Изменяем диррекпивы в фойлах настройки

gateN:~# nano /CHANGE/DIR/rsyncd.conf

...
     hosts allow = slave

проверяем

gateN:~# rsync slave::home


Добавляем автозапуск синхронизации каждую минуту

gateN:~# crontab -e


FreeBSD

* * * * * ps ax | grep -v grep | grep -q 'ftpd -D' && /usr/local/bin/rsync \
     -a /home/ slave::home

Ubuntu

* * * * * ps ax | grep -v grep | grep -q 'proftpd: (accepting connections)' && /usr/bin/rsync \
     -a /home/ slave::home

Подключаемся из винды, при помощи WinSCP подключаемся на www и редактируем файл index.htm, через минуту файли на gate1 b gate2 должны быть одинаковы.

Синхронизация файловых систем (зеркалирование):


!!! Проверять на отказоустойчивость дожидаясь синхронизации.
Сценарий: Создаем отказоустойчивый корпоративный файловый сервер. Второй узел кластера должен использоваться сервером по умолчанию.
Подключаем к обоим узлам по дополнительному физическому диску диску (для создания зеркал).

DRBD (Ubuntu)

Подготовка узлов:
Добавляем жесткие диски, создаем точки монтирования.
Смотрим какие диски подключены

gateN:~# lshw -C disk

Создаем директорию для монтирования зеркалируемого диска

gateN:~# mkdir /disk2


Установка и настройка

gateN:~# apt-get install drbd8-utils

gateN:~# nano /etc/drbd.d/global_common.conf

...
     syncer {
         # rate after al-extents use-rle cpu-mask verify-alg csums-alg
         # Скорость зеркалирования 10Mb/s
         rate 10M;
     } }

Редактируем основной файл конфигурации

gateN:~# nano /etc/drbd.d/r0.res

resource r0 {
     on gate1.corpX.un {
         device /dev/drbd0;
         disk /dev/sdb;

         # disk /dev/sdb1;

         address 10.0.0.1:7788;
         meta-disk internal;
     }

     on gate2.corpX.un {
         device /dev/drbd0;
         disk /dev/sdb;

         # disk /dev/sdb1;

         address 10.0.0.2:7788;
         meta-disk internal;
     }
}

Создаем мета информацию

gateN:~# drbdadm create-md r0


Стартуем одновременно на двух узлах (из родних консолей):

gateN:~# /etc/init.d/drbd start

смотрим запущен ли drbd

gateN:~# ps ax | grep drbd


назначаем первый узел gate1 - primary

gate1:~# drbdadm -- --overwrite-data-of-peer primary r0

проверяем

gateN:~# cat /proc/drbd


Можно не ожидая синхронизации создать файловую систему и смонтировать:

gate1:~# mkfs.ext3 /dev/drbd0

gate1:~# mount /dev/drbd0 /disk2


Смена ролей узлов (после окончания синхронизации):
для провеки копируем что-то

gate1:~# cp /etc/hostname /disk2


gate1:~# umount /disk2

gate1:~# drbdadm secondary r0


gate2:~# drbdadm primary r0

gate2:~# mount /dev/drbd0 /disk2

смотрум уже на второй машине gate2

gate2:~# cat /disk2/hostname


Отключение зеркалируемого раздела:

gate2:~# umount /disk2

gate2:~# drbdadm secondary r0


Восстановление после сбоя:
Устанавливаем новый диск

gateNEW:~# fdisk /dev/sdb

n
p
1
<enter>
<enter>
w

gateNEW:~# drbdadm create-md r0


gateNEW:~# /etc/init.d/drbd start


HEARTBEAT + DRBD

gateN:~# /etc/init.d/heartbeat stop

gateN:~# nano /etc/ha.d/haresources

gate2.corpX.un drbddisk Filesystem::/dev/drbd0::/disk2::ext3

gateN:~# /etc/init.d/heartbeat start


HAST (FreeBSD)

Подготовка узлов:
Добавляем жесткие диски, создаем точки монтирования.

gateN:~# dmesg

gateN:~# mkdir /disk2


Настройка узлов

gateN:~# nano /etc/hast.conf

resource r0 {
     on gate1 {
         local /dev/ad1

         # local /dev/ad1s1d

         remote 10.0.0.2
     }

     on gate2 {
         local /dev/ad1

         # local /dev/ad1s1d

         remote 10.0.0.1
     }
}

gateN:~# nano /etc/rc.conf

...
hastd_enable=yes

gateN:~# /etc/rc.d/hastd start


Инициализация:

gateN:~# hastctl create r0


gate1:~# hastctl role primary r0

gate2:~# hastctl role secondary r0


gateN:~# hastctl status


gate1:~# newfs /dev/hast/r0

gate1:~# mount /dev/hast/r0 /disk2

gate1:~# cp /etc/rc.conf /disk2/


Смена ролей узлов кластера:

gate1:~# umount /disk2

gate1:~# hastctl role secondary r0


gate2:~# hastctl role primary r0

gate2:~# fsck -y -t ufs /dev/hast/r0

gate2:~# mount /dev/hast/r0 /disk2


Отключение зеркалируемого раздела:

gate2:~# umount /disk2

gate2:~# hastctl role secondary r0


Дополнительные материалы:
Решение ситуации split brain
Выбираем узел, данные которого будут затерты.

gateZ:~# hastctl create r0

gateZ:~# hastctl role secondary r0

gateM:~# hastctl role primary r0

gateZ:~# hastctl status

gateM:~# hastctl status


HEARTBEAT + HAST

Состояние init возникает при запуске hastd на secondary узле, если он остановился и стартует раньше primary.
Ситуация Split-Brain возникает при запуске hastd на secondary узле, если он остановился позже primary и heartbeat успел его назначить primary, а запускаются оба узла синхронно и heartbeat считает что primary должен оставаться прежним.

gateN:~# /usr/local/etc/rc.d/heartbeat stop

gateN:~# nano /usr/local/etc/ha.d/resource.d/hast

#!/bin/sh
case $1 in

status)
     hastctl status r0 | grep -q 'role: init' && hastctl role secondary r0
     ;;

start)
     hastctl role primary r0
     sleep 5
     fsck -y -t ufs /dev/hast/r0
     mount /dev/hast/r0 /disk2
     ;;

stop)
     mount | grep -q hast && umount /disk2
     hastctl role secondary r0
     ;;
esac

exit 0

gateN:~# chmod +x /usr/local/etc/ha.d/resource.d/hast

gateN:~# nano /usr/local/etc/ha.d/haresources

gate2.corpX.un hast

gateN:~# /usr/local/etc/rc.d/heartbeat start


Samba как файловый сервер с пуюличным каталогом доступным на запись:


gateN:~# nano /var/cache/bind/corpX.un

...
samba A 192.168.X.20

Установка

FreeBSD

[gateN]# pkg_add -r samba3

[gateN]# nano /etc/rc.conf


nmbd_enable="YES"
smbd_enable="YES"
winbindd_enable="NO"


[gateN]# rehash

[gateN]# /usr/local/etc/rc.d/samba start

[gateN]# сd /usr/local/etc/


Ubuntu

gateN:~# apt-get install samba

gateN:~# cd /etc/samba/

gateN:~# mv smb.conf smb.conf.old


Окно аутентификации возникает в случае совпадения имени пользователя Windows с пользователем зарегистрированным в /etc/passwd

gateN:~# nano /etc/samba/smb.conf

[global]
     # Типы кодировок
     unix charset = UTF-8
     dos charset = cp866

     # Рабочая группа
     workgroup = OFFICE.AT

     # Тип авторизации
     security = user

     # Разрешаем только из конкретной сети
     hosts allow = 10.0.0.

     # Мапим на..
     map to guest = Bad User

[share]
     # Путь к каталогу шары
     path = /var/samba

     # Разрешаем общий доступ
     guest ok = yes

     # Разрешаем запись
     read only = no

     # Мапим на..
     force user = nobody

gateN:~# chown -R nobody /var/samba

gateN:~# testparm


Для FreeBSD не включаем, для Ubuntu отключаем автоматический запуск сервиса

gateN:~# nano /etc/init/smbd.conf

...
#start on ...
#stop on ...
...

gateN:~# nano /etc/init/nmbd.conf

...
#start on ...
#stop on ...
...

gateN:~# stop smbd


Настраиваем heartbeat на монтирование на мастер узле зеркалируемого раздела в каталог /disk2, назначение ip адреса 192.168.X.20 и запуск сервера samba

Ubuntu

gateN:~# /etc/init.d/heartbeat stop

gateN:~# nano /etc/ha.d/haresources

gate2.corpX.un \
     drbddisk \
     Filesystem::/dev/drbd0::/disk2::ext3 \
     IPaddr::192.168.X.20 \
     smbserv

gateN:~# nano /etc/ha.d/resource.d/smbserv

#!/bin/sh

case $1 in
start)
     start smbd
     ;;
stop)
     stop smbd
     ;;
esac

exit 0

root@gateN:~# chmod +x /etc/ha.d/resource.d/smbserv


root@gateN:~# /etc/init.d/heartbeat start


FreeBSD

[gateN:~]# /usr/local/etc/rc.d/heartbeat stop

[gateN:~]# nano /usr/local/etc/ha.d/haresources

gate2.corpX.un \
     hast \
     IPaddr::192.168.X.20 \
     smbserv

[gateN:~]# nano /usr/local/etc/ha.d/resource.d/smbserv

#!/bin/sh

case $1 in
start)
     sleep 10
     /usr/local/etc/rc.d/samba onestart
     ;;
stop)
     /usr/local/etc/rc.d/samba onestop
     ;;
esac

exit 0

[gateN:~]# chmod +x /usr/local/etc/ha.d/resource.d/smbserv


[gateN:~]# /usr/local/etc/rc.d/heartbeat start


Проверяем целостность зеркала

FreeBSD

master:~# hastctl status

Ubuntu

master:~# cat /proc/drbd


Останавливаем MASTER сервер и дожидаемся монтирования на SLAVE узле "половины" зеркалируемого раздела в каталог /disk2, назначение ip адреса 192.168.X.20 и запуск сервера samba.
Запускаем бывший MASTER узел и дожидаемся восстановления целостности зеркала

Универсальное решение (виртуальные машины)


Подготовка
Проверять на отказоустойчивость останавливая системы (init 0)
Проверять на отказоустойчивость дожидаясь синхронизации

В зону corpX.un добавляем запись (mail A 192.168.X.30)

gateN:~# nano /var/cache/bind/corpX.un

...
mail A 192.168.X.30

Останавливаем heartbeat

gateN:~# /etc/init.d/heratbeat stop

проверяем

gateN:~# cat /proc/drbd


Монтируем /disk2 раздел на MASTER (gate1) узле, решение DRBD или решение HAST в зависимости от системы сответственно

gateN:~# nano /etc/ha.d/haresources

gate1.corpX.un \
     drbddisk \
     Filesystem::/dev/drbd0::/disk2::ext3

Запускаем и проверяем смонтировался ли раздел

gateN:~# /etc/init.d/heartbeat start

gateN:~# cat /proc/drbd

На первом ресурсе должен быть смонтирован /disk2
...
     Primary/Secondary UpToDate/ UpToDate
...

Подготовка родительских узлов

LXC (Ubuntu)
Подготавливаем сеть для гостевых систем на обоих узлах для интерфейса LAN eth0

gateN:~# apt-get install bridge-utils

gateN:~# ifdown eth0

gateN:~# nano /etc/network/interfaces

...
auto br0
iface br0 inet static
     address 192.168.X.N
     netmask 255.255.255.0
     bridge_ports eth0
     bridge_stp off
     bridge_maxwait 0
     post-up /usr/sbin/brctl setfd br0 0
...

gateN:~# ifup br0

проверяем – из винды пингуем 192.168.X.1

Исправляем имена сетевых (/etc/rc.local) и dhcp (/etc/default/dhcp3-server) eth0 на br0

gateN:~# nano /etc/default/dhcp3-server

...
INTERFACES=”br0”

gateN:~# killall ucarp

gate1:~# nano /etc/rc.local

ucarp -i br0 -s 192.168.X.1 -v 1 -p secret -a 192.168.X.254 \
     -u /etc/vip-up.sh -d /etc/vip-down.sh -z -B

gate2:~# nano /etc/rc.local

ucarp -i br0 -s 192.168.X.2 -v 1 -p secret -a 192.168.X.254 \
     -u /etc/vip-up.sh -d /etc/vip-down.sh -z -B

Запускаем carp

gateN:~# /etc/init.d/hertbeat start


Установка утилит lxc (виртуализация линукс контейнеров) и настройка поддержки lxc на обоих узлах

gateN:~# apt-get install lxc

создаем точку монтирования, используется для хранения выделяемых ресурсов для виртуальной машины

gateN:~# mkdir /cgroup

не копировать редактировать индивидуально на каждой машине

gateN:~# nano /etc/fstab

...
none /cgroup cgroup defaults 0 0

gateN:~# mount /cgroup


Проверяем, на первом ресурсе должен быть смонтирован /disk2.

gate1:~# cat /proc/drbd

...
     Primary/Secondary UpToDate/ UpToDate
...

Готовимся - все, относящееся к виртуальным системам, хранить на зеркалируемом разделе

gateN:~# rmdir /var/lib/lxc/

gateN:~# ln -s /disk2/var/lib/lxc/ /var/lib/lxc


Подготовка виртуальных машин

LXC (Ubuntu). Инсталлируем виртуальные системы в зеркалируемый раздел.
Создаем ветку гостевой системы

gate1:~# apt-get install debootstrap

gate1:~# mkdir -p /disk2/var/lib/lxc/


Утилита позволяет выкачать минимальный (в данном случае) вариант --variant=minbase дистребутива lucid под указанную архитектуру --arch i386 в конкретную папку /var/lib/lxc/mail/rootfs из конкретного репозитория http://rep/ubuntu/.

gate1:~# debootstrap --variant=minbase --arch i386 lucid /var/lib/lxc/mail/rootfs http://rep/ubuntu/


gate1:~# cp /etc/hosts /var/lib/lxc/mail/rootfs/etc/

gate1:~# cp /etc/apt/sources.list /var/lib/lxc/mail/rootfs/etc/apt/


Устанавливаем ПО в гостевой системе на MASTER узле
Переходим в каталог с выкачанной системой:

gate1:~# chroot /var/lib/lxc/mail/rootfs/ /bin/bash

Меняем приглашение (чтобы не запутаться)

gate1:~# PS1='mail:\w# '


Обновляем базу данных репозитория

mail:/# apt-get update

принудительно если надо

mail:/# apt-get install --force-yes -y gpgv

mail:/# apt-get update


mail:/# apt-get -y install language-pack-en

mail:/# update-locale LANG="en_US.UTF-8" LANGUAGE="en_US.UTF-8" LC_ALL="en_US.UTF-8" LC_CTYPE="C"


mail:/# apt-get install -y vim nano telnet natcat inetutils-ping ssh rsyslog cron


Настраиваем hostname, hosts, DNS client и учетную запись root в гостевой системе

mail:/# nano /etc/hostname

mail.corpX.un

mail:/# nano /etc/hosts

...
192.168.X.30 mail.corpX.un

mail:/# nano /etc/resolv.conf

search corpX.un
nameserver 192.168.X.1
nameserver 192.168.X.2

Установим пароль дочерней системы (123)

mail:/# passwd


Настройка процесса загрузки дочерней системы

mail:/# cd /etc/init


mail:/etc/init# rm -f console* control* hwclock* module* mount* network-interface*

mail:/etc/init# rm -f plymouth* procps* tty* udev* upstart*


mail:/etc/init# rm rc-sysinit.conf

mail:/etc/init# nano rc-sysinit.conf

start on startup

pre-start script
     route add default gw 192.168.X.254
     # /etc/init.d/postfix start
end script

post-stop script
     # /etc/init.d/postfix stop
end script

mail:/etc/init# nano ssh.conf

...
start on startup
...

ail:/etc/init# nano rsyslog.conf

...
start on startup
...

mail:/etc/init# nano cron.conf

...
start on startup
...

Выход из ветки файлов дочерней системы

mail:/etc/init# exit


Настраиваем lxc для запуска гостевой системы в контейнере на MASTER узле

gate1:~# nano /var/lib/lxc/mail/config

lxc.utsname = mail
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.name = eth0
lxc.network.mtu = 1500
lxc.network.ipv4 = 192.168.X.30/24
lxc.rootfs = /var/lib/lxc/mail/rootfs
lxc.mount = /var/lib/lxc/mail/fstab

gate1:~# nano /var/lib/lxc/mail/fstab

none /var/lib/lxc/mail/rootfs/dev/pts devpts defaults 0 0
none /var/lib/lxc/mail/rootfs/proc proc defaults 0 0
none /var/lib/lxc/mail/rootfs/sys sysfs defaults 0 0
none /var/lib/lxc/mail/rootfs/var/lock tmpfs defaults 0 0
none /var/lib/lxc/mail/rootfs/var/run tmpfs defaults 0 0

gate1:~# lxc-info -n mail

запустить линукс контейнер

gate1:~# lxc-start -n mail -d

посмотреть какие линукс контейнеры запущены

gate1:~# lxc-info -n mail

'mail' is RUNNING

посмотреть процессы внутри линукс контейнера

gate1:~# lxc-ps --name mail

подрлючится по ssh

gate1:~# ssh mail

для проверки

mail:/ apt-get update

остановить

gate1:~# lxc-stop -n mail


gate1:~# umount /disk2


HEARTBEAT + LXC
Убеждаемся что контейнер остановлен

gate1:~# lxc-info -n mail

'mail' is STOPPED

gateN:~# /etc/init.d/heartbeat stop

gateN:~# cat /proc/drbd

...
     Secondary /Secondary UpToDate/ UpToDate
...

gateN:~# nano /etc/ha.d/resource.d/lxcserv

#!/bin/sh

case $1 in
start)
     lxc-start -n mail -d
     ;;
stop)
     lxc-stop -n mail
     ;;
esac

даем бит выполнения

gateN:~# chmod +x /etc/ha.d/resource.d/lxcserv

gateN:~# nano /etc/ha.d/haresources

gate1.corpX.un \
     drbddisk \
     Filesystem::/dev/drbd0::/disk2::ext3 \
     lxcserv

gateN:~# /etc/init.d/heartbeat start


jail (FreeBSD)
Инсталлируем исходные тексты системы

[gate1:~]# freebsd-update fetch

[gate1:~]# freebsd-update install


Создаем виртуальную машину только на MASTER узле

[gate1:~]# cd /usr/src

[gate1:/usr/src]# mkdir -p /disk2/jail/mail


[gate1:/usr/src]# make installworld DESTDIR=/disk2/jail/mail

[gate1:/usr/src]# make distribution DESTDIR=/disk2/jail/mail


Настраиваем параметры виртуальной машина на обоих узлах (без автозапуска)

[gateN:~]# nano /etc/rc.conf

...
jail_enable="NO"
jail_list="mail"
jail_mail_rootdir="/disk2/jail/mail"
jail_mail_hostname="mail.corpX.un"
jail_mail_interface="em0"
jail_mail_ip="192.168.X.30"
jail_mail_devfs_enable="YES"
jail_mail_devfs_ruleset="devfsrules_jail"

[gateN:~]# nano /etc/sysctl.conf

...
security.jail.allow_raw_sockets=1

[gateN:~]# sysctl security.jail.allow_raw_sockets=1


Тестируем виртуальную машину на MASTER узле

[gate1:~]# /etc/rc.d/jail onestart mail


[gate1:~]# jls

[gate1:~]# jexec NNN csh


mail# nano /etc/resolv.conf

nameserver 192.168.X.1
nameserver 192.168.X.2

mail# nano /etc/rc.conf

sshd_enable=yes

mail# adduser

...
student

mail# ping ya.ru


mail# telnet ya.ru 80

Trying 213.180.204.8...
Connected to ya.ru.
Escape character is '^]'.

[gate1:~]# /etc/rc.d/jail onestop mail

[gate1:~]# umount /disk2


HEARTBEAT + Jail

[gateN:~]# /usr/local/etc/rc.d/heartbeat stop

[gateN:~]# nano /etc/rc.conf

...
jail_enable="NO"
...

[gateN:~]# cat /usr/local/etc/ha.d/resource.d/jailserv

#!/bin/sh

case $1 in
start)
     sleep 10 # for HAST init
     /etc/rc.d/jail onestart mail
     ;;
stop)
     /etc/rc.d/jail onestop mail
     ;;
esac

exit 0

[gateN:~]# chmod +x /usr/local/etc/ha.d/resource.d/jailserv

[gateN:~]# cat /usr/local/etc/ha.d/haresources

gate1.corpX.un hast jailserv

[gateN:~]# /usr/local/etc/rc.d/heartbeat start


Настраиваем виртуальную систему как сервер электронной почты или как любой другой сервер.
© Все права защищены 2011-2018