web-dev-qa-db-ja.com

Galera:サーバー全体をロックせずに低速のALTERを実行する

さまざまなクライアントにサービスを提供する数百のデータベースを備えた3ノードのガレラクラスターがあります。

私は、レプリケーションとフォールオーバーを処理する簡単な方法としてガレラのみを使用しています。私は実際に一度に複数のマスターを使用していません。

各データベースのいくつかのテーブルでかなり高価なALTERを実行する必要があります。通常、各データベースでアップグレードスクリプトを1つずつ実行し、各サイトを一度に1つずつオフにするスクリプトがあります。

しかし、このガレラクラスターでは、DDLが遅いと、実行対象のデータベースだけでなく、すべてのデータベースが完全にロックされます。基本的には、アップグレードを実行する必要があるときはいつでも、全員のアップグレードを実行するのにかかる時間中、全員がオフラインになることを意味します。

wsrep_OSU_method があることは知っていますが、これをRSUに変更すると、それ自体に問題があり、役に立たないと思います。

ロックを無効にする方法はありますか?または、少なくともサーバーレベルのロックではなくデータベースレベルのロックにしますか?

クエリの実行中にクラスター内の他のノードを無効にした場合はどうなりますか?これでもグローバルロックが発生しますか?私が言ったように、私は実際には複数のマスターを使用しないので、この場合、他のノードを数分間オフラインにしておくことは問題ありません(通常の自動再結合プロセスがそれらを戻したときに発生する場合)。

3
chroder

あなたは運がいいです! Perconaは pt-online-schema-change まさにこの種の状況のた​​めに。

pt-online-schema-changeは、MySQLが内部でテーブルを変更する方法をエミュレートしますが、変更したいテーブルのコピーで機能します。これは、元のテーブルがロックされておらず、クライアントがそのテーブル内のデータの読み取りと変更を続行できることを意味します。

pt-online-schema-changeは、変更するテーブルの空のコピーを作成し、必要に応じて変更してから、元のテーブルから新しいテーブルに行をコピーすることで機能します。コピーが完了すると、元のテーブルから離れて新しいテーブルに置き換えられます。デフォルトでは、元のテーブルも削除されます。

Perconaによって作成されていますが、主要なMySQLバリアントのいずれでも機能します。

1
ceejayoz