sql >> データベース >  >> RDS >> Mysql

MySQLマスターからマスターへのレプリケーション

    レプリケーションは、実行された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を実行する必要があります


    1. 自動インクリメント主キーの並べ替え/リセット

    2. SQL Server ROWCOUNT_BIG()

    3. 12cデータ編集

    4. 組織にMicrosoftAccessを導入することの真の価値は何ですか?