Documentation Home
MySQL Shell 8.0
Download this Manual
PDF (US Ltr) - 1.4Mb
PDF (A4) - 1.4Mb


MySQL Shell 8.0  /  ...  /  InnoDB クラスタの操作

このページは機械翻訳したものです。

6.2.5 InnoDB クラスタの操作

このセクションでは、InnoDB クラスタ の使用方法および一般的な管理タスクの処理方法について説明します。

InnoDB クラスタからのインスタンスの削除

必要に応じて、いつでもクラスタからインスタンスを削除できます。 これは、次の例のように、Cluster.removeInstance(instance) メソッドを使用して実行できます:

mysql-js> cluster.removeInstance('root@localhost:3310')

The instance will be removed from the InnoDB cluster. Depending on the instance
being the Seed or not, the Metadata session might become invalid. If so, please
start a new session to the Metadata Storage R/W instance.

Attempting to leave from the Group Replication group...

The instance 'localhost:3310' was successfully removed from the cluster.

オプションで、interactive オプションを渡して、クラスタからのインスタンスの削除を確認するプロンプトを表示するかどうかを制御できます。 対話モードでは、インスタンスにアクセスできない場合に備えて、インスタンスの削除を続行するかどうかを尋ねるプロンプトが表示されます。 cluster.removeInstance() 操作により、ONLINE であるすべてのクラスタメンバーのメタデータおよびインスタンス自体からインスタンスが削除されます。

削除するインスタンスにまだ適用する必要があるトランザクションがある場合、AdminAPI は、トランザクション (GTID) が適用されるまで、MySQL Shell dba.gtidWaitTimeout オプションで構成された秒数まで待機します。 MySQL Shell dba.gtidWaitTimeout オプションのデフォルト値は 60 秒です。デフォルトの変更の詳細は、セクション10.4「MySQL Shell オプションの構成」 を参照してください。 トランザクションの適用を待機しているときに dba.gtidWaitTimeout で定義されたタイムアウト値に達し、force オプションが false (または定義されていない) の場合は、エラーが発行され、削除操作が中断されます。 トランザクションの適用を待機しているときに dba.gtidWaitTimeout で定義されたタイムアウト値に達し、force オプションが true に設定されている場合、操作はエラーなしで続行され、インスタンスがクラスタから削除されます。

重要

force オプションは、未処理のトランザクションや UNREACHABLE であるインスタンスなどのエラーを無視し、クラスタでインスタンスを再利用しない場合にのみ、Cluster.removeInstance(instance) で使用する必要があります。 クラスタからインスタンスを削除するときにエラーを無視すると、インスタンスがクラスタと同期しなくなり、後でクラスタに再参加できなくなる可能性があります。 force オプションは、クラスタでインスタンスを使用しないことを計画している場合にのみ使用します。それ以外の場合は、常にインスタンスのリカバリを試行し、インスタンスが使用可能で正常な場合、つまりステータスが ONLINE の場合にのみ削除する必要があります。

InnoDB クラスタの解決

InnoDB クラスタ を解決するには、読取り/書込みインスタンス (単一プライマリクラスタのプライマリなど) に接続し、Cluster.dissolve() コマンドを使用します。 これにより、クラスタに関連付けられているすべてのメタデータおよび構成が削除され、インスタンスでのグループレプリケーションが無効になります。 インスタンス間でレプリケートされたデータは削除されません。

重要

クラスタのディゾルブを元に戻す方法はありません。 再度作成するには、dba.createCluster() を使用します。

Cluster.dissolve() 操作では、ONLINE または到達可能なインスタンスのみを構成できます。 Cluster.dissolve() コマンドを発行したメンバーがクラスタのメンバーに到達できない場合は、ディゾルブ操作の続行方法を決定する必要があります。 クラスタから欠落として識別されたインスタンスを再結合する可能性がある場合は、ディゾルブ操作を取り消し、まず欠落しているインスタンスをオンラインに戻してから、ディゾルブ操作を続行することを強くお薦めします。 これにより、すべてのインスタンスのメタデータを正しく更新でき、スプリットブレイン状況が発生する可能性がなくなります。 ただし、到達できないクラスタのインスタンスが永続的に残っている場合は、選択肢はなく、ディゾルブ操作を強制することができます。つまり、欠落しているインスタンスは無視され、操作の影響を受けるのはオンラインインスタンスのみです。

警告

クラスタインスタンスを無視するようにディゾルブ操作を強制すると、ディゾルブ操作中に到達できなかったインスタンスが引き続き動作し、スプリットブレイン状況のリスクが発生する可能性があります。 インスタンスが再度オンラインになる可能性がないことが確実な場合にのみ、欠落しているインスタンスを無視するようにディゾルブ操作を強制します。

対話型モードでは、ディゾルブ操作中にクラスタのメンバーにアクセスできない場合、対話型プロンプトが表示されます。次に例を示します:

mysql-js> Cluster.dissolve()
The cluster still has the following registered instances:
{
    "clusterName": "testCluster",
    "defaultReplicaSet": {
        "name": "default",
        "topology": [
            {
                "address": "ic-1:3306",
                "label": "ic-1:3306",
                "role": "HA"
            },
            {
                "address": "ic-2:3306",
                "label": "ic-2:3306",
                "role": "HA"
            },
            {
                "address": "ic-3:3306",
                "label": "ic-3:3306",
                "role": "HA"
            }
        ]
    }
}
WARNING: You are about to dissolve the whole cluster and lose the high
availability features provided by it. This operation cannot be reverted. All
members will be removed from the cluster and replication will be stopped,
internal recovery user accounts and the cluster metadata will be dropped. User
data will be maintained intact in all instances.

