Hatena::ブログ(Diary)

富士山は世界遺産 このページをアンテナに追加 RSSフィード Twitter

2010-11-17

ZFSのmirror/raidzの容量を増やす方法

ZFS v22 (Solaris 10 9/10)にて検証、特に説明しない限りraidz = raidz1,2,3の事です。

増やす方法

増やす方法には3通りあります。

  1. 既存構成と同じ構成を作りつつzpool addで追加する方法
  2. 既存構成とは違う構成を作りつつzpool addで無理矢理追加する方法
  3. 容量の多いディスクとzpool replaceを使って交換していく方法

raidzを構成内容自体を変更することは出来ません。

その件はZFSのraidzを構成にディスクに追加することは、出来ません (ZFS v22の話) - 富士山は世界遺産をご覧ください。

論よりコード

既存構成と同じ構成を作りつつzpool addで追加する方法 / mirror

まず、mirrorプールを作ります。

# zpool create tank mirror /f/64m1 /f/64m2
# zpool status tank
  プール: tank
 状態: ONLINE
 スクラブ: 何も要求されませんでした
構成:

        NAME         STATE     READ WRITE CKSUM
        tank         ONLINE       0     0     0
          mirror-0   ONLINE       0     0     0
            /f/64m1  ONLINE       0     0     0
            /f/64m2  ONLINE       0     0     0

エラー: 既知のデータエラーはありません
# zpool list tank
NAME    SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank   59.5M  95.5K  59.4M     0%  ONLINE  -

では増やします。

# zpool add tank mirror /f/512m1 /f/512m2 
# zpool status tank
  プール: tank
 状態: ONLINE
 スクラブ: 何も要求されませんでした
構成:

        NAME          STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          mirror-0    ONLINE       0     0     0
            /f/64m1   ONLINE       0     0     0
            /f/64m2   ONLINE       0     0     0
          mirror-1    ONLINE       0     0     0
            /f/512m1  ONLINE       0     0     0
            /f/512m2  ONLINE       0     0     0

エラー: 既知のデータエラーはありません
# zpool list tank  
NAME    SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank    564M   147K   563M     0%  ONLINE  -

増えました。mirror間はストライプ(raid-0)になってます。

既存構成と同じ構成を作りつつzpool addで追加する方法 / raidz

まず、raidzプールを作ります。

# zpool create tank raidz /f/64m1 /f/64m2 /f/64m3 
# zpool status tank
  プール: tank
 状態: ONLINE
 スクラブ: 何も要求されませんでした
構成:

        NAME         STATE     READ WRITE CKSUM
        tank         ONLINE       0     0     0
          raidz1-0   ONLINE       0     0     0
            /f/64m1  ONLINE       0     0     0
            /f/64m2  ONLINE       0     0     0
            /f/64m3  ONLINE       0     0     0

エラー: 既知のデータエラーはありません
# zpool list tank
NAME    SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank    178M   179K   178M     0%  ONLINE  -

では増やします。

# zpool add tank raidz /f/512m1 /f/512m2 /f/512m3
# zpool status tank
  プール: tank
 状態: ONLINE
 スクラブ: 何も要求されませんでした
構成:

        NAME          STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            /f/64m1   ONLINE       0     0     0
            /f/64m2   ONLINE       0     0     0
            /f/64m3   ONLINE       0     0     0
          raidz1-1    ONLINE       0     0     0
            /f/512m1  ONLINE       0     0     0
            /f/512m2  ONLINE       0     0     0
            /f/512m3  ONLINE       0     0     0

エラー: 既知のデータエラーはありません
# zpool list tank                                
NAME    SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank   1.66G   276K  1.66G     0%  ONLINE  -

増えました。raidz間はストライプ(raid-0)になってます。

既存構成とは違う構成を作りつつzpool addで無理矢理追加する方法

まず、raidzプールを作ります。

# zpool create tank raidz /f/64m1 /f/64m2 /f/64m3 
# zpool status tank
  プール: tank
 状態: ONLINE
 スクラブ: 何も要求されませんでした
構成:

        NAME         STATE     READ WRITE CKSUM
        tank         ONLINE       0     0     0
          raidz1-0   ONLINE       0     0     0
            /f/64m1  ONLINE       0     0     0
            /f/64m2  ONLINE       0     0     0
            /f/64m3  ONLINE       0     0     0

エラー: 既知のデータエラーはありません
# zpool list tank  
NAME   SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank   178M   179K   178M     0%  ONLINE  -

