MySQLマスターコピーと読み書きから分離


アプリケーションのデータベースへのアクセスは、通常、ほとんどが読み取り操作であり、書き込みはほんの一部であることがわかります.したがって、読み書き分離(read-write-splitting)は、プライマリ・ライブラリの圧力を効果的に低減し、Webサイトの発展過程で発生した最初のデータベース・ボトルネックを解決します.
マスターコピー
まず、mysqlのプライマリ・スレーブ・レプリケーションが非同期であるため、masterライブラリはslaveライブラリの読み取りのために更新操作を記録する必要があります.現在A,Bの2台の機器があると仮定し,Aはmaster,Bはslaveである.
Master
sshからAサーバへ、mysqlにログインし、レプリケーション専用ユーザーreplを作成します.
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'B IP' IDENTIFIED BY '111111';
my.cnfファイルを変更し、bin-logを開き、server-idを設定します.
[mysqld]
log-bin = /XXXX/mysql-bin.log
server-id = 1

mysqlを再起動して構成を有効にします.次に、slaveライブラリを構成する前にmasterライブラリが読み書き操作をしていないことを確認するリードロックを設定します.
flush tables with read lock;

マスターライブラリの現在のbin-logのファイル名とオフセットを表示します.
show master status; +------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+
| mysql-bin.000002 | 1075 | | | +------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

ファイル名とオフセット量をメモします.この時点でmasterはすべてのデータ更新操作を停止し、masterライブラリのデータをバックアップしてslaveライブラリに復元します.この操作はmysqldumpコマンドで完了することを推奨します.マスターバックアップが完了すると、ロックを解除できます.
unlock tables;

Slave
sshからBサーバ、プロファイルの変更:
[mysqld]
server-id = 2
mysqld_safeによってライブラリを起動し、--skip-slave-startパラメータを追加します.
mysqld_safe --skip-slave-start

この目的は、プライマリ・ライブラリ情報が構成されていないため、ライブラリの起動時にレプリケーション・スレッドを起動させないことです.
mysql> CHANGE MASTER TO
-> MASTER_HOST='    ', -> MASTER_PORT=3306, -> MASTER_USER='repl', -> MASTER_PASSWORD='111111', -> MASTER_LOG_FILE='mysql-bin.000002', -> MASTER_LOG_POS=1075;

slaveスレッドを開始するには:
start slave;

これでライブラリからの構成が完了します.すべてがうまくいけば、このときメインライブラリで更新操作を実行し、ライブラリからすぐにフォローします.問題が見つかった場合は、
show slave status;

詳細を表示します.
読み書き分離
現在、読み書きの分離には2つの方法があります.
  • はアプリケーションを制御し、書き込み操作はメインライブラリに接続され、読み取り操作はライブラリから接続される.
  • は、データベースミドルウェアを導入します.公式のmysql-proxyのように.利点は、読み書き分離がアプリケーションに完全に透明であり、プログラムコードを変更する必要がないことです.しかし、現在のmysql-proxyは依然としてalphaバージョンであり、公式には生産環境での使用を推奨していない.

  • 実際には、ReplicationDriverを使用するという優雅なソリューションがあります.MySQLのJDBCドライバにはReplicationDriverが付属しており、JDBCのconn.setReadOnly(true)の接続をすべてスレーブライブラリにルーティングすることができ、プログラムコードの大きな手術を必要としません.Springに合わせて@Transactional(readOnly = true)注記を使用できます.MySQLマスターレプリケーションに遅延があるため、リアルタイム性の要求が高い操作については、readOnlyfalseに設定してReplicationDriverをマスターライブラリからデータを読み出すことも可能です.
    構成例:
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.ReplicationDriver" />
        <property name="url" value="jdbc:mysql:replication://  IP:3306,  IP:3306/test" />
        <property name="username" value="root" />
        <property name="password" value="root" />
        </bean>