[Sharding-JDBCシリーズ1] Spring BootはSharding-JDBCを統合して、読み取りと書き込みの分離を実現します

目次

シャーディング入門-JDBC

mysqlマスタースレーブデータベースを構築する

Springbootアプリケーションの構築

pomの依存関係

application.properties構成

テスト

ログを有効にする(必須ではありません)


シャーディング入門-JDBC

ShardingSphere-JDBCは、JavaのJDBCレイヤーで追加サービスを提供する軽量の分散データベースミドルウェアソリューションとして位置付けられています。クライアントを使用してデータベースに直接接続し、追加の展開や依存関係なしにjarパッケージの形式でサービスを提供します。これは、JDBCおよびさまざまなORMフレームワークと完全に互換性のある拡張JDBCドライバーとして理解できます。

  • JPA、Hibernate、Mybatis、Spring JDBCテンプレートなど、JDBCベースのORMフレームワークに適用できます。または、JDBCを直接使用します。
  • DBCP、C3P0、BoneCP、Druid、HikariCPなどのサードパーティのデータベース接続プールをサポートします。
  • JDBC仕様を実装するすべてのデータベースをサポートし、現在、MySQL、Oracle、SQLServer、PostgreSQL、およびSQL92標準に準拠するすべてのデータベースをサポートしています。

特徴:

  • サブライブラリとサブテーブル
  • 読み取りと書き込みの分離
  • シャーディング戦略のカスタマイズ
  • 分散型分散プライマリキー
  • 分散型ガバナンス
  • 柔軟な取引
  • 標準化されたトランザクションインターフェイス

mysqlマスタースレーブデータベースを構築する

前の記事「[MycatSeriesOne] Dockerに基づくMySQLマスタースレーブレプリケーションの構築の詳細なチュートリアル」を参照して、マスターと2スレーブのmysqlをビルドできます。もちろん、複数のlinuxを使用してdockerを使用せずにビルドすることもできます。詳細は次のとおりです。

データベースタイプ データベース ドッカーコンテナ内のIP ホストIP(外部IP)
主:mysql-master テスト 172.17.0.2:3306 192.168.239.128:3307
差出人:mysql-slave1 テスト 172.17.0.3:3306 192.168.239.128:3308
差出人:mysql-slave2 テスト 172.17.0.4:3306 192.168.239.128:3309

マスターとスレーブを構成した後、マスターライブラリに新しいデータベーステストを作成します。Navicatなどのサードパーティのクライアントツールやコマンドラインスクリプトを使用できます。SQLスクリプトは次のとおりです。

USE `test`;

DROP TABLE IF EXISTS `t_user`;

