回答:
設計上、1つのmysqldプロセスが2つの異なるマスターを同時にリッスンすることはできません。
CHANGE MASTER TOコマンドでは、1つのマスターを読み取るソースとしてのみ設定できます。
これをエミュレートするには、プログラムで2つのマスターを切り替える必要があります。どうやってやるの?
StackOverflowで、スレーブを異なるマスターに手動で接続する方法を説明しました。各マスターはラップトップで、スレーブは中央コンピューターでした。
ここに基本的な考え方があります
このようにM1からS1へのレプリケーションを設定し、次にM2からS1へのレプリケーションを設定
あるマスターから別のマスターに切り替えるたびに、2つの値を記録する必要があります。 SHOW SLAVE STATUS\G
これらの2つの値は、マスターから送信され、スレーブで次に実行される最後のSQLステートメントを表します。
重要な注意点が1つあります。M1とM2が相互に排他的なデータベースを更新している限り、このアルゴリズムで十分です。
信じられないかもしれませんが、私は2011年5月にServerFaultでこのような質問に対処しました。本「ハイパフォーマンスMySQL」に基づいて、BLACKHOLEストレージエンジンを使用して真のマルチマスター/シングルスレーブをエミュレートする方法を実際に説明しました。
Rolandoのソリューションには多くの注意点があります。1つ目のレプリカストリームは、他のストリームが機能している間は必ずしもレプリケーションされません。これはあなたのスレーブが同期していない期間をあなたに与えるでしょう。ここで、「ターン」が発生したときに追いつくのに十分な時間を確保するために、繊細なバランスをとる必要があります。
説明したように、あなたはまた切り替えるためにログポジションのブックキーパーをプレイしなければなりません。これは本当にバグがあり、データが失われたり一貫性がない場合にウィンドウを開いたり、複製が失敗した場合にログを壊したりします(ログの位置に「1つだけ」のエラーが発生した場合でも発生します)。
複数のmysqlインスタンスを実行することをお勧めします。同じマシン上で2つ以上のmysqlを実行することを妨げるものは何もありません。もちろん、両方を同じポートで操作することはできません。すべてのクライアントとライブラリで3306以外のものを指定できるので、私はこれが問題であるとは本当に思っていません。
port = 3307(または.cnfファイルの1つにあるもの)を指定するだけです。
また、個別に構成されたバッファプールと他のメモリ構成が互いに矛盾しないように注意する必要があります。レプリケートされる個々のデータベースの特定の要件に合わせてこれらの設定をより細かく調整できるため、これは実際には利点です。
この方法では、2つのレプリケーションストリームが同じサーバーで実行されるだけです。決して遅れることはなく、本の保管も、「スワッピング」スクリプトも必要ありません。
MySQL 5.7からファンイン(マルチソースレプリケーション)がサポートされます。
ラボのリリースはこちらから入手できます:http : //labs.mysql.com/
MySqlのインプレース置換として使用できるMariaDBを使用できます。バージョン10.2から対応
Mysql 5.7サポートの問題は、GTIDの必要性です。つまり、MariaDbの場合、マスターも変更する必要があります。これは当てはまりません。
例/ハウツーリンク:http : //www.skysql.com/blogs/dean-ellis/multi-source-replication-mariadb-100