読み取りと書き込みの分離
読み取りと書き込みの圧力はすべて 1 つのデータベースで負担され、高い圧力によってデータベース サーバーのディスクが損傷すると、データが失われ、単一障害点となります。
MySQL マスター/スレーブ レプリケーション
導入
MySQL のマスター/スレーブ レプリケーションは非同期レプリケーション プロセスであり、最下層はNysql データベースに付属するバイナリ ログ機能に基づいています。
1 つ以上の MysQL データベース (スレーブ、つまりライブラリから)が別の MySQL データベース (マスター、つまりメイン ライブラリ) からログをコピーし、ログを解析してそれ自体に適用し、最終的に実現します。データベースのデータとメイン ライブラリのデータは一貫性を保ちます。
MySQL のマスター/スレーブ レプリケーションは、サードパーティ ツールを必要としない MySQL データベースの組み込み機能です。
MySQL レプリケーション プロセスは 3 つのステップに分かれています。
- マスターは変更をバイナリログ(バイナリログ)に記録します
- スレーブはマスターのバイナリ ログをリレー ログ (リレー ログ) にコピーします。
- スレーブはリレー ログ内のイベントをやり直し、変更を自身のデータベースに適用します。
構成 - 前提条件
事前にサーバーを2台用意し、それぞれMysqlをインストールして正常にサービスを開始します
構成 - メインライブラリマスター
ステップ 1: Mysql データベースの構成ファイル /etc/my.cnf を変更します (find / -name my.cnf を使用して見つけることができます)
[mysqld]
log-bin=mysql-bin # [必须]启用二进制日志
server-id=100 #[必须]服务器唯一ID
ステップ 2: Mysql サービスを再起動する
systemctl restart mysqld
ステップ 3: Mysql データベースにログインし、次の SQL を実行します。
GRANT REPLICATION SLAVE ON *.* to 'xiaoming'@'%' identified by 'Root@123456';
注: 上記の SQL の機能は、ユーザー xiaoming を作成し、パスワードは Root@123456 であり、ユーザー xiaoming に REPLICATION SLAVE 権限を付与することです。
これは、レプリケーションに必要なユーザー権限を確立するためによく使用されます。つまり、このユーザーを介してレプリケートできるようにするには、スレーブがこの権限を持つユーザーであることをマスターによって承認される必要があります。
ステップ 4: Mysql データベースにログインし、次の SQL を実行し、結果の File と Position の値を記録します。
show master status;
バイナリ ログ ファイル名と位置を書き留めます。
注: 上記 SQL の機能はマスターのステータスを確認することです。この SQL の実行後は何も操作しません。
構成 - ライブラリからのスレーブ
ステップ 1: Mysql データベースの構成ファイル /etc/my.cnf を変更します (ubuntu20 は /etc/mysql/mysql.conf.d/mysqld.cnf)
[mysqld]
server-id=101 #[必须]服务器唯一ID
ステップ 2: Mysql サービスを再起動する
systemctl restart mysqld
ubuntu22使用
service mysql restart
ステップ 3: Mysql データベースにログインし、次の SQL を実行します。
change master to
master_host='这里输入master的ip地址', master_user='这里输入master中有REPLICATION SLAVE权限的用户名' ,master_password='这里输入用户密码', master_log_file= '这里输入master里的二进制log文件名', master_log_pos=这里输入master里的Position;
start slave;
ステップ 4: Mysql データベースにログインし、次の SQL を実行し、スレーブ データベースのステータスを確認します。
show slave status;
- ここを使用します
change master to
master_host='192.168.5.131', master_user='小明' ,master_password='Root@123456', master_log_file= 'mysql-bin.000002', master_log_pos=154;
- SLAVEサービスを停止します
STOP SLAVE IO_THREAD;
読み取りと書き込みが分離されている場合
バックグラウンド
システムアクセスの増加に伴い、データベースのスループットが大きなボトルネックに直面しています。同時読み取り操作が多数あり、同時に書き込み操作が少ないアプリケーション システムの場合、データベースはマスター データベースとスレーブ データベースに分割され、データ更新によって引き起こされる行ロックを効果的に回避し、全体のクエリ パフォーマンスを大幅に向上させます。システム。
シャーディング - JDBC の概要
Sharding-JDBC は軽量の Java フレームワークとして位置付けられ、Java JDBC レイヤーで追加のサービスを提供します。クライアントを使用してデータベースに直接接続し、追加の展開や依存関係を必要とせずに、jar パッケージの形式でサービスを提供します。JDBC ドライバーの拡張バージョンとして理解でき、JDBC およびさまざまな ORM フレームワークと完全な互換性があります。
Sharding-JDBCを利用すると、プログラム内でデータベースの読み書きの分離を簡単に実現できます。
- JPA、Hibernate、Mybatis、Spring JDBC Template などの JDBC ベースの ORM フレームワークに適用するか、JDBC を直接使用します。
- DBCP、C3P0、BoneCP、Druid、HikariCP などのサードパーティのデータベース接続プールをサポートします。
- JDBC 仕様を実装するデータベースはすべてサポートされます。現在、MySQL、Oracle、SQLServer、PostgreSQL、および SQL92 標準に準拠するデータベースをサポートしています。
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.O-RC1</version>
</dependency>
Sharding-JDBC を使用して、読み取りと書き込みの分離手順を実現します。
-
Maven 座標をインポートする
<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.0-RC1</version> </dependency>
-
構成ファイルで読み取り/書き込み分離ルールを構成する
spring: shardingsphere: datasource: names: master,slave # 主数据源 master: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://主库ip/使用的数据库名称?characterEncoding=utf-8 username: root password: root # 从数据源 slave: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://从库ip/使用的数据库名称?characterEncoding=utf-8 username: root password: root masterslave: # 读写分离配置 load-balance-algorithm-type: round_robin #多从库策略:轮询 # 最终的数据源名称 name: dataSource # 主库数据源名称 master-data-source-name: master # 从库数据源名称列表,多个逗号分隔 slave-data-source-names: slave props: sql: show: true #开启SQL显示在控制台输出,默认false
-
構成ファイル内の構成により、Bean 定義が構成項目をオーバーライドできるようになります
spring: main: allow-bean-definition-overriding: true
プロジェクトは読み取りと書き込みの分離を実現します
データベース環境の準備(マスタ・スレーブレプリケーション)
メイン ライブラリにセント レジス テイクアウト プロジェクトのビジネス データベース reggie を作成し、関連するテーブル構造とデータをインポートします。
コードの変更
Sharding-JDBC をプロジェクトに追加して、読み取りと書き込みの分離手順を実現します。
-
Maven 座標をインポートする
<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.O-RC1</version> </dependency>
-
構成ファイルで読み取り/書き込み分離ルールを構成する
spring: shardingsphere: datasource: names: master,slave # 主数据源 master: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://主库ip/使用的数据库名称?characterEncoding=utf-8 username: root password: root # 从数据源 slave: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://从库ip/使用的数据库名称?characterEncoding=utf-8 username: root password: root masterslave: # 读写分离配置 load-balance-algorithm-type: round_robin #多从库策略:轮询 # 最终的数据源名称 name: dataSource # 主库数据源名称 master-data-source-name: master # 从库数据源名称列表,多个逗号分隔 slave-data-source-names: slave props: sql: show: true #开启SQL显示在控制台输出,默认false
-
構成ファイル内の構成により、Bean 定義が構成項目をオーバーライドできるようになります
spring: main: allow-bean-definition-overriding: true