ZFS

Opensolaris ZFS 快照(snapshot)及還原簡單試作

設定可以看到 .zfs 的快照目錄

#zfs set snapdir=visible kisspool

会在目录下看到.zfs文件夹

ZFS and Mysql

因为ZFS性能优越、管理方便、使用简单等特色,得到越来越多的喜爱。Opensolaris就结合了很多ZFS的特色。Sun公司新的存储ST7000系列更是集ope nsolairs和ZFS的优点于一体。很多MySQL的用户也开始尝试采用ZFS来增加MySQL的性能。由于ZFS的Solaris自带的功能,因此,在使用ZFS的 时候,需要使用Solaris。

这里只是使用ZFS和MySQL的几点小建议: 1)根据MySQL存处引擎数据快的大小,调整ZFS的数据块的大小 ZFS默认数据块的大小是512 byte-128MB,ZFS可以根据压力数据调整性能。这种机制可以工作的很好。但是对于数据库系统,可能有的时候这些值并不太合适,因此可以调整这些参数。例如,I nnodb和MyISAM的数据页一般是16KB-2KB,falcon默认是4KB。因此你可以在my.cnf里面调整数据页的大小。 也可以调整ZFS数据块的大小。例如

# zfs set recordsize=16K matrix/mysqldata

2)给日志分一个单独的存储池 主要目的是保证IO 3)关掉Innodb的双重写入功能 主要是因为ZFS是copy-on-write的机制,对于原来的数据是不会覆盖掉的。不会因为系统重起或断电造成数据丢失或数据不一致的情况。通过在my.cnf 中设置innodb_doublewrite=0来关掉Innodb的双重写入功能。 4)限制内存的使用 因为ZFS默认使用系统所有可用的内存来做文件系统的缓存,最好是限制ZFS所能使用的内存,这样可以保留一部分内存给系统来用。在/etc/system里面设置 zfs:zfs_arc_max,例如:

set zfs:zfs_arc_max = 0x200000000
or
set zfs:zfs_arc_max = 8589934592

5)对于写比较多的MyISAM,可以采用分开的ZIL(ZFS Intent Log)

ZFS 占用内存设定

这篇文章介绍如何降低ZFS占用的kernel内存!

很多Oracle 数据库运行在Solaris 上,作为这类服务器系统的管理员,您是否遇到过以下情况: 假设你的系统有16G内存,系统启动后并没有运行什么大型程序,但是当你运行vmstat(或者系统中安装了top)时显示的空闲却内存只有200MB。当你试图启动配置了较大SGA的Oracle数据库时因为无法分配所需的内存而失败。

我想你一定会尖叫,内存都哪去了?

让我们来看一个真实的案例 在一台具有16G内存的SUN服务器上运行如下命令:

# echo "::memstat" | mdb -k
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 1717128 13415 83%
Anon 238964 1866 12%
Exec and libs 23450 183 1%
Page cache 19039 148 1%
Free (cachelist) 19243 150 1%
Free (freelist) 40453 316 2%

Total 2058277 16080
Physical 2054336 16049

内核占用了13GB内存??没错! 自从ZFS被引入Solaris 10 ,大家多数使用的是系统默认的ZFS ARC(adaptive replacement cache)设置, 正是这一默认设置,导致内核模块中的ZFS ARC占用了大量的内存。

很早以前当我们第一次遇到这一问题时,我们必须在系统启动时使用mdb来设定ARC参数,而不能仅仅通过在/etc/system文件中作一些设定来解决。但是,您不用抱怨太多,因为这一问题现在很容易进行修正。

什么是 ZFS ARC?简单的说,它是被ZFS用告诉缓存的一块内存区域。 默认设定下,ZFS ARC最大可以增长到 总内存容量-1G的大小。问题是,当用户空间的应用程序请求分配内存时,ZFS ARC所占用的内存会被相应释放,但实际中内存释放过程往往不够迅速。另外,内存碎片对SHM(Oracle SGA的一部分)来讲是非常严重的问题。

通常,我会保留2GB内存给OS 和其他一些应用程序。如果运行 Oracle 和/或者 Sun App Server,我还会流出SGA和/或 java池。加在一起,我们假设总共需要4G内存不被ZFS占用,如果你的实际内存为8G,那么你需要将ARC 的最大大小设为4G。

