Содержание

Отказоустойчивость IP

Обеспечение общего IP-адреса между однотипными узлами кластера.

ucarp

Ucarp — свободная реализация протокола CARP, который позволяет нескольким серверам иметь дополнительный одинаковый ip-адрес из одной подсети. В конкретный момент времени адрес может быть активен только на одном сервере.

apt-get install ucarp

Сервер 1:

/etc/network/interfaces
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:

/etc/network/interfaces
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

Простейший отказоустойчивый балансировщик layer 4

Другие варианты

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 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: 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ех нодах создать конфиг ресурса

/etc/drbd.d/r0.res
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

Надежное хранилище с DRBD9 и Proxmox (Часть 1: NFS)
Надежное хранилище с DRBD9 и Proxmox (Часть 2: iSCSI+LVM)
Разворачиваем хранилище LINSTOR для Proxmox

Linstor

Контроллер можно ставить на один сервер с сателлитом. Клиент ставится на один сервер с контроллером.

# Контроллер + сателлит + клиент
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   ┊     01000/dev/drbd1000 ┊   125 KiB ┊ Unused ┊ Inconsistent ┊
┊ gitlab-runner ┊ test1    ┊ drbd_test   ┊     01000/dev/drbd1000 ┊   125 KiB ┊ Unused ┊ Inconsistent ┊
┊ gitlab-server ┊ test1    ┊ drbd_test   ┊     01000/dev/drbd1000 ┊   125 KiB ┊ Unused ┊ Inconsistent ┊
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

Highly Available Storage made easy with DRBD from LINBIT
LINSTOR — это как Kubernetes, но для блочных устройств
Траблшутинг 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
DRBD Pacemaker HA Cluster