セント レジス テイクアウト プロジェクト - 読み取りと書き込みの分離

読み取りと書き込みの分離

読み取りと書き込みの圧力はすべて 1 つのデータベースで負担され、高い圧力によってデータベース サーバーのディスクが損傷すると、データが失われ、単一障害点となります。

MySQL マスター/スレーブ レプリケーション

導入

MySQL のマスター/スレーブ レプリケーションは非同期レプリケーション プロセスであり、最下層はNysql データベースに付属するバイナリ ログ機能に基づいています。

1 つ以上の MysQL データベース (スレーブ、つまりライブラリから)が別の MySQL データベース (マスター、つまりメイン ライブラリ) からログをコピーし、ログを解析してそれ自体に適用し、最終的に実現します。データベースのデータとメイン ライブラリのデータは一貫性を保ちます。

MySQL のマスター/スレーブ レプリケーションは、サードパーティ ツールを必要としない MySQL データベースの組み込み機能です。

MySQL レプリケーション プロセスは 3 つのステップに分かれています。

  • マスターは変更をバイナリログ(バイナリログ)に記録します
  • スレーブはマスターのバイナリ ログをリレー ログ (リレー ログ) にコピーします。
  • スレーブはリレー ログ内のイベントをやり直し、変更を自身のデータベースに適用します。

1

構成 - 前提条件

事前にサーバーを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 を使用して、読み取りと書き込みの分離手順を実現します。

  1. Maven 座標をインポートする

    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <version>4.0.0-RC1</version>
    </dependency>
    
  2. 構成ファイルで読み取り/書き込み分離ルールを構成する

    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
    
  3. 構成ファイル内の構成により、Bean 定義が構成項目をオーバーライドできるようになります

    spring:
      main:
        allow-bean-definition-overriding: true
    

プロジェクトは読み取りと書き込みの分離を実現します

データベース環境の準備(マスタ・スレーブレプリケーション)

メイン ライブラリにセント レジス テイクアウト プロジェクトのビジネス データベース reggie を作成し、関連するテーブル構造とデータをインポートします。

コードの変更

Sharding-JDBC をプロジェクトに追加して、読み取りと書き込みの分離手順を実現します。

  1. Maven 座標をインポートする

    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
        <version>4.0.O-RC1</version>
    </dependency>
    
  2. 構成ファイルで読み取り/書き込み分離ルールを構成する

    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
    
  3. 構成ファイル内の構成により、Bean 定義が構成項目をオーバーライドできるようになります

    spring:
      main:
        allow-bean-definition-overriding: true
    

おすすめ

転載: blog.csdn.net/jihuaTEL/article/details/130255550