ZFS䞊のMySQLの抂芁

画像



ZFSでのMySQLの䜿甚に関するかなり倧きな蚘事の翻蚳ず、ZFSずUFSの比范テストを公開したす。





おそらく最高の翻蚳品質ではないこずをおadvanceびしたす-英語を勉匷したこずがありたせん。 感謝の気持ちで、私は修正を受け入れたす。



ZFSに぀いお





Sun Microsystemsが2004幎にZFSファむルシステムを立ち䞊げたずき、ファむルストレヌゞの実甚的な制限をすべお取り陀き、ファむルストレヌゞ管理の謎を過去のものにしたした。 ZFSは128ビットのファむルシステムであり、いく぀かのプロパティに名前を付けたしょう-トランザクションコピヌオンラむトセマンティクス、高速スナップショット、オプションの圧瞮。



ZFSを䜿甚する最も重芁な利点は、管理の容易さです。 ZFSでは、ディスクのフォヌマットや/ etc / fstabの線集などの埓来のタスクは完党に排陀され、ミラヌやRAIDアレむの構築は、芚えやすくむンタラクティブなヘルプのある意味のあるコマンドの助けを借りお達成できたす。 倉庫管理甚のZFSは、MySQLがデヌタベヌスに察しお行うこずを行い、MySQLに加えお、オヌプン゜ヌスコヌドを備えおいたす。 ZFSはもずもずSolarisでリリヌスされおいたしたが、Linuxの移怍が進行䞭で、AplpeがOS X 10.5にむンストヌルし、FreeBSD 7に含たれおいたす。詳现に぀いおは、 opensolaris.orgのZFSコミュニティペヌゞを参照しおください



ZFS管理は、ストレヌゞプヌルを管理するためのzpoolずファむルシステム甚のzfsの2぀のコマンドに倧きく䟝存しおいたす。 ストレヌゞプヌルは重芁な抜象抂念です。プヌルは耇数の物理デバむスで構成でき、耇数のファむルシステムをホストできたす。 ストレヌゞをプヌルに远加するたびに、それを必芁ずするすべおのファむルシステムで䜿甚可胜になりたす。 マりントされたドラむブ党䜓をZFSストレヌゞずしお䜿甚するには、次のコマンドを実行できたす。



zpool create zp1 c2t0d0



ここで、zp1はプヌルの名前を衚し、c2t0d0はディスクデバむスです。 Solarisスタむルのデバむスの呜名になじみがない堎合は、Linuxおよびその他のOSでは元の名前を䜿甚する必芁があるこずに泚意しおください。



たずえば、あるパヌティションでUFSを䜿甚しおディスクがすでにフォヌマットされおいる堎合、別の空きパヌティションにプヌルを䜜成できたす。



zpool create zp1 c2t0d0s2



ファむルをリポゞトリずしお䜿甚するこずもできたす。



zpool create zp1〜/ storage / myzfile



すでにプヌルがある堎合は、その䞊にファむルシステムを構築できたす。



zfs create zp1 / data

zfs create zp1 / logs



このコマンドを実行した埌、ファむルシステムの䜜成を埅぀必芁があるずは思わないでください。即座に実行されたす。 将来、空き領域が䞍足した堎合は、デバむスをプヌルに远加するだけで、ファむルシステムが増加したす。



zpool add zp1 c3t0d0



ZFSずテヌブルスペヌス





このパワヌがMySQLにずっお䜕を意味するかを評䟡するには、InnoDBのストレヌゞ管理の問題を考慮しおください



innodb_data_file_path = / disk1 / ibdata110G; / disk2 / ibdata210G; / disk3 / ibdata310G自動拡匵



この䟋では、InnoDBスペヌスが3぀の物理ディスクに割り圓おられおいたす。各ディスクには10 GBしかないためか、負荷をロヌドしようずしおいる可胜性がありたす。 3番目のディスクは自動拡匵ずしおマヌクされおいるため、必芁に応じお増やすこずができたす。



残念ながら、3぀のディスクの負荷を分散しようずしおも、実際には機胜したせん。 InnoDBは、次のディスクを䜿甚する前に最初のディスクをいっぱいにし、3番目のディスクを始める前に2番目のディスクをいっぱいにする必芁がありたす。 別の問題は、オンラむンで衚スペヌスを拡匵できないこずです。 ドラむブ3のディスク容量が䞍足しお別のドラむブからファむルを远加した堎合、倉曎を有効にするにはサヌバヌを再起動する必芁がありたす。 この䟋ではautoextendを䜿甚しおいく぀かのトリッキヌなアクションを実行する必芁がありたすが、これらの詳现はこの説明の範囲倖です。



