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 を体験頂ければと思います。

/home1/yepnnet/public_html/wiki/data/pages/zfs.txt · 最后更改: 2010/02/01 00:37 由 admin
到顶部
chimeric.de = chi`s home Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0