学習MongoDB--(9-4):コピー(コピーセット)
5167 ワード
まず、レプリカセットの概念を説明します.自動障害復旧機能のある主従構造です.前述したプライマリ・スレーブ構造とレプリカ・セットの最大の違いは、レプリカ・セットに固定された「プライマリ・ノード」がなく、クラスタ構造全体が動的に「プライマリ・ノード」が選択され、動作しない場合、他のノードに動的に変更されることです.レプリカセットは、アクティブノード(プライマリノード)とバックアップノード(スレーブノード)のノードを特別に呼びます.
レプリカセットの最も素晴らしい点は、現在アクティブなノードが障害で停止している間に、バックアップノードが自動的にアクティブなノードにアップグレードされる自動化です.システムの正常な動作を維持します.
レプリカ・セットを構築する手順は、まずレプリカ・セットの名前(テスト名はyy)を付け、オプションであるreplsetを使用してレプリカ・セットの最初のサービスを開始する必要があります.
上記では、コピーセット名yyの区切り文字が「/」でなければなりません.そうしないと、後で登録して失敗します.これは、このレプリカセットyyのもう一つのMongoDBサービスを指定し、その傍受ポートは自機の10001ですが、この時点ではまだサービスを開始していません.
最初のノード・ログの出力には、次の文が含まれています.
レプリカセットの2番目のサービスを開始します.
最初のサービスの起動ログから、集合中のlocalが表示されます.system.replsetには構成情報がなく、レプリカセットはshellでreplsetInitiateコマンドを実行して初期化する必要があります.いずれかのサーバ(テストで使用した2台目)でコマンド初期化を実行します(adminデータベースで実行する必要があることに注意してください).このセットには構成情報が自動的に挿入され、構成情報はレプリカセット内の各サーバ間でコピーされます.
1"_id":"yy",このキーはレプリカセットの名前を示す
2》 “members” :[...], このキーはサーバのリストを示し、後でレプリカセットにサーバを追加することもできます.
3"_id":N、ドキュメントを埋め込むキーで、コピーセットのサーバを一意に表示します.
4』「host」:host address、サーバーのホストとポート番号を示す
コマンドの初期化が完了したら、ログを表示します.
2番目のサーバはアクティブなノードとなり、残りの2つのサーバはバックアップノードです.バックアップノードはアクティブノードのoplogを抽出し、アクティブノードとのデータ同期を維持します!バックアップノードは直接クライアントを通じていくつかの操作を行うことができなくて、クエリー操作も“slaveeok”(shellでクエリーを行って、主従構造の従ノードはshellクライアントを通じてデータをクエリーすることができて、コピーセットは厳格に制御して、そのバックアップノードはshellクライアントを通じて直接クエリーすることができなくて、slaveeokオプションを設定する必要があることを提示して、shellクエリーはこのようなサポートを提供していないようです!)
初期化は、レプリカセットの情報をレプリカセットの各ノードのデータベースlocalのセットsystemに保存する.replsetでは、最初のサーバでセットを確認します.
初期化コマンドを実行する場合、キー「members」の埋め込みドキュメントには、次の2つのキーが使用できます.
1」priority:N、優先度、サーバーの優先度を指定します.デフォルトは1で、[0000]でもかまいません.これにより、レプリカセットのサーバーノードがアクティブなノードであることを指定できます.
2』arbiterOnly:true、仲裁ノード、特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定
【フェイルオーバー】
現在アクティブなノードが無効になった場合、次の2つのケースがあります.
1)現在アクティブなノードのダウンタイムまたはそれ自体の異常
2)現在アクティブなノードは、ハートビート追跡クラスタ内の複数受信ノードによって表示され、クラスタサーバ数の半分未満の場合、自動的にバックアップノードにダウングレードされます.
このとき,クラスタは新しいアクティブノード(新しい比較優先度,優先度が同じで,各ノードがどのデータが最新であるか,どれを投げるかを判断する)を投票し,いつでもアクティブノードのデータが最新とされる.アクティブなノードを再確認したら、他のすべてのノードが完全な同期を再開します.
レプリカセットの最も素晴らしい点は、現在アクティブなノードが障害で停止している間に、バックアップノードが自動的にアクティブなノードにアップグレードされる自動化です.システムの正常な動作を維持します.
レプリカ・セットを構築する手順は、まずレプリカ・セットの名前(テスト名はyy)を付け、オプションであるreplsetを使用してレプリカ・セットの最初のサービスを開始する必要があります.
C:\Documents and Settings\liuxjd>mongod --dbpath e:\mdbserver1 --port 10000 --lo
gpath e:\mdblog1\log.log --replSet yy/localhost:10001
all output going to: e:\mdblog1\log.log
上記では、コピーセット名yyの区切り文字が「/」でなければなりません.そうしないと、後で登録して失敗します.これは、このレプリカセットyyのもう一つのMongoDBサービスを指定し、その傍受ポートは自機の10001ですが、この時点ではまだサービスを開始していません.
最初のノード・ログの出力には、次の文が含まれています.
Sun Sep 02 10:48:51 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG)
Sun Sep 02 10:48:51 [rsStart] replSet info you may need to run replSetInitiate -- rs.initiate() in the shell -- if that is not already done
レプリカセットの2番目のサービスを開始します.
C:\Documents and Settings\liuxjd>mongod --dbpath e:\mdbserver2 --port 10001 --lo
gpath e:\mdblog2\log.log --replSet yy/localhost:10000
all output going to: e:\mdblog2\log.log
レプリカセットの3台目のサービスを開始することもできます.次の2つの方法があります.C:\Documents and Settings\liuxjd>mongod --dbpath e:\mdbserver3 --port 10002 --lo
gpath e:\mdblog3\log.log --replSet yy/localhost:10000
all output going to: e:\mdblog3\log.log
C:\Documents and Settings\liuxjd>mongod --dbpath e:\mdbserver3 --port 10002 --lo
gpath e:\mdblog3\log.log --replSet yy/localhost:10000,localhost:10001
all output going to: e:\mdblog3\log.log
すなわち、第3のサービスを開始するときに、レプリカセットの1つのサービスのみを指定するか、同時に指定することができる.レプリカセットの特性の1つは、自動検出です.1台のサーバのみを指定すると、MongoDBは同じレプリカセットの残りのノードを自動的に検索して接続します.最初のサービスの起動ログから、集合中のlocalが表示されます.system.replsetには構成情報がなく、レプリカセットはshellでreplsetInitiateコマンドを実行して初期化する必要があります.いずれかのサーバ(テストで使用した2台目)でコマンド初期化を実行します(adminデータベースで実行する必要があることに注意してください).このセットには構成情報が自動的に挿入され、構成情報はレプリカセット内の各サーバ間でコピーされます.
C:\Documents and Settings\liuxjd>mongo localhost:10001
MongoDB shell version: 2.0.7
connecting to: localhost:10001/test
> use admin
switched to db admin
> db.runCommand({"replSetInitiate" : {
... "_id" : "yy",
... "members" : [
... {
... "_id" :1,
... "host": "localhost:10000"
... },
... {
... "_id" : 2,
... "host" : "localhost:10001"
... },
... {
... "_id" : 3,
... "host" : "localhost:10002"
... }
... ]}});
{
"info" : "Config now saved locally. Should come online in about a minut
e.",
"ok" : 1
}
>
このコマンドを実行するドキュメントは少し複雑です.各キーの意味を説明します.1"_id":"yy",このキーはレプリカセットの名前を示す
2》 “members” :[...], このキーはサーバのリストを示し、後でレプリカセットにサーバを追加することもできます.
3"_id":N、ドキュメントを埋め込むキーで、コピーセットのサーバを一意に表示します.
4』「host」:host address、サーバーのホストとポート番号を示す
コマンドの初期化が完了したら、ログを表示します.
Sun Sep 02 10:52:11 [rsHealthPoll] replSet member localhost:10001 is now in state PRIMARY
Sun Sep 02 10:52:25 [rsHealthPoll] replSet member localhost:10000 is now in state SECONDARY
Sun Sep 02 10:52:17 [rsHealthPoll] replSet member localhost:10002 is now in state SECONDARY
2番目のサーバはアクティブなノードとなり、残りの2つのサーバはバックアップノードです.バックアップノードはアクティブノードのoplogを抽出し、アクティブノードとのデータ同期を維持します!バックアップノードは直接クライアントを通じていくつかの操作を行うことができなくて、クエリー操作も“slaveeok”(shellでクエリーを行って、主従構造の従ノードはshellクライアントを通じてデータをクエリーすることができて、コピーセットは厳格に制御して、そのバックアップノードはshellクライアントを通じて直接クエリーすることができなくて、slaveeokオプションを設定する必要があることを提示して、shellクエリーはこのようなサポートを提供していないようです!)
初期化は、レプリカセットの情報をレプリカセットの各ノードのデータベースlocalのセットsystemに保存する.replsetでは、最初のサーバでセットを確認します.
SECONDARY> use local;
switched to db local
SECONDARY> db.system.replset.find();
{ "_id" : "yy", "version" : 1, "members" : [ { "_id" : 1, "host" :
"localhost:10000" }, { "_id" : 2, "host" : "localhost:10001" },
{ "_id" : 3, "host" : "localhost:10002" } ] }
SECONDARY>
初期化コマンドを実行する場合、キー「members」の埋め込みドキュメントには、次の2つのキーが使用できます.
1」priority:N、優先度、サーバーの優先度を指定します.デフォルトは1で、[0000]でもかまいません.これにより、レプリカセットのサーバーノードがアクティブなノードであることを指定できます.
2』arbiterOnly:true、仲裁ノード、特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定特定
【フェイルオーバー】
現在アクティブなノードが無効になった場合、次の2つのケースがあります.
1)現在アクティブなノードのダウンタイムまたはそれ自体の異常
2)現在アクティブなノードは、ハートビート追跡クラスタ内の複数受信ノードによって表示され、クラスタサーバ数の半分未満の場合、自動的にバックアップノードにダウングレードされます.
このとき,クラスタは新しいアクティブノード(新しい比較優先度,優先度が同じで,各ノードがどのデータが最新であるか,どれを投げるかを判断する)を投票し,いつでもアクティブノードのデータが最新とされる.アクティブなノードを再確認したら、他のすべてのノードが完全な同期を再開します.