如果你不运行Oralce之类的程序,只是在你的机器上运行1个图形桌面或Sunray Server ,需要保留2GB内存不被ZFS占用,并且你总共只有4GB内存,那么就将ARC的最大大小设为2GB。

如何设定ARC的最大大小? 当前较新版本的solaris 10系统中您只需编辑/etc/system 文件 添加以下设定:

* Restrict ZFS ARC to 8GB
set zfs:zfs_arc_max = 8000000000

我在设定时使用8000000000 ,这实际上< 8GB,但是相对1024x1024x1024的结果来说读起来更方便。

您可以更具实际情况设定ZFS RAC的最大值。保存设定后需要重新启动系统使设定生效。

系统重新启动后,您可以执行kstat -m zfs来验证此设定更改。

# kstat -m zfs
module: zfs instance: 0
name: arcstats class: misc
c 8000000000
c_max 8000000000
c_min 1000000000

ZFS上のswapを増量する

通常installした場合、swap領域もZFS上に zfs volumeとして作成されます。 スワップパーティション・スライスは使っていません。

サイズはメモリの半分です。これを増やしたいと思います。 しかし、Solarisのマニュアルでは、ファイルシステム上にスワップファイルを 作成してそれを追加する手順しか書いていません。 Solaris 10 システム管理:第 20 章 追加スワップ空間の構成 (手順) そりゃスライスを弄るのは難しいんでしょうが…。

ということで試行錯誤しながらやってみることにします。 現状は512MBになっています。

# swap -lh
swapfile             dev    swaplo   blocks     free
/dev/zvol/dsk/rpool/swap 182,1        4K     512M     512M
# zfs list rpool/swap
NAME         USED  AVAIL  REFER  MOUNTPOINT
rpool/swap   512M  10.1G  28.3M  -

zfs volumeは以下のようになっています。 通常のファイルシステムとは扱いが少し違っています。

# zfs get all rpool/swap
NAME        PROPERTY         VALUE                  SOURCE
rpool/swap  type             volume                 -
rpool/swap  creation         Fri Jul 11 22:53 2008  -
rpool/swap  used             512M                   -
rpool/swap  available        10.1G                  -
rpool/swap  referenced       28.3M                  -
rpool/swap  compressratio    1.00x                  -
rpool/swap  reservation      none                   default
rpool/swap  volsize          512M                   -
rpool/swap  volblocksize     4K                     -
rpool/swap  checksum         on                     default
rpool/swap  compression      off                    default
rpool/swap  readonly         off                    default
rpool/swap  shareiscsi       off                    default
rpool/swap  copies           1                      default
rpool/swap  refreservation   512M                   local

一旦swapをオフにします。

# swap -d /dev/zvol/dsk/rpool/swap
# swap -lh
No swap devices configured

サイズを増やすには、volsize を増やすだけです。

# zfs set volsize=1G rpool/swap
# zfs get volsize rpool/swap
NAME        PROPERTY  VALUE       SOURCE
rpool/swap  volsize   1G          -

あとは /sbin/swapadd をすればおしまい。

# /sbin/swapadd
# swap -lh
swapfile             dev    swaplo   blocks     free
/dev/zvol/dsk/rpool/swap 182,1        4K     1.0G     1.0G

スライスを書き換えることもなければ、/etc/vfstabへの追加も必要ありません。 ZFS を使ってるメリットの一つと言えるでしょう。

ZFSのatime 設定

無駄を減らして性能アップするので、 mount option に noatime をつけるのはZFSに限らず UNIXでの基本Tipsの一つだと思います。

ZFSの場合はスナップショットの差分が大きくならない 効果もあります。設定は以下のようになります。 rpool だけ設定すれば、その以下も設定を継承します。

# zfs get -r atime rpool
NAME                   PROPERTY  VALUE                  SOURCE
rpool                  atime     on                     default
rpool/ROOT             atime     on                     default
rpool/ROOT/snv_91      atime     on                     default
rpool/ROOT/snv_91/var  atime     on                     default
rpool/dump             atime     -                      -
rpool/export           atime     on                     default
rpool/export/home      atime     on                     default
rpool/swap             atime     -                      -
# zfs set atime=off rpool
# zfs get -r atime rpool
NAME                   PROPERTY  VALUE                  SOURCE
rpool                  atime     off                    local
rpool/ROOT             atime     off                    inherited from rpool
rpool/ROOT/snv_91      atime     off                    inherited from rpool
rpool/ROOT/snv_91/var  atime     off                    inherited from rpool
rpool/dump             atime     -                      -
rpool/export           atime     off                    inherited from rpool
rpool/export/home      atime     off                    inherited from rpool
rpool/swap             atime     -                      -

