Flashcacheの実現と使い方

9686 ワード

仕事の必要性は、flashcacheの内容を見て、以下のように記録しました.
インプリメンテーション
Flashcacheは、フェイスブック技術チームが開発した新しいオープンソースプロジェクトで、主な目的はSSDハードディスクでデータをキャッシュしてMySQLのカーネルモジュールを加速させることです.最初はデータベースの加速に使用されたが、ブロックデバイス上に構築されたアプリケーションにも使用できる汎用キャッシュモジュールとして設計されていることがわかります.
動作原理Device Mapperに基づいて、高速SSDハードディスクと通常のハードディスクをキャッシュ付き論理ブロックデバイスにマッピングし、ユーザー操作のインタフェースとして使用します.ユーザは、下位層のSSDまたは通常のハードディスクに対して直接操作することなく、この論理デバイスに対して読み書き操作を実行する.最下位のこれらのブロックデバイスを操作すると、全体として提供されるキャッシュ機能が失われる.
カーネル階層.Flashcacheは、ファイルシステムとブロックデバイス駆動層の間にキャッシュ階層を追加することによって実現され、ここではDM層のマッピングメカニズムに言及せざるを得ない.DMは仮想ブロックデバイス駆動としてカーネルに登録されているため、実際のデバイス駆動ではなく、bioの処理を完了できないため、主にマッピングテーブルに基づいてbioを分解、クローン化、再マッピングし、その後、bioは最下位の実際のデバイス駆動に達し、データ伝送を開始する.デバイスマップには、target_が導入されていますdriver、各target_driverはtarget_からtypeタイプ記述は、ブロックデバイスのマッピングプロセスを具体的に実現するためにそれぞれ使用されるマッピングのクラスを表す.target_を呼び出すdriverのmapメソッドは、上位から配布されたbio、すなわち、正しいターゲットデバイスを見つけ、bioをターゲットデバイスの要求キューに転送し、操作を完了する.flashcache_targetはこのような新しいtargetです.driver(新しいマッピングタイプとしてtarget_typeが必要)は、DM層にモジュール化された方法で組み込まれている.
論理アーキテクチャ.ソースコード階層解析から、flashcacheをこの4つのモジュールに分けることができ、スケジューリングモジュール(「読み書きモジュール」とも呼ばれる)、論理処理モジュール(「読み書き後処理モジュール」とも呼ばれる)、下位ストレージモジュール、バックグラウンドクリーンアップモジュールに分けられ、いずれもSSD Layoutに基づいて実現され、SSDレイアウト(後で分析する)の上に構築される.ここで、スケジューリングモジュールは、コードにflashcache_に対応するmapマッピング関数は、flashcacheキャッシュ階層データエントリであるため、論理デバイスの読み書き要求に到達し、最終的にはDM層の処理を経て、flashcache_を通過する.mapはスケジューリングモジュールに入ります.「スケジューリング」とは、主にデータを受信するとbioリクエストの読み書きタイプ、キャッシュにヒットするかどうかなどの要因に応じて、flashcache_のような異なる処理ブランチを選択することを意味します.read/writeまたはflashcache_uncached_io、readとwriteでflashcacheを選択します.read_hit/missかflashcacheかwrite_hit/miss.異なるブランチの読み書きによって、ディスクまたはcacheのデータの読み書きを完了するために、最下位のストレージモジュールが呼び出されます.論理処理モジュール、コードでflashcacheに対応io_callbackは、スケジューリングモジュールが最下位のストレージモジュールを介してデータの読み書き操作を実行した後にコールバック実行されるため、ステータスマシンで実現される「読み書き後処理モジュール」であり、スケジューリングモジュールの読み書きタイプに応じて後続の処理を行い、読み書きがヒットしない場合、ディスクの読み書きが完了した後、論理処理モジュールにコールバックする.ディスクから読み取ったデータをSSDに書き戻すか、書き込みがヒットしていない場合、書き込みSSDが完了した後、論理処理モジュールにコールバックしてメタデータの更新を行い、スケジューリングモジュールでの読み書き操作のエラーを処理する.DMによって提供されるdm_io関数は、最終的にはsubmit_を通過します.bioの方式は、スケジューリングモジュールによって処理されたbioを汎用ブロック層に提出し、実際のデバイス駆動に転送し、データの読み書きを完了する.また、kcopydは、カーネルから提供される最下位コピー関数であり、主に汚れたブロックの書き込み(SSDからディスク)を担当し、メタデータの更新を引き起こす.バックグラウンドクリーンアップモジュールは、setごとにデータクリーンアップを行い、2つの戦略に基づいて汚れブロックを回収する:(1)set内臓ブロックがしきい値を超えた;(2)ダーティブロックが設定された空き時間を超えている、すなわちfallow_delayは、一般的に15分で、15分で操作されなければ優先的に回収されます.注意しなければならないのは、単独のスレッドがバックグラウンドで定期的に空きブロックを回収していないので、IO操作によってトリガーされなければならない.長い間set操作をしていないと、その中の汚れたデータは長期にわたって保持され、データの安全に危害を及ぼしやすい.
ソースコードレイアウト.2つのワークキュー.デバイスmapperコード、特にdmを結合する.cは、flashcacheを呼び出していることを知ることができます.createツールflashcacheデバイスを作成すると、flashcache_が呼び出されます.ctl関数、作成ツールを実行します.ワークキューが作成されます.delay_cleanは、主にcacheデバイス全体の汚れたブロックのクリーンアップを担当し、flashcache_clean_setは特定の条件で呼び出し(コードを参照)、flashcache_を介してclean_allはすべてのsetsのスキャンとクリーンアップを実行します.別のワークキュー、kq_xxx(はっきり覚えていません)、flashcache_Initでは、flashcacheモジュールのロード時に実行し、5つのjobチェーンテーブルを処理することにより、メタデータの更新と処理関数の完了、ディスク読み取り後のSSD書き込み、および待ち行列の処理を実行し、主に読み書き後の処理を担当するロジック処理モジュール、すなわち「読み書き後処理モジュール」に属し、ディスクまたはSSDによって読み書きされた後、異なる場合にスケジュールされます.
スケジューリングのタイミングはflashcacheを見ることができます.map関数、処理ロジックは主に関数flashcache_io_callback内部では、the same blockの待機キューが空であるかどうかを判断し、空でない場合もflashcache_が呼び出されます.do_handlerは、待機キューの処理を実行します.
データ・スケジュール.読み、bioを受信するには、まずbio->bi_に基づいてsector、すなわちハードディスクのセクタ番号は、SSD上のsetを得る.次に、set内でヒットするかどうかを探し、ヒットした場合、ハードディスクのセクタ番号をSSDのセクタ番号に変換し、このbioをSSDに提出し、読み取りを行う.ヒットしなかった場合は、まずハードディスクドライブにbioをコミットし、ハードディスクからデータを読み取り、読み取りが完了した後、コールバック関数によってライトバックSSD操作を開始し、bioのセクタ番号をSSDの=セクタ番号に変換した後、SSDドライバにコミットし、ハードディスク読み取りのデータをSSDに書き込む.書き込みは、ファイルシステムのページバッファと同じで、ハードディスク(HDD)に直接書き込むのではなく、SSDに書き込むと同時に、バルブ値を20%保持し、汚れたブロックの数がこの値に達したときにディスクに書き込みます.
インストール
具体的なインストール手順は、ここを参照してください.linux-3.15.5カーネルをコンパイルしたcentos-6.5に直接makeとmake installをインストールしました.
make -j 4 KERNEL_TREE=/usr/src/kernels/2.6.32-131.0.15.el6.x86_64
sudo make install

