===== Отказоустойчивость IP =====
Обеспечение общего IP-адреса между однотипными узлами кластера.
==== ucarp ====
[[https://github.com/jedisct1/UCarp|Ucarp]] — свободная реализация протокола CARP, который позволяет нескольким серверам иметь дополнительный одинаковый ip-адрес из одной подсети. В конкретный момент времени адрес может быть активен только на одном сервере.
apt-get install ucarp
Сервер 1:
iface lo inet loopback
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.0.1
netmask 255.255.255.0
gateway 192.168.0.254
ucarp-vid 1
ucarp-vip 192.168.0.3
ucarp-password password
iface eth0:ucarp inet static
address 192.168.0.3
netmask 255.255.255.0
Сервер 2:
iface lo inet loopback
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.0.2
netmask 255.255.255.0
gateway 192.168.0.254
ucarp-vid 1
ucarp-vip 192.168.0.3
ucarp-password password
iface eth0:ucarp inet static
address 192.168.0.3
netmask 255.255.255.0
[[https://blog.bissquit.com/unix/debian/prostejshij-otkazoustojchivyj-balansirovshhik-layer-4/|Простейший отказоустойчивый балансировщик layer 4]]
==== Другие варианты ====
* [[https://clusterlabs.org/|corosync2/pacemaker]]
* [[https://www.keepalived.org/|keepalived]]
* [[http://www.linuxvirtualserver.org/|LVS]] (модуль ядра Linux ipvs).
===== Pacemaker =====
https://clusterlabs.org/pacemaker/doc/\\
If you're new to Pacemaker or clustering in general, the best place to start is **Clusters from Scratch,** which walks you step-by-step through the installation and configuration of a high-availability cluster with Pacemaker. It even makes common configuration mistakes so that it can demonstrate how to fix them.
On the other hand, if you're looking for an exhaustive reference of all of Pacemaker's options and features, try **Pacemaker Explained.** It's dry, but should have the answers you're looking for.
There is also a [[https://wiki.clusterlabs.org/wiki/Main_Page|project wiki]] with examples, how-to guides, and other information that doesn't make it into the manuals.
===== DRBD =====
https://linbit.com/drbd-user-guide/drbd-guide-9_0-en
> В интернете также можно найти кучу статей, где люди ошибочно советуют запускать DRBD в режиме dual-primary и поверх него настроить кластерную файловую систему. Это наихудший вариант, потому что получается двунаправленная синхронизация, и в случае каких-либо проблем вы рискуете получить неразрешимый split-brain с гарантированной потерей данных. Никогда не используйте опцию allow-two-primaries в DRBD для чего-либо, кроме live-миграции виртуальных машин.
В Ubuntu 22.04 версия DRBD 8-я, чтобы поставить 9-ю, надо заменить модуль ядра.\\
Distribution Supplied Packages: [[https://linbit.com/drbd-user-guide/drbd-guide-9_0-en/#s-install-pkgs-ubuntu_linux|Ubuntu Linux]]
# Проверка версии встроенного модуля
modinfo -F version drbd
8.4.11
# Установка модуля ядра и утилит управления
add-apt-repository ppa:linbit/linbit-drbd9-stack
apt update
apt install drbd-dkms drbd-utils -y
# Проверка версии после установки
dkms status
drbd/9.2.4-1ppa1~jammy1, 5.15.0-78-generic, x86_64: installed
# На вcех нодах выключить сбор и отправку статистики
sed -i 's/usage-count yes/usage-count no/' /etc/drbd.d/global_common.conf
На вcех нодах создать конфиг ресурса
resource "r0" {
device minor 1;
disk "/dev/sdb";
meta-disk internal;
on "gitlab-server" {
address 192.168.1.9:7789;
node-id 0;
}
on "gitlab-runner" {
address 192.168.1.7:7789;
node-id 1;
}
on "deploy-server" {
address 192.168.1.8:7789;
node-id 2;
}
connection-mesh {
hosts gitlab-server gitlab-runner deploy-server;
}
}
# На всех нодах создать блочное drbd-устройство на основе конфига
drbdadm create-md r0
initializing activity log
initializing bitmap (64 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
# На всех нодах запустить drbd-устройство
drbdadm up r0
# Статус - все вторичные
drbdadm status
r0 role:Secondary
disk:Inconsistent
deploy-server role:Secondary
peer-disk:Inconsistent
gitlab-runner role:Secondary
peer-disk:Inconsistent
# Список блочных устройств: появилось sdb/drbd1 (1 - это в конфиге "device minor")
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 63.3M 1 loop /snap/core20/1822
loop1 7:1 0 63.4M 1 loop /snap/core20/1974
loop2 7:2 0 111.9M 1 loop /snap/lxd/24322
loop3 7:3 0 53.3M 1 loop /snap/snapd/19457
loop4 7:4 0 49.8M 1 loop /snap/snapd/18357
sda 8:0 0 127G 0 disk
├─sda1 8:1 0 1G 0 part /boot/efi
├─sda2 8:2 0 2G 0 part /boot
└─sda3 8:3 0 123.9G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 123.9G 0 lvm /
sdb 8:16 0 1G 0 disk
└─drbd1 147:1 0 1023.9M 0 disk
sr0 11:0 1 1024M 0 rom
# Сделать один из серверов первичным (или не делать, а просто смонтировать /dev/drbd1)
drbdadm primary --force r0
# Статус - вторичные начали синхронизацию
drbdadm status
r0 role:Primary
disk:UpToDate
deploy-server role:Secondary congested:yes ap-in-flight:0 rs-in-flight:8192
replication:SyncSource peer-disk:Inconsistent done:67.39
gitlab-runner role:Secondary congested:yes ap-in-flight:0 rs-in-flight:6144
replication:SyncSource peer-disk:Inconsistent done:67.29
# Создать файловую систему на первичном сервере (окончания синхронизации можно не ждать)
mkfs.ext4 /dev/drbd1
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 262119 4k blocks and 65536 inodes
Filesystem UUID: 659cdd2a-fedc-42a0-8d44-6895a92700c5
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
# Статус
drbdadm status
r0 role:Primary
disk:UpToDate
deploy-server role:Secondary
peer-disk:UpToDate
gitlab-runner role:Secondary
peer-disk:UpToDate
# Проверка - на первичном сервере смонтировать диск и создать файл, размонтировать
mkdir /drbd
mount /dev/drbd1 /drbd
echo "Hello, it should work" > /drbd/file.txt
umount /drbd
# Проверка на остальных серверах
mkdir /drbd
mount /dev/drbd1 /drbd
cat /drbd/file.txt
umount /drbd
[[https://habr.com/ru/articles/417473/|Надежное хранилище с DRBD9 и Proxmox (Часть 1: NFS)]]\\
[[https://habr.com/ru/articles/417597/|Надежное хранилище с DRBD9 и Proxmox (Часть 2: iSCSI+LVM)]]\\
[[https://habr.com/ru/articles/423101/|Разворачиваем хранилище LINSTOR для Proxmox]]\\
==== Linstor ====
* linstor-controller - распределяет конфигурации по узлам, порты 3370 и 3376.
* linstor-satellite - применяет конфигурацию на узле (устанавливается на каждый сервер drbd), порт 3366.
* linstor-client - клиентская часть, общается с контроллером, применяя через него конфигурации.
Контроллер можно ставить на один сервер с сателлитом. Клиент ставится на один сервер с контроллером.
# Контроллер + сателлит + клиент
apt install linstor-controller linstor-satellite linstor-client
systemctl start linstor-controller
systemctl enable linstor-controller
# Сателлит
apt install linstor-satellite
systemctl start linstor-satellite
systemctl enable linstor-satellite
# Добавление нод в кластер
linstor node create --node-type combined gitlab-server 192.168.1.9
linstor node create --node-type satellite gitlab-runner 192.168.1.7
linstor node create --node-type satellite deploy-server 192.168.1.8
linstor node list
╭───────────────────────────────────────────────────────────────╮
┊ Node ┊ NodeType ┊ Addresses ┊ State ┊
╞═══════════════════════════════════════════════════════════════╡
┊ deploy-server ┊ SATELLITE ┊ 192.168.1.8:3366 (PLAIN) ┊ Online ┊
┊ gitlab-runner ┊ SATELLITE ┊ 192.168.1.7:3366 (PLAIN) ┊ Online ┊
┊ gitlab-server ┊ COMBINED ┊ 192.168.1.9:3366 (PLAIN) ┊ Online ┊
╰───────────────────────────────────────────────────────────────╯
# Создание LVM
pvcreate /dev/sdb
vgcreate drbd_test /dev/sdb
lvcreate -L 1000M -T drbd_test/thin_pool
Thin pool volume with chunk size 64.00 KiB can address at most 15.81 TiB of data.
Logical volume "thin_pool" created.
# Пул
linstor storage-pool create lvmthin gitlab-server drbd_test drbd_test/thin_pool
linstor storage-pool create lvmthin gitlab-runner drbd_test drbd_test/thin_pool
linstor storage-pool create lvmthin deploy-server drbd_test drbd_test/thin_pool
linstor storage-pool list
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
┊ StoragePool ┊ Node ┊ Driver ┊ PoolName ┊ FreeCapacity ┊ TotalCapacity ┊ CanSnapshots ┊ State ┊ SharedName ┊
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡
┊ DfltDisklessStorPool ┊ deploy-server ┊ DISKLESS ┊ ┊ ┊ ┊ False ┊ Ok ┊ deploy-server;DfltDisklessStorPool ┊
┊ DfltDisklessStorPool ┊ gitlab-runner ┊ DISKLESS ┊ ┊ ┊ ┊ False ┊ Ok ┊ gitlab-runner;DfltDisklessStorPool ┊
┊ DfltDisklessStorPool ┊ gitlab-server ┊ DISKLESS ┊ ┊ ┊ ┊ False ┊ Ok ┊ gitlab-server;DfltDisklessStorPool ┊
┊ drbd_test ┊ deploy-server ┊ LVM_THIN ┊ drbd_test/thin_pool ┊ 1000 MiB ┊ 1000 MiB ┊ True ┊ Ok ┊ deploy-server;drbd_test ┊
┊ drbd_test ┊ gitlab-runner ┊ LVM_THIN ┊ drbd_test/thin_pool ┊ 1000 MiB ┊ 1000 MiB ┊ True ┊ Ok ┊ gitlab-runner;drbd_test ┊
┊ drbd_test ┊ gitlab-server ┊ LVM_THIN ┊ drbd_test/thin_pool ┊ 1000 MiB ┊ 1000 MiB ┊ True ┊ Ok ┊ gitlab-server;drbd_test ┊
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
# Определение ресурса
linstor resource-definition create test1 --port 7070
linstor resource-definition list -r test1
╭─────────────────────────────────────────────╮
┊ ResourceName ┊ Port ┊ ResourceGroup ┊ State ┊
╞═════════════════════════════════════════════╡
┊ test1 ┊ 7070 ┊ DfltRscGrp ┊ ok ┊
╰─────────────────────────────────────────────╯
# Определение тома
linstor volume-definition create test1 200M --storage-pool drbd_test
# Создание ресурса
linstor resource create test1 --auto-place 3
# Статус
linstor resource list
╭───────────────────────────────────────────────────────────────────────────────────────────╮
┊ ResourceName ┊ Node ┊ Port ┊ Usage ┊ Conns ┊ State ┊ CreatedOn ┊
╞═══════════════════════════════════════════════════════════════════════════════════════════╡
┊ test1 ┊ deploy-server ┊ 7070 ┊ Unused ┊ Ok ┊ Inconsistent ┊ 2023-07-30 17:47:05 ┊
┊ test1 ┊ gitlab-runner ┊ 7070 ┊ Unused ┊ Ok ┊ Inconsistent ┊ 2023-07-30 17:47:05 ┊
┊ test1 ┊ gitlab-server ┊ 7070 ┊ Unused ┊ Ok ┊ Inconsistent ┊ 2023-07-30 17:47:06 ┊
╰───────────────────────────────────────────────────────────────────────────────────────────╯
linstor volume list
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
┊ Node ┊ Resource ┊ StoragePool ┊ VolNr ┊ MinorNr ┊ DeviceName ┊ Allocated ┊ InUse ┊ State ┊
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════════╡
┊ deploy-server ┊ test1 ┊ drbd_test ┊ 0 ┊ 1000 ┊ /dev/drbd1000 ┊ 125 KiB ┊ Unused ┊ Inconsistent ┊
┊ gitlab-runner ┊ test1 ┊ drbd_test ┊ 0 ┊ 1000 ┊ /dev/drbd1000 ┊ 125 KiB ┊ Unused ┊ Inconsistent ┊
┊ gitlab-server ┊ test1 ┊ drbd_test ┊ 0 ┊ 1000 ┊ /dev/drbd1000 ┊ 125 KiB ┊ Unused ┊ Inconsistent ┊
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
[[https://www.youtube.com/watch?v=5LUw_B10FJ8&list=PLtGnc4I6s8dtam3Y2YFdfQgaPdJcqHxS7&index=8&pp=iAQB|Highly Available Storage made easy with DRBD from LINBIT]]\\
[[https://habr.com/ru/companies/flant/articles/680286/|LINSTOR — это как Kubernetes, но для блочных устройств]]\\
[[https://habr.com/ru/articles/531344/|Траблшутинг DRBD9 в LINSTOR]]
===== Отказоустойчивость файловых ресурсов =====
[[https://social.technet.microsoft.com/Forums/windowsserver/en-US/9ddc9513-861c-485c-b299-6d849f6bf161/best-design-for-file-services-high-availability?forum=winserverClustering]]\\
[[https://www.unitrends.com/blog/sofs-help-hyper-v]]\\
[[https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/hh831349(v=ws.11)?redirectedfrom=MSDN]]\\
[[https://www.theurbanpenguin.com/category/linux/drbd/|DRBD Pacemaker HA Cluster]]\\