では増やします。既存のディスク3台raidzに、ディスク2台mirrorを追加してみます。

# zpool add tank mirror /f/512m1 /f/512m2        
仮想デバイスの指定が無効です
次のエラーを無効にするには、'-f' を使用してください:
複製レベルの不一致: プールでは raidz、新しい仮想デバイスでは mirror が使用されています
# zpool add -f tank mirror /f/512m1 /f/512m2 
# zpool status tank                          
  プール: tank
 状態: ONLINE
 スクラブ: 何も要求されませんでした
構成:

        NAME          STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            /f/64m1   ONLINE       0     0     0
            /f/64m2   ONLINE       0     0     0
            /f/64m3   ONLINE       0     0     0
          mirror-1    ONLINE       0     0     0
            /f/512m1  ONLINE       0     0     0
            /f/512m2  ONLINE       0     0     0

エラー: 既知のデータエラーはありません
# zpool list tank  
NAME   SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank   682M   268K   682M     0%  ONLINE  -

zpool add に -f をつけて無理矢理追加しました。容量も増えています。

そして、raidz - mirror間はストライプ(raid-0)になってます。この状態は推奨してないそうです。(ソース忘れた)

容量の多いディスクとzpool replaceを使って交換していく方法

この方法を行う前の注意。再同期が完了していないと、次のzpool replaceが実行出来ません。再同期の時間はデータ量に比例します。

まずはプールを作ります。

# zpool create tank mirror /f/64m1 /f/64m2
# zpool status tank                       
  プール: tank
 状態: ONLINE
 スクラブ: 何も要求されませんでした
構成:

        NAME         STATE     READ WRITE CKSUM
        tank         ONLINE       0     0     0
          mirror-0   ONLINE       0     0     0
            /f/64m1  ONLINE       0     0     0
            /f/64m2  ONLINE       0     0     0

エラー: 既知のデータエラーはありません
# zpool list tank                         
NAME   SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank  59.5M  95.5K  59.4M     0%  ONLINE  -

では、容量の大きいディスクへ置き換えます。

# zpool replace tank /f/64m1 /f/512m1     
# zpool status tank                       
  プール: tank
 状態: ONLINE
 スクラブ: Fri Nov 12 22:15:03 2010
 上で 0 エラーが発生した 0h0m のあとの resilver completed構成:

        NAME          STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          mirror-0    ONLINE       0     0     0
            /f/512m1  ONLINE       0     0     0  73.5K resilvered
            /f/64m2   ONLINE       0     0     0

エラー: 既知のデータエラーはありません
# zpool list tank                    
NAME   SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank  59.5M   160K  59.3M     0%  ONLINE  -
# zpool replace tank /f/64m2 /f/512m2     
# zpool status tank                  
  プール: tank
 状態: ONLINE
 スクラブ: Fri Nov 12 22:15:25 2010
 上で 0 エラーが発生した 0h0m のあとの resilver completed構成:

        NAME          STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          mirror-0    ONLINE       0     0     0
            /f/512m1  ONLINE       0     0     0
            /f/512m2  ONLINE       0     0     0  84K resilvered

エラー: 既知のデータエラーはありません
# zpool list tank                    
NAME   SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank  59.5M   172K  59.3M     0%  ONLINE  -
# zpool online -e tank /f/512m1 
# zpool list tank               
NAME   SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank   508M   183K   507M     0%  ONLINE  -

ポイントは zpool online -e です。ディスクはどれか一つ指定すればOK。

raidzでも試してみましょう。今度は1台replaceが終わったら都度zpool online -eもしてみることにします。

# zpool create tank raidz /f/64m1 /f/64m2 /f/64m3 
# zpool status tank
  プール: tank
 状態: ONLINE
 スクラブ: 何も要求されませんでした
構成:

        NAME         STATE     READ WRITE CKSUM
        tank         ONLINE       0     0     0
          raidz1-0   ONLINE       0     0     0
            /f/64m1  ONLINE       0     0     0
            /f/64m2  ONLINE       0     0     0
            /f/64m3  ONLINE       0     0     0

エラー: 既知のデータエラーはありません
# zpool list tank  
NAME   SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank   178M   179K   178M     0%  ONLINE  -
# zpool replace tank /f/64m1 /f/512m1  
# zpool status tank                    
  プール: tank
 状態: ONLINE
 スクラブ: Fri Nov 12 22:46:11 2010
 上で 0 エラーが発生した 0h0m のあとの resilver completed構成:

        NAME          STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            /f/512m1  ONLINE       0     0     0  45.5K resilvered
            /f/64m2   ONLINE       0     0     0
            /f/64m3   ONLINE       0     0     0

