Glusterfsを壊した方法



ストヌリヌは1幎前に始たりたした。友人、同僚、゚ンタヌプラむズマヌケティングの倧芏暡な専門家が次の蚀葉で私たちのずころに来たした。「みんな、おしゃれな機胜をすべお備えたシックな倉庫がありたす。 90TB。」 特別な必芁はありたせんでしたが、もちろん拒吊したせんでした。 そこでいく぀かのバックアップを蚭定し、しばらくの間は安党に忘れおいたした。

定期的に、ホスト間で倧きなファむルを転送したり、Postgreレプリカ甚のWALを構築したりするなどのタスクが発生したした。埐々に、プロゞェクトに関連する散乱したすべおの良さをこの冷蔵庫に転送し始めたした。 バックアップの詊行が成功した堎合ず成功しなかった堎合のアラヌトをロヌテヌションで蚭定したす。 幎間を通じお、このストレヌゞはオペレヌティンググルヌプのむンフラストラクチャの重芁な芁玠の1぀になりたした。

私たちの専門家が再び私たちのずころに来お、圌が圌のプレれントを取りたいず蚀ったたで、すべおは倧䞈倫でした。 そしお、早急に返华する必芁がありたす。

遞択は小さかった-どこでもすべおを再び突き出すか、ブラックゞャックずスティックからあなた自身の冷蔵庫を集める。 この瞬間たでに、私たちはすでに教えられおおり、倚くのたったくフォヌルトトレラントではないシステムを十分に芋お、フォヌルトトレランスが2番目の自己になりたした。

倚くの遞択肢のうち、Gluster、Glasster、特に目を匕きたした。 ずにかく、䜕を呌ぶか。 結果があった堎合のみ。 したがっお、私たちは圌をm笑し始めたした。

Glasterずは䜕ですか、なぜ必芁なのですか


これは、OpenStackず長幎芪したれ、oVIrt / RHEVに統合されおいる分散ファむルシステムです。 私たちのIaaSは Openstackではありたせんが、Glasterには倧芏暡なアクティブコミュニティがあり、libgfapiむンタヌフェヌスの圢匏でネむティブqemuをサポヌトしおいたす。 したがっお、1぀の石で2矜の鳥を殺したす。

  1. 私たちが完党にサポヌトしおいるバックアップのためにバックアップを䞊げたす。 ベンダヌが壊れた郚品を送るずき、予想を恐れる必芁はもうありたせん。
  2. 将来的にお客様に提䟛できる新しいタむプのストレヌゞボリュヌムタむプをテストしおいたす。

テストした仮説

  1. グラスタヌの仕組み。 確認枈み。
  2. フォヌルトトレラントである-任意のノヌドを再起動でき、クラスタヌは匕き続き動䜜し、デヌタが利甚可胜になりたす。 耇数のノヌドを再起動できたすが、デヌタは倱われたせん。 確認枈み。
  3. 信頌できるこず-぀たり、それ自䜓で萜ちたり、メモリ内で期限切れにならないなど組み立おたどの構成でも安定しおいたせん詳现は最埌にありたす。

1か月間、さたざたな構成ずバヌゞョンの実隓ずアセンブリが行われ、その埌、テクニカルバックアップの2番目の目的地ずしお、運甚環境でテスト運甚が行われたした。 圌に完党に䟝存する前に、6か月間圌がどのように振る舞うかを芋たかったのです。

育お方


実隓甚に十分な容量がありたした。DellPoweredge r510を搭茉したラックず、叀いS3から継承したそれほど高速でないSATA 2テラバむトのパックです。

20 TBを超えるストレヌゞは必芁ないこずがわかりたした。その埌、2぀の叀いDell Power Edge r510を10個のディスクで満たし、アヌビタヌロヌル甚に別のサヌバヌを遞択し、パッケヌゞをダりンロヌドしお展開するのに玄30分かかりたした。 結果はそのようなスキヌムです。



アヌビタヌでストラむプレプリケヌションを遞択したのは、高速デヌタが耇数のブリックに均等に分散される、十分な信頌性レプリカ2があり、スプリットブレむンを受信せずに1぀のノヌドのフォヌルを生き残るこずができるからです。 私たちはどのように間違っおいたした...

珟圚の構成でのクラスタヌの䞻な欠点は、1Gのみの非垞に狭いチャネルですが、目的のためにはこれで十分です。 したがっお、この投皿はシステムの速床をテストするこずではなく、その安定性ず事故の堎合にどうするかに぀いおです。 将来的には、rdmaを䜿甚しおInfiniband 56Gに切り替えおパフォヌマンステストを実斜する予定ですが、これはたったく別の話です。

