レプリケーションは、実行されたDML /ステートメントまたはデータセットの変更をマスターサーバーから1つまたは複数のスレーブサーバーにレプリケートすることにより、2つ以上のデータベースの同期を維持するために使用されます。
レプリケーションのためにデータをログに記録する方法は3つあります。ステートメントベースのレプリケーション(SBR)は、データを変更するSQLステートメントをレプリケートします。行ベースのレプリケーション(RBR)は、変更された行のみをレプリケートします。混合ベースのレプリケーション(MBR)は、ステートメントベースのレプリケーションと行ベースのレプリケーションです。以前は、mysqldのすべてのバージョンで、ステートメントベースのレプリケーションがデフォルトのフラグ付け方法です。ほとんどすべてのストレージエンジンは、データをログに記録するための3つのアプローチすべてをサポートしています。
MySQLマスター-マスターレプリケーションは、システムをスケールアップし、バックアップのオーバーヘッドを削減してパフォーマンスを向上させ、アクティブなアプリケーションに冗長性を提供します。それが何であるかわからない場合は、2台のMySQLサーバーが互いに最新の状態を維持しているようなものです。レプリケーションでは、2つの別々のMySQLサーバーがクラスターとして機能します。データベースクラスタリングは、主に高可用性アプリケーション構成に適しています
マスター/マスターレプリケーションは、ServerAをServerBのスレーブとして設定し、ServerBをServerAのスレーブとして設定することで実現されます。
前提: この記事では、MySQLサーバーをインストールする手順については説明していません。Mysqlサーバー(単一インスタンス)が両方のサーバーにインストールされていることを前提としています。
LinuxサーバーでレプリケーションをマスターするようにMySQLマスターを構成するには、2台のサーバーが必要です。情報は次のようになります。
サーバーA :192.168.1.2
サーバーB: 192.168.1.3
OS: RHL 6.4 x86_64
MySQLサーバー: 5.6.17 x86_64
事前チェック:
両方のサーバーでファイアウォールを無効にします:
service iptables stop chkconfig iptables off service iptables status
各サーバーにpingを送信してアクセス可能性を確認するには、両方のサーバーが相互にアクセス可能である必要があります。
両方のサーバーのmy.sandbox.cnfまたはmy.cnfファイルでbind-address属性をコメント化するか、(bind-address =0.0.0.0)に設定します。 my.sandbox.cnfについて説明しました。これは、MySQL ::Sandbox
を使用している場合に使用します。まず、サーバーBからAへのレプリケーションを有効にします
ステップ1:
サーバーA:192.168.1.2
my.sandbox.cnfまたはmy.cnfを編集し、以下の値を追加します。server-idは>0である必要があります。 my.cnfファイルの場所がわからない場合は、OSシェル「mysql–help | grep my.cnf」、通常はmy.cnfは/etc/ディレクトリにあります
server-id=1 replicate-same-server-id=0 auto-increment-increment=2 auto-increment-offset=1 relay-log=serverA-relay-bin relay-log-index=serverA-relay-bin.index master-info-file=mysqk-master.info relay-log-info-file=serverA-relay-log.info log-bin=mysql-bin
サーバーB:192.168.1.3
my.sandbox.cnfまたはmy.cnfを編集し、以下の値を追加しますserver-idは>0である必要があります;
server-id=2 replicate-same-server-id=0 auto-increment-increment=2 auto-increment-offset=2 relay-log=serverB-relay-bin relay-log-index=serverB-relay-bin.index master-info-file=mysqk-master.info relay-log-info-file=serverB-relay-log.info log-bin=mysql-bin
ステップ2:
サーバーA:192.168.1.2
create user 'syncstndby' identified by 'warsaw'; grant replication slave on *.* to 'syncstndby'@'192.168.1.3' identified by 'warsaw'; flush privileges;
サーバーBの場合:192.168.1.3
create user 'syncstndby' identified by 'warsaw'; grant replication slave on *.* to 'syncstndby'@'192.168.1.2' identified by 'warsaw'; flush privileges;
ステップ3:
サーバーB:192.168.1.3
mysql > SHOW GLOBAL VARIABLES LIKE 'PORT'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 5617 | +---------------+-------+ 1 row in set (0.00 sec) mysql > show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000002 | 423 | | | | +------------------+----------+--------------+------------------+-------------------+
サーバーA:192.168.1.2
CHANGE MASTER TO MASTER_HOST='192.168.1.3', MASTER_USER='syncstndby', MASTER_PASSWORD='warsaw', MASTER_PORT= 5617, MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=423;
ここで、これらの属性の値をどこから選択するかを考えます。説明しているので心配しないでください。上記のクエリ(SHOW GLOBAL VARIABLES LIKE'PORT')からMASTER_PORT値を選択してください。この場合、ポートは5617です。 、Mysql-bin.000002)である上記のクエリの列ファイルからMASTER_LOG_FILE値を選択します(「showmaster status;」)、上記のクエリの列位置から423)
であるMASTER_LOG_POS値を選択します。ステップ4:
これで、スレーブを起動できます
mysql>start salve: mysql> show slave status \G;
これで、BからAへのレプリケーションが有効になりました
ステップ5
このステップでは、サーバーBからAへのレプリケーションをテストします。
オンマスター(サーバーB):192.168.1.3
show schemas; create database reptest; create table reptest.simples (id int not null primary key) ; insert into reptest.simples values (999),(1),(2),(3);
オンスレーブ:192.168.1.2(サーバーA)
show schemas; use reptest; select * from reptest.simples;
次に、サーバーAからBへのレプリケーションを有効にします
ステップ6:
サーバーA:192.168.1.2
mysql > SHOW GLOBAL VARIABLES LIKE 'PORT'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 5617 | +---------------+-------+ 1 row in set (0.00 sec) mysql > show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000004 | 120 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
サーバーB:192.168.1.3
CHANGE MASTER TO MASTER_HOST='192.168.1.2', MASTER_USER='syncstndby', MASTER_PASSWORD='warsaw', MASTER_PORT= 5617, MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=120;
上記のクエリ(SHOW GLOBAL VARIABLES LIKE'PORT')からMASTER_PORT値を選択します。この場合、ポートは5617です。上記のクエリ(「showmaster status;」)の列FileからMASTER_LOG_FILE値を選択します。これはMysql-binです。 .000004)、上記のクエリの列位置からMASTER_LOG_POS値120)
を選択します。これで、スレーブを起動できます
mysql> show slave status \G; mysql>start salve: mysql> show slave status \G;
ステップ7
これで環境が設定されました。次に、環境が機能しているかどうかをテストします。
ON 192.168.1.2(サーバーA)
insert into reptest.simples values (777),(41),(15),(61);
ここでは、サーバーBでDB reptestとテーブルを作成したときに、サーバーAに既に複製されているため、DBnamereptestで単純なテーブルを作成していません。
ON 192.168.1.3(サーバーB)
use reptest; select * from reptest.simples;
やあ!すべてが設定され、マスターからマスターへのレプリケーションが設定されていることがわかります。
警告: アプリケーションで両方のサーバーで同時にDMLを実行するのは簡単です。両方のサーバーに同時に書き込むと、高可用性のために適度に耐久性のある高速フェイルオーバーが可能になりますが、パフォーマンスは向上しません。 DMLがクライアントから直接取得されるか、レプリケーションを介して取得されるかに関係なく、両方のサーバーがすべてのDMLを実行する必要があります