非冗長ZFSプールのディスクを交換する方法は?


8

私は少し読んでいますが、ZFSはディスクが非冗長アレイから削除されることを望まないようです:

このzpool detachコマンドを使用して、ミラーリングされたストレージプールからデバイスを切り離すことができます。例えば:

# zpool detach zeepool c2t1d0

ただし、データの有効なレプリカが他にない場合、この操作は拒否されます。例えば:

# zpool detach newpool c1t2d0
cannot detach c1t2d0: only applicable to mirror and replacing vdevs

基本的な問題は理解できます。配列から一部のデータ(メタデータまたはペイロードデータ)の唯一のコピーを削除すると、そのデータが使用できなくなります。

ZFSストレージプール内のデバイス交換する例は、ストレージプール内のデバイスを交換する方法の基本的な段階的な説明を提供します。ディスクをオフラインにし、ディスクを取り外し、交換用ディスクを挿入し、実行zpool replaceしてZFSに変更を通知しますそしてディスクをオンラインにします。これは明らかに、アレイが交換されるディスクに依存しないことを必要とするため、アレイには冗長性が必要です。問題のドライブに依存している場合、このアプローチでは上記と同じ問題が発生します。

非冗長 ZFSアレイのディスクを交換するための推奨される方法は何ですか?

既存のディスクが正常に動作していると想定し、交換用ディスクは少なくとも交換されるディスクと同じサイズであると想定します。(既存のディスクに障害が発生した場合、明らかにできることは、新しいディスクを追加して、ディスク障害の影響を受けるすべてのファイルをバックアップから復元することだけです。)

回答:


3

`13では状況がそれほど異なっていたかどうかはわかりませんが、「zfs replace」は非冗長プールで機能します。最初にデタッチする代わりに、1コマンドを実行するだけです。

d1は1G、d2は2G、どちらも/ tmp内の空のファイルです。

/t/test #> zpool create test /tmp/test/d1
/t/test #> zpool set autoexpand=on test
/t/test #> zpool status
  pool: test
 state: ONLINE
  scan: none requested
config:

    NAME            STATE     READ WRITE CKSUM
    test            ONLINE       0     0     0
      /tmp/test/d1  ONLINE       0     0     0

errors: No known data errors
/t/test #> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test   1008M   258K  1008M         -     0%     0%  1.00x  ONLINE  -


/t/test #> zpool replace test /tmp/test/d1 /tmp/test/d2


/t/test #> zpool status
  pool: test
 state: ONLINE
  scan: resilvered 61K in 0h0m with 0 errors on Sun Sep 18 18:55:32 2016
config:

    NAME            STATE     READ WRITE CKSUM
    test            ONLINE       0     0     0
      /tmp/test/d2  ONLINE       0     0     0

errors: No known data errors
/t/test #> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test   1.98G   408K  1.98G         -     0%     0%  1.00x  ONLINE  -

12
zpool attach pool old-disk new-disk

これにより、old-diskがold-diskとnew-diskの両方を持つミラーに変換され、再同期が開始されます。その後、古いディスクを切り離すことができます。

zpool detach pool old-disk

ループデバイスでテスト済み:

# truncate -s 1G a b
# truncate -s 1200M c
# losetup  /dev/loop0 a
# losetup  /dev/loop1 b
# losetup  /dev/loop2 c
# zpool create test loop{0,1}
# zpool attach test loop1 loop2
# zpool status
      pool: test
 state: ONLINE
  scan: resilvered 62K in 0h0m with 0 errors on Wed Jul 31 13:43:19 2013
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          loop0     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            loop1   ONLINE       0     0     0
            loop2   ONLINE       0     0     0
# zpool detach test loop1
# zpool status
  pool: test
 state: ONLINE
  scan: resilvered 62K in 0h0m with 0 errors on Wed Jul 31 13:43:19 2013
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          loop0     ONLINE       0     0     0
          loop2     ONLINE       0     0     0

ZFSはそのような操作をネイティブにサポートしていないと言っているのですか?奇妙なようです。(必要なことは、両方のドライブを接続し、古いドライブがオフラインになることをZFSに通知することだけであるように思われます。これにより、ドライブ上のデータを他のドライブに移行する機会が与えられます。それが冗長アレイでの回復であった場合)
CVn 2013

@MichaelKjörling、私はそれを言っていません。うまくいかない理由がわからないので、上記はうまくいくはずです。
ステファンChazelas

そうは言っても、ZFSは確かにそれをサポートしているようです。回答を更新しました。
ステファンChazelas

すごい!これは私が探していて、期待していた種類の答えです。できれば、もう一度試してみてください。
CVn 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.