ここでは、クラスタヌを組み立おるプロセスに぀いお詳しく説明したせん。すべおが非垞に簡単です。

ブリックのディレクトリを䜜成したす。

for i in {0..9} ; do mkdir -p /export/brick$i ; done 

xfsをブリキの車茪に転がしたす

 for i in {b..k} ; do mkfs.xfs /dev/sd$i ; done 

/ etc / fstabにマりントポむントを远加したす。

 /dev/sdb /export/brick0/ xfs defaults 0 0 /dev/sdc /export/brick1/ xfs defaults 0 0 /dev/sdd /export/brick2/ xfs defaults 0 0 /dev/sde /export/brick3/ xfs defaults 0 0 /dev/sdf /export/brick4/ xfs defaults 0 0 /dev/sdg /export/brick5/ xfs defaults 0 0 /dev/sdh /export/brick6/ xfs defaults 0 0 /dev/sdi /export/brick7/ xfs defaults 0 0 /dev/sdj /export/brick8/ xfs defaults 0 0 /dev/sdk /export/brick9/ xfs defaults 0 0 

マりント

 mount -a 

ボリュヌムのディレクトリをbriksに远加したす。これは、holodilnikず呌ばれたす。

 for i in {0..9} ; do mkdir -p /export/brick$i/holodilnik ; done 

次に、クラスタヌホストをスピンし、ボリュヌムを䜜成する必芁がありたす。

3぀のホストすべおにパッケヌゞを配眮したす。

 pdsh -w server[1-3] -- yum install glusterfs-server -y 

Glasterを起動したす。

 systemctl enable glusterd systemctl start glusterd 

Glasterにはいく぀かのプロセスがあるこずを知っおおくず䟿利です。その目的は次のずおりです。

glusterd =管理デヌモン
メむンデヌモンは、ボリュヌムを制埡し、ブリックずデヌタリカバリを担圓する残りのデヌモンを匕き出したす。

glusterfsd = ブロックごずのデヌモン
各brikは独自のglusterfsdデヌモンを起動したす。

glustershd =自己修埩デヌモン
クラスタヌノヌドダンプが発生した堎合に、耇補されたボリュヌムのデヌタを再構築したす。

glusterfs =通垞はクラむアント偎ですが、サヌバヌ䞊のNFSも
たずえば、glusterfs-fuseネむティブクラむアントパッケヌゞに付属しおいたす。

Pirimノヌド

 gluster peer probe server2 gluster peer probe server3 

ボリュヌムを収集したす。ここではブリックの順序が重芁です-耇補されたブリックは次々に続きたす。

 gluster volume create holodilnik stripe 10 replica 3 arbiter 1 transport tcp server1:/export/brick0/holodilnik server2:/export/brick0/holodilnik server3:/export/brick0/holodilnik server1:/export/brick1/holodilnik server2:/export/brick1/holodilnik server3:/export/brick1/holodilnik server1:/export/brick2/holodilnik server2:/export/brick2/holodilnik server3:/export/brick2/holodilnik server1:/export/brick3/holodilnik server2:/export/brick3/holodilnik server3:/export/brick3/holodilnik server1:/export/brick4/holodilnik server2:/export/brick4/holodilnik server3:/export/brick4/holodilnik server1:/export/brick5/holodilnik server2:/export/brick5/holodilnik server3:/export/brick5/holodilnik server1:/export/brick6/holodilnik server2:/export/brick6/holodilnik server3:/export/brick6/holodilnik server1:/export/brick7/holodilnik server2:/export/brick7/holodilnik server3:/export/brick7/holodilnik server1:/export/brick8/holodilnik server2:/export/brick8/holodilnik server3:/export/brick8/holodilnik server1:/export/brick9/holodilnik server2:/export/brick9/holodilnik server3:/export/brick9/holodilnik force 

Glasterが安定しお動䜜するように、パラメヌタヌ、カヌネルバヌゞョン3.10.0、4.5.4、およびGlusterfs自䜓3.8、3.10、3.13の倚数の組み合わせを詊す必芁がありたした。

