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

【NewSQL】アプリケーション開発観点からのTiDB - Java編

【NewSQL】アプリケーション開発観点からのTiDB - Java編

このスライドでは、アプリケーション開発者やアーキテクトの方々に対して、TiDBというデータベースをアプリケーションからどのように利用するのか、他データベースからの移行にあたって、アプリケーション開発者の観点から考慮するべきかについてご紹介します。

アーカイブ動画:https://youtu.be/8DZXIqZoCs4

PingCAP-Japan

May 26, 2022
Tweet

More Decks by PingCAP-Japan

Other Decks in Technology

Transcript

  1. 本日のセッションの位置づけ ・イベント登録 : https://pingcap.co.jp/event/ ・過去開催アーカイブ :  https://www.youtube.com/channel/UCatxrGZANSnii2fe7FeEwvg/playlists 2022年4月14日(木) 14:00-15:30 TiDB ソフトウェアの紹介・デモ 2022年4月21日(木) 14:00-15:00

    アプリケーション開発観点からの TiDB - Ruby編 2022年5月12日(木) 14:00-15:30 TiDB Cloudの紹介・デモ 2022年5月19日(木) 14:00-15:00 最新TiDB 6.0のポイント 2022年5月26日(木) 14:00-15:00 アプリケーション開発観点からの TiDB - Java編 2022年6月9日(木) 14:00-15:30 TiDB ソフトウェアの紹介・デモ 2022年6月16日(木) 14:00-15:00 PingCAP Education:TiKV- RocksDBについて 2022年6月23日(木) 14:00-15:00 アプリケーション開発観点からの TiDB - PHP編
  2. これまでの対応案の難しさ • 読み込み/書き込み分割 ◦ 必要なデータの「新鮮さ」に応じて接続先を切り替える必要 • シャーディング ◦ テーブルの列にシャーディングキーを追加する設計が必要 ◦

    アプリケーションがどのインスタンスにどのデータがあるか知る必要 ◦ マスターデータはすべてのインスタンスにコピーする必要あり ◦ DDLもすべてのインスタンスに個別に実行する必要あり • データベースサーバーのスケールアップ ◦ 利用できるスペックの上限に達する可能性あり
  3. スケールアウト可能なMySQLプロトコル互換 TiDB クエリの増加 ノード追加で対応 TiDB TiDB Cluster
 TiKV Cluster
 負荷分散・領域管理

    3ノードのみ必要 PD Cluster TiDB TiKV TiKV TiKV TiKV 容量拡張 ノード追加で対応 TSO / Data Location Metadata
 PD PD PD Application via MySQL Protocol Application via MySQL Protocol Application via MySQL Protocol Application via MySQL Protocol データストアレイヤー アプリケーション (MySQL Client利用可能) - TiDB : クエリーの増加に対してTiDBサーバーのスケールアウト可能 - TiKV : データ容量/IO要件の増加に対してTiKVサーバーのスケールアウト可能 SQL解析レイヤー (Parser, Optimizer)
  4. TiDBによってできること • 読み込み/書き込み分割 ◦ どのTiDBサーバーに接続しても最新のデータを読み書き可能 • シャーディング ◦ TiKVが内部的にテーブルをRegionという単位で分割する ◦

    テーブルにシャーディング用のキーは不要 ◦ DDLも一度実行すれば、すべてのサーバーに自動的に伝播されます • データベースサーバーのスケールアップ ◦ クエリー数の増加に応じてTiDBをスケールアウト可能 ◦ 容量、IO要件の増加に対してTiKVをスケールアウト可能
  5. TiDBと各開発言語、フレームワーク • App Development Overview | PingCAP Docs ◦ 一覧にないコネクター、アダプターやフレームワークをご利用の場合はお知らせください

    • MySQLプロトコルレベル : “Connectors” → “Full support” ◦ Java: MySQL Connector/J ◦ PHP: something • SQLレベル : “ORM Frameworks” → “Verified support” ◦ Java: Hibernate ◦ PHP: Something • Full support : 既知の問題が存在しない • Verified Support : TiDBがサポートしていない機能がある場合(例 外部キーなど)
  6. TiDBとJavaアプリケーションの関連 TiDB Spring Data JPA Hibernate ORM (JPAプロバイダとして) レポジトリ MySQL

    Connector/J JDBC データベース(永続層) ORM (Javaのオブジェクトとデータベースの relationの相 互変換) レポジトリ JDBC Data Source
  7. MySQL Connector/J • MySQLプロトコルレベル : “Connectors”にあたるもの • TiDB/MySQLに接続するためのJDBCドライバー ◦ MySQLに接続するためのJDBCドライバーをTiDBにそのままご利用いただけます

    • Known issue ◦ MySQL Connector/J 8.0.xとサーバーサイドprepared statement(useServerPrepStmts=true)の組み合わせで、TiDBへの接 続に問題が発生する場合があります (EOFパケットがdeprecatedになったため https://dev.mysql.com/worklog/task/?id=7766 ) ◦ サーバーサイドprepared statement(useServerPrepStmts=true)を利用される場合、TiDBへの接続には、MySQL Connector/J 5.1.x をご利用ください • 修正 ◦ MySQLに不具合として報告するとともに、 TiDB側での修正にも取り組んでおります ◦ server: support `CLIENT_DEPRECATE_EOF` capability flag · Issue #32118 · pingcap/tidb · GitHub ◦ MySQL Bugs: #106252: Connector/J client hangs after prepare & execute process with old version server
  8. Spring Data JPA and ORM • SQLレベル : “ORM Frameworks”

    にあたるもの • Javaでは、多数のフレームワーク、ORMが存在 • 今回のウェビナーでは、Spring Data JPAとJPAプロバイダとしてのHibernate ORMを例に紹介します ◦ それ以外のフレームワークや ORMをご利用の場合はお知らせください
  9. Hibernate ORM • Hibernate ORM ◦ 代表的なORMの一つ • Dialectとは ◦

    Hibernate ORMが利用する各種データベースごとの ”方言” ◦ MySQL5.7用のDialect (MySQL57Dialect) がご利用いただけます • MySQL 5.7に存在しないウィンドウ関数の対応のため、識別子をバッククオートする設定をおすすめします ◦ Spring Data JPAのapplication.propertis ▪ spring.jpa.properties.hibernate.globally_quoted_identifiers=true ◦ Hibernate ORM単体のhibernate.properties ▪ hibernate.globally_quoted_identifiers true ◦ 設定前 ▪ create table user (id integer not null auto_increment, email varchar(255), name varchar(255), primary key (id)) engine=InnoDB ◦ 設定後 ▪ create table `user` (`id` integer not null auto_increment, `email` varchar(255), `name` varchar(255), primary key (`id`)) engine=InnoDB
  10. TiDBDialect • TiDBDialect (TiDB専用のDialect)を開発し、Hiberanate ORMから利用できるよう準備しています • MySQL 5.7用の(MySQL57Dialect)を継承して実装 ◦ public

    class TiDBDialect extends MySQL57Dialect • TiDBDialectの主な役割 ◦ TiDBがサポートするsequenceへの対応 ◦ MySQL 5.7との予約語の違い (RANK, ROW_NUMBER等のWindow関数) • 状況の確認方法 ◦ https://hibernate.atlassian.net/browse/HHH-14576 ◦ https://github.com/hibernate/hibernate-orm/pull/4060/
  11. Spring Data JPA • MySQL用に提供されたSpring Data JPAのサンプルコードを利用してTiDBに接続するデモ • Getting Started

    | Accessing data with MySQL • Spring Boot JPA で MySQL データアクセス - 公式サンプルコード
  12. tiup playground /データベースユーザー作成 • tiup playground の起動 % tiup playground

    • データベースとデータベースユーザーの作成 % mysql --comments --host 127.0.0.1 --port 4000 -u root -p mysql> create database db_example; -- Creates the new database mysql> create user 'springuser'@'%' identified by 'ThePassword'; mysql>grant all on db_example.* to 'springuser'@'%';
  13. application.propertiesの変更 • src/main/resources/application.properties • 変更するプロパティ ◦ ポート番号を3306から4000に変更(必須) ▪ spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:4000/db_example ◦

    識別子(列名など)に引用符(`)をつける(任意) ▪ spring.jpa.properties.hibernate.globally_quoted_identifiers=true ◦ ログにSQLを表示させる(任意) ▪ spring.jpa.show-sql: true
  14. GeneratedValueの変更 • src/main/java/com/example/accessingdatamysql/User.java • 変更するプロパティ ◦ TiDBのauto_incrementを利用してIDを生成させるようにします ◦ 変更前 ▪

    @GeneratedValue(strategy=GenerationType.AUTO) ▪ 実行されるSQL • Hibernate: create table hibernate_sequence (next_val bigint) engine=InnoDB • Hibernate: insert into hibernate_sequence values ( 1 ) • Hibernate: create table user (id integer not null, email varchar(255), name varchar(255), primary key (id)) engine=InnoDB ◦ 変更後 ▪ @GeneratedValue(strategy=GenerationType.IDENTITY) ▪ 実行されるSQL • Hibernate: create table user (`id` integer not null auto_increment, email varchar(255), name varchar(255), primary key (id)) engine=InnoDB
  15. Spring Bootの起動 • Spring Bootの起動 % ./mvnw spring-boot:run . ____

    _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.6.3) 2022-05-26 12:45:54.125 INFO 8191 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.6.4.Final 2022-05-26 12:45:54.265 INFO 8191 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} 2022-05-26 12:45:54.517 INFO 8191 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQL57Dialect Hibernate: create table `user` (`id` integer not null auto_increment, `email` varchar(255), `name` varchar(255), primary key (`id`)) engine=InnoDB 2022-05-26 12:45:55.687 INFO 8191 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2022-05-26 12:45:55.695 INFO 8191 --- [ main] c.e.a.AccessingDataMysqlApplication : Started AccessingDataMysqlApplication in 3.189 seconds (JVM running for 3.495)
  16. データの作成と表示 • データの作成 ◦ curl localhost:8080/demo/add -d name=First -d [email protected]

    ◦ 実行されるSQL ▪ Hibernate: insert into `user` (`email`, `name`) values (?, ?) • データの表示 ◦ curl 'localhost:8080/demo/all' ◦ [{"id":1,"name":"First","email":" [email protected] "}]% ◦ 実行されるSQL ▪ Hibernate: select user0_.`id` as id1_0_, user0_.`email` as email2_0_, user0_.`name` as name3_0_ from `user` user0_
  17. その他のベストプラクティス • Best Practices for Developing Java Applications with TiDB

    | PingCAP Docs • Batch API • StreamingResultの利用 • Prepared Statement ◦ server side ◦ client side • タイムアウトパラメータの調整 • Connection poolの利用
  18. Webinar : 今後の予定 ・イベント登録 : https://pingcap.co.jp/event/ 2022年6月9日(木) 14:00-15:30 TiDB ソフトウェアの紹介・デモ 2022年6月16日(木) 14:00-15:00

    PingCAP Education:TiKV- RocksDBについて 2022年6月23日(木) 14:00-15:00 アプリケーション開発観点からの TiDB - PHP編 2022年7月14日(木) 14:00-15:30 TiDB Cloudの紹介・デモ 2022年7月21日(木) 14:00-15:00 TiDB Cloud リリースノートについて 2022年7月28日(木) 14:00-15:00 PingCAP Education:TiDBでの表設計(1) ※過去開催アーカイブ : https://www.youtube.com/channel/UCatxrGZANSnii2fe7FeEwvg/playlists
  19. スケーラブルDBはこう使われている!を知るイベント 7/7開催・TiDB User Day 2022 注目セッション スピーカー企業 ①AWS/GCPベースのSaaSシステムはTiDBとの相性が抜群! ②@cosmeがレガシーシステムをクラウドネイティブ DBに載せ替える理由

    ③【パネルディスカッション】現場から見た TiDB / NewSQL https://pingcap.co.jp/tidb-user-day-2022/ 特典 🎁 ①イベント登録で先着200名様にAmazonギフト券1,000円をプレゼント! ②イベントの感想や技術ブログを書くと Amazonギフト券最大50,000円分をプレゼント!
  20. クラウドアプリのスタートをご支援! TiDB Cloud 1年無料キャンペーン 日本進出から1周年を記念し、TiDB Cloudをご利用いただいたことがないお客様を対象にTiDB Cloud1年間相当の値引きキャンペーンを実施します。 キャンペーン期間 2022年5月18日~2023年3月31日 申込み分まで キャンペーン内容

    最大700万円相当(TiDB Cloud典型構成で1年分相当)の値引きを提供します。 対象・適用条件 下記条件をみたすお客様 ※1(最大10社※2)  - TiDB Cloudを使用したことがないお客様  - 事例・プロモーションにご協力いただけるお客様  - 設立から1年以上経過しているお客様 適用方法 フォームにご入力の上、キャンペーンにお申し込みください。審査結果およびキャンペーン の詳細について担当者より連絡いたします。 URL https://pingcap.co.jp/start-dash-202205/ ※1 別途所定の審査あり
 ※2 予定数に達し次第終了する可能性があります。

  21. Free Trialのご案内 TiDB Cloud Free Trialはこちら https://tidbcloud.com/signup Developer Tierでは TiDB

    Cloudを無償で1年間ご利用頂けます。 容量制限はありますが、 本番と同等の機能を提供しているため、 アプリとの接続試験などが容易に。 *現在はAWSのみ対応
  22. 活発度が分かる分析サービス OSS Insight 46億を超えるGitHub上のイベント分析するデータベースとして TiDB (TiFlash)を活用 ①各イベント発生の推移 ①GitHubイベント データを1時間おきに同期 (1分おきに変更予定

    ) +TiFlash https://ossinsight.io/ ②Pull requests地域の表示 ②分析クエリを TiFlash(カラムストア ) で高速処理 ③ジャンル内での比較(人気言語等) etc…