ZFSでホットスペア

Solaris 10 11/06 から ホットスペア の機能が 実装された事を以前ご紹介致しました。 そこで、今回は実際に X4500 を使用して、ZFS Hotspare の作成方法と 障害時の Status の変化についてご紹介したいと思います。

まずホットスペアの設定方法ですが、ZFS Pool の構築時に、下記のように spare オプションを使用すれば構築することができます。

例 ) ZFS Pool 構築時
# zpool create zfs_pool_test raidz c5t1d0 c4t1d0 c7t1d0 spare c4t0d0 c7t0d0 c6t0d0
もし既存の Pool に対してホットスペアを設定する場合には、 add オプションで既存の pool に対して追加します。

例 ) HotSpare 追加時
# zpool add pool_test spare c4t0d0 c7t0d0 c6t0d0
又、他のプールでホットスペアとして指定したデバイスは、複数のプールで共有することも可能です。 ( Global hotspare の様な動きになります。)

例 ) Global HotSpare 設定時
# zpool create -f pool1 raidz c5t1d0 c4t1d0 c7t1d0 spare c4t0d0 c7t0d0 c6t0d0
# zpool create -f pool2 raidz2 c5t2d0 c4t2d0 c7t2d0 spare c4t0d0 c7t0d0 c6t0d0
# zpool create -f pool3 mirror c5t3d0 c4t3d0 spare c4t0d0 c7t0d0 c6t0d0
           ※ 上記の例ではpool1, 2, 3 で同じ Spare Disk を指定します。
以上でホットスペアとしての設定は完了です。

それでは実際に X4500 を使用して ZFS Hotspare の設定と、 擬似障害としてディスク c5t1d0 を引き抜き・交換を 行ってみたいと思います。

pool の作成 まず zpool コマンドを使用して pool を作成します。 今回は全ての pool で c4t0d0 c7t0d0 c6t0d0 の 3本のディスクを Global Spare disk として指定しています。

# zpool status
no pools available
#
# zpool create -f pool1 raidz c5t1d0 c4t1d0 c7t1d0 spare c4t0d0 c7t0d0 c6t0d0
# zpool create -f pool2 raidz2 c5t2d0 c4t2d0 c7t2d0 spare c4t0d0 c7t0d0 c6t0d0
#
# zpool status
  pool: pool1
 state: ONLINE
 scrub: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    pool1       ONLINE       0     0     0
      raidz1    ONLINE       0     0     0
        c5t1d0  ONLINE       0     0     0
        c4t1d0  ONLINE       0     0     0
        c7t1d0  ONLINE       0     0     0
    spares
      c4t0d0    AVAIL ★←ここに表示されているディスクが
      c7t0d0    AVAIL   対象のプールに設定されている
      c6t0d0    AVAIL   ホットスペアです。

errors: No known data errors

  pool: pool2
 state: ONLINE
 scrub: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    pool2       ONLINE       0     0     0
      raidz2    ONLINE       0     0     0
        c5t2d0  ONLINE       0     0     0
        c4t2d0  ONLINE       0     0     0
        c7t2d0  ONLINE       0     0     0
    spares
      c4t0d0    AVAIL ★← pool1 と同じホットスペアです。
      c7t0d0    AVAIL
      c6t0d0    AVAIL

errors: No known data errors
#

ZFS File System の作成 次に zfs コマンドを使用して、先程作成した pool に ZFS File system を作成します。

# zfs create pool1/raidz
# zfs create pool2/raidz2
#
# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
pool1                  156K  1.11T  42.3K  /pool1
pool1/raidz           40.7K  1.11T  40.7K  /pool1/raidz
pool2                  180K   913G  51.0K  /pool2
pool2/raidz2          49.0K   913G  49.0K  /pool2/raidz2
#

以上で ZFS の構築は終了です。

c5t1d0 の強制引き抜き それでは擬似障害として物理的に pool1 の c5t1d0 を強制的に引き抜きます。

