設定可以看到 .zfs 的快照目錄 #zfs set snapdir=visible kisspool 会在目录下看到.zfs文件夹
因为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占用的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
通常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 を使ってるメリットの一つと言えるでしょう。
無駄を減らして性能アップするので、 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 - -
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 を体験頂ければと思います。