From 3df04ced3bebb15c49f874f2f3674a170ac61358 Mon Sep 17 00:00:00 2001
From: Sergey Matveev <stargrave@stargrave.org>
Date: Mon, 18 Jan 2016 01:12:31 +0300
Subject: [PATCH] =?utf8?q?=D0=9E=D0=B1=D0=BE=D0=B6=D0=B0=D1=8E=20=D1=83?=
 =?utf8?q?=D0=B4=D0=BE=D0=B1=D1=81=D1=82=D0=B2=D0=BE=20ZFS?=
MIME-Version: 1.0
Content-Type: text/plain; charset=utf8
Content-Transfer-Encoding: 8bit

Очередная радость от использования ZFS. dmesg стал говорить регулярно
что на ada1 диске возникают unrecoverable ошибки DMA. ada1 это зеркало
ada0. Возможно порт SATA плохой в корзине, возможно шлейф, возможно диск
или ещё чего. Самое простое это просто переткнуть диск в другой слот
корзины.

Можно выключить систему, переткнуть, включить. Это будет большое время
простоя, не хочется выключать систему. Можно сделать по горячему: вынуть
и вставить. Будь это обычный RAID, то не миновать полного rebuild-а
всего трёхтерабайтного диска.

Но в ZFS это тривиально:

    # zpool offline zroot ada1

Через пару секунд ada1 диск можно вынуть, он отключен от пула.
Перетыкаем в другой слот.

    # zpool online zroot ada1

И видим что он автоматически понял что диск из этого пула, и быстро
сделал resilvering:

  pool: zroot
 state: ONLINE
  scan: resilvered 33.5M in 0h0m with 0 errors on Mon Jan 18 00:23:43 2016

То есть ему пришлось всего 33.5 мегабайта данных синхронизировать. Он
находит superblock, находит ближайший checkpoint в одном и другом диске.
У каждого checkoint-а есть монотонно инкрементирующийся timestamp. По
нему он понимает насколько кто отстаёт. Используя деревья Меркле он
шустро находит разницу между ними и её дописывает во время resilvering
на второй диск. Теперь они синхронизированы точно.

Никакого downtime, 33.5 мегабайта переданных данных, вместо трёх
терабайт, пара команд, всё работает как ни в чём не бывало.
-- 
2.51.0