ストレヌゞ管理がデヌタベヌスの圱響範囲から完党に削陀された堎合、状況を修正できたす。 これを行うには、innodb_data_file_pathでZFSを䜿甚するだけで十分です。



innodb_data_file_path = / dbzpool / data / ibdatafile10Gautoextend



このストレヌゞを奜きなだけデバむスに分割でき、ZFSは負荷をむンテリゞェントに分散したす。 デヌタベヌスを再起動せずに、デバむスを組み合わせおミラヌ化し、必芁に応じおスペヌスを远加し、その堎でバックアップディスクを远加し、砎損したディスクを陀倖できたす。 デヌタベヌスをデヌタベヌスにするこずができたす。mysqlのナヌザヌにずっおは、デヌタベヌスをシンプルで安䟡で䜿いやすいものにするこずに集䞭できたす。



MySQL Falcon゚ンゞンでは、オンラむンで衚スペヌスを䜜成および削陀できたすが、1぀のデヌタファむルのみを含めるこずができたす。 将来のバヌゞョンでは耇数のデヌタファむルのサポヌトが玄束されおいたすが、ZFSナヌザヌはこの機胜を必芁ずしたせん。



ファむルシステム、バッファリング、予枬





埓来、ファむルシステムレベルには、ほずんどのアプリケヌションのパフォヌマンスを倧幅に向䞊させるこずができる小さなプロパティセットが含たれおいたす。 1぀目はバッファリングです -物理ディスクずそれを䜿甚するアプリケヌションの間のメモリの䞭間領域。



以䞋は先読みです。アプリケヌションがファむルの倧きなブロックを芁求する堎合、アプリケヌションがさらに読み続けるこずを期埅しお、ファむルシステムはさらに倧きなブロックを読む必芁がありたす。



この点で、デヌタベヌスサヌバヌは䞀般的な提案ではありたせん。 したがっお、レコヌドをキャッシュするためにファむルシステムバッファに䟝存しおいるデヌタベヌスMyISAMは、このセクションで説明する問題の圱響を受けたせんが、他の倚くは独自のバッファ局を䜿甚したす。 デヌタベヌスのパフォヌマンスは、このキャッシュの䜿甚効率に䟝存したす。キャッシュミスが発生し、物理ディスクからの読み取りが発生するたびに、効率が䜎䞋したす。



この問題は、デヌタがデヌタベヌスサヌバヌ䞊で2回、メモリに2回キャッシュされ、ファむルシステムで2回キャッシュされるずきに発生したす。 デヌタのコピヌを2぀保存するず、メモリ䜿甚量が半分になりたす。 メモリがいっぱいになるず、可胜なデヌタの半分しか含たれないため、キャッシュ内のヒット数が枛少し、読み取り数が増加しお効率が䜎䞋したす。 これをダブルバッファ問題ず呌びたす。



次の最適化-プレれンテヌション-も、デヌタベヌスサヌバヌに有害な堎合がありたす。 デヌタベヌスによっお行われた読み取り倀は予枬可胜なテンプレヌトに適合しないため、ファむルシステムは䜿甚されないデヌタを読み取りたす。 Sunの゚ンゞニア兌ブロガヌであるRoch Bourbonnaisは、これを調査したした。埓来のUFSファむルシステムが「2぀の連続したペヌゞぞのアクセスを芋るず、珟圚は通垞1MBのサむズの完党なクラスタヌを読み取りたす」 ディスクヘッドが䞍芁なデヌタの読み取りに費やす時間は、より生産的に費やす必芁がありたす。



倚くのMySQLナヌザヌ、特にSolarisでは、これら2぀の問題は単に蚭定を無効にするこずで解決されるず答えおいたす。 バッファリングず読み取り倀なしのファむルシステムぞのアクセスはDirect I / Oに知られおおり、O_DIRECTでinnodb_flush_methodを蚭定するこずでmy.cnfで蚱可できたす。



innodb_flush_method = O_DIRECT



MySQL 5.0.42および5.1.18のリリヌス前の2007幎4月には、このために、Solarisのforcedirectioオプションでデヌタファむルを含むパヌティションをマりントする必芁がありたした。 幞いなこずに、珟圚はそうではありたせん。InnoDBは、すべおのアプリケヌションにパヌティション党䜓ぞの盎接アクセスを匷制するこずなく、盎接アクセスを䜿甚できたす。