最初のバージョンのFlashcacheはwritebackのみをサポートし、その後、flashcache-wtディレクトリにwritethroughをサポートするブランチを単独で開いたが、現在の最新バージョンではwrite throughがプライマリバージョンに統合され、write aroundポリシーが追加されている.
最新のソースコードはGithubで入手できます.
env GIT_SSL_NO_VERIFY=true git clone https://github.com/facebook/flashcache.git
ソースコードをダウンロードした後の最初のことは、docの下でflashcache-docを読むことです.txtとflashcache-sa-guide.txt
シミュレーション実験
誰もがSSD/PCI-E Flashのハードウェアを持っているわけではないので、ここでは仮想ハイブリッドストレージデバイスを構築する小さなテクニックを提供することができます.これにより、自分のノートパソコンでも、Flashcacheの試験環境を簡単にシミュレートすることができ、勝手に振り回すことができます.
まず、メモリでパフォーマンスの良いFlashデバイスをシミュレートすることができます.もちろん、ホストが再起動すると何もなくなりますが、実験テストに使用するのは大きな問題ではありません.メモリを用いてブロックデバイスをシミュレートするには、ramdiskまたはtmpfs+loop deviceの2つの方法がある.ramdiskはサイズを調整するにはgrubを変更して再起動する必要があるため,ここではtmpfsで実現する.
#   tmpfs     10G,      (     24G    )
$sudo mount tmpfs /dev/shm -t tmpfs -o size=10240m
#     2G   ,    2G flash  
$dd if=/dev/zero of=/dev/shm/ssd.img bs=1024k count=2048
#          
$sudo losetup /dev/loop0 /dev/shm/ssd.img

cacheデバイスを解決するには、disk持続デバイスも必要です.同様に、通常のディスク上のファイルを使用してloopデバイスに仮想化できます.
#                4G   ,    4G disk  
$dd if=/dev/zero of=/u01/jiangfeng/disk.img bs=1024k count=4096
$sudo losetup /dev/loop1 /u01/jiangfeng/disk.img

