こんにちは、WhaTap Labs DevOpsチームリーダーのソンジェジンです。
DevOpsチームは、WhaTapサービスインフラ管理からCI / CD、課題処理、顧客応対、技術文書の作成まで、幅広い作業を行います。
技術業務のうち、サービス開発を除く残りのすべてを行っていると言えます。
WhaTap Monitoringサービスは、世界中の数万台のサーバーと毎秒100万件以上のトランザクションをリアルタイムでモニタリングするのに十分な量のデータを収集します。
収集サーバーDiskに保存される量は6Tb /日レベルで、保存量は毎日増加しています。
WhaTapサービスの核となるデータ、このデータ保存方式の効率化のため、コードではなくインフラの観点から悩んだ話をしたいと思います。 😄
WhaTapサービスのモニタリングの単位は、**「プロジェクト」**と呼ばれます。1つのプロジェクトは、1ユニットのアプリケーショングループでも、1ユニットのサーバーグループでもかまいません。そして Kubernetes は 1 つの NameSapce が最小単位になります。ほとんどはサーバー数台、アプリケーション数個程度を1つのプロジェクトで構成しています。
データ保存もプロジェクトが基準となります。
保存量合計が6Tb/日、総プロジェクト数は10,000個程度なので、プロジェクトあたり600Mb/日が平均です。新しいプロジェクトが作成されると、何十代ものリポジトリの中で最もリラックスしたVMになります。VMに割り当てられたボリュームはモニタリングデーモンによって管理され、スペースが不足すると予想される場合はクラウドプロバイダのapiを呼び出してボリュームサイズを増やします。
日々、このサービスは繁栄し、システムは自動化の力で知り、よく転がっていく平和な時代を過ごしていました。
そんなある日、大規模な顧客会社Kubernetesモニタリングプロジェクト1つで危険信号を検出しました。
1 つの NameSapce で数百のポッドが作成されると、1 日で 1 Tb 以上のデータが蓄積し始めます。
プロジェクト数の増加は自然にスケールアウトされますが、1つのプロジェクトで膨大なデータを保存することは予期しないことです。
WhaTap Monitoringサービスは、1ヶ月間のデータ保管を保証する必要があります。宿題ができました。このままだと数日でボリュームサイズ制限に達するからです。
使用量の推移を数日見てみると、ボリュームサイズが16Tbを超えることが確実になりました。そのプロジェクトだけが新しいVMに移動し、移動したVMのボリュームはLVMで構成され、2つのボリュームをまとめました。
ところで、積み重ねられたデータを顧客が一生懸命照会するときになるため、パフォーマンス問題が発生しました。LVM自体ではパフォーマンスの低下を引き起こすことはありませんが、拡張を念頭に置いてLinearで構成した結果、ディスクの2つのうちの1つだけを懸命に書き込むことが問題になりました。
I / Oのパフォーマンスが低下し、LVMでStripeを考えました。
LVMのStripeはraid0方式なので、欠点も同じです。各ボリュームのサイズも一致する必要があり、後でボリュームのサイズを変更することはできません。この構成は、LVMの柔軟性を大幅に削減します。
クラウド環境でDisk Failを心配することはありませんが、設定の変更によってStripe情報が失われる場合はかなり頻繁なので、心配しました。
ストレージの特性上、Random I/O で常時数千 IOPS を使用し、即時の Latency を必要とするために HDFS などの分散ファイルシステム、Object Storage はそもそも考慮対象にはなりません。
あの夜遅くまで悩んでいた私は**"LVMでLinearのようにStripeを構成できたらどれだけいいのか?"**と願いながら眠りました。
翌日、出勤の道 "zfs、btrfs 二人の中から選んでみなさい" とGoogleが願いに答えました。どちらも聞いたことのあるやつらですが、関心を持ってみたり、実際に適用してみるつもりはありませんでした。
zfsのホームページに掲載されている紹介はすごかったです。
なんとファイルシステム系の万能薬です。これが全部できるのだろうか? と細部の機能を覗いてみると、本当にできそうに見えました。
本当か確認してみることにしました。
サービスデータの一部をミラーリングして、運用リポジトリの2倍以上のプロジェクトを収容するように厳しい環境を作りました。
Canaria環境はこうです、名前は「カナリ」です。
Linux環境では、管理とモニタリングはbtrfsには多くの利点がありましたが、単純なパイロットの結果として、私たちのサービスにはzfsがより適切だという結論を出しました。
発展の可能性を見れば断然btrfsですが、現在は残念な点が少しあります。今後、btrfsは通常のzstdに対して5倍以上の圧縮率のzstd dictionary、最速のlz4サポートが予定されていますね。予定通りになれば2~3年後にzfsをbtrfsに変える作業もできると思います。
btrfs.wiki.kernel.org/index.php
そして、lz4圧縮サポートが大きかったです。zfsのlz4はbrfsのlzo、zstdと比較したとき、Random I/O 速度差が "非常に" 大きかったです。
ただし、私たちのように即時のラテンシーが切実でなければ、btrfs + zstdの組み合わせも素晴らしい選択だと思います。
| アルゴリズム | 圧縮率 | 圧縮性能 | 解凍性能 | | ---------- | ------- | -------- | --------- | | gzip | 2.743x | 90 MB/s | 400 MB/s | | lzo | 2.106x | 690 MB/s | 820 MB/s | | lz4 | 2.101x | 740 MB/s | 4530 MB/s | | zstd | 2.884x | 500 MB/s | 1660 MB/s |
出典**:** https://facebook.github.io/zstd/
一般的な環境では、ファイルシステムの特性によるパフォーマンスの違いを体感することは困難ですが、リポジトリは極端なI / Oを誇ります。
我が社のリポジトリの特性です。
カナリ環境テストの結果は次のとおりです。
結果にとても驚きました。zfsを使わない理由が、**"全く"、"Never"**ありません。特にボリューム圧縮を適用した場合、I/O パフォーマンスがさらに向上するという事実は非常に促されていました。
ext4をzfsに変更すると、次のような利点が期待されます。
楽なボリューム管理
パフォーマンス
コスト削減
いくつかの欠点がありますが、利点はすべてを超えています。
多少のメモリとCPU使用量が増加するが、これをTrade Offしても性能とコスト削減の利点があまりにもサイズに10回譲っても残る商売です。
欠点
「カナリ」環境で素晴らしい結果を見せたので、すぐにProduction環境の適用を始めました。合計150Tb以上のファイルシステムの移行は3ヶ月にわたって順次行われ、無難な過程ですが、いくつかの試行錯誤があり、まとめておきます。
ZFSのバージョンはさまざまで、モジュールの提供方法もいくつかあります。ディストリビューションに組み込まれているZFSよりも、OpenZFS 2.0xバージョン+ dkmsで配布されたモジュールがパフォーマンス/安定性の点で優れていました。悩まないでこのバージョンを使ってください。
ぜひ! 2.0.xバージョンを使ってください。違いがとても大きいです。
#Ubuntuなら、
sudo add-apt-repository ppa:jonathonf/zfs
sudo apt-get install -y zfs-dkms
デフォルトは無難ですが、わずかなオプション調整が加わるとパフォーマンスが大幅に向上します。ただし、すべての場合に通用される万能薬はないし、順序 vs Randomなどの特性に合わせて適切に調整する必要があります。
たとえば、recordsize を大きくとると圧縮率、順次保存性能が向上しますが、Random性能は低くなる式のTrade Offがあります。
ガイドは親切に出ています。
https://openzfs.github.io/openzfs-docs/Performance and Tuning/Workload Tuning.html
#ワタップ収集サーバーに適用されるオプション
sudo zpool set ashift=12 yardbase
sudo zfs set compression=lz4 yardbase
sudo zfs set atime=off yardbase
sudo zfs set sync=disabled yardbase
sudo zfs set dnodesize=auto yardbase
sudo zfs set redundant_metadata=most yardbase
sudo zfs set xattr=sa yardbase
sudo zfs set recordsize=128k yardbase
Production環境で特に問題なく適用され、うまく使用されたら、Disk Specを下げようとしました。
AWSリージョンはgp2をgp3に変更しました。gp2に比べてgp3は latencyがやや低く帯域幅は半分ですが、費用が 20% 近く安いです。 パフォーマンスの違いは以下のblogに従いましたが、私たちが既存のext4で測定したのとあまり変わりません。
https://silashansen.medium.com/looking-into-the-new-ebs-gp3-volumes-8eaaa8aff33e
AzureリージョンはプレミアムSSDを標準SSDに変更しました。
Azureの標準SSDは非常に低いパフォーマンスを持っていますが、実際にはHDDよりも少し優れています。
Wow!! 変えても十分です。
特に、Azureの標準SSDでうまく動作するとは予想していませんでした。
ZFSのraidz stripeがDisk数ほど性能が線形的に増加したため、低いSpec Diskもまったく無理ではありませんでした。
柔軟なボリューム管理とパフォーマンス改善の目的でZFSを適用しましたが、最大のパフォーマンスは「費用」でした。
ZFSを完全に適用し、総ボリュームサイズを100Tb以上削減しました。 100Tbのボリュームコストを削減しました。さらに、残りのDiskはDowngradeで20%以上の費用を削減しました。
ZFSの導入により、すべての所望の結果が得られました。
削減されたディスクコストは、再び顧客に投資することにしました。
I/Oの特性上、当社のサービスでDiskが占める管理費用が最も大きかったのですが、この部分が解決されて大きな決定をすることになりました。
管理が容易になり、IO性能が改善され、ストレージ容量が減るようになり、**「統計データの保存周期を1ヶ月から1年に変更」**することにしました。
Diskの管理とDisk I / Oのパフォーマンスの問題に悩んでいる場合は、ZFSを確認してください。メリットがとても多いです。
十分なテストとオプション調整が伴う場合、ZFSは必ずI / Oボトルネック地獄からあなたを救います。
十分なテストはWhaTapでよくモニタリングしてください。