以下のトピックでは、MySQLマスターへのスレーブとしてのClustrixの構成について説明します。

スレーブ構成の作成と維持

Clustrixは個々に独自の設定を持つ複数のスレーブプロセスをサポートします。この機能はMySQLによって提供するものを超えているため、ClustrixはSlave構成というものをサポートするためにリプリケーション構文を拡張します。個々のスレーブのリプリケーションは独立して操作されます。もし1つのスレーブがエラーになり止まったとしても、他のスレーブは影響を受けません。スレーブが矛盾するやり方でデータベースを更新しないことを確認してください。指定されたスレーブがどこで実行されているかを決定するには、 system.mysql_Slave_stats テーブルのnodeid列を問い合わせてください。

MySQLとの互換性のために、その標準のコマンドは"default."という名前のスレーブ上で操作します。

例えば、"default"スレーブ上の操作は、以下のコマンドで発行することができます。

mysql> CHANGE MASTER TO MASTER_LOG_FILE = 'master_log_name', MASTER_LOG_POS = 1234, MASTER_HOST = 'host_name', MASTER_USER = 'user_name', MASTER_PASSWORD = 'password', MASTER_PORT = 3306;
mysql> START SLAVE;
mysql> STOP SLAVE;
mysql> SHOW SLAVE STATUS;
Icon

前の例での CHANGE MASETER の使用に注意してください。このマンドは常にデフォルトのスレーブを参照し、MySQLとの互換性のために含まれています。CHANGE MASTER は CHANGE SLAVE 'default' の別名です。


To define named Slaves for multiple Slave instances, use the following syntax:

