CockRoachバックアップを使用してデータを保護する

公開: 2019-07-24

企業が規模を拡大し始めると、はるかに速い速度でデータの収集を開始します。 このデータの適切なバックアップと復元の手順を使用して、緊急事態に備えて計画することが不可欠です。

実行可能な状態に復元する方法を計画せずに、すべてのユーザーデータが消去されるという悲惨なことを想像してみてください。

今日は、ここJustunoで使用しているいくつかのテクノロジーを利用した簡単なバックアップと復元の計画について説明します。 CockRoachDB、Google Cloud Storage、およびGolangaGoogleがプログラミング言語を作成しました。

CockRoachDBのことを聞いたことがなくても、PostgresやMySQLなどの他のデータベースシステムを使用したことがある場合は、自宅にいるように感じるでしょう。 CockRoachには、GitHubによると、分散システムであるという追加の利点があります。これは、「トランザクション型で一貫性の高いKey-Valueストア上に構築されています。 水平方向に拡張し、ディスク、マシン、ラック、さらにはデータセンターの障害にも耐え、遅延の中断を最小限に抑え、手動による介入を行わず、一貫性の高いACIDトランザクションをサポートします。」

フォローしたい場合は、CockRoachインストールガイドに進んで、Enterpriseエディションの30日間の無料トライアルをローカルでセットアップしてください。 また、Google Cloud Storageアカウントにサインアップして、Golangをシステムにインストールする必要があります。

セットアップが完了したら、GCSコンソールに移動し、プロジェクトの作成から始めます。

CockRoach作成プロジェクト

その後、バケットを作成するという画面が表示されたら、そのオプションをクリックします。

ゴキブリ作成バケット

一意の名前、地域、場所を選択し、オブジェクトレベルとバケットレベルの権限を設定する必要があります。 成功すると、下の私のような画像が表示されます。 繰り返しになりますが、設定はユースケースによって異なりますが、従うために、デフォルトを使用することは問題ありません。

CockRoachプロジェクト設定

次に、CockRoachバックアップをGoogleクラウドストレージに直接アップロードできるようにするいくつかのデータベース構成設定に対処する必要があります。 GCSの利用に興味がない場合。 CockRoachは、Amazon、Azure、Http、NFS/ローカルバックアップファイルのURLもサポートしています。 詳細については、こちらをご覧ください。

画面の左側にあるメニューを開き、[APIとサービス]および[資格情報]オプションを選択します。 これで、「資格情報の作成」という画面が表示されます。 この目的のために、サービスアカウントキーに関心があります。

CockRoach資格情報

次の画面で、[新しいサービスアカウント]を選択します。 サービスアカウント名を作成します。 ロールタイプを選択し、キータイプとしてJSONを選択していることを確認してください。 この特定のチュートリアルでは、プロジェクトと所有者を選択します。 実稼働環境では、より制限的な役割が必要になります。

ゴキブリのスクリーンショット

完了すると、自動ダウンロードはJSONコンテンツから開始されます。これは、次の図のようになります。

CockRoach JSON

次に、選択したツールを使用してゴキブリインスタンスに接続し、PostgresにはSQLProを使用します。 ほとんどのPsqlドライバーを利用してCockroachインスタンスに接続できます。 ローカルインスタンスを実行しているときに端末を介して接続する場合は、次を実行できます。

=>ゴキブリsql–insecure –host = localhost

最初に行うことは、JSONファイルのコンテンツでcloudstorage.gs.default.keyを更新することです。

CockRoachJSONコンテンツ

上の画像のように、最初に現在の設定を確認してください。

クラスター設定を表示cloudstorage.gs.default.key;

次に、gs.default.keyをJSONファイルの内容に設定します。

SET CLUSTER SETTING cloudstorage.gs.default.key='Jsonコンテンツ'

セットアップと構成が完了したので、次は実際のコードである楽しいものに取り掛かります。

Goプロジェクトを作成することから始めます。 私の名前はbackup-managerです。 次に、ルートディレクトリにmain.goファイルを作成し、マネージャーディレクトリにcrdb.goという名前のファイルを作成します。 マネージャディレクトリはアプリケーションロジックの要点を保持し、ファイル構造は私のものと似ているはずです。

CockRoachマネージャーディレクトリ

次に、いくつかのパッケージをインストールし、ターミナルを開いて、プロジェクトのルートに移動する必要があります。 次を実行します。

「github.com/lib/pq」を入手してください

「データベース/SQL」を取得します

github.com/lib/pqを入手してください

「cloud.google.com/go/storage」を取得します

「github.com/snabb/isoweek」を入手してください

これらをインストールした後、データベース接続を確立するためにファイルの先頭にいくつかの定数を設定します。 これらの定数は、ホスト、ポート、ユーザー、パスワード、およびdbnameになります。

ゴキブリ定数

main内では、設定した定数を使用してpsql接続文字列を作成し、データベースへの接続を確立しようとします。 エラーが発生した場合、パニックになります。

CockRoachpsql接続

あなたのファイルは私のものに似ているはずですが、あなたの定数はあなたの設定と一致しています。 先に進み、ターミナルで次のコマンドを実行してアプリケーションを実行します。

