MySQLマスターコピーと読み書きから分離
アプリケーションのデータベースへのアクセスは、通常、ほとんどが読み取り操作であり、書き込みはほんの一部であることがわかります.したがって、読み書き分離(read-write-splitting)は、プライマリ・ライブラリの圧力を効果的に低減し、Webサイトの発展過程で発生した最初のデータベース・ボトルネックを解決します.
マスターコピー
まず、mysqlのプライマリ・スレーブ・レプリケーションが非同期であるため、masterライブラリはslaveライブラリの読み取りのために更新操作を記録する必要があります.現在A,Bの2台の機器があると仮定し,Aはmaster,Bはslaveである.
Master
sshからAサーバへ、mysqlにログインし、レプリケーション専用ユーザー
mysqlを再起動して構成を有効にします.次に、slaveライブラリを構成する前にmasterライブラリが読み書き操作をしていないことを確認するリードロックを設定します.
マスターライブラリの現在のbin-logのファイル名とオフセットを表示します.
ファイル名とオフセット量をメモします.この時点でmasterはすべてのデータ更新操作を停止し、masterライブラリのデータをバックアップしてslaveライブラリに復元します.この操作は
Slave
sshからBサーバ、プロファイルの変更:
この目的は、プライマリ・ライブラリ情報が構成されていないため、ライブラリの起動時にレプリケーション・スレッドを起動させないことです.
slaveスレッドを開始するには:
これでライブラリからの構成が完了します.すべてがうまくいけば、このときメインライブラリで更新操作を実行し、ライブラリからすぐにフォローします.問題が見つかった場合は、
詳細を表示します.
読み書き分離
現在、読み書きの分離には2つの方法があります.はアプリケーションを制御し、書き込み操作はメインライブラリに接続され、読み取り操作はライブラリから接続される. は、データベースミドルウェアを導入します.公式の
実際には、
構成例:
マスターコピー
まず、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マスターレプリケーションに遅延があるため、リアルタイム性の要求が高い操作については、readOnly
をfalse
に設定して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>