障害時のステータス確認 以下が c5t1d0 を強制的に引き抜いた後の zpool, cfgadm コマンドの Status です。

c5t1d0 の Disk が UNAVAIL Status に変化し、 c4t0d0 の Sapre Disk が使用されているのが確認できます。

# zpool status
  pool: pool1
 state: DEGRADED
status: One or more devices could not be opened.  Sufficient replicas exist for
    the pool to continue functioning in a degraded state.
action: Attach the missing device and online it using 'zpool online'.
   see: http://www.sun.com/msg/ZFS-8000-D3
 scrub: resilver completed with 0 errors on Sat Dec 24 00:49:06 2005
config:

    NAME          STATE     READ WRITE CKSUM
    pool1         DEGRADED     0     0     0
      raidz1      DEGRADED     0     0     0
        spare     DEGRADED     0     0     0
          c5t1d0  UNAVAIL      0    64     0  cannot open ★強制引き抜き
          c4t0d0  ONLINE       0     0     0       ★ホットスペア
        c4t1d0    ONLINE       0     0     0
        c7t1d0    ONLINE       0     0     0
    spares
      c4t0d0      INUSE     currently in use
      c7t0d0      AVAIL
      c6t0d0      AVAIL

errors: No known data errors

  pool: pool2
 state: ONLINE
 scrub: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    pool2       ONLINE       0     0     0
      raidz2    ONLINE       0     0     0
        c5t2d0  ONLINE       0     0     0
        c4t2d0  ONLINE       0     0     0
        c7t2d0  ONLINE       0     0     0
    spares
      c4t0d0    INUSE   in use by pool 'pool1'
      c7t0d0    AVAIL   ★↑pool1 で c4t0d0 が使用
      c6t0d0    AVAIL     されている事を示しています。

errors: No known data errors
#
# cfgadm -al
Ap_Id                          Type         Receptacle   Occupant     Condition
sata0/0::dsk/c0t0d0            disk         connected    configured   ok
sata0/1::dsk/c0t1d0            disk         connected    configured   ok
sata0/2::dsk/c0t2d0            disk         connected    configured   ok
            : 省略
sata2/6::dsk/c4t6d0            disk         connected    configured   ok
sata2/7::dsk/c4t7d0            disk         connected    configured   ok
sata3/0::dsk/c5t0d0            disk         connected    configured   ok
sata3/1                        sata-port    empty        unconfigured ok ★
sata3/2::dsk/c5t2d0            disk         connected    configured   ok
sata3/3::dsk/c5t3d0            disk         connected    configured   ok
            : 省略
usb4/5.2                       unknown      empty        unconfigured ok
usb4/5.3                       unknown      empty        unconfigured ok
usb4/5.4                       unknown      empty        unconfigured ok
#

c5t1d0 の挿入を実施 次にディスクの交換を行ったと仮定して、先程引き抜いた c5t1d0 のディスクを再度挿入します。

# date; cfgadm -al
Sat Dec 24 01:06:46 JST 2005
Ap_Id                          Type         Receptacle   Occupant     Condition
sata0/0::dsk/c0t0d0            disk         connected    configured   ok
sata0/1::dsk/c0t1d0            disk         connected    configured   ok
            : 省略
sata2/7::dsk/c4t7d0            disk         connected    configured   ok
sata3/0::dsk/c5t0d0            disk         connected    configured   ok
sata3/1                        disk         connected    unconfigured unknown ★
sata3/2::dsk/c5t2d0            disk         connected    configured   ok
sata3/3::dsk/c5t3d0            disk         connected    configured   ok
            : 省略
usb4/5.3                       unknown      empty        unconfigured ok
usb4/5.4                       unknown      empty        unconfigured ok
#

c5t1d0 の再認識を実施 挿入した c5t1d0 のディスクを OS 上で認識させます。

# cfgadm -c configure sata3/1::dsk/c5t1d0
#
# cfgadm -al
Ap_Id                          Type         Receptacle   Occupant     Condition
sata0/0::dsk/c0t0d0            disk         connected    configured   ok
sata0/1::dsk/c0t1d0            disk         connected    configured   ok
            : 省略
