web-dev-qa-db-ja.com

NFSを介して同じデータベースにアクセスする2つのMySQLサーバー

2つの別々のマシンで2つの別々のMySQLインスタンスを実行したいのですが、nfsで同じデータディレクトリを使用していますが、InnoDBストレージエンジンで可能ですか?アプリケーションの操作により、次のことが保証されます。

  • 1つのMySQLインスタンスがプロデューサーになります
  • 1つのMySQLは読み取り専用コンシューマになります

MySQLサイトでは、これはMyISAMおよびマージストレージエンジンでのみ可能であると述べられていますが、推奨することはありません。

http://dev.mysql.com/doc/refman/5.6/en/multiple-data-directories.html

3
HRK

あなたが求めていることは現時点では不可能です。なぜ ???

まず、InnoDBアーキテクチャを見てください。

InnoDB Architecture

InnoDBバッファープールとInnoDBログバッファーは、単一のシステムテーブルスペース(別名ibdata1)で動作するように設計されています。私はこれについてOct 03, 2013に書き戻しました: 同じサーバー上の異なるデータベースに異なるInnoDB設定を使用する方法はありますか?

探しているものが現在Oracle RACに存在します。

Oracle RAC

これらの特性を持つクラスターを形成します

  • 各Oracle RACサーバーは、OracleのRDBMSのローカルインスタンスを実行します。
  • 各Oracle RACサーバーには、独自のログバッファがあります。
  • 各Oracle RACサーバーは他のOracle RACサーバーとアクセスを共有します
  • すべてのOracle RACサーバーが同じデータベースファイルのセットに接続する

InnoDB

MySQL用InnoDBストレージエンジン

  • InnoDBには1つのログバッファーと、ログバッファーに接続する1つのスレッドしかありません
  • InnoDBは複数のログバッファースレッドを許可しません
  • Mysqld(MySQLのインスタンス)を起動し、そのInnoDBストレージエンジンがibdata1に接続しようとすると、別のmysqldプロセスから別のログバッファースレッドがすでに開いている場合、InnoDBストレージエンジンは起動に失敗する必要があります。

エピローグ

私の 2つの代替案の以前の投稿 を読んでください。 3番目の方法は、MySQL Clusterに切り替えることです( NDB Storage Engine を使用)。これにより、複数のSQLノード間で1つ以上のデータノードを共有できます。

UPDATE 2014-04-24 16:55 EDT

@ypercubeが次のコメントをしました

リンクされた質問(および回答)は約1台のサーバーです。この質問は、同じデータディレクトリを共有する2つのサーバーについてです。 2つは関連がないようです。

理論的には、単一のサーバーにmysqldの複数のインスタンスを設定できます。ただし、各mysqldインスタンスは一意のシステムテーブルスペース(ibdata1)を指す必要があります。この事実に照らして、複数のmysqldインスタンスについては、それらが1つのDBサーバーからのものであっても、複数のDBサーバーからのものであっても、次のようになります。

  • 1つのmysqldインスタンスのみがシステムテーブルスペースで排他的なログバッファースレッドを取得できます
  • システムテーブルスペースで排他的な挿入バッファースレッドを達成できるのは、1つのmysqldインスタンスだけです。

2013年10月3日 の投稿を参照したのはこのためです。また、Oracle RACとの比較についても触れました。

あなたの実際の質問

2つの別個のマシンで2つの別個のMySQLインスタンスを実行したいのですが、NFSで同じデータディレクトリを使用していますが、InnoDBストレージエンジンで可能ですか?

InnoDBは、共有ログバッファーまたは共有挿入バッファーを持つようには設計されていません。答えはいいえだ。 Oracleがこれを行うためにInnoDBストレージエンジンを変更することはないと思います。そうした場合、予算上の理由や無茶苦茶な理由から、多くの人々がInnoDBを支持してOracle RACとMySQL Clusterを削除します。

1
RolandoMySQLDBA

技術的に可能かどうかを確認したいだけですが、おすすめは別話です。特に私のアプリケーションは書き込み/読み取りが競合しないことを保証しました

@RolandoMySQLDBAが言ったように、これはInnoDBまたはMyISAMでは不可能です。

より簡単に述べると、変更したデータの一部のページはすぐにディスクに書き込まれません。これはバックグラウンドで行われ、一度にすべてではありません。したがって、2番目の読み取り専用インスタンスが同じデータディレクトリからNFSを介してデータを読み取ろうとすると、ディスクに部分的に書き込まれた変更を読み取ることは確実です。基本的にはゴミ。

MyISAMにはバッファプールはありませんが、ファイルシステムをライトバックキャッシュとして利用するため、すべての変更がディスクに到達したかどうかはわかりません。この場合、NFSを介して別のホストからファイルを読み取ろうとすると、予測できないデータの大量のデータが表示されます。

しかし、なぜこれを最初にしたいのですか? 1秒間に多数のクエリを実行することで、より大きな容量を獲得することですか?canreplication を使用して、ほぼ同期されたデータでMySQLの複数のインスタンスを実行します。これはより一般的な方法であり、うまく機能します。

フェイルオーバー機能を使用する理由はありますか?その場合、 DRBDをブロックレベルのレプリケーション に使用できます。それ以外にも、かなりの数のフェイルオーバーソリューションがあります。

3
Bill Karwin