CREATE TABLE `t_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT '' COMMENT '名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1307873057269878786 DEFAULT CHARSET=utf8 COMMENT='用户表';

ナビキャットの効果は次のとおりです。

Springbootアプリケーションの構築

この記事では、SpringBoot + Mybatis-plus + Druid + Sharding-JDBC + MySQLを次のように統合します。

pomの依存関係

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>

        <!-- 数据库连接池 -->
       <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.22</version>
        </dependency>

        <dependency>
            <groupId>io.shardingsphere</groupId>
            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
            <version>3.1.0.M1</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.2</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.1.2</version>
        </dependency>

application.properties構成

# 服务端口
server.port=8080

# mysql-plus 配置
mybatis-plus.mapper-locations=classpath:/mapper/*.xml
mybatis-plus.type-aliases-package=com.stwen.shardingjdbc.entity

spring.main.allow-bean-definition-overriding=true

# sharding-jdbc 配置主从
sharding.jdbc.dataSource.names=master,slave1,slave2

# sharding-jdbc 主数据库
sharding.jdbc.dataSource.master.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.dataSource.master.driverClassName=com.mysql.jdbc.Driver
sharding.jdbc.dataSource.master.url=jdbc:mysql://192.168.239.128:3307/test?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT
sharding.jdbc.dataSource.master.username=root
sharding.jdbc.dataSource.master.password=123456
sharding.jdbc.dataSource.master.maxPoolSize=20

# sharding-jdbc 从数据库一
sharding.jdbc.dataSource.slave1.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.dataSource.slave1.driverClassName=com.mysql.jdbc.Driver
sharding.jdbc.dataSource.slave1.url=jdbc:mysql://192.168.239.128:3308/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
sharding.jdbc.dataSource.slave1.username=root
sharding.jdbc.dataSource.slave1.password=123456
sharding.jdbc.dataSource.slave1.maxPoolSize=20

# sharding-jdbc 从数据库二
sharding.jdbc.dataSource.slave2.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.dataSource.slave2.driverClassName=com.mysql.jdbc.Driver
sharding.jdbc.dataSource.slave2.url=jdbc:mysql://192.168.239.128:3309/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT
sharding.jdbc.dataSource.slave2.username=root
sharding.jdbc.dataSource.slave2.password=123456
sharding.jdbc.dataSource.slave2.maxPoolSize=20

# 配置从库选择策略,提供轮询与随机,这里选择用轮询,random-随机
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
# 配置主从读写分离
sharding.jdbc.config.masterslave.name=master-slave 
sharding.jdbc.config.masterslave.master-data-source-name=master
sharding.jdbc.config.masterslave.slave-data-source-names=slave1,slave2
# 开启SQL显示,默认值: false,注意:仅配置读写分离时不会打印日志
sharding.jdbc.props.sql.show=true

構成パラメーターの説明:

  • mybatis-plus.mapper-locations:XXXmapper.xmlマッピングファイルのパス
  • mybatis-plus.type-aliases-package:エンティティクラスパッケージ名
  • sharding.jdbc.dataSource.names:構成はデータベースの名前であり、上記で構築された複数のデータソースの名前です。
  • sharding.jdbc.dataSource:複数のデータソースを構成します

他の詳細なパラメータは1つずつ説明されるのではなく、それを見て理解するだけです。

その中で、次のエラーが報告されないようにspring.main.allow-bean-definition-overriding = trueが追加されています。

Springbootスタートアップクラスで、次のように構成を追加し、mybatisのdaoインターフェイスパッケージをスキャンします

WeChatスクリーンショット_20190626145550.png

テスト

テストクラスを作成し、2つのインターフェイスを追加します:新しいクエリリストを追加します

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private IUserService userService;

    @PutMapping("/save")
    public Object save() {
        User user = new User();
        user.setName("新增");
        return userService.save(user);
    }
    
    @GetMapping("/list")
    public Object list() {
        // 强制路由主库
        //HintManager.getInstance().setMasterRouteOnly();
        return userService.list();
    }
    
}

アプリケーションを起動し、インターフェイスにアクセスします:localhost:8080 / user / save、データを表示して、新しいデータが追加されていることを確認できます

リストクエリインターフェイスに再度アクセスします:localhost:8080 / user / list

ログを有効にする(必須ではありません)

(必須ではありません)sqlステートメントのログをオンにします。実稼働環境でオンにすることはお勧めしません。これは、読み取りと書き込みの分離の効果が達成されているかどうかを確認するためだけです。

ログディレクトリを表示し、sqlステートメントのログを開きます。

mysql>  show variables like '%general_log%';
mysql>  set global general_log=on;

注意:

  • 上記で構成された3つのデータベースに接続し、上記のコマンドを実行して、sqlロギングをオンにします(有効にするために再起動する必要はありません)。
  • Mysqlを再起動すると、上記のログ設定は無効になります。

3つのデータベースをセットアップした後、2つのテストインターフェイスに再度アクセスし、sqlログを確認します。

次のように、mysql-masterコンテナで、sqlログを確認すると、挿入されたsqlがメインデータベースで実行されていることがわかります。

次のように、mysql-slave2のsqlログを確認すると、データベースから読み取りリストデータが実行され、構成した読み取り/書き込み分離が成功したことが示されます。

マスタースレーブ同期遅延

  これは、読み取り/書き込み分離アーキテクチャ、つまり読み取り遅延の問題を解決する方法によく見られます。

  データを挿入してすぐに読み取ってください。現時点では読み取れないのでしょうか。最終的な分析では、マスターノードが書き込まれた後にデータがスレーブノードにコピーされるためです。データを読み取れない理由は、コピー時間が比較的長い、つまりデータがスレーブノードにコピーされていないため、ノードから読み取る必要があるためです。読めません。mysql5.7のマスタースレーブレプリケーションはマルチスレッドです。つまり、速度は速くなりますが、すぐに100%読み取られるとは限りません。この問題は2つの方法で解決できます。

  (1)業務完了後すぐに読まれるかどうか、事業レベルでの妥協

  (2)手術直後に読み取られ、業務上妥協できないものについては、直接メインライブラリにアクセスしてこのタイプの読み取りを行うことができます。もちろん、Sharding-JDBCもこの問題の存在を考慮しているため、この関数を使用すると、ユーザーはメインライブラリを読み取りに使用するかどうかを指定できます。読む前に、次の方法を使用して設定してください。

    @GetMapping("/list")
    public Object list() {
        // 强制路由主库
        HintManager.getInstance().setMasterRouteOnly();
        return userService.list();
    }

メインライブラリ構成のsqlログを確認すると、次の印刷出力が表示され、読み取り操作が強制的に実行されていることがメインライブラリに示されます。

SELECT  id,name  FROM t_user

史上最強のTomcat8パフォーマンス最適化

なぜアリババは90秒で100億に抵抗できるのですか?-サーバー側の高同時分散アーキテクチャの進化

B2Beコマースプラットフォーム--ChinaPayUnionPay電子決済機能

Zookeeperの分散ロックを学び、インタビュアーに感心してあなたを見てもらいましょう

SpringCloudeコマーススパイクマイクロサービス-Redisson分散ロックソリューション

もっと良い記事をチェックして、公式アカウントを入力してください-私にお願いします-過去に素晴らしい

深くソウルフルなパブリックアカウント0.0

おすすめ

転載: blog.csdn.net/a1036645146/article/details/108705394