Содержание
Отказоустойчивость 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
Другие варианты
- 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 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
- 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 ┊ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
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