「gorunmain.go」

エラーが発生しなければ、接続は良好です。

CockRoachアプリの実行

main.goをしばらくそのままにして、前に作成したcrdb.goファイルに移動します。 何が起こっているかを確認する前に、下の画像に表示されているものをコピーしてください。

ゴキブリcrdb.go

まず、パッケージ名とファイルの先頭を宣言します。

パッケージマネージャー

CrdbManagerという名前のインターフェイスを作成することから始めます。 インターフェイスに慣れていない場合は、必要な動作を指定できます。 この場合、データのバックアップ、増分バックアップの実行、および復元の実行に重点を置いています。

ゴキブリCrdbManager

次に、crdbManagerStruct{}を作成します。

CockRoach crdb struct

他の言語のオブジェクトのような構造体を考えることができます。 通常、クラスを作成してから、そのクラスが作成されたインターフェイスを実装することを明示的に示します。 ただし、Goでは、以下の構文でメソッドを適用すると、Goは構造体がinterface型であると推測します。

CockRoach構造体の構文

バックアップコードを開始する前に、ゴキブリを扱うときに覚えておくべきいくつかの癖があります。 Cockroachは、フルバックアップとインクリメンタルバックアップの2つの形式のバックアップを提供します。 完全バックアップは単純であり、データベース名とGoogleクラウドストレージの場所を渡す必要があります。

例:データベースバンクを'g​​s:// acme-co-backup / database-bank-2017-03-27-weekly' AS OF SYSTEMTIME'-10s'にバックアップします。

増分バックアップでは、以前のすべての完全バックアップと増分バックアップを一覧表示する必要があるため、少し注意が必要です。 まず、バックアップを保存する場所を宣言してから、完全バックアップから次の増分バックアップまで、以前のすべてのバックアップを一覧表示する必要があります。

例:データベースバンクを'g​​s:// acme-co-backup / db / bank / 2017-03-29-nightly' AS OF SYSTEM TIME'-10s' INCREMENTAL FROM'gs://acme-co-backup/にバックアップします。 database-bank-2017-03-27-weekly'、' gs:// acme-co-backup / database-bank-2017-03-28-nightly';

そうは言っても、上記のコマンドを動的に作成できるようにするストレージスキーマを作成するのはあなた次第です。 この例では、毎日のバックアップを取るスキーマを作成します。週の最初のバックアップは完全バックアップであり、年-月-日の名前付けスキーマを使用します。 たとえば、最初のバックアップの名前は2019-7-8-fullになり、翌日は2019-7-9-nightlyになります。 その週のすべてのバックアップは、そのデータベース名で「weekly」で終わる毎週のdirディレクトリに保存されます。 例えば:

2019-7-8-weekly / dbName/2019-7-8-フルおよびナイトリーロケーション

だろう

2019-7-8-毎週/dbName/2019-7-9-毎晩。

次に、プロジェクトのルートにutilという名前の新しいディレクトリを作成し、util.goという名前のファイルを作成します。 ディレクトリ構造は以下のようになります。

CockRoach Directory Strucutre

util.goファイルには、毎週、毎晩、および完全な値を自動生成するヘルパーが含まれています。 util.goは次のスクリーンショットのようになります。

ゴキブリutil.go

crdb.goファイルに戻りましょう。 いくつかのインポートを追加し、コードを下の画像のように調整する必要があります。

CockRoachcrdbコード調整

CrdManagerインターフェイスのシグネチャを、DBインスタンスとデータベース名を除いて更新しました。 また、前に作成したutilメソッドと、Googleクラウドのバックアップ名を保持するconstを呼び出すことで、毎週、毎週、毎晩、変数を作成しました。

CockRoachCrdbManagerアップデート

これで、バックアップ方法に進むことができます。

ゴキブリのバックアップ方法

バックアップメソッドは、dbインスタンス値とバックアップしているデータベースをパラメーターとして受け取ります。 次に、前に説明したように、バックアップの保存場所を生成します。 週次ディレクトリは週の始まりの名前を取り、後続のすべての完全および増分はその週のそのディレクトリの下に格納されることを忘れないでください。 生成されたgsStorageの場所は次のようになります。

gs:// test-crdb-backup / 2019-7-8-weekly / testdb / 2019-7-8-full

実行する完全なクエリを生成して実行し、クエリが失敗した場合はパニックに陥ります。 クエリは次のように終わることに注意してください。

`'システム時間'-10S';`

Cockroachは、10秒前からバックアップを開始することをお勧めします。 これで、増分バックアップ方式に進むことができます。

CockRoach増分バックアップ

増分バックアップは、先ほど行ったように、gcs増分保存場所を生成することから始まります。 今回はクエリを作成した後、完全なクエリを作成するために以前のバックアップのリストが必要になります。 これはlistDirメソッドを呼び出すことによって行われ、最後に調べられます。

バックアップのリストを確認した後、生成クエリを終了して実行します。 パニックに失敗し、最終的には、クエリは次のようになります。