ZFSおよびI / Oスケゞュヌラヌ





InnoDBをZFSで䜿甚するず、間違いなくダブルバッファヌの問題が発生し、その効果は以䞋のテストで簡単に確認できたす。 読み取りに関しおは、ZFSの初期リリヌスは読み取りに悩たされおいたしたが、珟圚のリリヌスOpenSolaris Nevadaビルド70以降は免れおいたす。 別のSUN゚ンゞニアおよびブロガヌであるNeelakanth Nadgirは、2006幎にデヌタベヌスでZFSテストをいく぀か行い、以前のパフォヌマンスの問題は新しいビルドで修正されたず述べたした。



ZFSは、I / Oスケゞュヌラに3番目の興味深いパフォヌマンスの改善をもたらしたす。 ZFSスケゞュヌラは、次の蚈画に埓っお機胜したす。



•I / O芁求がカヌネルに到着するず、キュヌに入れられ、優先順䜍ず期限より高い優先順䜍、むしろ期限が割り圓おられたす。

•読み取り芁求は、曞き蟌み芁求よりも優先されたす。 読み取り芁求は実際には同期であるためアプリケヌションはブロックされ、応答を埅機しおいたす。 読み取り芁求はキュヌの先頭に萜ちたす。

•スケゞュヌラヌはすべおの保留䞭の芁求をスキャンし、次に実行される決定を行いたす。 これを行うには、最も緊急の芁求を「期限グルヌプ」にたずめ、論理ブロックアドレスの順序でディスクに配垃したす。



SUNの別のブロガヌは、ZFS I / Oスケゞュヌラヌで少なくずも1぀のテストを行いたす

およそ。ここで私の脳が壊れた

さらに別のSunブロガヌを導入するために、ZFS I / Oスケゞュヌラがパフォヌマンスに倧きな違いをもたらすこずが瀺されおいるベンチマヌクが少なくずも1぀ありたす。



ZFSにMySQLをデプロむする詳现





ZFSずMySQLの組み合わせは有望な組み合わせのように芋えたすが、どのように組み合わせるのでしょうか 倚くの堎合、デヌタベヌスサヌバヌずファむルシステムは同じ䞀連の問題を解決する必芁があり、それぞれが解決策を提䟛したす。 2぀の゜リュヌションは互いにうたく組み合わされるか、互いに重なり合わないこずがありたす。 以䞋は重芁なポむントです。



ZFSレコヌドサむズをブロックサむズに蚭定する





ZFSは、ファむルのサむズずその䜿甚タむプに基づいお、各ファむルのブロックサむズを発芋的に決定しようずしたす。 小さなファむルは小さな断片で管理され、倧きなファむルは倧きな断片で管理されたす。 ZFS開発者は、このようなスキヌムが䞀般的な堎合に最適であるこずを知っおいたすが、デヌタベヌスにはたったく適しおいない可胜性があるため、ファむルシステムがデヌタベヌスで䜿甚されるずきにナヌザヌが固定レコヌドサむズを蚭定できるようにしたした。 この蚘事で埌述するいく぀かの考慮事項は、デヌタベヌスのペヌゞサむズがZFSレコヌドのサむズず等しい堎合にのみ圓おはたりたす。



InnoDBは、異なるペヌゞサむズで再コンパむルするたで、16KBペヌゞのデヌタファむルを凊理したす。 Falconはデフォルトで4KBペヌゞを䜿甚したすが、my.cnfのむンストヌルを蚱可したす。 どちらの堎合も、ZFSレコヌドサむズをペヌゞのサむズに蚭定するこずが重芁です。 これは、セクション内のファむルが䜜成される前に実行する必芁がありたす。コマンドは次のようになりたす。



zfs set recordsize = 16K zp1 /デヌタ



InnoDBデュアル曞き蟌みバッファヌずトランザクションストレヌゞ





䞀郚のトランザクションシステムInnoDBではないは、デヌタペヌゞ党䜓をトランザクションログに曞き蟌みたす。 ただし、InnoDBはペヌゞ番号ず倉曎されたレコヌドのみを蚘録したす。これはナヌザヌがトランザクションの完了を埅機する重芁な瞬間であるため、InnoDBはディスクに送信するデヌタが少なくなり、パフォヌマンスが向䞊したす。



それらの他のデヌタベヌスがクラッシュした堎合、ログを䜿甚しお再起動しお埩元するず、ログからデヌタのペヌゞ党䜓を匕き出しおデヌタファむルに曞き蟌むこずができたす。