これにより、Flashcacheハイブリッドストレージデバイスの作成を開始できる高速デバイス/dev/loop 0、遅いディスクデバイス/dev/loop 1が用意されました.
$sudo flashcache_create -p back cachedev /dev/loop0 /dev/loop1
cachedev cachedev, ssd_devname /dev/loop0, disk_devname /dev/loop1 cache mode WRITE_BACK
block_size 8, md_block_size 8, cache_size 0
Flashcache metadata will use 8MB of your 48384MB main memory

$sudo mkfs.ext3 /dev/mapper/cachedev
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
262144 inodes, 1048576 blocks
52428 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1073741824
32 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

$sudo mount /dev/mapper/cachedev /u03

Ok、チェックして、いくつかのシミュレーションテストを始めることができます.
$sudo dmsetup table
cachedev: 0 8388608 flashcache conf:
        ssd dev (/dev/loop0), disk dev (/dev/loop1) cache mode(WRITE_BACK)
        capacity(2038M), associativity(512), data block size(4K) metadata block size(4096b)
        skip sequential thresh(0K)
        total blocks(521728), cached blocks(83), cache percent(0)
        dirty blocks(0), dirty percent(0)
        nr_queued(0)
Size Hist: 4096:84 

$sudo dmsetup status
cachedev: 0 8388608 flashcache stats:
        reads(84), writes(0)
        read hits(1), read hit percent(1)
        write hits(0) write hit percent(0)
        dirty write hits(0) dirty write hit percent(0)
        replacement(0), write replacement(0)
        write invalidates(0), read invalidates(0)
        pending enqueues(0), pending inval(0)
        metadata dirties(0), metadata cleans(0)
        metadata batch(0) metadata ssd writes(0)
        cleanings(0) fallow cleanings(0)
        no room(0) front merge(0) back merge(0)
        disk reads(83), disk writes(0) ssd reads(1) ssd writes(83)
        uncached reads(0), uncached writes(0), uncached IO requeue(0)
        uncached sequential reads(0), uncached sequential writes(0)
        pid_adds(0), pid_dels(0), pid_drops(0) pid_expiry(0)

$sudo sysctl -a | grep flashcache
dev.flashcache.loop0+loop1.io_latency_hist = 0
dev.flashcache.loop0+loop1.do_sync = 0
dev.flashcache.loop0+loop1.stop_sync = 0
dev.flashcache.loop0+loop1.dirty_thresh_pct = 20
dev.flashcache.loop0+loop1.max_clean_ios_total = 4
dev.flashcache.loop0+loop1.max_clean_ios_set = 2
dev.flashcache.loop0+loop1.do_pid_expiry = 0
dev.flashcache.loop0+loop1.max_pids = 100
dev.flashcache.loop0+loop1.pid_expiry_secs = 60
dev.flashcache.loop0+loop1.reclaim_policy = 0
dev.flashcache.loop0+loop1.zero_stats = 0
dev.flashcache.loop0+loop1.fast_remove = 0
dev.flashcache.loop0+loop1.cache_all = 1
dev.flashcache.loop0+loop1.fallow_clean_speed = 2
dev.flashcache.loop0+loop1.fallow_delay = 900
dev.flashcache.loop0+loop1.skip_seq_thresh_kb = 0
ddです.imgとdisk.img、その後fioはテストを行い、非flashcacheデバイスより3-4倍効果が向上した.
Flashcacheコマンドライン
私たちのss dディスクは/dev/sdbであり、sasディスクは/dev/sdcであると仮定します.
Flashcacheデバイスを作成するには、次の手順に従います.
flashcache_create -p back cachedev /dev/sdb /dev/sdc

-p back:cacheモードがwritebackであることを指定
Cachedev:flashcacheデバイス名
注意sdディスクを前に、sasディスクを後ろに置きます.
これによりLinuxはキャッシュ付きブロックデバイスを仮想化します.
[root@osd0 loop2+loop3]# ll /dev/mapper/cachedev 
lrwxrwxrwx 1 root root 7 Aug 18 11:08 /dev/mapper/cachedev -> ../dm-1
は、一般的なブロックデバイスを使用するように、デバイスを使用することができる.元のパーティション/dev/sdcにファイルシステムがある場合は、mount後も正常に使用できます.ファイルシステムがなければ、一般的なデバイスと同じようにファイルシステムを作ってからmountを使ってもいいです.
mount /dev/mapper/cachedev /mnt
Flashcacheを再作成するには、まずumountの対応するパーティションが必要です.次に、Flashcacheを再作成する必要がある場合は、次の手順に従います.
umount /mnt
dmsetup remove cachedev
flashcache_destroy /dev/sdb

再構築が必要な場合は、上のflashcacheをインストールします.createを再構築すればいいです.
参考資料:
http://blog.csdn.net/kidd_3/article/category/905673
http://www.sebastien-han.fr/blog/2012/11/15/make-your-rbd-fly-with-flashcache/
http://www.sebastien-han.fr/blog/2014/10/06/ceph-and-enhanceio/
http://www.orczhou.com/index.php/2010/10/how-to-setup-flashcace/
http://www.ningoo.net/html/2012/all_things_about_flashcache_4.html