1. 階層化ストレージについて
SSDが普及し始めた頃から、Linux上で様々なSSDを用いたキャッシュのテクノロジーが現れては消えを繰り返してきました。
しかし熾烈な生存競争に生き残ったテクノロジーもあり、
今回はdm-cacheを利用したいと思います。
本稿の執筆にあたっては、@Kaz_Kさん執筆のdm-cacheの技術概要と構築手順を参考にさせていただきました。ありがとうございました。
2.構築のイメージ
ここでは、SSDを/dev/sda、HDDを/dev/sdbとしてお話を進めていくこととします。下の図を参考にしてください。
最上位のレイヤーであるファイルシステムからはキャッシュが透過的に扱われますので利用者側が普段意識する事はありません。
(もちろんcacheの状態を確認する事は可能です)
3. 各物理ドライブへの割り当てについて
当たり前といえばそうなのですが、SSDとHDDで、割り当てるべき容量が違ってきます。
SSDに対してはこう言う感じで容量を割り当てていきます。
私もあれこれ調べては見たのですが、MetaData領域にはキャッシュドライブの容量の1%を指定している情報ばかり(英語は・・・ごめんなさい)。
まぁとりあえず1%割り当てておくことにします。
HDDについてはあえてここで述べるような事はありませんが、せっかく絵を作ったので貼らせてくださいw
4.構築の実際
ここからは実際のコマンドをトレースしながら、どのようにキャッシュされたLVMが構築されていくのかを見ていきたいと思います。
4.1 下準備
LVMの”issue_discards” 設定を変更し、再起動しておきます。
この設定、SSDのTRIMがらみでも触ることがあるみたいですね。
# vi /etc/lvm/lvm.conf
issue_discards = 0 を
issue_discards = 1 に変更。
# dracut -f
# sync
# reboot
4.2 PVの作成
もうここからは淡々と作業するのみ!
# pvcreate /dev/sda1
Physical volume "/dev/sda1" successfully created.
# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
4.3 VGの作成
どんどん進めていきましょう。
# vgcreate hybrid_vg0 /dev/sda1 /dev/sdb1
Devices have inconsistent logical block sizes (512 and 4096).
See lvm.conf allow_mixed_block_sizes.
おっと・・・ロジカルブロックサイズが SSDとHDDで違っているようですね。
さてどうしましょうか。
確かにこれはちがいますねぇ・・・・
# blockdev --report /dev/sd{a,b}
RO RA SSZ BSZ 開始セクタ サイズ デバイス
rw 8192 512 4096 0 999997571072 /dev/sda
rw 8192 4096 4096 0 8999978139648 /dev/sdb
で、結局こうなりました。
# vgcreate --config devices/allow_mixed_block_sizes=1 hybrid_vg0 /dev/sda1 /dev/sdb1
Physical volume "/dev/sda1" successfully created.
Volume group "hybrid_vg0" successfully created
4.4 LVの作成
さくさく進むはずです。
キャッシュとメタデータの作成については前述の通りです
それにしてもSSDで1TBなんていい時代になったものですね。
キャッシュメタデータのサイズについては、はっきりこうと書いたものがみあたらなかったので、とりあえずキャッシュサイズの1%としておきます。
(容量を使い切っていない件については、後述ということで・・・・)
# lvcreate -L 8G -n cache_meta hybrid_vg0 /dev/sda1
Logical volume "cache_meta" created.
# lvcreate -L 800G -n cache hybrid_vg0 /dev/sda1
Logical volume "cache" created.
# lvcreate -l 100%FREE -n lv0 hybrid_vg0 /dev/sdb1
Logical volume "lv0" created.
4.5 cache poolの作成
どんどん進めていきます。
せっかくなので、キャッシュモードはWriteBackに設定します。
cachemodeを指定しないとwritetrueとなります。
がしかし・・・
[root@nas01 ~]# lvconvert --type cache-pool --cachemode writeback --poolmetadata /dev/hybrid_vg0/cache_meta --chunksize 256 /dev/hybrid_vg0/cache
Chunk size 256.00 KiB is less than required minimal chunk size 896.00 KiB for a cache pool of <831.32 GiB size and limit 1000000 chunks.
To allow use of more chunks, see setting allocation/cache_pool_max_chunks.
だみだこりゃ。
チャッンクサイズの上限を打ち破ってしまったようですね。
では、これでどうかなぁ?
# lvconvert --type cache-pool --cachemode writeback --poolmetadata /dev/hybrid_vg0/cache_meta --chunksize 1024 /dev/hybrid_vg0/cache
WARNING: Converting hybrid_vg0/cache and hybrid_vg0/cache_meta to cache pool's data and metadata volumes with metadata wiping.
THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
Do you really want to convert hybrid_vg0/cache and hybrid_vg0/cache_meta? [y/n]: y
Converted hybrid_vg0/cache and hybrid_vg0/cache_meta to cache pool.
4.6 cache poolの紐付け
ここまできたら、このコマンドでHDDに対してSSDをキャッシュとして紐づけて高速なLogical Volumeを作成します。
# lvconvert --type cache --cachepool /dev/hybrid_vg0/cache /dev/hybrid_vg0/lv0
Do you want wipe existing metadata of cache pool hybrid_vg0/cache? [y/n]: y
Logical volume hybrid_vg0/lv0 is now cached.
4.7 Filesystemの作成と動作確認
そして、最後にこれをお忘れなく。
今回FileSystemとしてbtrfsを選択しています。
まぁ今でも色々言われているようですが、私はbtrfsに助けられたのでほかを選択する余地はありません。
動作確認については適当なファイルをコピーするなどしましょう。
# mkfs.btrfs /dev/hybrid_vg0/lv0
5.ベンチマークなど
6.構築後の操作
6.1 cacheの取り外し
キャッシュを無効にしたいときは、次のコマンドでCache Poolを外すことができます。また、再度Cache Poolを接続することもできますが、一度取り外した後に再接続する場合、キャッシュは消去されます。(検証やベンチマークが目的で、キャッシュを一旦削除したい場合にも有効です。)
# lvconvert --splitcache hybrid_vg0/lv0
Flushing 0 blocks for cache hybrid_vg0/lv0.
Logical volume hybrid_vg0/lv0 is not cached and cache pool hybrid_vg0/cache is unused.
取り外した結果。Cache Pool自体は残ってます。
# lvs -a hybrid_vg0
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
[cache] hybrid_vg0 Cwi---C--- 800.00g 0.08 0.09 0.00
[cache_cdata] hybrid_vg0 Cwi-ao---- 800.00g
[cache_cmeta] hybrid_vg0 ewi-ao---- 8.00g
lv0 hybrid_vg0 Cwi-a-C--- <8.19t [cache] [lv0_corig] 0.08 0.09 0.00
[lv0_corig] hybrid_vg0 owi-aoC--- <8.19t
[lvol0_pmspare] hybrid_vg0 ewi------- 8.00g
再度キャッシュを有効にしたいときは、構築時と同じコマンドで、LVを結合します。
# lvconvert --type cache --cachepool /dev/hybrid_vg0/cache /dev/hybrid_vg0/lv0
Do you want wipe existing metadata of cache pool hybrid_vg0/cache? [y/n]: y
Logical volume hybrid_vg0/lv0 is now cached.
# lvs -a hybrid_vg0
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
参考資料
Qiita | dm-cacheの技術概要と構築手順 |
Qiita | [CentOS] dm-cacheを使用してSSDをHDDのキャッシュにする |
RedHat | DM_Cache |
RedHat Blog | Improving read performance with dm-cache |
bootloader blog | SSD Caching Using dm-cache Tutorial |
Fibrevillage | How to remove cache of a cache Logivcal Volume |
コメント