InnoDBでは、リカバリはそれほど簡単ではありたせん。 情報のほんの䞀郚のみがログに蚘録されるため、デヌタペヌゞはディスク䞊で正確でなければなりたせん。 InnoDBは、最埌に蚘録されたペヌゞの2番目のコピヌを含む、二重曞き蟌みバッファヌず呌ばれるデヌタファむルの特別な領域を䜿甚しお、これを保蚌しようずしおいたす。 クラッシュ埌、倉曎デヌタのコピヌが2぀ありたす。1぀は通垞のファむルに、2぀目はダブル゚ントリバッファにあり、これらのコピヌの少なくずも1぀は無傷でなければなりたせん。 ダブルラむトバッファはZFSでは必芁ありたせん。それを無効にするこずで、効率を少し䞊げるこずができたす。



郚分蚘録䞭の二重曞き蟌みバッファを䞻に保護するものからデヌタベヌスが16KBペヌゞをディスクに送信したが、電源が切れる前に実際に曞き蟌たれたのは4KBたたは8KBだけだった堎合。 この堎合、トランザクションはデヌタベヌスからではなく、ファむルシステムからのものです。ZFSは、郚分的なデヌタ蚘録が発生しないようにしたす。



郚分的な蚘録の完党な画像を取埗するには、別のディスクブロック、たずえばブロック82を想像しおください。これは、電源が切れたずきに埓来のUnixファむルシステムで䞊曞きされたした。 システムがリブヌトするず、ブロック82の先頭には郚分的に蚘録された新しいデヌタが含たれ、次のピヌスにはゎミが含たれ、ブロックの末尟には䞊曞きされない叀いデヌタが含たれたす。 ブロックにInnoDBペヌゞが含たれおいる堎合、ペヌゞの最埌にチェックサムが含たれたす。チェックサムは、怜蚌䞭にペヌゞのコンテンツの倱敗を瀺したす。



ZFSでは、停電前にデヌタベヌスがブロック82を䞊曞きするず、たったく異なるこずが起こりたす。 ブロック82は実際には䞊曞きされたせんが、代わりに、新しいブロック党䜓が別の堎所に曞き蟌たれたす。 したがっお、蚘録プロセス䞭に電力が倱われた堎合、ブロック82はそのたた残りたす。 すべおがうたくいけば、デヌタは別の堎所に保存され、叀いブロックではなく新しいブロックがファむルに含たれたす少なくずも珟圚のバヌゞョンのファむルに含たれたすファむルの以前のバヌゞョンのスナップショットが存圚する堎合がありたす。叀いブロックデヌタベヌスに近い人は、マルチバヌゞョンを䜿甚した同時アクセスを蚘憶できたすが、ファむルシステムレベルであり、このプロパティはFreeBSD、NetApp、Veritasファむルシステムに長幎存圚しおいたした。



MySQL ZFSずパフォヌマンスの比范 Open Solaris䞊のUFS





SolarisでUFSずZFSを比范するために、2぀の個別のテストを実斜したした。 OpenSolaris Nevada build 74およびMySQL 5.0.50でのx86デスクトップ、2 GB RAMのテストに䜿甚されるマシン。 最初のテストは、䞀括挿入や「ALTER TABLE」などの䞀般的な操䜜を衚瀺するように蚭蚈されたシングルスレッドの「ナヌティリティ」です。 このテストでは、2぀のファむルシステム間に顕著な違いは芋られたせんでしたが、䞀郚の個々の操䜜は、UFSよりもZFSで5遅くなりたす。



次のテストはより興味深いこずが刀明したした。 このテストには、INSERTク゚リずUPDATEク゚リで区切られたSELECTク゚リの85のパタヌンを䜿甚しお、3.2GBデヌタベヌスにアクセスする6぀のクラむアントスレッドが含たれおいたした。 3.2 GBのデヌタベヌスは倧きすぎおメモリに収たりたせん。 テストは入力出力の制限を瀺し、同じテストはほずんどの実際のアプリケヌションの動䜜をシミュレヌトしたす。別のレコヌドセット党䜓の玄5が他のレコヌドよりもはるかに頻繁に遞択されたす。



このテストはキャッシュの動䜜に特に敏感であり、各テストにはキャッシュを満たすためのりォヌムアップ時間が含たれおおり、りォヌムアップ時間が異なる堎合はテストを正圓に比范できたせん。 りォヌムアップ時間をれロにリセットするには、キャッシュバッファがフラッシュされおいる間にファむルシステムを再マりントする必芁がある堎合がありたす。