Are you sure you want to dissolve the cluster? [y/N]: y

ERROR: The instance 'ic-2:3306' cannot be removed because it is on a '(MISSING)'
state. Please bring the instance back ONLINE and try to dissolve the cluster
again. If the instance is permanently not reachable, then you can choose to
proceed with the operation and only remove the instance from the Cluster
Metadata.

Do you want to continue anyway (only the instance metadata will be removed)?
[y/N]: y

Instance 'ic-3:3306' is attempting to leave the cluster...  Instance 'ic-1:3306'
is attempting to leave the cluster...

WARNING: The cluster was successfully dissolved, but the following instance was
skipped: 'ic-2:3306'. Please make sure this instance is permanently unavailable
or take any necessary manual action to ensure the cluster is fully dissolved.

この例では、クラスタは 3 つのインスタンスで構成されており、そのうちの 1 つはディゾルブが発行されたときにオフラインでした。 エラーが捕捉され、続行方法を選択できます。 この場合、欠落している ic-2 インスタンスは無視され、到達可能なメンバーのメタデータが更新されます。

MySQL Shell が非対話モードで実行されている場合 (バッチファイルの実行時など)、force オプションを使用して Cluster.dissolve() 操作の動作を構成できます。 到達不能なインスタンスをディゾルブ操作で強制的に無視するには、次のように発行します:

mysql-js> Cluster.dissolve({force: true})

到達可能なインスタンスはすべてクラスタから削除され、到達不可能なインスタンスは無視されます。 このセクションでは、クラスタからの欠落しているインスタンスの強制的な削除に関する警告は、この解決操作を強制するこの手法にも同様に適用されます。

Cluster.dissolve() 操作で interactive オプションを使用して、MySQL Shell が実行されているモードをオーバーライドすることもできます。たとえば、バッチスクリプトの実行時に対話型プロンプトが表示されるようにします。 例:

mysql-js> Cluster.dissolve({interactive: true})

dba.gtidWaitTimeout MySQL Shell オプションでは、Cluster.dissolve() 操作がクラスタからターゲットインスタンスを削除する前にクラスタトランザクションの適用を待機する時間を構成しますが、これはターゲットインスタンスが ONLINE の場合のみです。 削除されるインスタンスのいずれかにクラスタトランザクションが適用されるのを待機しているときにタイムアウトに達すると、強制を除いてエラーが発行されます: true が使用され、その場合はエラーがスキップされます。

注記

cluster.dissolve() を発行すると、Cluster オブジェクトに割り当てられた変数は無効になります。

クラスタトポロジの変更

デフォルトでは、InnoDB クラスタ はシングルプライマリモードで実行され、クラスタには読取りおよび書込みクエリー (R/W) を受け入れる単一のプライマリサーバーがあり、クラスタ内の残りのすべてのインスタンスは読取りクエリー (R/O) のみを受け入れます。 マルチプライマリモードで実行するようにクラスタを構成すると、クラスタ内のすべてのインスタンスがプライマリになります。つまり、読取りクエリーと書込みクエリー (R/W) の両方を受け入れます。 クラスタのすべてのインスタンスで MySQL サーバーバージョン 8.0.15 以降が実行されている場合は、クラスタがオンラインの間にクラスタのトポロジを変更できます。 以前のバージョンでは、構成を変更するためにクラスタを完全に開放して再作成する必要がありました。 これは、オンライングループの構成 で説明されている UDF を介して公開されるグループアクションコーディネータを使用するため、オンライングループを構成するためのルールに従う必要があります。

注記

マルチプライマリモードは拡張モードとみなされます

通常、単一プライマリクラスタは、予期しない停止などが原因で、現在のプライマリが予期せずクラスタを離れたときに新しいプライマリを選択します。 選択プロセスは通常、新しいプライマリになる現在のセカンダリを選択するために使用されます。 選択プロセスをオーバーライドし、特定のサーバーを強制的に新しいプライマリにするには、Cluster.setPrimaryInstance(instance) 関数を使用します。ここで、instance は、新しいプライマリになるインスタンスへの接続を指定します。 これにより、基礎となるグループレプリケーショングループを構成して、選択プロセスをバイパスして特定のインスタンスを新しいプライマリとして選択できます。

次の操作を使用して、単一プライマリとマルチプライマリの間でクラスタが実行されているモード (トポロジとも呼ばれる) を変更できます:

  • Cluster.switchToMultiPrimaryMode():クラスタをマルチプライマリモードに切り替えます。 すべてのインスタンスがプライマリになります。

  • Cluster.switchToSinglePrimaryMode([instance]):クラスタをシングルプライマリモードに切り替えます。 instance が指定されている場合は、プライマリになり、他のすべてのインスタンスがセカンダリになります。 instance が指定されていない場合、新しいプライマリはメンバーの重みが最も高いインスタンス (およびメンバーの重みが結び付けられている場合は UUID が最も低いインスタンス) です。