Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Building Scalable Spring Applications with Yuga...

Takeshi
March 28, 2023

Building Scalable Spring Applications with YugabyteDB

Takeshi

March 28, 2023
Tweet

More Decks by Takeshi

Other Decks in Technology

Transcript

  1. Distributed SQL Summit ASIA 2023 | 2023-03-28 YugabyteDB によるスケーラブルな Spring

    アプリケーションの構築 OGAWA,Takeshi Tagbangers,Inc.
  2. ©2023 Tagbangers,Inc. Agenda • 従来の RDB と YugabyteDB のスケーラビリティ •

    YugabyteDB のはじめかた • スケーラビリティを⽀える YugabyteDB の仕組み • Spring Application への組み込み 2
  3. ©2023 Tagbangers,Inc. 従来の RDB のスケーラビリティ 4 Primary Read 
 Replica

    • リードレプリカで読み取り負荷をオフロード • 書き込みできるのはプライマリーのみ • アプリケーションは書き込みと読み込みのエンドポイントを区 別してクエリーをルーティングする必要がある App Read Only Read & Write 🤔
  4. ©2023 Tagbangers,Inc. 従来の RDB の⽔平スケール 5 App Primary Read 


    Replica Read 
 Replica • リードレプリカが⽔平スケール • プライマリーは垂直スケールのみ • 追加されたリードレプリカのエンドポイントをア プリケーションが管理する必要がある App App Scale out Scale out Scale up 🤔 Read Only Read Only
  5. ©2023 Tagbangers,Inc. YugabyteDB のスケーラビリティ 6 ❤ App Yugabyte 
 DB

    Yugabyte 
 DB App App Scale out Yugabyte 
 DB Read & Write Read & Write Read & Write Scale out • Read / Write ともに⽔平スケール可能 • Yugabyte JDBC Driver によって追加されたノード のエンドポイントを⾃動で認識できる
  6. ©2023 Tagbangers,Inc. docker run -d -p7000 yugabytedb/yugabyte:latest bin/yugabyted start \

    - Single-node Cluster 8 Node YugabyteDB 1. Docker network の作成 💡 PostgreSQL 互換 docker network create yugabyte spring: datasource: url: jdbc:postgresql: username: yugabyte password: yugabyte 2. Docker run
  7. ©2023 Tagbangers,Inc. Multi-node Cluster 9 Node #2 Node #3 Node

    #1 最初に作成したノード👆に2つのノードを追加する👇 YugabyteDB Cluster 👍 Dynamically add nodes docker run -d yugabytedb/yugabyte:latest bin/yugabyted start \ - docker run -d yugabytedb/yugabyte:latest bin/yugabyted start \ - docker run -d -p7000 yugabytedb/yugabyte:latest bin/yugabyted start \ -
  8. ©2023 Tagbangers,Inc. Node #3 Node #2 Node #1 Two-server Architecture

    12 Master App JDBC:5433 TServer TServer TServer Master Master JDBC:5433 JDBC:5433 • メタデータを管理する • Raft によって複数の Node の Master Server から単⼀の リーダーが選出される • JDBC のエンドポイントを提供する • ユーザーデータの管理とクエリーの処理 Master Server (Master) Tablet Server (TServer) Leader Follower Follower
  9. ©2023 Tagbangers,Inc. yugabyted • Master Server と TServer を両⽅を起動するため、ローカル 環境などでの検証に便利

    • 本番環境での利⽤は⾮推奨 13 Node Master TServer Master TServer JDBC:5433 HTTP:9000 HTTP:7000 docker run -d -p7000 yugabytedb/yugabyte:latest bin/yugabyted start \ - App RPC:9100 RPC:7100 HTTP:13000 RPC:9100 RPC:7100 External Internal Web / Metrics Web / Metrics
  10. ©2023 Tagbangers,Inc. Tablet sharding 14 ID NAME … 1 Ogawa

    … 2 John … 3 Anne … 4 Sala … 5 Ray … テーブルのデータは… TServer #3 TServer #2 TServer #1 分散して Tablet に保存される Tablet #1 Tablet #2 Tablet #3 Tablet #4 1 Ogawa … 3 Anne … 4 Sala … 5 Ray … 2 John … ⾏ごとに分割され… Auto-sharding
  11. ©2023 Tagbangers,Inc. TServer Replication factor 15 TServer TServer Tablet#1-Follower Tablet#3-Leader

    Tablet#2-Follower Tablet#1-Leader Tablet#2-Follower Tablet#3-Follower Table#1-Follower Tablet#2-Leader Tablet#3-Follower Tablet Peer Replication Replication • Tablet は Replication Factor で指定した数で複数の TServer 間で均⼀となるように複製される • Tablet は Raft によって単⼀の Leader が選出される(Master Server と同じように) • 基本的にデータの読み込み/書き込みは Leader に対して⾏われる
  12. ©2023 Tagbangers,Inc. Tablet の⾃動的なリバランス 16 TServer TServer TServer Tablet#1 Tablet#3

    Tablet#2 Tablet#1 Tablet#2 Tablet#3 Table#1 Tablet#2 Tablet#3 TServer TServer TServer Tablet#3 Tablet#2 Tablet#1 Tablet#3 Table#1 Tablet#2 TServer Table#1 Tablet#3 Tablet#2 Tablet#1 Add Tablet#3 Auto-balancing Data 読み取り/書き込み処理が特定のノードに 集中せず、ノード間で均等に分散されス ループットが向上する
  13. ©2023 Tagbangers,Inc. Read I/O Path 17 https://www.yugabyte.com/blog/how-does-the-raft-consensus-based-replication-protocol-work-in-yugabyte-db/ Node #2 Node

    #3 Node #1 TServer App Master 
 Leader TServer TServer 1 参照クエリー 2 Tablet-Leader の場所を取得 Tablet 
 Leader 3 Tablet-Leader にからデータを取得 4 クエリー結果
  14. ©2023 Tagbangers,Inc. Write I/O Path 18 https://www.yugabyte.com/blog/how-does-the-raft-consensus-based-replication-protocol-work-in-yugabyte-db/ Node #2 Node

    #3 Node #1 TServer App Master 
 Leader TServer TServer 1 更新クエリー 2 Tablet-Leader の場所を取得 Tablet 
 Leader 3 Tablet-Leader に書き込み Tablet 
 Follower Tablet 
 Follower 4 4 Tablet-Follower と同期 5 1 つの Follower へのレプリケーションが 
 完了してから結果が返る
  15. ©2023 Tagbangers,Inc. App Connection Pool 20 TServer Connection 
 Pool

    Connection • YugabyteDB においても RDB と同様、JDBC 接続にはコストがかかるためコネクションプールが必要 • YugabyteDB 固有の JDBC Driver を使⽤することでスケーラブルなアプリケーションが構築できる DataSource Driver
  16. ©2023 Tagbangers,Inc. App Yugabyte JDBC Driver 21 TServer 
 #1

    jdbc:yugabytedb:tserver#1 Connection Pool JDBC 
 URL エンドポイントは単⼀の TServer だけを指定 
 コネクションをプールを⾏う App Connection Pool TServer 
 #1 TServer 
 #2 TServer 
 #3 Add Add Dynamically add nodes JDBC 
 URL 追加された TServer を⾃動認識 
 コネクション数が TServer 間で均⼀となるよ うに調整される App Connection Pool TServer 
 #1 TServer 
 #2 TServer 
 #3 Remove JDBC 
 URL Dynamically remove nodes 削除された TServer に対するコネクションが廃⽌され 
 アクティブな TServer で調整される
  17. ©2023 Tagbangers,Inc. application.yml 22 spring: datasource: type: com.zaxxer.hikari.HikariDataSource hikari: username:

    yugabyte password: yugabyte data-source-class-name: com.yugabyte.ysql.YBClusterAwareDataSource data-source-properties: url: jdbc:yugabytedb: // yugabyte1 : 5433/yugabyte?load-balance=true additionalEndpoints: yugabyte2 : 5433,yugabyte3 : 5433 HikariCP が YugabyteDB への物理接続を管理できるように、 
 DataSource クラス に YBClusterAwareDataSource を指定 👇 👇 単⼀の TServer のエンドポイントを指定し、 
 ロードバランス機能を有効化 👇 単⼀の TServer のエンドポイントを指定
  18. ©2023 Tagbangers,Inc. Beans 23 @Bean @ConfigurationProperties(prefix = "spring.datasource.hikari") public HikariConfig

    hikariConfig() { return new HikariConfig(); } @Bean public DataSource dataSource(HikariConfig hikariConfig) { return new HikariDataSource(hikariConfig); }
  19. ©2023 Tagbangers,Inc. yugabyte=# select * from yb_servers(); host | port

    | num_connections | node_type | cloud | region | zone | public_ip | … ------------+------+-----------------+-----------+--------+-------------+-------+-------------+ 172.19.0.4 | 5433 | 0 | primary | cloud1 | datacenter1 | rack1 | 10.200.10.2 | … 172.19.0.5 | 5433 | 0 | primary | cloud1 | datacenter1 | rack1 | 10.200.10.3 | … 172.19.0.2 | 5433 | 0 | primary | cloud1 | datacenter1 | rack1 | 10.200.10.1 | … yb_servers 関数 24 TServer Driver TServer のリスト select * from yb_servers() • Driver は接続開始時に yb_servers() によって TServer のリスト を取得する • TServer のリストは Driver 側キャッシュされ、5 分ごとにリフ レッシュされる • Driver は新しいコネクションを作成する際に最も接続数の少な い TServer に接続する connect( … )
  20. ©2023 Tagbangers,Inc. 最⼤接続数の拡張 26 App App App TServer TServer TServer

    Max connections 
 300 Max connections 
 300 Max connections 
 300 Pool size 
 300 Scale out yugabyte=# show max_connections; max_connections ----------------- 300 最⼤接続数は TServer ごとにあるため TServer を追加することで接続数 を拡張できる TServer の最⼤接続数は次の SQL で確認できる(デフォルトは 300) Pool size 
 300 Pool size 
 300
  21. ©2023 Tagbangers,Inc. スケールイン時の Exception 28 🔥 App TServer Remove •

    Connection Pool からスケールインで削除された TServer への無効な Connection を取得してしまった め、Application で 500 エラーが発⽣ 👇 👇
  22. ©2023 Tagbangers,Inc. Retry 29 @Retryable( retryFor = { SocketTimeoutException.class, TransactionSystemException.class,

    CannotCreateTransactionException.class }, maxAttempts = 5) public interface SampleRepository extends CrudRepository<Sample, String> { }