This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
создание_отказоустойчивых_linux_решений_new [2022/03/19 20:30] val [Модуль 11. Тестирование отказоустойчивости] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Создание отказоустойчивых Linux решений ====== | ||
- | |||
- | ===== Программа курса ===== | ||
- | |||
- | * [[http://www.specialist.ru/course/un5|Linux. Уровень 6. Создание отказоустойчивых кластерных решений.]] | ||
- | |||
- | ===== Ссылка на вебинар ===== | ||
- | |||
- | |||
- | ===== Цель курса ===== | ||
- | |||
- | * Научиться настраивать отказоустойчивую конфигурацию сервисов Linux на "железном" оборудовании в сети предприятия. | ||
- | |||
- | ===== План обновлений ===== | ||
- | |||
- | - Прозрачная миграция сети ЛИН2 в ЛИН6 | ||
- | - DRBD без OCFS поскольку с ним будет CEPH | ||
- | - server1/2 вместо server для демонстрации шаблонов контейнеров | ||
- | ===== Модуль 0. Подготовка стенда в классе ===== | ||
- | |||
- | * Узнать свой номер стенда | ||
- | * Удалить виртуалки | ||
- | * Удалить профили putty | ||
- | * Отключить не используемые адаптеры | ||
- | * Записать логин пароль и IP (сообщить преподавателю) рабочей станции | ||
- | * Проверить наличие дистрибутивов и образов | ||
- | |||
- | |||
- | |||
- | |||
- | ===== Модуль 1. Развертывание систем и сети кластера ===== | ||
- | |||
- | ==== Теория ==== | ||
- | |||
- | * [[http://www.team.ru/server/stbl_compare.shtml|Сравнение кластера надежности и "обычного" сервера]] | ||
- | * [[https://ru.wikipedia.org/wiki/%D0%9E%D1%82%D0%BA%D0%B0%D0%B7%D0%BE%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D1%8B%D0%B9_%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80|Отказоустойчивый кластер]] | ||
- | * [[https://ru.wikipedia.org/wiki/%D0%92%D0%B5%D1%80%D0%BE%D1%8F%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B1%D0%B5%D0%B7%D0%BE%D1%82%D0%BA%D0%B0%D0%B7%D0%BD%D0%BE%D0%B9_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B|Вероятность безотказной работы]] | ||
- | * [[https://www.youtube.com/watch?v=-izJHCPKvCg|youtube Отказоустойчивый микрокластер своими руками / Виталий Гаврилов (Ленвендо)]] Схема сети на 4-й минуте | ||
- | |||
- | ==== Лабораторные работы ==== | ||
- | |||
- | === 1.1 Импорт VM Linux === | ||
- | |||
- | C:\cmder\cmder.exe | ||
- | |||
- | <code> | ||
- | bash | ||
- | |||
- | cd | ||
- | |||
- | git clone http://val.bmstu.ru/unix/conf.git | ||
- | |||
- | cd conf/virtualbox/ | ||
- | |||
- | ./setup.sh X 6 | ||
- | </code> | ||
- | |||
- | === 1.2 Аппаратная настройка систем === | ||
- | |||
- | * Адаптер 1 - eth0 - Виртуальный адаптер хоста (LAN) | ||
- | * Адаптер 2 - eth1 - Сетевой мост (ISP1) только для node1 и node2 | ||
- | * Жесткий диск размер 4G уже добавлен | ||
- | |||
- | === 1.3 Импорт VM Windows === | ||
- | |||
- | === 1.4 Исходная настройка сети шлюза === | ||
- | |||
- | <code> | ||
- | ubuntu# sh net_gate.sh | ||
- | |||
- | ubuntu# init 6 | ||
- | </code> | ||
- | |||
- | <code> | ||
- | gate# sh conf/dhcp.sh | ||
- | </code> | ||
- | |||
- | === 1.5 Тестирование сети === | ||
- | <code> | ||
- | windows> ping 1.1.1.1 | ||
- | </code> | ||
- | |||
- | === 1.6 Подготовка отказоустойчивой конфигурации === | ||
- | |||
- | * [[Сервис Keepalived]] (сервис не перезапускать!) | ||
- | |||
- | <code> | ||
- | gate# cat /etc/network/interfaces | ||
- | </code><code> | ||
- | auto lo | ||
- | iface lo inet loopback | ||
- | |||
- | auto eth0 | ||
- | iface eth0 inet static | ||
- | address 192.168.X.1 | ||
- | netmask 255.255.255.0 | ||
- | |||
- | auto eth1 | ||
- | iface eth1 inet manual | ||
- | up ip link set eth1 up | ||
- | |||
- | #auto eth2 | ||
- | #iface eth2 inet manual | ||
- | # up ip link set eth2 up | ||
- | </code> | ||
- | <code> | ||
- | gate# cat /etc/hostname | ||
- | </code><code> | ||
- | node1.corpX.un | ||
- | </code><code> | ||
- | gate# cat /etc/hosts | ||
- | </code><code> | ||
- | 127.0.0.1 localhost | ||
- | |||
- | 192.168.X.1 node1.corpX.un node1 | ||
- | 192.168.X.2 node2.corpX.un node2 | ||
- | </code><code> | ||
- | gate# init 6 | ||
- | </code> | ||
- | |||
- | === 1.7 Тестирование сети === | ||
- | <code> | ||
- | node1# ping ya.ru | ||
- | |||
- | windows> ping 1.1.1.1 | ||
- | </code> | ||
- | |||
- | ==== Вопросы ==== | ||
- | |||
- | - НА кластер используется для повышения ... | ||
- | - НP кластер используется для повышения ... | ||
- | - Вероятность безотказной работы группы объектов равна ... | ||
- | |||
- | ===== Модуль 2. Синхронизация файлов конфигураций узлов ===== | ||
- | |||
- | ==== Теория ==== | ||
- | |||
- | * [[https://habr.com/en/post/120702/|csync2 или как облегчить работу с кластером]] | ||
- | * [[https://ru.wikipedia.org/wiki/Ansible|Ansible]] | ||
- | |||
- | ==== Лабораторные работы ==== | ||
- | |||
- | === 2.1 Запуск node2 === | ||
- | |||
- | === 2.2 Синхронизация с использованием сервиса SSH === | ||
- | |||
- | * Настройка доступа по протоколу ssh пользователя root с node1 на node2 ([[Сервис SSH#Разрешение доступа пользователя root на основании адреса клиента]]) | ||
- | * Настройка беспарольного доступа пользователя root с node1 на node2 ([[Сервис SSH#Аутентификация с использованием ключей ssh]]) | ||
- | |||
- | <code> | ||
- | node2# ifconfig eth0 inet 192.168.X.2/24 | ||
- | |||
- | node1# ping node2 | ||
- | |||
- | node1# ssh-keygen | ||
- | ... | ||
- | Enter passphrase (empty for no passphrase): Пароль на ключ пустой!!! | ||
- | ... | ||
- | |||
- | node1# ssh-copy-id node2 | ||
- | </code> | ||
- | |||
- | Проверка: | ||
- | |||
- | <code> | ||
- | node1# | ||
- | scp /etc/hosts node2:/etc/ | ||
- | scp /etc/hostname node2:/etc/ | ||
- | scp /etc/network/interfaces node2:/etc/network/ | ||
- | |||
- | node1# ssh node2 route add default gw 192.168.X.254 | ||
- | |||
- | node1# ssh node2 apt update | ||
- | node1# ssh node2 apt install keepalived | ||
- | |||
- | scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/keepalived.conf | ||
- | scp /usr/local/bin/vrrp.sh node2:/usr/local/bin/vrrp.sh | ||
- | </code> | ||
- | |||
- | * Правим файлы конфигурации на node2, перезапускаем, тестируем сеть | ||
- | |||
- | <code> | ||
- | node1# ssh node2 | ||
- | |||
- | node2# cat /etc/hostname | ||
- | </code><code> | ||
- | node2.corp13.un | ||
- | </code><code> | ||
- | node2# cat /etc/network/interfaces | ||
- | </code><code> | ||
- | ... | ||
- | address 192.168.X.2 | ||
- | ... | ||
- | </code><code> | ||
- | node2# /etc/keepalived/keepalived.conf | ||
- | </code><code> | ||
- | ... | ||
- | state BACKUP | ||
- | ... | ||
- | </code><code> | ||
- | node2# init 6 | ||
- | </code> | ||
- | |||
- | === 2.3 Использование BASH алиасов и функций для удобства === | ||
- | |||
- | * [[Настройка командных интерпретаторов#bash]] алиасы и функции | ||
- | |||
- | <code> | ||
- | node1# scn2 /etc/sysctl.conf | ||
- | |||
- | node1# ssn2 sysctl -f | ||
- | </code> | ||
- | |||
- | === 2.4 Синхронизация с использованием пакета CSYNC2 === | ||
- | |||
- | **Сценарий:** настроить DNS на node1, на node2 конфигурация появится автоматически | ||
- | |||
- | * [[Финальная настройка DNS сервера]] (как это было на "ЛИН СЕРВ") | ||
- | * Устанавливаем и ЗАПУСКАЕМ на двух узлаx, настраиваем на node1 | ||
- | <code> | ||
- | node1# sh conf/dns.sh | ||
- | |||
- | node1# cat /etc/bind/corpX.un | ||
- | </code><code> | ||
- | $TTL 3h | ||
- | @ SOA ns root.ns 1 1d 12h 1w 3h | ||
- | NS ns | ||
- | |||
- | ns A 192.168.X.1 | ||
- | ns A 192.168.X.2 | ||
- | |||
- | ;node1 A 192.168.X.1 | ||
- | ;node2 A 192.168.X.2 | ||
- | $GENERATE 1-9 node$ A 192.168.X.$ | ||
- | |||
- | gate A 192.168.X.254 | ||
- | </code><code> | ||
- | node1# ssn2 apt install bind9 | ||
- | </code> | ||
- | |||
- | * [[Локализация системы#Локализация временной зоны]] | ||
- | * [[Пакет CSYNC2]] | ||
- | |||
- | <code> | ||
- | node1# csync2 -xv | ||
- | </code> | ||
- | <code> | ||
- | nodeN# cat /etc/resolv.conf | ||
- | </code><code> | ||
- | search corpX.un | ||
- | nameserver 192.168.X.1 | ||
- | nameserver 192.168.X.2 | ||
- | </code> | ||
- | <code> | ||
- | nodeN# host ns node1 | ||
- | nodeN# host ns node2 | ||
- | </code> | ||
- | === 2.5 Синхронизация с использованием пакета Ansible === | ||
- | |||
- | **Сценарий:** на обоих узлах создаем пользователя user1 с uid=10001 | ||
- | |||
- | **Примечание:** выполнить в 5-м модуле | ||
- | |||
- | * [[Сервис Ansible]] | ||
- | |||
- | ==== Вопросы ==== | ||
- | |||
- | - Команда ssh-copy-id копирует ... | ||
- | - Где располагается файл с публичными ключами пользователей ssh? | ||
- | - На каком узле будет сохранен файл в результате выполнения команды ssh node2 iptables-save > /etc/iptables.rules | ||
- | - Что определяет параметр конфигурации auto younger в пакете csync2 | ||
- | - Перечислите известные Вам варианты тиражирования файлов конфигурации в кластере? | ||
- | |||
- | ===== Модуль 3. Развертывание сервисов с интегрированной поддержкой отказоустойчивости ===== | ||
- | |||
- | ==== Теория ==== | ||
- | |||
- | * [[https://www.communigate.ru/CommuniGatePro/russian/Clusters.html|Кластеры Communigate Pro]] | ||
- | * man dhcpd.conf (DHCP FAILOVER) | ||
- | ==== Лабораторные работы ==== | ||
- | |||
- | === 3.1 Отказоустойчивый DHCP сервер === | ||
- | |||
- | * [[Сервис DHCP#Установка]] cервиса DHCP | ||
- | <code> | ||
- | node2# sh conf/dhcp.sh | ||
- | </code> | ||
- | |||
- | * [[Сервис DHCP#Отказоустойчивая конфигурация]] cервиса DHCP | ||
- | * [[Сервис DHCP#Проверка конфигурации и запуск]] cервиса DHCP | ||
- | * [[Сервис DHCP#Мониторинг выданных адресов]] cервиса DHCP | ||
- | |||
- | Примечание: в первый момент необходимо запустить оба сервера чтобы они синхронизировались. | ||
- | |||
- | === 3.2 Проверка === | ||
- | |||
- | * !!! Вместо тестирования отказоустойчивости выпольнить лабораторную работу 4.3.1 | ||
- | |||
- | <code> | ||
- | windows> ipconfig /release | ||
- | |||
- | windows> ipconfig /renew | ||
- | |||
- | windows> ipconfig /all | ||
- | |||
- | windows> ping ya.ru | ||
- | </code> | ||
- | |||
- | ==== Вопросы ==== | ||
- | |||
- | - Есть ли необходимость в использовании дополнительного ПО для реализации отказоустойчивой конфигурации пакета isc-dhcp? | ||
- | - Сколько узлов может быть в отказоустойчивой конфигурации isc-dhcp? | ||
- | - Какие условия необходимы на начальном этапе развертывания отказоустойчивой конфигурации isc-dhcp? | ||
- | - Какие преимущества отказоустойчивой конфигурации isc-dhcp перед двумя независимыми dhcp серверами? | ||
- | |||
- | ===== Модуль 4. Развертывание отказоустойчивого шлюза в Internet ===== | ||
- | |||
- | ==== Теория ==== | ||
- | |||
- | * [[https://ru.wikipedia.org/wiki/CARP|CARP]] | ||
- | * [[https://ru.wikipedia.org/wiki/VRRP|CARP]] | ||
- | * [[https://ru.wikipedia.org/wiki/Iproute2|Iproute2]] | ||
- | |||
- | ==== Лабораторные работы ==== | ||
- | |||
- | ==== 4.1 Отказоустойчивый gate ==== | ||
- | |||
- | * [[Протокол CARP]] | ||
- | * [[Сервис Keepalived]] | ||
- | |||
- | <code> | ||
- | windows> ping gate | ||
- | </code> | ||
- | ==== 4.2 Отказоустойчивый nat ==== | ||
- | |||
- | * Настроить NAT трансляцию для сети 192.168.X/24 в реальный адрес ISP ([[Сервис NAT]]) | ||
- | |||
- | * !!! Вместо тестирования отказоустойчивости выпольнить лабораторную работу 4.3.1 | ||
- | |||
- | ==== 4.3 Балансировка нагрузки и отказоустойчивость при использовании нескольких ISP ==== | ||
- | |||
- | === 4.3.1 Добавление сетевых карт для подключения к ISP2 === | ||
- | |||
- | <code> | ||
- | root@nodeN:~# cat /etc/network/interfaces | ||
- | </code><code> | ||
- | ... | ||
- | auto eth2 | ||
- | iface eth2 inet manual | ||
- | up ip link set eth2 up | ||
- | </code> | ||
- | |||
- | * [[Сервис Keepalived]] - добавляем eth2 | ||
- | * По очереди останавливаем узлы и добавляем Адаптер 3 - eth2 - Сетевой мост (ISP2) | ||
- | |||
- | <code> | ||
- | nodeN# ip a | grep eth2 | ||
- | </code> | ||
- | |||
- | === 4.3.2 Модификация настроек dns сервера === | ||
- | <code> | ||
- | node1# cat /etc/bind/named.conf | ||
- | </code><code> | ||
- | ... | ||
- | forwarders { | ||
- | 172.16.1.254; | ||
- | 172.16.2.254; | ||
- | }; | ||
- | ... | ||
- | </code><code> | ||
- | node1# csync2 -xv | ||
- | </code> | ||
- | |||
- | === 4.3.3 Тестирование ISP2 === | ||
- | |||
- | <code> | ||
- | node1# ip a | grep 172.16.2 | ||
- | |||
- | node1# ping 172.16.2.254 | ||
- | |||
- | node1# ip route del default | ||
- | node1# ip route add default via 172.16.2.254 | ||
- | |||
- | node1# ping ya.ru | ||
- | |||
- | node1# tracepath ya.ru | ||
- | |||
- | node1# ip route del default | ||
- | </code> | ||
- | |||
- | === 4.3.4 Использование PBR для балансировки нагрузки === | ||
- | |||
- | **Сценарий:** | ||
- | |||
- | * Всем настроить NAT на два ISP ([[Сервисы Gateway и routing#Использование iproute2 для управления выбором ISP]]), iptables-restore можно "привязать" к интерфейсу eth0 | ||
- | * Преподавателю продемонстрировать PBR в "ручном" режиме ([[Сервисы Gateway и routing#NetFilter iproute2 (Linux)]]) | ||
- | |||
- | |||
- | === 4.3.5 Автоматизация балансировки/отказоустойчивости выбора ISP === | ||
- | |||
- | * [[Сервис Keepalived]] - добавляем таблицы 101 и 102 | ||
- | |||
- | <code> | ||
- | node1# ip route show table 101 | ||
- | |||
- | node1# ip route show table 102 | ||
- | |||
- | nodeN# cat set_isp.sh | ||
- | </code><code> | ||
- | #!/bin/sh | ||
- | |||
- | case $1 in | ||
- | ISP1) | ||
- | ip rule del from 192.168/16 to 192.168/16 table main | ||
- | while ip rule del from any table 101;do true;done | ||
- | while ip rule del from any table 102;do true;done | ||
- | ip route delete default | ||
- | |||
- | ip rule add from 192.168.X.0/24 table 101 | ||
- | ip rule add from 192.168/16 to 192.168/16 table main | ||
- | |||
- | ip route add default via 172.16.1.254 | ||
- | |||
- | /sbin/ip route flush cache | ||
- | /usr/sbin/conntrack -F | ||
- | ;; | ||
- | ISP2) | ||
- | ip rule del from 192.168/16 to 192.168/16 table main | ||
- | while ip rule del from any table 101;do true;done | ||
- | while ip rule del from any table 102;do true;done | ||
- | ip route delete default | ||
- | |||
- | ip rule add from 192.168.X.0/24 table 102 | ||
- | ip rule add from 192.168/16 to 192.168/16 table main | ||
- | |||
- | ip route add default via 172.16.2.254 | ||
- | |||
- | /sbin/ip route flush cache | ||
- | /usr/sbin/conntrack -F | ||
- | ;; | ||
- | ISP1ISP2) | ||
- | ip rule del from 192.168/16 to 192.168/16 table main | ||
- | while ip rule del from any table 101;do true;done | ||
- | while ip rule del from any table 102;do true;done | ||
- | ip route delete default | ||
- | |||
- | ip rule add from 192.168.X.0/25 table 101 | ||
- | ip rule add from 192.168.X.128/25 table 102 | ||
- | ip rule add from 192.168/16 to 192.168/16 table main | ||
- | |||
- | ip route add default via 172.16.1.254 | ||
- | #ip route add default via 172.16.2.254 | ||
- | |||
- | /sbin/ip route flush cache | ||
- | /usr/sbin/conntrack -F | ||
- | ;; | ||
- | esac | ||
- | </code><code> | ||
- | nodeN# chmod +x set_isp.sh | ||
- | |||
- | node1# /root/set_isp.sh ISP1ISP2 | ||
- | |||
- | node1# ip rule show | ||
- | |||
- | node2# tracepath ya.ru | ||
- | |||
- | windows> tracert ya.ru | ||
- | |||
- | nodeN# cat select_isp.sh | ||
- | </code><code> | ||
- | #!/bin/sh | ||
- | |||
- | TESTIP=1.1.1.1 | ||
- | |||
- | ip a | grep -q '192.168.*254' || exit 0 | ||
- | |||
- | ISP='' | ||
- | |||
- | ip route del $TESTIP | ||
- | ip route add $TESTIP via 172.16.1.254 | ||
- | ping -c3 $TESTIP && ISP=ISP1 | ||
- | |||
- | ip route del $TESTIP | ||
- | ip route add $TESTIP via 172.16.2.254 | ||
- | ping -c3 $TESTIP && ISP=${ISP}ISP2 | ||
- | |||
- | ip route del $TESTIP | ||
- | |||
- | echo $ISP | ||
- | # exit 0 | ||
- | |||
- | touch /tmp/current_isp | ||
- | test $ISP = "`cat /tmp/current_isp`" && exit 0 | ||
- | |||
- | echo $ISP > /tmp/current_isp | ||
- | |||
- | /root/set_isp.sh $ISP | ||
- | |||
- | </code><code> | ||
- | nodeN# chmod +x select_isp.sh | ||
- | |||
- | node1# /root/select_isp.sh | ||
- | |||
- | node1# cat /tmp/current_isp | ||
- | |||
- | nodeN# crontab -l | ||
- | </code><code> | ||
- | * * * * * /root/select_isp.sh >/dev/null 2>&1 | ||
- | </code> | ||
- | <code> | ||
- | master_node# ip rule show | ||
- | </code> | ||
- | |||
- | ==== Вопросы ==== | ||
- | |||
- | - Перечислите протоколы отказоустойчивого шлюза. | ||
- | - Для какой операционной системы впервые появилась реализация протокола CARP? | ||
- | - Какая утилита из набора iproute2 позволяет назначить/удалить IP адрес на интерфейсе? | ||
- | - В чем отличие поведения мастер хоста от других в протоколе CARP/VRRP? | ||
- | - Поддерживает ли протокол CARP/VRRP отказоустойчивость соединений? | ||
- | - Поддерживает ли протокол CARP/VRRP балансировку нагрузки? | ||
- | - Что такое ucarp? | ||
- | - В каком пакете в Debian содержатся современные сетевые утилиты, пришедшие на смену классическим UNIX утилитам ifconfig, route, arp, netstat? | ||
- | - Какая утилита из набора iproute2 заменяет команду arp? | ||
- | - В какой пакет входит утилита send_arp в Debian, для чего нужна и какой вид трафика использует? | ||
- | - Какой командой можно очистить таблицу ARP в Linux? | ||
- | - В чем принцип работы механизма PBR? | ||
- | - Можно ли балансировать трафик одного соединения между двумя ISP при использовании NAT? | ||
- | - Необходим ли маршрут "по умолчанию" на шлюзе для прохождения пользовательского трафика? | ||
- | - Согласно какой таблице маршрутизации в Linux обрабатывается пакет, если для него нет правила, определяющего обработку в конкретной таблице? | ||
- | - Что следует сделать с текущими активными соединениями после изменения правил PBR? | ||
- | |||
- | ===== Модуль 5. Использование систем управления ресурсами кластера ===== | ||
- | |||
- | ==== Теория ==== | ||
- | |||
- | |||
- | * [[https://github.com/voxpupuli/puppet-corosync/issues/32|Corosync vs Pacemaker: wrong usage of "Corosync"]] | ||
- | * [[https://stackoverflow.com/questions/22502495/which-one-is-the-official-command-line-package-of-pacemaker-crmsh-or-pcs|which one is the official command line package of pacemaker? crmsh or pcs?]] | ||
- | * [[https://clusterlabs.org/pacemaker/doc/2.1/Pacemaker_Administration/html/pcs-crmsh.html|Quick Comparison of pcs and crm shell]] | ||
- | * [[https://clusterlabs.org/pacemaker/doc/|ClusterLabs Pacemaker Documentation]] | ||
- | |||
- | |||
- | |||
- | ==== Лабораторные работы ==== | ||
- | |||
- | Сценарий: отказоустойчивое ftp хранилище пользовательских файлов с web доступом | ||
- | |||
- | * Содержимое домашних каталогов мастер сервера периодически копируется на резервный. | ||
- | * В случае временной остановки или выхода из строя главного сервера автоматически становится доступным резервный. | ||
- | * Не преднамеренный запуск мастер сервера не должен менять ролей серверов. | ||
- | |||
- | ==== 5.1 Синхронизация каталогов ==== | ||
- | |||
- | === 5.1.1 Установка и запуск сервера Apache === | ||
- | |||
- | * В зону corpX.un добавляем запись www A 192.168.X.10 | ||
- | |||
- | <code> | ||
- | node1# cat /etc/bind/corpX.un | ||
- | </code><code> | ||
- | ... | ||
- | www A 192.168.X.10 | ||
- | </code><code> | ||
- | node1# csync2 -xv | ||
- | </code> | ||
- | |||
- | * На обоих узлах [[Сервис HTTP#Установка и запуск сервера Apache]] (можно через Ansible) | ||
- | * На обоих узлах создаем пользователя user1 с uid=10001 ([[Управление учетными записями в Linux]]) (можно через Ansible) | ||
- | * На обоих узлах включаем [[Сервис HTTP#Использование домашних каталогов]] (можно через Ansible) | ||
- | * Использование [[Сервис Ansible]] для автоматизации задач (финальные работы 8.1 и 8.2 выполнить утром 3-го дня) | ||
- | * Устанавливаем сервер ftp на node1 и запускаем его ([[Сервис FTP#Сервер ftp]]) | ||
- | * Создаем тестовую www страницу для пользователя user1 используя протокол ftp на node1 | ||
- | |||
- | <code> | ||
- | Проводник: ftp://node1 | ||
- | l: user1 | ||
- | p: password1 | ||
- | |||
- | Каталог: public_html | ||
- | |||
- | В Браузере: http://node1/~user1 | ||
- | </code> | ||
- | |||
- | === 5.1.2 Синхронизация пользовательских данных === | ||
- | |||
- | * [[Пакет RSYNC]] | ||
- | * Можно автоматизировать, ([[Планирование выполнения заданий в Linux]]), но, пока не нужно. | ||
- | ==== 5.2 Автоматизация смены ролей узлов кластера ==== | ||
- | |||
- | === 5.2.1 Установка и сервера FTP === | ||
- | |||
- | * Устанавливаем ftp сервис на node2 ([[Сервис FTP#Сервер ftp]]) | ||
- | * На обоих узлах отключаем автоматический запуск ftp сервиса ([[Управление сервисами в Linux]]) | ||
- | |||
- | <code> | ||
- | nodeN# service proftpd stop | ||
- | |||
- | nodeN# update-rc.d -f proftpd remove | ||
- | или | ||
- | debian11# systemctl disable proftpd | ||
- | </code> | ||
- | |||
- | === 5.2.2 Настройка менеджера кластера === | ||
- | |||
- | * [[Пакет HEARTBEAT]] (Демонстрирует преподаватель в методических целях) | ||
- | * [[Пакет Corosync]] | ||
- | * [[Пакет Pacemaker]] | ||
- | * [[Пакет PCS]] (сделать резервную копию /etc/corosync/corosync.conf) | ||
- | |||
- | <code> | ||
- | Проводник: ftp://www | ||
- | |||
- | В Браузере: http://www.corpX.un/~user1 | ||
- | </code> | ||
- | |||
- | === 5.2.3 Автоматическая синхронизация домашних каталогов === | ||
- | |||
- | * Настроить автоматическую синхронизацию домашних каталогов с мастер узла на резервный | ||
- | <code> | ||
- | node2# ssh-keygen | ||
- | |||
- | node2# ssh-copy-id node1 | ||
- | |||
- | nodeN# crontab -l | ||
- | </code><code> | ||
- | ... | ||
- | * * * * * ps ax | grep -v grep | grep -q 'proftpd: (accepting connections)' && /usr/bin/rsync -az --delete /home/ nodeM:/home/ | ||
- | </code> | ||
- | ==== Вопросы ==== | ||
- | |||
- | - В чем преимущество использования rsync по сравнению с scp? | ||
- | - Что определяют разделители : и :: в команде rsync? | ||
- | - Реализацией какой части классического пакета heartbeat является пакет pacemaker? | ||
- | - Какие задачи классического пакета heartbeat НЕ решает пакет corosync? | ||
- | - В каком формате хранятся файлы конфигурации пакета corosync? | ||
- | - В каком формате хранятся файлы конфигурации пакета pacemaker? | ||
- | - По какой причине не следует редактировать файлы конфигурации пакета pacemaker в текстовом редакторе? | ||
- | - Для чего используется утилита crm должна ли она быть установлена на все узлы кластера? | ||
- | - Для чего используется утилита crm_mon и есть ли она на всех узлах кластера? | ||
- | - Что надо настроить в пакете pacemaker, что бы все части, из которых состоит ресурс, запускались на одном узле кластера? | ||
- | - Какой тип трафика может использоваться для связи узлов кластера corosync? | ||
- | - Что нужно сделать для сервисов, управляемых менеджером кластера? | ||
- | |||
- | ===== Модуль 6. Развертывание отказоустойчивых файловых сервисов ===== | ||
- | |||
- | ==== Теория ==== | ||
- | |||
- | * [[https://ru.wikipedia.org/wiki/DRBD|Distributed Replicated Block Device]] | ||
- | * [[https://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D1%82%D1%8C_%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85|Сеть хранения данных (англ. Storage Area Network, SAN)]] | ||
- | * [[https://ru.wikipedia.org/wiki/NAS|Cервер для хранения данных (англ. Network Attached Storage, NAS)]] | ||
- | |||
- | ==== Лабораторные работы ==== | ||
- | |||
- | **Сценарий**: Создаем отказоустойчивый корпоративный файловый сервер. Первый узел кластера должен использоваться сервером по умолчанию. | ||
- | |||
- | ==== 6.1 Развертывание распределенного RAID 1 ===== | ||
- | |||
- | * Подключаем к обоим узлам по дополнительному диску | ||
- | * [[Решение DRBD]] | ||
- | |||
- | ==== 6.2 Автоматизация смены ролей узлов кластера ==== | ||
- | |||
- | * Pacemaker [[Пакет Pacemaker#Удаление ресурсов]] | ||
- | * [[Решение DRBD#DRBD и Pacemaker]] (оставить приклрепление к node1) или [[Сервис OCFS2]] | ||
- | |||
- | ==== 6.3 Настройка NAS сервера SMB/CIFS ==== | ||
- | |||
- | * В зону corpX.un добавляем запись fs A 192.168.X.20 | ||
- | |||
- | <code> | ||
- | node1# cat /etc/bind/corpX.un | ||
- | </code><code> | ||
- | ... | ||
- | fs A 192.168.X.20 | ||
- | </code><code> | ||
- | node1# csync2 -xv | ||
- | </code> | ||
- | |||
- | * Устанавливаем на оба узла (лучше, отдельно на каждом) пакет samba ([[Файловый сервер SAMBA]]) | ||
- | * Отключаем автоматический запуск сервиса | ||
- | |||
- | <code> | ||
- | root@nodeN:~# | ||
- | |||
- | service smbd stop | ||
- | service nmbd stop | ||
- | |||
- | systemctl disable smbd | ||
- | systemctl disable nmbd | ||
- | |||
- | |||
- | </code> | ||
- | |||
- | * Настраиваем на обоих узлах [[Файловый сервер SAMBA#Публичный каталог доступный на запись]] | ||
- | * Создаем каталог /disk2/samba на мастер узле | ||
- | * Настраиваем менеджер кластера на монтирование на мастер узле зеркалируемого раздела в каталог /disk2, назначение ip адреса 192.168.X.20 и запуск сервера samba | ||
- | |||
- | <code> | ||
- | node1# crm configure | ||
- | |||
- | crm(live)configure# primitive pr_srv_smbd systemd:smbd | ||
- | |||
- | crm(live)configure# primitive pr_ip_smbd ocf:heartbeat:IPaddr2 params ip=192.168.X.20 cidr_netmask=32 nic=eth0 | ||
- | |||
- | crm(live)configure# group gr_ip_fs pr_fs_r0 pr_ip_smbd pr_srv_smbd | ||
- | |||
- | или | ||
- | |||
- | crm(live)configure# group pr_fs_r0 pr_ip_smbd pr_srv_smbd | ||
- | |||
- | или | ||
- | |||
- | crm(live)configure# edit gr_ip_fs | ||
- | |||
- | crm(live)configure# commit | ||
- | </code> | ||
- | |||
- | === Тестирование === | ||
- | |||
- | <code> | ||
- | master# watch cat /proc/drbd | ||
- | |||
- | master# crm_mon | ||
- | </code> | ||
- | |||
- | * Останавливаем MASTER сервер и дожидаемся монтирования на SLAVE узле "половины" зеркалируемого раздела в каталог /disk2, назначение ip адреса 192.168.X.20 и запуск сервера samba | ||
- | * Запускаем бывший MASTER узел и дожидаемся восстановления целостности зеркала | ||
- | |||
- | * !!! (Лучше после демонстрации SplitBrain) Останавливаем группу ресурсов кластера и [[Пакет Pacemaker#Удаление ресурсов]] | ||
- | <code> | ||
- | master# crm resource stop pr_srv_smbd pr_ip_smbd | ||
- | |||
- | master# crm configure delete pr_srv_smbd pr_ip_smbd gr_ip_fs | ||
- | </code> | ||
- | |||
- | ==== Вопросы ==== | ||
- | |||
- | - Какое решение можно использовать для блочной синхронизации дисковых устройств по сети? | ||
- | - При каком условии можно монтировать распределенное блочное хранилище на запись сразу на нескольких, содержащих его узлах? | ||
- | - Что определяет параметр wfc-timeout в пакете DRBD? | ||
- | - В каком состоянии будет DRBD RAID1 если узлы, входящие в него, в разное время поработали, независимо друг от друга, с разделом, в течение времени превышающем wfc-timeout? | ||
- | - Чем отличаются системы NAS и SAN | ||
- | - В чем фундаментальное отличие протоколов CIFS и iSCSI? | ||
- | |||
- | ===== Модуль 7. Развертывание контейнеров в отказоустойчивой конфигурации ===== | ||
- | |||
- | ==== Теория ==== | ||
- | |||
- | * [[https://ru.wikipedia.org/wiki/LXC|Linux Containers]] | ||
- | * [[https://www.thomas-krenn.com/en/wiki/HA_Cluster_with_Linux_Containers_based_on_Heartbeat,_Pacemaker,_DRBD_and_LXC|HA Cluster with Linux Containers based on Heartbeat, Pacemaker, DRBD and LXC]] | ||
- | |||
- | ==== Лабораторные работы ==== | ||
- | |||
- | ==== 7.1 Linux Containers в зеркалируемом разделе ==== | ||
- | |||
- | * В зону corpX.un добавляем запись server1 A 192.168.X.31 | ||
- | |||
- | <code> | ||
- | node1# cat /etc/bind/corpX.un | ||
- | </code><code> | ||
- | ... | ||
- | server1 A 192.168.X.31 | ||
- | server2 A 192.168.X.32 | ||
- | @ MX 10 server1 | ||
- | </code><code> | ||
- | node1# csync2 -xv | ||
- | </code> | ||
- | |||
- | |||
- | === 7.1.1 Настройка bridge на узлах и сервисах === | ||
- | |||
- | * [[Технология LXC#Подготовка сети]] для LXC на одной системе | ||
- | |||
- | <code> | ||
- | nodeN# apt install bridge-utils | ||
- | |||
- | nodeN# cat /etc/network/interfaces | ||
- | </code><code> | ||
- | ... | ||
- | auto br0 | ||
- | iface br0 inet static | ||
- | |||
- | bridge_ports eth0 | ||
- | #bridge_hw 08:00:27:12:34:0N #if generate same mac on nodes (Debian11) | ||
- | |||
- | address 192.168.X.N | ||
- | ... | ||
- | | ||
- | </code> | ||
- | |||
- | * [[Сервис Keepalived]] и bridge | ||
- | * Сервис DHCP и bridge | ||
- | |||
- | <code> | ||
- | nodeN# cat /etc/default/isc-dhcp-server | ||
- | </code><code> | ||
- | ... | ||
- | INTERFACESv4="br0" | ||
- | </code><code> | ||
- | nodeN# init 0 | ||
- | </code> | ||
- | |||
- | * Для режима bridge в lxc понадобиться включить "неразборчивый режим" первом адаптере обеих виртуальных машин | ||
- | * Проверки после запуска | ||
- | |||
- | <code> | ||
- | nodeN# ip a | ||
- | |||
- | node1# mount | egrep 'ext|ocfs' | ||
- | |||
- | nodeN# cat /proc/drbd | ||
- | </code> | ||
- | |||
- | * Может понадобиться [[Решение DRBD#Решение ситуации Split-Brain]] или, в нашем случае [[Решение DRBD#Решение ситуации Split-Brain при использовании Pacemaker]] | ||
- | |||
- | === 7.1.2 Подготовка виртуальных машин === | ||
- | |||
- | * [[Технология LXC#Установка и настройка lxc]] на обоих узлах | ||
- | * Готовимся все, относящееся к виртуальным системам, хранить на зеркалируемом разделе | ||
- | |||
- | <code> | ||
- | root@nodeN:~# rmdir /var/lib/lxc/ | ||
- | |||
- | root@nodeN:~# ln -s /disk2/var/lib/lxc/ /var/lib/lxc | ||
- | </code> | ||
- | |||
- | * Создание ветки дочерней системы/шаблона | ||
- | | ||
- | <code> | ||
- | root@node1.corpX.un:~# mkdir -p /disk2/var/lib/lxc/ | ||
- | |||
- | root@node1.corpX.un:~# lxc-create -t download -n server-template -- --no-validate -d ubuntu -r focal -a amd64 | ||
- | </code> | ||
- | |||
- | * Установка ПО в дочерней системе/шаблоне | ||
- | |||
- | <code> | ||
- | root@node1.corpX.un:~# chroot /var/lib/lxc/server-template/rootfs/ /bin/bash | ||
- | |||
- | root@node1:/# PS1='server-template:\w# ' | ||
- | |||
- | server-template:/# apt update | ||
- | |||
- | server-template:/# apt purge netplan.io | ||
- | |||
- | server-template:/# apt install nano ssh | ||
- | </code> | ||
- | |||
- | * !!! Методическая рекомендация - запустить процесс установки Ceph (лабораторная работа 8.3) | ||
- | |||
- | * Настраиваем hostname, hosts, DNS client и учетную запись root в гостевой системе/шаблоне | ||
- | |||
- | <code> | ||
- | server:/# cat /etc/hostname | ||
- | </code><code> | ||
- | server-template.corpX.un | ||
- | </code><code> | ||
- | server-template:/# cat /etc/hosts | ||
- | </code><code> | ||
- | 127.0.0.1 localhost | ||
- | |||
- | 192.168.X.30 server-template.corpX.un server-template | ||
- | </code><code> | ||
- | server-template:/# cat /etc/systemd/resolved.conf | ||
- | </code><code> | ||
- | [Resolve] | ||
- | DNS=192.168.X.1 192.168.X.2 | ||
- | </code><code> | ||
- | server-template:/# passwd ubuntu | ||
- | </code> | ||
- | Ctrl-D | ||
- | |||
- | * Настраиваем lxc для запуска гостевой системы/шаблона в контейнере | ||
- | |||
- | <code> | ||
- | root@node1.corpX.un:~# cat /var/lib/lxc/server-template/config | ||
- | </code><code> | ||
- | ... | ||
- | lxc.rootfs.path = dir:/var/lib/lxc/server-template/rootfs | ||
- | lxc.uts.name = server-template | ||
- | ... | ||
- | lxc.net.0.type = veth | ||
- | lxc.net.0.link = br0 | ||
- | lxc.net.0.flags = up | ||
- | lxc.net.0.ipv4.address = 192.168.X.30/24 | ||
- | lxc.net.0.ipv4.gateway = 192.168.X.254 | ||
- | </code> | ||
- | |||
- | * Создание системы из шаблона | ||
- | |||
- | <code> | ||
- | root@node1.corpX.un:~# | ||
- | |||
- | SRC_CONTAINER=server-template | ||
- | DST_CONTAINER=server1 | ||
- | |||
- | SRC_IP=192.168.X.30 | ||
- | DST_IP=192.168.X.31 | ||
- | |||
- | time cp -rp /var/lib/lxc/$SRC_CONTAINER/ /var/lib/lxc/$DST_CONTAINER/ | ||
- | |||
- | find /var/lib/lxc/$DST_CONTAINER/rootfs/etc/ -type f -exec sed -i'' -e "s/$SRC_CONTAINER/$DST_CONTAINER/" -e "s/$SRC_IP/$DST_IP/" {} \; | ||
- | |||
- | sed -i'' -e "s/$SRC_CONTAINER/$DST_CONTAINER/" -e "s/$SRC_IP/$DST_IP/" /var/lib/lxc/$DST_CONTAINER/config | ||
- | |||
- | </code> | ||
- | |||
- | * Тестируем работу виртуальной системе на MASTER узле | ||
- | |||
- | <code> | ||
- | root@node1.corpX.un:~# lxc-info -n server1 | ||
- | |||
- | root@node1.corpX.un:~# systemctl start lxc@server1 | ||
- | |||
- | root@node1.corpX.un:~# ssh ubuntu@server1 | ||
- | |||
- | root@node1.corpX.un:~# systemctl stop lxc@server1 | ||
- | </code> | ||
- | |||
- | ==== 7.2 Интеграция контейнеров с менеджером кластера ==== | ||
- | |||
- | === Pacemaker === | ||
- | |||
- | <code> | ||
- | primitive pr_lxc_server1 systemd:lxc@server1 meta resource-stickiness=100 | ||
- | |||
- | group gr_fs_lxc pr_fs_r0 pr_lxc_server1 | ||
- | </code> | ||
- | |||
- | ==== Настройка виртуальной системы как сервер электронной почты и тестирование отказоустойчивости ==== | ||
- | |||
- | * [[Сервис SSH#PuTTY]] | ||
- | |||
- | <code> | ||
- | server1$ sudo -i | ||
- | |||
- | server1# apt install ansible git | ||
- | </code> | ||
- | |||
- | * Сервис Git [[Сервис Git#Клонирование и обновление локального репозитория из сетевого]] | ||
- | |||
- | <code> | ||
- | server1# ansible-playbook conf/ansible/roles/mail.yml | ||
- | </code> | ||
- | |||
- | |||
- | * Roundcube http://server1.corpX.un/mail | ||
- | * [[Thunderbird]] | ||
- | |||
- | <code> | ||
- | node1# crm resource move gr_fs_lxc node2 | ||
- | </code> | ||
- | ==== Вопросы ==== | ||
- | |||
- | - Что лучше, контейнерная виртуализация или аппаратная? | ||
- | |||
- | ===== Модуль 8. Распределенное отказоустойчивое хранилище Ceph ===== | ||
- | |||
- | - Настройка IP на node3-7, [[Сервис Ansible#Настройка групп управляемых систем]], [[Сервис Ansible#Настройка транспорта ssh]] и [[Сервис Ansible#Использование модулей]] Ansible для тестирования связи с ними | ||
- | - [[Сервис Ansible#Использование ролей]] Ansible для настройки файлов конфигурации сети на node3-7 | ||
- | - [[Сервис Ansible#Использование модулей]] Ansible для инсталляции Ceph на node3-7 | ||
- | - [[Ceph - просто добавь узлов!#Шаг 2. Установка и настройка Ceph]] сразу добавить 6-й узел как OSD | ||
- | - [[Сервис iSCSI#iSCSI initiator]] | ||
- | - [[Сервис multipath]] | ||
- | |||
- | ===== Модуль 9. Кластерная файловая система OCFS2 ===== | ||
- | |||
- | * [[Сервис OCFS2]] | ||
- | |||
- | ===== Модуль 10. Система визуализации KVM ===== | ||
- | |||
- | * Методическая рекомендация - выключить win10 clientN (конфликт имен и путаница с ip адресами) | ||
- | * [[Технология KVM]] | ||
- | |||
- | ===== Модуль 11. Тестирование отказоустойчивости ===== | ||
- | |||
- | - Переместить все ресурсы на node1, обесточить его и убедиться что все ресурсы (winxp1 и server1) запустились на node2 (на winxp1 может начаться проверка диска) | ||
- | - Остановить/запустить node2 (рекомендуется сперва корректно остановить winxp1), убедиться что все ресурсы (winxp1 и server1) запускается | ||
- | - Выяснить, через какой узел подключается [[Сервис multipath]] на node2 по iSCSI к RBD Ceph | ||
- | - Выполнить для этого узла [[Распределенное отказоустойчивое хранилище Ceph - просто добавь узлов!#Шаг 4. Сценарий - авария узла]] | ||
- | |||
- | |||