データベースバンクを'g​​s:// test-crdb-backup / 2019-7-8-weekly / testdb / 2019-7-10-nightly' AS OF

システム時間'-10s'INCREMENTAL FROM'gs:// test-crdb-backup / 2019-7-8-weekly / testdb / 2019-7-8-full'、

'gs:// test-crdb-backup / 2019-7-8-weekly / testdb / 2019-7-9-nightly;

次は復元方法です。

ゴキブリ復元方法

復元は増分バックアップに似ています。 クエリを生成してから、dirsのリストを呼び出し、元のクエリにデータベースリストを追加します。 その後、クエリを実行し、クエリが失敗した場合はパニックになります。

インクリメンタルとリストアについては、バックアップリストの順序が重要であることを忘れないでください。 フルバックアップから開始し、次の増分バックアップ、次に増分バックアップを実行します。 正しく注文しないと、復元と増分バックアップが失敗します。 復元機能の詳細については、ここをクリックしてください。

次に、ListlistDirメソッドに移ります。

CockRoachListdirメソッド

Goでは小文字のメソッドがプライベートであるため、最初に気付くのはlistDirが大文字になっていないことです。 listDirはInterfaceメソッドのヘルパーであるため、メソッドをパブリックにする必要はありません。

まず、ストレージオブジェクトのクエリに使用するバケットオブジェクトを作成することから始めます。 次に、その特定のデータベースインスタンスの毎週のバックアップを指すクエリを作成します。 そこから、Dirsのスライスを生成します。 その後、チェックを実行して、完全バックアップがスライスの最初にリストされていることを確認し、リストされていない場合は、スライスを逆にします。

GoogleクラウドストレージにDirsをリストすると、奇妙な動作が見られました。 呼び出しによって、リストが昇順で返され、次に降順で返される場合があります。 正しい順序でdirsリターンのリストを再確認することに焦点を当てて、この方法で時間をかけてください。

別のアプローチは、ネーミングスキーマを変更し、ディレクトリ名の一部としてタイムスタンプを追加することです。 そのような状況では、dirリストを繰り返し処理して、ファイルが時間の昇順で正しく順序付けられていることを確認できます。 listDirメソッドは、スキーマストレージの設計に大きく依存します。 繰り返しますが、listDirが正しく順序付けられていない場合、復元と増分バックアップは失敗します。

最後にmain.goファイルを見てみましょう。

CockRoachmain.goファイル

インポートのリストを更新し、定数がすべて適切に入力されていることを確認してください。 constの下に、次のコードを追加します。

CockRoachmain.goファイルに追加されたコード

まず、アプリケーションのロジックを指定するコマンドライン引数の変数のグループを作成します。 1つのコマンドフラグは「操作」であり、バックアップ、復元、または増分の値オプションがあります。 もう1つは、復元操作を呼び出す場合のデータベース名とテーブルのデータベースです。 db接続ロジックは同じままで、その下にdbManagerインスタンスを作成して、アプリケーションに渡したコマンドライン引数を解析します。 次に、呼び出された操作に応じて、バックアップ復元または増分を実行します。 コマンドラインフラグの経験がない場合は、ここで詳細を確認できます。 アプリケーションを実行すると、コマンドは次のようになります。

main.go -operation = backup -database=dbNameを実行します

最終的な考え

これは本番環境に対応したアプリケーションではありません。 これは、思考プロセスを開始し、理想的には構成にかかる時間を節約するための単なるデモです。 このアプリケーション全体で、何らかのエラーが発生した場合、単にパニックと呼ばれ、アプリケーションを強制的に終了させます。 実稼働環境では、これを別の方法で処理し、何らかの形式のロギングまたは電子メールやSMSイベントなどの通知ロジックのタイプを追加して、ジョブのステータスを通知する必要があります。

このアプリケーションは、すべてのデータベース名を手動でアプリケーションに渡すことを前提としています。 これは、これらの値を渡すスクリプトを記述し、スクリプトを実行するためのcronジョブを設定することで実行できますが、より良いアプローチがあります。 私の提案は、Cockroachインスタンス内のすべてのデータベースのバックアップを実行するコードを記述して、「showdatabases」を呼び出して戻り結果を繰り返し処理し、バックアップメソッドを呼び出すことです。 Goアプリを毎晩実行するためのcronジョブを設定できることを忘れないでください。

最後に、テーブルで復元を実行する場合、Cockroachはテーブルが存在しないと想定することに注意することが重要です。 テーブルに対して復元を実行しようとして、テーブルが存在する場合、エラーが発生します。 外部キー制限のあるテーブルで復元を実行する順序に注意してください。 外部キー制限のあるテーブルを復元しようとしたが、他のテーブルが存在しない場合、問題が発生します。

次を追加して、復元を実行できます。

`Skip_missing_foreign_keysを使用

これにより、外部キー制約が削除されますが、後で必ず外部キー制約を追加してください。

うまくいけば、この投稿は、緊急時に会社のデータをバックアップおよび復元する方法に光を当てるでしょう。 準備が整っていることを確認することで、影響を最小限に抑え、迅速に復旧して実行できるようになります。