mysql> CREATE SLAVE '{slave-name}'MASTER_LOG_FILE = '{master_log_name}', MASTER_LOG_POS = {###}[, {MASTER_HOST | MASTER_USER | MASTER_PASSWORD | MASTER_PORT} = {'string' | ###}];


以下のコードは指定されたマスターの設定で新しいスレーブ構成を作成します。Tスレーブのインスタンスを制御あるいは監視するためにコマンド内で指定したSlave-nameを使います。

mysql> CREATE SLAVE 'foo'MASTER_LOG_FILE = 'my_master_log', MASTER_LOG_POS = 1234, MASTER_HOST = 'myhost', MASTER_USER = 'myuser', MASTER_PASSWORD = 'swordfish', MASTER_PORT = 3306;
mysql> START SLAVE 'foo';
mysql> STOP SLAVE 'foo';
mysql> SHOW SLAVE 'foo' STATUS;


スレーブの設定を更新するには、ホスト名、ポート、ログシーケンス、およびログファイル名のような設定を指定して、以下のコマンドを発行します:

mysql> CHANGE SLAVE 'slave-name' TO {master_option} [, {master_option}];

スレーブプロセスの開始と終了

指定されたスレーブを開始するには、以下のコマンドを発行します:

mysql> START SLAVE 'slave-name';

既にスレーブが実行されている場合は、このマンドは何も影響しません。このクラスタ上で設定されたまだ実行されていない全てのスレーブを開始するには、以下のコマンドを発行します。リプリケーションの通信をロードバランスするために、スレーブはクラスタ内のノード内に渡ってラウンドロビン形式で開始されます。

mysql> START SLAVE ALL;

指定されたスレーブを停止するには、以下のコマンドを実行します:

mysql> STOP SLAVE 'slave-name';

スレーブが動作していない場合は、コマンドは効果がありません。

全ての実行しているスレーブを停止するには、以下のコマンドを発行します:

mysql> STOP SLAVE ALL;

もう一つの方法として、Clustrix はレガシー構文のSLAVE STARTおよびSLAVE STOPもサポートしています。

スレーブのステータスの表示


指定したスレーブのステータスを表示するには、以下のコマンドを発行します。

mysql> SHOW SLAVE STATUS 'slave-name';

スレーブのステータスを表示するには、以下のコマンドを発行します。

mysql> SHOW SLAVE STATUS;

停止したスレーブのためのステートメントのスキップ

1つ以上の未解決のリプリケーションステートメントをスキップするには(例えば、良くないクエリを扱っている場合)、以下のコマンドを発行します:

mysql> START SLAVE <optional slave name> SKIP N;

N はスキップするステートメントの数です。スレーブは指定したかずのステートメントをスキップし、以下のステートメントを実行しようとします。もしステートメント N+1 がなんらかの理由で失敗すると、スレーブはSKIPコマンドが発行される前の状態のままになります。例えば、3つの連続するクエリが連続して失敗すると、SKIP 1またはSKIP 2はスレーブのポジションに影響ありませんが、SKIP 3によりリプリケーションは再開することができます。

データベースの無視および追加の指定

Clustrixのリプリケーションスレーブは二つのモードをサポートします:

  • 指定されたデータベースをスキップし、全てをリプリケート(デフォルト)
  • 全てをスキップし、指定されたデータベースのみリプリケートする

以下の例では、"one", "two"および"three"と言う名前のデータベースを使って、モードを説明します。以下の例では、"one"および"tree"のデータベースへのステートメントが実行されます。データベース"two"へのステートメントはスキップされます。

mysql> SET GLOBAL mysql_default_db_replication_policy = true;
mysql> INSERT INTO mysql_slave_db_replication_policy (slave_name, dbname, allow) VALUES ('foo', 'one', true);
mysql> INSERT INTO mysql_slave_db_replication_policy (slave_name, dbname, allow) VALUES ('foo', 'two', false);


以下の例では、データベース"one"へのステートメントが実行されます。データベース"two"および"tree"へのステートメントはスキップされます。

mysql> SET GLOBAL mysql_default_db_replication_policy = false;
mysql> INSERT INTO mysql_slave_db_replication_policy (slave_name, dbname, allow) VALUES ('foo', 'one', true);
mysql> INSERT INTO mysql_slave_db_replication_policy (slave_name, dbname, allow) VALUES ('foo', 'two', false);
Icon
  • これらの"ignore"および"include"ディレクティブは指定されたスレーブのインスタンスに全体的に影響します。
  • ステートメントの現在のデータベースだけが、このポリシーの一部分として実行あるいはスキップするかどうかを決定します。
  • allow 列がポリシーの変数に一致する行だけが、それらが存在しないかのように扱われます(それは、ポリシーによります)。
  • ポリシーを変更する前にスレーブを手動で停止します。この設定はスレーブが開始する時(そして、バッファがフルになる時に定期的)に、読み込まれます。

エラー時のスレーブの挙動の制御

Clustrixはエラー時のスレーブの挙動を制御するいくつかの方法を提供します:

  • system.mysql_slave_skip_errorsへのエラーコードの挿入
  • slave_exec_mode グローバル変数の設定
  • rbr_loose_fks グローバル変数の設定
system.mysql_slave_skip_errorsへのエラーコードの挿入

system.mysql_slave_skip_errorsテーブルに期待するエラーコードを入れることで、特定のエラーでスレーブが停止しないように設定することができます。これは全てのスレーブに適用されます。スレーブごとの設定はありません。注意: mysql_slave_skip_errorsには result_code ではなく、mysql_error_code を入れます。


利用可能なエラーコードのリストを取得するには、以下のクエリを実行します:

 mysql> select * from mysql_error_codes natural join error_codes;
+-------------+------------------+---------+-----------------------+--------------------------------------------------+
| result_code | mysql_error_code | family  | code                  | message                                          |
+-------------+------------------+---------+-----------------------+--------------------------------------------------+
|        7168 |             1452 | dml     | DML_FK_INSERT_ERR     | Foreign key constraint violation on insert       |
|       60417 |             1213 | lockman | LOCKMAN_RC_DEADLOCK   | Lock manager deadlock detected                   |
|       26645 |             1062 | rigr    | RIGR_RC_DUPLICATE_KEY | Duplicate key in representation                  |
|       12309 |             1061 | ddl     | DDL_RC_INDEX_CONFLICT | Index name conflict                              |
|        7172 |             1701 | dml     | DML_FK_TRUNCATE_ERR   | Foreign key contraint on truncate                |
|       11267 |             1049 | trans   | NO_SUCH_DATABASE      | No such database                                 |
|       11281 |             1044 | trans   | DB_PERMISSION_DENIED  | Insufficient user permissions to access database |
|       12307 |             1007 | ddl     | DDL_RC_DB_CONFLICT    | Database name conflict                           |
|       34816 |             1064 | parser  | ERRCODE_SYNTAX_ERROR  | syntax error                                     |
|        7171 |             1048 | dml     | DML_NOTNULL_ERR       | NOT NULL constraint violation                    |
...
Icon

 行ベースのリプリケーション(RBR)でサポートされているエラーは1451と1452だけです(それぞれ、親の行をdeleteまたはupdateできない、子の行をaddまたはupdateできない)。

エラーコードをsystem.mysql_slave_skip_errorsに入れるために、スレーブを止め、テーブルにエラーコード 1062 を入れる以下のようなSQLを実行します:

mysql> insert into mysql_slave_skip_errors values (1062);
Query OK, 1 row affected (0.02 sec)


スキップされたエラーを記録する


グローバル変数 mysql_slave_log_skipped_statements を設定してスキップされたステートメントをsprout.log に記録することができます。

slave_exec_mode グローバル変数の設定

MySQL row-based replication specifies the expected (pre-update) contents of each row to be updated or deleted. 指定された行がClustrixにある行と完全に一致しない場合は、グローバル変数 slave_exec_modeの設定によって決定される3つの操作のモードがあります:

  • STRICT: このモードでは、行のPRIMARY KEYまたは最初のUNIQUEキーが一致する限りは、update/delete が適用されます。これはデフォルトの設定で、MySQLのデフォルトの挙動と一致します。
  • EXACT: このモードでは、指定された行がテーブルにある行に完全に一致しない(全ての列について)場合は、スレーブが("Row Not Found"とともに)エラーを起こし、停止するでしょう。このモードはClustrixにユニークなものである事に注意してください。
  • IDEMPOTENT: このモードでは、"duplicate key"と"row not found"エラーが無視されます。これは、そのようなエラーになる操作は適用されないが、スレーブは停止しないことを意味します。このモードは複数マスター設定に対してのみ適切で、慎重に使われるべきです

 

Icon

IDEMPOTENTモードは、エラーコード 1032と1062 をsystem.mysql_slave_skip_errorsに入れることに似ていますが、system.mysql_slave_skip_errorsのやり方はエラーになるまで適用されその後止まるのに対し、IDEMPOTENTモードは停止しません。 

設定はただちに効果を表します。

rbr_loose_fks グローバル変数の設定

外部キー(FK)とRBRによるパフォーマンスの問題を和らげるために、グローバル変数 rbr_loose_fkstrueにしてスレーブがRESTRICT FKを無視するように設定できますが、まだCASCADEアクション(update/delete)を適用します。ここでの考えとしては、もしマスターとスレーブが一貫性があれば、マスターは衝突を起こすような全てのwriteを拒否しなければならず、従ってスレーブは独自のFKのチェックをする必要は無い、ということです。CASCADEs are different, because they do not result in errors, rather additional operations beyond that directly requested (i.e. updating/deleting child/parent rows).

同じ名前に設定されたデータベースのリプリケート

異なるマスターから同じ名前のデータベースをリプリケートするために、一つのデータベースから他の名前にマップする書き換えルールを作成することができます。データベース名を書き換えるには、書式のルール (Slave_name, from_db, to_db) をテーブル system.mysql_Slave_rewrite_dbに追加します。以下の例では、"ab1234"を”other”に書き換えます。

mysql> INSERT INTO system.mysql_slave_rewrite_db VALUES('slaveA','db1234','otherdb');
Query OK, 1 row affected (0.02 sec)
Icon
  • 一つの書き換えだけで全てのスレーブ/データベースの組み合わせを定義することができます。
  • ルールを作成または修正する前にスレーブを止めなければなりません。
  • データベースをまたがった更新を実行することはできません。

スレーブ構成の削除

事前に設定されたスレーブを削除するには、以下のコマンドを発行します:

mysql> DROP SLAVE 'slave-name';
Icon

削除をする前にスレーブを停止しなければなりません。



  • ラベルなし
TOP
inserted by FC2 system