課題
データベースオブジェクト、つまりテーブルと列のみを追加し、それらを変更または削除しないというプラクティスがあることを認識しています
私が働いていたある会社で、生データのローリングウィンドウは約6か月に相当し、10 TBを消費しました。その後、データはRDBMS形式に処理され、6 TBの使用可能なデータがかかり、報告可能なデータの約10年間を占めました。重要なのは、これらの種類のプラクティスは大規模では、単に実用的ではないということです。ストレージは高価です-おそらく最大のコンピューティング費用。これには、いくつかの興味深い課題があります。
- バックアップ -innodbプラグインは優れていますが、その量のデータのバックアップ時間はそれほど実用的ではありません
- 復元時間 -大規模なデータセットの場合-特に、復元が動作状態に戻るまでに数日から数週間かかる場合があるため、レプリケーションが必要な場合
- 新しいインスタンスの作成/シード -多くの場合、開発/テストで行う作業には、データセットのETL(抽出、変換、および読み込み)ジョブが含まれます。これらは、QAテストユニットを使用して検証する必要がありますが、元の実稼働データセットが保持されるように、非破壊的な方法でこれを行う必要があります。災害時には、バックアップは保険であり、それを回避することを目的としているため、DevOps開発ワークフローでは、基本的に、復元または定期的に(おそらく1日に複数回)データのコピー
- 容量 -今説明した規模で大量のデータを処理することは、I / Oを集中的に使用する可能性があります。1-3で説明した問題に対処する必要があるだけでなく、運用システムの停止やパフォーマンスの低下を引き起こさない方法でそれを行う必要があります。
上記の考慮事項は小規模では問題にならないかもしれませんが、大規模ではこれらは大きな問題になります。つまり、要件を定義し、データセットのサイズを予測することが非常に重要です。
要件の定義
そのため、いくつかの要件を定義する必要があります。
- RTO-バックアップのRTOまたは復元時間目標は、データベースバックアップソリューションの最も重要な要因の1つです。最初は、他のほとんどの問題に関連していないように見えるかもしれませんが、「新しいインスタンスを作成またはシードするためにバックアップソリューションを使用した場合はどうすればよいですか?」次のセクションでは、そのためのいくつかの手法について説明します。
- RPO-バックアップのRPOまたは復元ポイントの目標は、A)どれくらい前まで復元できるか(分、時間、日、週、月、または年)B)さまざまな層でのバックアップ間隔とC)復元方法。たとえば、電子メールデータベースの場合、メッセージレベルのバックアップ(特定の電子メールの復元)がよく求められます。同様に、数日間のデータはまったく役に立たない場合があります。したがって、1年前に復元しても意味がありません。
- データセットのサイズ -これは重要です。1MBのデータベースでは、ほとんどのバックアップ製品とソリューションでRTOを達成できるためです。しかし、10TBのデータベースに対しては、LTO 3テープへの完全な、行レベルのバックアップがあることでしょう、おそらくあなたのRTOを達成することはありませんし、バックアップは、バックアップウィンドウを超え始めるので、あなたのRPOを妨げる可能性があります。この大規模なデータセットでmysqldumpを正確に実行することはできませんが、おそらく1MBデータベースでmysqldumpを使用できます。
- データベースの一貫性 - データベースを使用する際に、継続的な展開、サイトの信頼性、スケーラビリティ、および高可用性に大きな違いをもたらす最後のことは、一貫性の必要性(または不足)です。3つの基本タイプがあります:即時整合性、ジャストインタイム(JIT)整合性、および最終整合性
上記の主要な考慮事項に加えて、ライセンスとサポートの要件(オープンソースまたはクローズドソース、社内サポート、サードパーティのサポートまたはベンダーのサポート)のアプリケーション/言語要件(多くのデータベースのコネクタが重要になる可能性があります。あなたのアプリはコンパイルされていますか?ソースコードにアクセスできますか?それを再コンパイルできますか、それともベンダーから提供されますか?またはインタープリター言語で実行されますか?)政治的要件(あなたの組織はOracleだけを信頼していますか? ?彼らはMySqlを信頼していませんか?MariaDBまたはPostgresについてどう思いますか?)およびデータベースエンジン(innoDB?MyISAM?Blackhole?NDB Cluster?Spider?)および歴史的または互換性の要件(私たちは何年もコードの半分でPL / SQLを使用しました) Oracleエンジンに組み込まれています!MariaDBにどのように移植できますか?!?)
これらのすべてが(かなり)使用可能なツールに影響します。
社内データ管理のオプション
注:以下は完全なものではありません。他のSEユーザーは、追加の提案を聞いてください。
汎用的な考慮事項を無視して、上記に対処するためのいくつかのテクニックとテクノロジーを提供します。まず、本当にRDBMSを使用する必要があるのか、Hadoop、CouchDB、またはObject Oriented Storage(swiftなど)のような非構造化データがオプションであるのかを自問してください。
第二に、クラウドベースのソリューションを検討することを検討してください。これは、この頭痛の種の一部を外部委託し、複雑な問題を有能な(そして有給の)個人に任せます。ただし、大規模な場合、これは予算に実際に食い込んでいることがわかります(クラウドプロバイダーはこれで利益を上げますが、特定の規模では、これらの専門家を自分で雇うだけの余裕があります)または特定のセキュリティまたは政治の下で働いている場合要件(読み取り:クラウドを実行できません)は、ハイブリッドNFS / FibreChannel Filerを検討します。NetApp、Pure Storage、Tegileなどのこれらのファイラーのほとんどは、A)バックアップの作成、B)バックアップの復元、C)新しいバックアップのシードに非常に便利なデルタベースのスナップショットとクローン作成の手法をサポートしています。
この時点で、私はバックアップとストレージの専門家ではないことに注意する必要があります。そのため、他の問題(および環境に優しい牧草地)に進む前に解決できなかったこの問題の一部があります。
ただし、これらの製品を使用すると、データベースの下で差分スナップショットを取得できます。データベースインスタンスの1つ(読み取り専用スレーブを推奨)で完全な「読み取りロック付きのロックテーブル」をスクリプト化して、binlog位置またはGTIDをダンプする必要がありますが、これらのファイラーについては、一度行うと、これらのスナップを使用して、データベースの新しいインスタンスを作成します。binlogを別のパーティションに配置し、データベースデータのみをこれらのパーティションに配置します。これを行うと、これらのパーティションのクローンを作成できます(NetAppでは、これは「FlexClone」として知られています)
これは、ブロックごとにファイラーがデータが凍結された元のスナップショットまたはデルタにあるかどうかを判断する必要があるためです。複数のスナップショットを持つボリューム/ストアの場合、これを複数回確認する必要がある場合があります。これを克服するには、データを更新します(つまり、スナップショットを破棄し、定期的に再度クローンします-これは、適切な継続的デプロイメント環境では自然かつ有機的に発生する可能性があります)または、ボリュームを永続的に分割する(NetApp用語では「Flex Split」と呼ばれます) )デルタを恒久的に解決し、まったく新しい別個のボリュームを作成するには少し時間がかかります。
これらのデルタクローンには、全体的なストレージ要件を削減するという追加の利点があります。複数のクローンまたは実稼働データベースデータのインスタンスを生成して、開発、テスト、および検証を行うことができます。大規模なデータセットのコピーを1つだけに加えて(可能性が高い)小さなデルタのみを保持する場合、全体的なストレージコストとフットプリントを削減できます。
ここでの唯一の秘isは、「バックアップ」がファイラーに残っているため、これが完全バックアップソリューションを構成しない可能性があることです。そのためには、NetAppがSnap Mirrorと呼ぶものを使用して、ファイラーとデータセンター間でデータをミラーリングする(rsyncスタイルの技術を使用)か、デルタスナップショットの1つまたはフレックスクローン。
ただし、これには1つの大きな欠陥があります。すべてのデータ-dev、test、およびprodは、同じファイラーとストレージヘッドでI / Oをまだ使用しています。この問題を回避するには、2番目のファイラーにスレーブデータベースインスタンスを作成します。これは、テストファイラーまたはdevファイラーのシードポイントになるか、アプリケーションレイヤーのロードバランサー/アプリケーション配信コントローラーを使用して実稼働要求をミラーリングします。テスト(および/または開発)環境。これには、すぐに気付かない可能性のある問題を実稼働環境にプロモートする前に、QA /テスト環境で製品トラフィックをスローするという追加の利点があります。その後、本番トラフィックとユーザーの行動に基づいてログのエラーを確認できます。
これにより、いくつかのスクリプトを使用して、継続的な展開方法で使用するために(および大規模な)データセット全体をプログラムで生成および破棄できるようになります。
スケーラビリティと高可用性
継続的な展開についてお聞きしましたが、DevOpsは単なる継続的な展開以上のものであると考えられているため、冗長性、スケーラビリティ、高可用性について少し説明します。
私は、JIT、即時および最終的な一貫性について言及しました。これは、さまざまなRDBMSエンジンの出番です。循環非同期レプリケーションを構成するだけで、結果の一貫性は比較的簡単です。ただし、これにより衝突が発生する可能性があります*(レプリケーションが完了する前にアプリケーション層がクラスターの片側とクラスターの反対側のデータを更新した場合はどうなりますか?)即時の整合性については、同期レプリケーションを強制するGaleraクラスターをご覧くださいスケーラビリティの問題を引き起こします(ネットワークレイヤーでの伝搬遅延による大幅な遅延を発生させずに、地理的に災害復旧サイトに複製するか、負荷分散する方法)データセンター内で同期複製とサイト間の非同期複製を実行できるかどうかも確認できます。しかし、これは両方の世界の最悪のようです。
ただし、通常、ほとんどの人は完全な同期レプリケーションを必要としません。これは通常、テーブルシャーディングでマルチマスターが必要な非常に特殊な(そしてエキゾチックな)高書き込み環境にのみ必要です。ほとんどのアプリは、データベースプロキシを使用してJust-In-Timeの一貫性を処理できます。たとえば、ScaleArcはレプリケーションステータスを監視し、書き込みがどこに行ったのかを追跡して(レプリケーションが追いつくまで副次的な読み取り要求を送信するため)、ジャストインタイムの一貫性と外観を提供しますデータベースの一貫性。ScaleArcはPostgres、MySQL、MariaDB、Oracle、MSSQLと互換性があり、正規表現を使用して、シャードキーを使用できないアプリケーション用にデータベースをシャード/パーティション分割できます。また、構成管理ソフトウェアとやり取りするための堅牢なREST APIがあり、サポートチームは卓越しています
同様に、MariaDBチームがMariaDB用に開発したMaxScaleを無料で検討することもできます。ただし、GUIとScaleArcのキャッシュ機能の一部が欠けています。
最後に、MySQLファブリック(および、RAM内のMySQL Cluster-十分なRAMを購入できる場合)は、特にMySQLの新しいプロキシの場合、他の可能性もあります。これにより、環境にスケーラビリティと冗長性のコンポーネントを提供できます。
PostgresとOracleには必要なレプリケーションおよびシャーディング機能が必要ですが、プロキシが必要な場合はScaleArcはうまくペアリングします。
最終的に、クラウドベースの環境を単純に使用できず、クラウドプロバイダーが上記の問題に対処することができない場合、これらすべての要素は、継続的な展開と開発に適した柔軟性の高い環境になります。