Задача:
Настроить кластер DRBD из двух нод
Дано:
NODE1 CentOS7
NODE2 CentOS7
DRBD 9
Диск для репликации sdb1
Решение:
Установка пакета DRBD9
Подключаем репозиторий
| 1 2 3 4 | rpm -ivh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org | 
Устанавливаем пакет
| 1 2 3 | yum install drbd90-utils kmod-drbd90 | 
Добавляем в автозагрузку модуль ядра
| 1 2 3 4 | echo drbd > /etc/modules-load.d/drbd.conf modprobe drbd | 
Проверяем, все ли подгрузилось
| 1 2 3 4 5 6 7 | lsmod | grep -i drbd drbd_transport_tcp 22144 1 drbd 553913 2  drbd_transport_tcplibcrc32c 12644 1 drbd | 
Настройка
Настройка файла hosts
Необходимо в файл /etc/hosts добавить имена нод, если они не могут выть определены с основного ДНС сервера
| 1 2 3 4 5 6 7 | 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 10.10.0.1           drbd01 10.10.0.2           drbd02 | 
Создание файла ресурсов с именем /etc/drbd.d/data.res
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | resource data { protocol C;           device /dev/drbd0;      disk /dev/sdb1;      meta-disk internal; on node1 {           address 10.10.0.1:7788;          } on node2 {           address 10.10.0.2:7788;          } } | 
Инициализация и запуск ресурса (по сути создание метаданных)
Данную процедуру выполняем на обоих нодах
| 1 2 3 | drbdadm create-md data | 
Если возникает ошибка
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | Device size would be truncated, which would corrupt data and result in 'access beyond end of device' errors. You need to either    * use external meta data (recommended)    * shrink that filesystem first    * zero out the device (destroy the filesystem) Operation refused. Command 'drbdmeta 0 v09 /dev/sdb1 internal create-md 1' terminated with exit code 40 | 
То необходимо удалить остаточные данные, например, ранее диск был отформатирован под ext4 или использовался в массиве RAID
| 1 2 3 | dd if=/dev/zero of=/dev/sdb1 bs=1024k count=1024 | 
После этого можно повторно инициализировать ресурс командой drbdadm create-md
Назначаем первичную ноду и поднимаем ее. Выполняется на первичной ноде
| 1 2 3 4 5 6 7 8 9 | drbdadm primary --force data drbdadm status data data role:Secondary   disk:UpToDate   drbd01 role:Primary     peer-disk:UpToDate | 
Примечание
Файл /proc/drbd
В 9 версии нет информации в традиционном файле /proc/drbd
| 1 2 3 4 5 6 7 | cat /proc/drbd version: 9.0.16-1 (api:2/proto:86-114) GIT-hash: ab9777dfeaf9d619acc9a5201bfcae8103e9529c build by mockbuild@, 2018-11-03 13:54:24 Transports (api:16): tcp (9.0.16-1) | 
Информацию можно получить по следующему пути
| 1 2 3 4 | watch cat /sys/kernel/debug/drbd/resources/data/connections/node02/0/proc_drbd drbdadm status data | 
Устранение ошибки split-brain
Ошибка может возникать в случае одновременного отключения хостов и даже кратковременной потери соединения. Первое, что необходимо, определить ноду с наиболее актуальными данными (по времени загрузки, по системе мониторинга или каким то иным способом)
На сервере 1 переводим ресурс data в состояние secondary и подключаем к data с параметром –discard-my-data,
| 1 2 3 4 | drbdadm secondary data drbdadm -- --discard-my-data connect data | 
Если выходит следующее сообщение
| 1 2 3 4 | Failure: (125) Device has a net-config (use disconnect first) Command 'drbdsetup 0 net 10.10.0.1:7789 10.10.0.2:7789 C --set-defaults --create-device --allow-two-primaries --discard-my-data' terminated with exit code 10 | 
Отключаем data и повторяем операцию.
| 1 2 3 4 | drbdadm disconnect data drbdadm -- --discard-my-data connect data | 
На втором сервере запускаем
| 1 2 3 | drbdadm connect data | 
Проверяем состояние, в случае если данные не синхронизированы начнется синхронизация разделов.
| 1 2 3 | drbdadm status data | 
Теория
Основной файл конфигурации
minor-count — По умолчанию модуль DRBD загружается с minorcount 32, если используется много устройств и номеров не хватает их можно явно указать здесь;
dialog-refresh — Обновление экрана каждые n секунд, может быть полезно при подключение к серверу по последовательному интерфейсу;
disable-ip-verifi cation — Позволяет отключить одну из проверок drbdadm;
usage-count — Участвовать в глобальном подсчете пользователей DRBD или нет;
common {…} — Секция, опции которой наследуют все ресурсы;
syncer — Позволяет задать пропускную способность при синхронизации устройств по сети, разработчики рекомендуют использовать 30% от возможностей сети. Например, если у вас 100 Мбит сеть, то 100 * 0.3 = 30 Мб;
resource data {…} — Секция описания ресурса;
protocol — Задает протокол для DRBD, подробнее о них написано далее;
handlers {…} — Задает обработчики, например что делать в случае потери соединения первичной ноды;
startup {…} — Секция для опций используемых в процессе загрузки DRBD;
wfc-timeout — Ожидание таймаута соединения;
degr-wfc-timeout — Ожидание таймаута подключения, в случае если в кластере одна рабочая нода;
wait-after-sb — Ожидание после split brain, ситуация когда все ноды могут попытаться запустить сервис одновременно, думая что другие ноды недоступны. В свою очередь это может повлечь за собой повреждение данных;
disk {…} — Секция с настройками оповещения верхних уровней, если замечено, что происходят I/O ошибки при обращение к диску;
on-io-error detach — Нода перестает работать с носителем данных если на нем происходят I/O ошибки;
fencing — Процесс блокировки ресурсов с нод статус которых сомнителен;
net {…} — Секция задает различные опции сети, такие как размеры буфера, максимальное число запросов обрабатываемых DRBD. В обычных ситуациях значений по умолчанию достаточно;
on host {…} — Секция описания нод;
device — Указывает на устройство DRBD, они расположены в /dev/ и начинаются с 0;
disk — Физический диск или раздел, который будет задействован в работе DRBD;
address — IP-адрес и порт этой ноды, нужно указывать именно ее IP-адрес а не shared IP;
meta-disk — Meta данные могут храниться на отдельном разделе диске а могут на диске описанном в опции disk;
max-buffers — Число буферов используемых для хранения данных, пока те записываются на диск;
max-epoch-size — Максимальное число запросов на запись. Должно соответствовать max-buff ers;
timeout, ping-int — Эти значения можно повысить если наблюдаются обрывы связи;
Возможный статус соединения
StandAlone — Недоступна сетевая конфигурация. Этот ресурс еще не был подключен или был административно отключен (drbdadm disconnect), или сбросил сетевое подключение из за не пройденной аутентификации или split brain;
Disconnecting — Временное состояние пока происходит отключение,
следующее состояние StandAlone;
Unconnected — Временное состояние до попытки подключения. Следующее возможное состояние WFConnection или WFReportParams;
Timeout — Временное состояние после перерыва связи с peer-ом. Следующее возможное состояние Unconnected;
BrokenPipe — Временное состояние после потери связи с peer-ом. Следующее возможное состояние Unconnected;
NetworkFailure — Временное состояние после потери связи с партнером. Следующее возможное состояние — Unconnected;
ProtocolError — Временное состояние после потери связи с партнером. Следующее возможное состояние Unconnected;
TearDown — Временное состояние, peer закрывает соединение. Следующее возможное состояние Unconnected;
WFConnection — Нода ожидает пока peer станет виден в сети;
WFReportParams — TCP соединение было установлено, нода ожидает первый сетевой пакет от peer-ра;
Connected — DRBD соединение установлено, зеркалирование данных активно. Это нормальное состояние;
StartingSyncS — Начата полная синхронизация, выполняется администратором. Следующее возможное состояние SyncSource или PausedSyncS;
StartingSyncT — Начата полная синхронизация, выполняется администратором. Следующее возможное состояние WFSyncUUID;
WFBitMapS — Частичная синхронизация начата. Следующее возможное состояние SyncSource или PausedSyncS;
WFBitMapT — Частичная синхронизация начата. Следующее возможное состояние WFSyncUUID;
WFSyncUUID — Синхронизация скоро начнется. Следующее возможное состояние SyncTarget или PausedSyncT;
SyncSource — Синхронизация запускается, локальная нода является источником синхронизации;
SyncTarget — Синхронизация запускается, локальная нода является целью синхронизации;
PausedSyncS — Локальная нода источник синхронизации, но синхронизация находится в режиме паузы;
PausedSyncT — Локальная нода является целью синхронизации, но синхронизация находится в режиме паузы;
VerifyS — Запускается онлайн верификация, локальная нода является источником верификации;
VerifyT — Запускается онлайн верификация, локальная нода является целью верификации.
Роли ресурсов:
Primary — первичная нода;
Secondary — вторичная нода;
Unknown — роль ресурса неизвестна. Локальный ресурс не бывает в этой роли. Она отображается только для ресурса peer-ра в отключенном режиме.
Возможные состояния диска
Diskless — Драйверу DRBD не назначено блочное устройство;
Attaching — Переходное состояние пока считываются meta данные;
Failed — Переходное состояние последовавшее за I/O ошибкой локального блочного устройства, следующее возможное состояние Diskless;
Negotiating — Переходное состояние пока налаживается соединение;
Inconsistent — Данные непоследовательны. Это статус нового ресурса;
Outdated — Данные ресурса последовательны но устарели;
DUnknown — Статус используется для peer-ра если не доступно сетевое подключение;
Consistent — Последовательные данные ноды без сетевого подключения. После подключения будет решено, данные являются актуальными или устаревшими;
UpToDate — Все данные в актуальном состояние. Это нормально состояние.
Файл конфигурации ресурса
DRBD поддерживает как синхронную, так и асинхронную синхронизацию
Асинхронной репликация, протокол «A» — запись считается завершенной, как только запись завершилась на локальное устройство и данные были отправлены на удаленный узел
Промежуточный протокол репликации «B» — запись считается успешной, если она завершилась на локальный диск и удаленный узел подтвердил получение (но не локальную запись) данных
Синхронная репликация, протокол «С» — операция записи считается завершенной, когда и локальный, и сетевой диски сообщают об успешном завершении записи
on node1: состояния on on, к которым относятся вложенные операторы конфигурации
data: это имя нового ресурса
device /dev/drbd0: указывает новое виртуальное блочное устройство, управляемое DRBD
disk /dev/sdb1: это раздел блочного устройства, который является резервным устройством для устройства DRBD
meta-disk: определяет, где DRBD хранит свои метаданные. Использование Internal означает, что DRBD хранит свои метаданные на том же физическом устройстве нижнего уровня, что и фактические производственные данные
address: указывает IP-адрес и номер порта соответствующего узла
Инициализация и включение ресурса
Для взаимодействия с DRBD мы будем использовать следующие инструменты администрирования, которые взаимодействуют с модулем ядра для настройки и администрирования ресурсов DRBD:
drbdadm: инструмент администрирования высокого уровня DRBD
drbdsetup: инструмент администрирования более низкого уровня для подключения устройств DRBD к их устройствам резервного блока, для настройки пар устройств DRBD для зеркалирования их устройств резервного блока и для проверки конфигурации работающих устройств DRBD
drbdmeta: инструмент управления метаданными
Увеличение скорости синхронизации DRDB
При синхронизации идет нагрузка как на диски, так и на сеть, поэтому параметры необходимо подбирать исходя из ваших скоростей. Так у меня на 10Гб сети, стоит ограничение по нагрузке на диски в 350Мб\с, что составляет примерно 3Гб\с по трафику
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | Every 2,0s: cat /sys/kernel/debug/drbd/resources/maildata/connections/node02/0/proc_drbd                                                              Tue Sep 17 14:42:34 2019  0: cs:SyncSource ro:Secondary/Secondary ds:UpToDate/Inconsistent C r-----     ns:1756942336 nr:0 dw:0 dr:1756944440 al:0 bm:0 lo:0 pe:[0;3] ua:0 ap:[0;0] ep:1 wo:1 oos:8003072084         [==>.................] sync'ed: 18.1% (7815500/9531260)M         <strong>finish: 5:55:44 speed: 374,952 (457,384 -- 372,624) K/sec</strong>           0% sector pos: 0/19520022696         resync: used:0/61 hits:3447618 misses:26810 starving:0 locked:0 changed:13405         act_log: used:0/1237 hits:0 misses:0 starving:0 locked:0 changed:0         blocked on activity log: 0/0/0 | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | ATOP - node02                        2019/09/17  14:44:16                        --------------                        10s elapsed PRC |  sys    1.82s |  user   0.06s  |  #proc    174 |  #trun      3  |  #tslpi   194 |  #tslpu     0  |  #zombie    0 |  #exit      0  | CPU |  sys      12% |  user      1%  |  irq       4% |  idle     83%  |  wait      0% |  ipc notavail  |  curf 2.20GHz |  curscal   ?%  | CPL |  avg1    0.04 |  avg5    0.17  |  avg15   0.21 |                |  csw    14638 |  intr   43454  |               |  numcpu     1  | MEM |  tot     2.0G |  free    1.3G  |  cache 146.3M |  buff   19.0M  |  slab   46.3M |  shmem  46.8M  |  vmbal   0.0M |  hptot   0.0M  | SWP |  tot     3.0G |  free    3.0G  |               |                |               |                |  vmcom 413.7M |  vmlim   4.0G  | LVM |  5--02--MAILS |  busy     48%  |  read       0 |  write   7024  |  KiB/w    510 |  MBr/s    0.0  |  MBw/s  350.0 |  avio 0.67 ms  | LVM |  os_node-root |  busy      0%  |  read       0 |  write      1  |  KiB/w      4 |  MBr/s    0.0  |  MBw/s    0.0 |  avio 0.00 ms  | DSK |           sdb |  busy     48%  |  read       0 |  write   7024  |  KiB/w    510 |  MBr/s    0.0  |  MBw/s  350.0 |  avio 0.67 ms  | DSK |           sda |  busy      0%  |  read       0 |  write      1  |  KiB/w      4 |  MBr/s    0.0  |  MBw/s    0.0 |  avio 0.00 ms  | NET |  transport    |  tcpi   67949  |  tcpo   42788 |  udpi      82  |  udpo      55 |  tcpao      0  |  tcppo      0 |  tcprs      0  | NET |  network      |  ipi    68034  |  ipo    42846 |  ipfrw      0  |  deliv  68034 |                |  icmpi      3 |  icmpo      0  | <strong>NET |  ens192   29% |  pcki   68044  |  pcko   42846 |  sp   10 Gbps  |  si 2939 Mbps |  so 2490 Kbps  |  erri       0 |  erro       0  |</strong>   PID   SYSCPU   USRCPU    VGROW    RGROW    RDDSK    WRDSK   RUID        EUID       ST   EXC    THR   S   CPUNR    CPU   CMD         1/1  1421    1.63s    0.00s       0K       0K       0K       0K   root        root       --     -      1   R       0    17%   drbd_r_maildat  1180    0.02s    0.05s       0K       0K       0K       0K   root        root       --     -      2   S       0     1%   corosync   419    0.04s    0.00s       0K       0K       0K       0K   root        root       --     -      1   S       0     0%   kworker/u2:29  1412    0.04s    0.00s       0K       0K       0K       0K   root        root       --     -      1   S       0     0%   drbd_s_maildat  1959    0.04s    0.00s       0K       0K       0K       0K   root        root       --     -      1   S       0     0%   kworker/u2:0  1559    0.02s    0.00s       0K       0K       0K       0K   root        root       --     -      1   R       0     0%   atop     3    0.02s    0.00s       0K       0K       0K       0K   root        root       --     -      1   S       0     0%   ksoftirqd/0   802    0.00s    0.01s       0K       0K       0K       0K   root        root       --     -      2   S       0     0%   vmtoolsd   515    0.01s    0.00s       0K       0K       0K       0K   root        root       --     -      1   S       0     0%   kworker/0:1H  1145    0.00s    0.00s       0K       0K       0K       0K   zabbix      zabbix     --     -      1   S       0     0%   zabbix_agentd | 
В файле/etc/drbd.d/global_common.conf заданы следующие параметры
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |         disk {                 # size on-io-error fencing disk-barrier disk-flushes                 # disk-drain md-flushes resync-rate resync-after al-extents                 # c-plan-ahead c-delay-target c-fill-target c-max-rate                 # c-min-rate disk-timeout                 on-io-error             detach;                 no-disk-flushes ;                 no-disk-barrier;                 c-plan-ahead 10;                 c-fill-target 24M;                 c-min-rate 30M;                 c-max-rate 350M;               } | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |         net {                 # protocol timeout max-epoch-size max-buffers                 # connect-int ping-int sndbuf-size rcvbuf-size ko-count                 # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri                 # after-sb-1pri after-sb-2pri always-asbp rr-conflict                 # ping-timeout data-integrity-alg tcp-cork on-congestion                 # congestion-fill congestion-extents csums-alg verify-alg                 # use-rle                 # max-epoch-size          20000;                 max-buffers             36k;                 sndbuf-size            1024k ;                 rcvbuf-size            2048k;         } | 
Небольшой видос


 Загрузка...
 Загрузка...
[…] the end of synchronization, both resources should have UpToDate. You can read more about statuses here in the “Theory” section. Official site with documentation. Further, it is necessary to […]