MySQL のマスター/スレーブ レプリケーションを使用して読み取り/書き込み分離アーキテクチャを実装する方法
従来の Web アプリケーションでは、通常、読み取り操作と書き込み操作は同じデータベース サーバーに接続されます。アプリケーションが開発され、アクセス量が増加すると、このアーキテクチャはデータベースのパフォーマンスのボトルネックを引き起こしやすくなります。この問題を解決するには、MySQL のマスター/スレーブ レプリケーションを使用して、読み取り/書き込み分離アーキテクチャを実装できます。この記事では、MySQL のマスター/スレーブ レプリケーションを使用して読み取りと書き込みの分離を実現する方法を紹介し、対応するコード例を示します。
(1) メイン データベースの設定ファイル my.cnf を開き、次の設定を次の場所に追加します。最後:
# 设置为主数据库 server-id=1 log-bin=mysql-bin
(2) メイン データベースを再起動します:
$ sudo service mysql restart
(1) スレーブ データベースを開きます。 データベース構成ファイル my.cnf の最後に次の構成を追加します。
# 设置为从数据库 server-id=2 relay-log=mysql-relay-bin
(2) スレーブ データベースを再起動します。
$ sudo service mysql restart
コピー用のユーザーを作成し、対応する権限を付与します。次のコマンドを実行します:
mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'password'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%'; mysql> FLUSH PRIVILEGES;
スレーブ データベースで次のコマンドを実行して、マスター/スレーブ レプリケーションを開始します:
mysql> CHANGE MASTER TO MASTER_HOST='主数据库IP', MASTER_USER='replication', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=0; mysql> START SLAVE;
スレーブ データベースで次のコマンドを実行して、マスター/スレーブ レプリケーションのステータスを表示します:
mysql> SHOW SLAVE STATUS G
Slave_IO_Running: Yes Slave_SQL_Running: Yes
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ReadWriteSeparationExample { public static void main(String[] args) { // 读操作连接从数据库 Connection readConn = null; String readUrl = "jdbc:mysql://从数据库IP:端口/数据库名"; String readUser = "用户名"; String readPassword = "密码"; try { readConn = DriverManager.getConnection(readUrl, readUser, readPassword); Statement readStmt = readConn.createStatement(); ResultSet readResult = readStmt.executeQuery("SELECT * FROM 表名"); while (readResult.next()) { // 处理查询结果 } readResult.close(); readStmt.close(); readConn.close(); } catch (SQLException e) { e.printStackTrace(); } // 写操作连接主数据库 Connection writeConn = null; String writeUrl = "jdbc:mysql://主数据库IP:端口/数据库名"; String writeUser = "用户名"; String writePassword = "密码"; try { writeConn = DriverManager.getConnection(writeUrl, writeUser, writePassword); Statement writeStmt = writeConn.createStatement(); writeStmt.execute("INSERT INTO 表名 VALUES(1, '数据')"); writeStmt.close(); writeConn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
以上がMySQL のマスター/スレーブ レプリケーションを使用して読み取り/書き込み分離アーキテクチャを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。