エラー: 既知のデータエラーはありません
# zpool list tank  
NAME   SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank   178M   309K   178M     0%  ONLINE  -
# zpool online -e tank /f/512m1       
# zpool list tank               
NAME   SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank   178M   234K   178M     0%  ONLINE  -
# zpool replace tank /f/64m2 /f/512m2 
# zpool status tank                   
  プール: tank
 状態: ONLINE
 スクラブ: Fri Nov 12 22:47:39 2010
 上で 0 エラーが発生した 0h0m のあとの resilver completed構成:

        NAME          STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            /f/512m1  ONLINE       0     0     0
            /f/512m2  ONLINE       0     0     0  52K resilvered
            /f/64m3   ONLINE       0     0     0

エラー: 既知のデータエラーはありません
# zpool list tank                     
NAME   SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank   178M   342K   178M     0%  ONLINE  -
# zpool online -e tank /f/512m2       
# zpool list tank              
NAME   SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank   178M   246K   178M     0%  ONLINE  -
# zpool replace tank /f/64m3 /f/512m3 
# zpool status tank                  
  プール: tank
 状態: ONLINE
 スクラブ: Fri Nov 12 22:48:08 2010
 上で 0 エラーが発生した 0h0m のあとの resilver completed構成:

        NAME          STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          raidz1-0    ONLINE       0     0     0
            /f/512m1  ONLINE       0     0     0
            /f/512m2  ONLINE       0     0     0
            /f/512m3  ONLINE       0     0     0  53K resilvered

エラー: 既知のデータエラーはありません
# zpool list tank                    
NAME   SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank   178M   282K   178M     0%  ONLINE  -
# zpool online -e tank /f/512m3      
# zpool list tank              
NAME   SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank  1.49G   351K  1.49G     0%  ONLINE  -

すべての容量が大きくならないと、拡張されませんでした。(まぁ仕組みを考えれば当たり前ですが)

ちなみに、プールのプロパティにautoexpandがあります。これがonの場合、zpool online -eを行わなくても、自動的に拡張します。

autoexpandプロパティはプール作成時、既存プールに指定することも可能です。

# zpool create -o autoexpand=on tank mirror /f/64m1 /f/64m2  
# zpool get autoexpand tank
NAME    PROPERTY    VALUE   SOURCE
tank    autoexpand  on      local
# zpool set autoexpand=off tank
# zpool get autoexpand tank          
NAME    PROPERTY    VALUE   SOURCE
tank    autoexpand  off     default
# zpool set autoexpand=on tank       
# zpool get autoexpand tank   
NAME    PROPERTY    VALUE   SOURCE
tank    autoexpand  on      local
# zpool replace tank /f/64m1 /f/512m1 
# zpool status tank                   
  プール: tank
 状態: ONLINE
 スクラブ: Fri Nov 12 22:52:21 2010
 上で 0 エラーが発生した 0h0m のあとの resilver completed構成:

        NAME          STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          mirror-0    ONLINE       0     0     0
            /f/512m1  ONLINE       0     0     0  76.5K resilvered
            /f/64m2   ONLINE       0     0     0

エラー: 既知のデータエラーはありません
# zpool list tank   
NAME   SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank  59.5M   171K  59.3M     0%  ONLINE  -
# zpool replace tank /f/64m2 /f/512m2 
# zpool status tank                  
  プール: tank
 状態: ONLINE
 スクラブ: Fri Nov 12 22:52:40 2010
 上で 0 エラーが発生した 0h0m のあとの resilver completed構成:

        NAME          STATE     READ WRITE CKSUM
        tank          ONLINE       0     0     0
          mirror-0    ONLINE       0     0     0
            /f/512m1  ONLINE       0     0     0
            /f/512m2  ONLINE       0     0     0  88.5K resilvered

エラー: 既知のデータエラーはありません
# zpool list tank                    
NAME   SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
tank   508M   186K   507M     0%  ONLINE  -

自動で拡張されました。ちなみにreplaceが終わった後にzpool set autoexpand=onしても、自動拡張されません。

そのときは慌てずzpool online -e をお使いください。

あとがき

ごきげんよう

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証