sql >> データベース >  >> NoSQL >> MongoDB

ssh経由でMongoDBを同期する

    これは、SSHトンネリングを使用して実現できます。リモートMongoDBインスタンスを、ローカルポートの1つで実行するように設定します。デフォルトでは、MongoDBは27017で実行されるため、以下の例では、リモートのMongoDBインスタンスをローカルの27018ポートにマップすることを選択しました。

    データベースをSERVER1からLOCALHOSTにコピーしようとしている場合は、LOCALHOSTで次のコマンドを実行できます。

    ssh -L27018:localhost:27017 SERVER1

    (明らかに、SERVER1を実際のサーバーまたはsshエイリアスに置き換えます)

    これにより、SERVER1へのSSH接続が開かれますが、LOCALHOSTのポート27018がSERVER1のリモートポート27017にマップされます。そのSSH接続を閉じないでください。次に、次のように、ポート27018を使用してローカルホストマシン上のMongoDBに接続してみてください。

    mongo --port 27018

    ローカルマシンからアクセスしている場合を除いて、これがSERVER1のデータになっていることがわかります。

    MongoDBを通常どおり実行するだけです:

    mongo (またはmongo --port 27107

    ローカルマシンになります。

    技術的には(SSHトンネルを実行したLOCALHOSTに)あるので:

    • 27017のMongoDB(LOCALHOST)
    • 27018のMongoDB(SERVER1)

    db.copyDatabase()を使用するだけです MongoDB(LOCALHOST)内で機能し、データをコピーします。

    ポート27017のローカルホストから(ライブで実行するとデータが削除されます)

    // Use the right DB
    use DATABASENAME; 
    // Drop the Existing Data on LOCALHOST
    db.dropDatabase();
    // Copies the entire database from 27018
    db.copyDatabase("DATABASENAME", "DATABASENAME", "localhost:27018");
    

    これらすべてを、これらすべてのコマンドを実行できるシェルスクリプトにまとめることができるはずです。私は自分で1つ持っていますが、実際にはいくつかの追加の手順があり、おそらくもう少し混乱するでしょう:)

    これを実行し、MongoDBのネイティブdb.copyDatabase()関数を使用すると、ダンプ/圧縮/復元する必要がなくなります。もちろん、それでもそのルートに行きたいのであれば、mongodumpを実行するのはそれほど難しくありません。 、データをエクスポートし、tar / gzipしてから、scp TARGETSERVER:/path/to/file /local/path/to/fileを使用します。 プルダウンしてmongorestoreを実行します その上で。

    もっと仕事のようです!

    編集 -これは、これを実行できるシェルスクリプトを作成するために一緒に使用されるSHファイルとJSファイルです。 ローカルホストでこれらを実行します 、ライブで実行しないでください。実行すると、ライブでdb.dropDatabaseが実行されます。これらの2つのファイルを同じフォルダーに入れ、 YOURSERVERNAMEを置き換えます pull-db.shで domain / ip / sshエイリアスを使用してから、pull-db.js DBNAMEHEREをデータベース名に変更します。

    私は通常、scriptsというフォルダを作成します 私のプロジェクトでは、Textmateを使用して、⌘+Rを押すだけです。 pull-db.shを使用している間 それを実行するために編集するために開きます。

    pull-db.sh

    ssh -L27018:localhost:27017 YOURSERVERNAME '
        echo "Connected on Remote End, sleeping for 10"; 
        sleep 10; 
        exit' &
    echo "Waiting 5 sec on local";
    sleep 5;
    echo "Connecting to Mongo and piping in script";
    cat pull-db.js | mongo
    

    pull-db.js

    use DBNAMEHERE;
    db.dropDatabase();
    use DBNAMEHERE;
    db.copyDatabase("DBNAMEHERE","DBNAMEHERE","localhost:27018");
    

    シェルスクリプトにコードを追加して、実行内容をエコーアウトしました(sorta)。スクリプトのスリープタイマーは、次の行が実行される前にSSH接続が接続される時間を与えるためだけのものです。基本的に、次のようになります。

    1. コードの最初の行は、マシン上にトンネルを作成し、ECHO、SLEEP、EXITをリモートSSHセッションに送信します。
    2. 次に5秒間待機します。これにより、手順1のSSHセッションが接続できるようになります。
    3. 次に、pull-db.jsファイルをローカルのmongoシェルにパイプします。 (ステップ#1は5秒以内に完了する必要があります...)
    4. pull-db.jsはmongoで実行されているはずです。また、ステップ1のSSHターミナルは、接続が開かれてから10秒間実行され、EXITがそのセッションに送信されます。コマンドが発行されますが、SSHセッションは、ステップ3のアクティビティが完了するまで実際には開いたままになります。
    5. pull-db.jsスクリプトがリモートサーバーからのすべてのデータのプルを終了するとすぐに、リモートサーバーでステップ1で発行されたEXITコマンドが最終的に接続を閉じることが許可され、ローカルホストで27108のバインドが解除されます。

    これで、ローカルホストにリモートデータベースのすべてのデータが含まれるはずです。



    1. HadoopのHDFSで名前ノードの自動フェイルオーバーとは何ですか?

    2. redisハッシュでキーパターンを検索する方法は?

    3. 春のデータmongo@CompoundIndexをサブコレクションで使用する方法は?

    4. すべてのクエリをログに記録するMongoDB