sata2/7::dsk/c4t7d0            disk         connected    configured   ok
sata3/0::dsk/c5t0d0            disk         connected    configured   ok
sata3/1::dsk/c5t1d0            disk         connected    configured   ok ★
sata3/2::dsk/c5t2d0            disk         connected    configured   ok
sata3/3::dsk/c5t3d0            disk         connected    configured   ok
            : 省略
usb4/5.3                       unknown      empty        unconfigured ok
usb4/5.4                       unknown      empty        unconfigured ok
#

ZFS 上の Status の確認 OS から c5t1d0 を認識した状態で pool1 に対してファイルの 読み込みや書き込みを行うと、自動的に ONLINE Status に戻ります。

# zpool status
  pool: pool1
 state: ONLINE
 scrub: resilver completed with 0 errors on Sat Dec 24 00:49:06 2005
config:

    NAME          STATE     READ WRITE CKSUM
    pool1         ONLINE       0     0     0
      raidz1      ONLINE       0     0     0
        spare     ONLINE       0     0     0
          c5t1d0  ONLINE       0     0     0 ★Online に変化!
          c4t0d0  ONLINE       0     0     0
        c4t1d0    ONLINE       0     0     0
        c7t1d0    ONLINE       0     0     0
    spares
      c4t0d0      INUSE     currently in use
      c7t0d0      AVAIL
      c6t0d0      AVAIL

errors: No known data errors

  pool: pool2
 state: ONLINE
 scrub: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    pool2       ONLINE       0     0     0
      raidz2    ONLINE       0     0     0
        c5t2d0  ONLINE       0     0     0
        c4t2d0  ONLINE       0     0     0
        c7t2d0  ONLINE       0     0     0
    spares
      c4t0d0    INUSE     in use by pool 'pool1'
      c7t0d0    AVAIL
      c6t0d0    AVAIL

errors: No known data errors
#

もし暫く経っても Online Status に変わらない場合には、 下記のコマンドを実施します。

# zpool clear pool1 c5t1d0
# zpool online pool1 c5t1d0

ZFS の Spare を戻す 最後に c4t0d0 を Spare Disk として元に戻します。 ( 現在はまだ c5t1d0, c4t0d0 の両方のディスクに対して読み書きしています )

# zpool detach pool1 c4t0d0

これで Status が正常に戻りました。

# date; zpool status
Sat Dec 24 01:12:21 JST 2005
  pool: pool1
 state: ONLINE
 scrub: resilver completed with 0 errors on Sat Dec 24 00:49:06 2005
config:

    NAME        STATE     READ WRITE CKSUM
    pool1       ONLINE       0     0     0
      raidz1    ONLINE       0     0     0
        c5t1d0  ONLINE       0     0     0
        c4t1d0  ONLINE       0     0     0
        c7t1d0  ONLINE       0     0     0
    spares
      c4t0d0    AVAIL
      c7t0d0    AVAIL
      c6t0d0    AVAIL

errors: No known data errors

  pool: pool2
 state: ONLINE
 scrub: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    pool2       ONLINE       0     0     0
      raidz2    ONLINE       0     0     0
        c5t2d0  ONLINE       0     0     0
        c4t2d0  ONLINE       0     0     0
        c7t2d0  ONLINE       0     0     0
    spares
      c4t0d0    AVAIL
      c7t0d0    AVAIL
      c6t0d0    AVAIL

errors: No known data errors
#

以上で ZFS ホットスペアの構築と、ディスクの交換が完了しました。

皆様もご覧頂けたと思いますが、ホットスペアの設定自体は zpool コマンドに spare オプションを加えるだけの為、管理が非常に簡単です。 (「操作が簡単」は ZFS のコンセプトでもあります )

又、ホットスペアの他にも Solaris 10 11/06 から加えられた機能の中に、 RAID-Z2 ( ダブルパリティによる RAID-6 相当の機能 ) がありますが、 ホットスペアと RAID-Z2 を組み合わせることにより、さらにシステムの冗長性を 高める事が可能になります。

まだ OS 領域に ZFS を利用できませんが、近い将来利用できるようになると思いますので、 是非、今のうちから ZFS を体験頂ければと思います。

/var/lib/openshift/bccd8eac1968476490eaee9ced33c7bf/app-root/runtime/repo/php/data/pages/zfs.txt · 最后更改: 2012/09/07 09:21 (外部编辑)
到顶部
CC Attribution-Noncommercial-Share Alike 3.0 Unported
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0