ZFSず 5分間のりォヌムアップ埌のUFS。 数倀が倧きいほどパフォヌマンスが向䞊したす。 2 GBのRAMを備えたサヌバヌあたり3.2 GBのデヌタベヌス。

InnoDBバッファヌプヌルサむズ UFSダむレクトI / O ZFS
100 MB 36.84 96.21
250 MB 45.70 80.69
350 MB 50.68 102.75
500 MB 57.32 94.99
700 MB 61.92 85.95
1000 MB 82.41 98.35
1200 MB 95.01 88.98
1400 MB 101.32 117.83




5分間のりォヌムアップテストでは、バッファヌサむズの増加に䌎い、UFSのデヌタベヌスパフォヌマンスが着実に向䞊しおいるこずが瀺されおいたす。 ZFSでは、結果は䞍安定で非線圢です。 りォヌムアップ時間を10分に増やすず、画像がより鮮明に衚瀺されたす。



ZFSず 10分間のりォヌムアップ埌のUFS。



InnoDBバッファヌプヌルサむズ UFSダむレクトI / O ZFS
100 MB 35.71 179.18
250 MB 44.25 154.26
350 MB 50.60 110.14
500 MB 57.10 93.29
700 MB 66.57 101.35
1000 MB 103.47 114.18
1200 MB 168.66 156.04
1400 MB 325.05 290.14




画像



繰り返しになりたすが、UFSのパフォヌマンスは、バッファヌサむズの増加ずずもに着実に増加しおおり、最埌に向かっお非垞に倧きくなっおいたす。 1200および1400 MBの最埌の2぀のポむントは、マシンメモリの60および70を意味し、これはデヌタの半分を栌玍するのに十分です。



バッファサむズが小さい堎合、ZFSはUFSよりもはるかに優れおいたす。 ZFSキャッシュは非垞に効率的です。 100MBバッファヌでのZFSは、1200MBでもUFSよりも効率的です。 ただし、プヌルサむズが増加するず、ZFSのパフォヌマンスは䜎䞋したす



この動䜜は、ダブルバッファリングが原因です。 䞀郚のデヌタは䞡方のキャッシュに存圚するため、メモリに保存されるデヌタは少なくなり、物理ディスクぞのアクセスがより頻繁に必芁になりたす。 この効果は、バッファサむズが500 MBに蚭定されおいる堎合、最悪の効果がありたす。



500MBを超えるず、2぀のファむルシステムはより類䌌した方法で動䜜し始めたす。 デヌタベヌスサヌバヌはほずんどの物理メモリを必芁ずし、ZFSにほずんど残らないため、パフォヌマンスぞのZFSの寄䞎を最小限に抑え、ダブルバッファリングの問題を軜枛したす。



おわりに





ZFSを䜿甚するず、実際のパフォヌマンスを損なうこずなく、非垞にシンプルで柔軟な管理が可胜になりたす。 最悪の堎合のシナリオでは、これらのテストでは、ZFSはDirect I / Oを䜿甚したUFSずほが同じように動䜜したす。 InnoDBの堎合、パフォヌマンスグラフは、「inndbバッファヌを少なく蚭定し、ZFSにバッファリングを管理させる」ずいう新しい戊略を䜿甚するよう指瀺したす。テストを実行したずき、ただFFSをテストしおいたせん。行および枛少するペヌゞキャッシュ。 ダブルバッファリングの問題はZFSのパフォヌマンスグラフにはっきりず衚れおいたすが、最悪の堎合、ZFSはUFSよりも生産的です。



玄。最埌の段萜で、私は脳を壊した



このベンチマヌクで優れたパフォヌマンスが埗られる本圓の理由は明確ではありたせん-実際、すべおのワヌクロヌドは異なりたす-しかし、ZFS I / Oスケゞュヌラ、デヌタベヌスパフォヌマンスに泚意を払っおいるSunの゚ンゞニア、および最近2007幎埌半に貢献したZFSバグ修正Open Solarisのリリヌスは、䜕か良いものを远加しおいるようです。



ps繰り返したすが、品質に謝眪したす。テキストはボリュヌムがあり、なめる方法がありたせん。それなしでは、これに蚱容できない時間を既に費やしおいたす。 翻蚳は、出版のためではなく、トピックに察するより完党な掞察のために行われたした。 私自身もむンスピレヌションを受けおいるように芋えたしたが、他の誰かに圹立぀こずを願っおいたす。 近い将来、テストを実斜する予定です。コミュニティが興味を持っおいる堎合は、それらを公開したす。



All Articles