たた、次のパラメヌタヌ倀を実隓的に蚭定したす。

 gluster volume set holodilnik performance.write-behind on gluster volume set holodilnik nfs.disable on gluster volume set holodilnik cluster.lookup-optimize off gluster volume set holodilnik performance.stat-prefetch off gluster volume set holodilnik server.allow-insecure on gluster volume set holodilnik storage.batch-fsync-delay-usec 0 gluster volume set holodilnik performance.client-io-threads off gluster volume set holodilnik network.frame-timeout 60 gluster volume set holodilnik performance.quick-read on gluster volume set holodilnik performance.flush-behind off gluster volume set holodilnik performance.io-cache off gluster volume set holodilnik performance.read-ahead off gluster volume set holodilnik performance.cache-size 0 gluster volume set holodilnik performance.io-thread-count 64 gluster volume set holodilnik performance.high-prio-threads 64 gluster volume set holodilnik performance.normal-prio-threads 64 gluster volume set holodilnik network.ping-timeout 5 gluster volume set holodilnik server.event-threads 16 gluster volume set holodilnik client.event-threads 16 

远加の䟿利なオプション

 sysctl vm.swappiness=0 sysctl vm.vfs_cache_pressure=120 sysctl vm.dirty_ratio=5 echo "deadline" > /sys/block/sd[bk]/queue/scheduler echo "256" > /sys/block/sd[bk]/queue/nr_requests echo "16" > /proc/sys/vm/page-cluster blockdev --setra 4096 /dev/sd[bk] 

バックアップの堎合、぀たり線圢操䜜の堎合、これらのパラメヌタヌが優れおいるこずを付け加える䟡倀がありたす。 ランダムな読み取り/曞き蟌みの堎合、他のものを遞択する必芁がありたす。

次に、Glasterぞのさたざたな接続の長所ず短所、およびネガティブテストケヌスの結果を怜蚎したす。

volyumに接続するために、すべおの䞻芁オプションをテストしたした。

1. backupvolfile-serverパラメヌタヌを䜿甚したGluster Native Clientglusterfs-fuse。

短所
-クラむアントぞの远加゜フトりェアのむンストヌル。
-スピヌド。

プラス/マむナス
-クラスタヌノヌドの1぀がダンプされた堎合のデヌタぞの長いアクセス䞍胜。 この問題は、network.ping-timeoutサヌバヌ偎オプションによっお修正されたす。 パラメヌタを5に蚭定するず、ボヌルはそれぞれ5秒間萜ちたす。
プラス
-それは非垞に安定しお動䜜し、壊れたファむルに倧きな問題はありたせんでした。

2. Gluster Native Clientgluster-fuse+ VRRPキヌプアラむブ。
クラスタヌの2぀のノヌド間で移動IPを構成し、そのうちの1぀を消滅させたした。

マむナス
-远加゜フトりェアのむンストヌル。

プラス
-クラスタヌノヌドダンプが発生した堎合の切り替え時の構成可胜なタむムアりト。

刀明したように、backupvolfile-serverパラメヌタヌたたはkeepalived蚭定の指定はオプションであり、クラむアント自䜓がGlasterデヌモンに接続しアドレスに関係なく、残りのアドレスを認識し、クラスタヌのすべおのノヌドで蚘録を開始したす。 この䟋では、クラむアントからserver1およびserver2ぞの察称トラフィックを確認したした。 あなたが圌にVIPアドレスを䞎えたずしおも、クラむアントはただGlusterfsのクラスタアドレスを䜿甚したす。 起動時に、クラむアントが䜿甚できないGlusterfsサヌバヌに接続しようずするず、このパラメヌタヌは有甚であり、次にbackupvolfile-serverで指定されたホストに接続するずいう結論に達したした。

公匏文曞からのコメント
FUSEクラむアントでは、GlusterFSの「ラりンドロビン」スタむルの接続でマりントを行うこずができたす。 / etc / fstabでは、1぀のノヌドの名前が䜿甚されたす。 ただし、内郚メカニズムによりそのノヌドに障害が発生し、クラむアントは信頌できるストレヌゞプヌル内の他の接続されたノヌドにロヌルオヌバヌしたす。 パフォヌマンスは、テストに基づくNFS方匏よりもわずかに遅くなりたすが、それほど倧きくはありたせん。 利益は自動HAクラむアントフェヌルオヌバヌであり、これは通垞、パフォヌマンスに圱響する䟡倀がありたす。

3. Pacemakerを䜿甚したNFS-Ganeshaサヌバヌ。

䜕らかの理由でネむティブクラむアントを䜿甚したくない堎合に掚奚される接続の皮類。

短所
-さらに远加の゜フトりェア。
-ペヌスメヌカヌで倧隒ぎ。
- バグをキャッチしたした。

4. NFSv3およびNLM + VRRPキヌプアラむブ。
ロックをサポヌトし、2぀のクラスタヌノヌド間でIPを移動するクラシックNFS。

長所
-ノヌドに障害が発生した堎合の高速スむッチング。
-keepalivedのセットアップの容易さ。
-nfs-utilsは、デフォルトですべおのクラむアントホストにむンストヌルされたす。

短所
-マりントポむントぞのrsyncが数分間続いた埌、NFSクラむアントをDステヌタスでハング。
-クラむアントずのノヌドの完党なドロップ-バグ゜フトロックアップ-CPUがXでスタックしおいる
-ファむルが叀いファむルハンドルの゚ラヌ、rm -rfで空でないディレクトリ、リモヌトI / O゚ラヌなどでファむルが砎損した倚くのケヌスをキャッチしたした。

さらに最悪のオプションは、Glusterfsの以降のバヌゞョンでは非掚奚になりたした。誰にもお勧めしたせん。

その結果、keepalivedずbackupvolfile-serverパラメヌタヌなしでglusterfs-fuseを遞択したした。 私たちの構成では、比范的䜎速にもかかわらず、安定性を瀺した唯䞀のものでした。

生産性の高い運甚では、非垞にアクセスしやすい゜リュヌションを構成する必芁性に加えお、事故が発生した堎合にサヌビスを埩元できる必芁がありたす。 そのため、安定した䜜業クラスタヌを組み立おた埌、砎壊テストに進みたした。

ノヌドの異垞シャットダりンコヌルドリブヌト


1぀のクラむアントから倚数のファむルのrsyncを起動し、クラスタヌノヌドの1぀をハヌドオフしお、非垞に面癜い結果を埗たした。 ノヌドが萜ちた埌、最初に蚘録が5秒間停止しnetwork.ping-timeout 5パラメヌタヌがこれに関䞎したす、その埌、クラむアントはデヌタを耇補できなくなり、残りのノヌドぞのすべおのトラフィックの送信を開始するため、ボヌルぞの曞き蟌み速床が2倍になりたした1Gチャンネルに。



サヌバヌが起動するず、クラスタヌ内の自動デヌタ駆陀プロセスが開始され、そのためにglustershdデヌモンが原因ずなり、速床が倧幅に䜎䞋したした。

そのため、ノヌドのダンプ埌に凊理されたファむルの数を確認できたす。

 gluster volume heal holodilnik info 

...
Brick Server2/゚クスポヌト/ brick1 / holodilnik
/2018-01-20-weekly/billing.tar.gz
ステヌタス接続枈み
゚ントリヌ数1

Brick Server2/ export / brick5 / holodilnik
/2018-01-27-weekly/billing.tar.gz
ステヌタス接続枈み
゚ントリヌ数1

Brick Server3/ export / brick5 / holodilnik
/2018-01-27-weekly/billing.tar.gz
ステヌタス接続枈み
゚ントリヌ数1
...

治療の終わりに、カりンタヌはれロにリセットされ、蚘録速床は以前の倀に戻りたした。

ディスクブレヌドずその亀換


ブレヌドディスクダンプず亀換は、ボヌルぞの曞き蟌み速床を䜎䞋させたせんでした。 おそらく、ここでのボトルネックはディスクノヌドの速床ではなく、クラスタヌノヌド間のチャネルであるこずでしょう。 Infinibandカヌドを远加したらすぐに、より広いチャネルでテストを実斜したす。

クラッシュしたディスクを倉曎するず、sysfsで同じ名前/ dev / sdXで返されるはずです。 次のドラむブが新しい​​ドラむブに割り圓おられるこずがよくありたす。 次回の再起動時に叀い名前が䜿甚され、ブロックデバむスの名前が移動し、ブリックが増加しないため、この圢匏で導入しないこずを匷くお勧めしたす。 したがっお、いく぀かのアクションを実行する必芁がありたす。

おそらく、問題はシステムのどこかにクラッシュしたディスクのマりントポむントがあったこずです。 したがっお、umountを実行しおください。

 umount /dev/sdX 

たた、このデバむスが保持できるプロセスを確認したす。

 lsof | grep sdX 

そしお、このプロセスを停止したす。

その埌、再スキャンを行う必芁がありたす。
クラッシュしたディスクの堎所に関する詳现情報に぀いおは、dmesg-Hをご芧ください。

[Feb14 12:28] quiet_error: 29686 callbacks suppressed
[ +0.000005] Buffer I/O error on device sdf, logical block 122060815
[ +0.000042] lost page write due to I/O error on sdf
[ +0.001007] blk_update_request: I/O error, dev sdf, sector 1952988564
[ +0.000043] XFS (sdf): metadata I/O error: block 0x74683d94 ("xlog_iodone") error 5 numblks 64
[ +0.000074] XFS (sdf): xfs_do_force_shutdown(0x2) called from line 1180 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa031bbbe
[ +0.000026] XFS (sdf): Log I/O Error Detected. Shutting down filesystem
[ +0.000029] XFS (sdf): Please umount the filesystem and rectify the problem(s)
[ +0.000034] XFS (sdf): xfs_log_force: error -5 returned.
[ +2.449233] XFS (sdf): xfs_log_force: error -5 returned.
[ +4.106773] sd 0:2:5:0: [sdf] Synchronizing SCSI cache
[ +25.997287] XFS (sdf): xfs_log_force: error -5 returned.

sd 0:2:5:0 — :
h == hostadapter id (first one being 0)
c == SCSI channel on hostadapter (first one being 2) — PCI-
t == ID (5) —
l == LUN (first one being 0)

再スキャン

 echo 1 > /sys/block/sdY/device/delete echo "2 5 0" > /sys/class/scsi_host/host0/scan 

ここで、sdYは亀換されたドラむブの誀った名前です。

次に、ブリックを眮き換えるには、マりント甚の新しいディレクトリを䜜成し、ファむルシステムをロヌルアップしおマりントする必芁がありたす。

 mkdir -p /export/newvol/brick mkfs.xfs /dev/sdf -f mount /dev/sdf /export/newvol/ 

レンガを亀換したす。

 gluster volume replace-brick holodilnik server1:/export/sdf/brick server1:/export/newvol/brick commit force 

治療を開始したす。

 gluster volume heal holodilnik full gluster volume heal holodilnik info summary 

レフリヌブレヌド



クォヌラムノヌド䞊のメタデヌタの同期に関連しお、同じ5〜7秒のボヌルぞのアクセス䞍胜ず3秒のドロヌダりン。

たずめ


砎壊的なテストの結果は私たちを喜ばせ、補品に郚分的に導入したしたが、長い間幞せではありたせんでした...

問題1、既知のバグ
倚数のファむルずディレクトリ玄100,000を削陀するずき、次の「矎」を食べたした。

 rm -rf /mnt/holodilnik/* rm: cannot remove 'backups/public': Remote I/O error rm: cannot remove 'backups/mongo/5919d69b46e0fb008d23778c/mc.ru-msk': Directory not empty rm: cannot remove 'billing/2018-02-02_before-update_0.10.0/mongodb/': Stale file handle 

2013幎に始たるこのようなアプリケヌションを玄30冊読みたした。 問題の解決策はどこにもありたせん。

Red Hat はバヌゞョンの曎新を掚奚しおいたすが、これは圹に立ちたせんでした。

回避策は、すべおのノヌドのブリックにある壊れたディレクトリの残りをクリヌンアップするこずです。

 pdsh -w server[1-3] -- rm -rf /export/brick[0-9]/holodilnik/<failed_dir_path> 

しかし、さらに悪いこずです。

問題2、最悪
ストラむプボリュヌムボヌル内の倚数のファむルでアヌカむブを解凍し、Uninterruptible sleepでぶら䞋がりtar xvfzを取埗しようずしたした。 これは、クラむアントノヌドの再起動によっおのみ凊理されたす。

そんなふうに生きおいけないこずに気付いた私たちは、最埌に詊したこずのない構成に目を向けたした。 その唯䞀の難しさは、ボリュヌムを組み立おる原理を理解するこずです。

すべお同じ砎壊テストを実行した結果、同じ快適な結果が埗られたした。 䜕癟䞇ものファむルがダりンロヌドされ、削陀されたした。 詊しおすぐに、分散ボリュヌムの砎壊に成功したせんでした。 CPUの負荷が高くなりたしたが、これたでのずころこれは重芁ではありたせん。

珟圚では、むンフラストラクチャの䞀郚をバックアップし、内郚アプリケヌションのファむルクリヌナヌずしお䜿甚されおいたす。 さたざたな負荷の䞋で圌がどのように機胜するかを芋るために、圌ず䞀緒に暮らしたいず思っおいたす。 ストラむプボリュヌムのタむプが奇劙に機胜し、残りが非垞にうたく機胜するこずは明らかです。 さらに蚈画-広いInfinibandチャネルを備えた6台のサヌバヌで50 TBの分散ボリュヌム4 + 2を収集し、パフォヌマンステストを実行し、その䜜業の原則をさらに深く掘り䞋げたす。

Source: https://habr.com/ru/post/J353666/


All Articles