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

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

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

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

PingCAP-Japan

May 26, 2022
Tweet

More Decks by PingCAP-Japan

Other Decks in Technology

Transcript

  1. Javaとフレームワークを例に
    アプリケーション開発視点からのTiDB
    Yasuo Honda / 本多康夫
    Technical Support Engineer
    PingCAP株式会社

    View Slide

  2. 本日のセッションの位置づけ
    ・イベント登録 : 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編

    View Slide

  3. アジェンダ
    ● TiDBを利用することでアプリケーション開発者が得られるメリット
    ● TiDBと動作する各プログラミング言語、フレームワークの紹介
    ● プログラミング言語Javaで広く利用されているWebアプリケーションフレームワーク
    Spring Boot(Spring Data JPA)へのTiDB対応状況

    View Slide

  4. TiDBを利用することでアプリケーション開発者が得られ
    るメリット

    View Slide

  5. データベースにおいて悩ましいこと
    ● データベースのスケーラビリティーに課題がある
    ● これまでの対応案:
    ○ レプリケーションの導入する
    ○ シャーディングの導入する
    ○ データベースサーバーをスケールアップする

    View Slide

  6. これまでの対応案の難しさ
    ● 読み込み/書き込み分割
    ○ 必要なデータの「新鮮さ」に応じて接続先を切り替える必要
    ● シャーディング
    ○ テーブルの列にシャーディングキーを追加する設計が必要
    ○ アプリケーションがどのインスタンスにどのデータがあるか知る必要
    ○ マスターデータはすべてのインスタンスにコピーする必要あり
    ○ DDLもすべてのインスタンスに個別に実行する必要あり
    ● データベースサーバーのスケールアップ
    ○ 利用できるスペックの上限に達する可能性あり

    View Slide

  7. スケールアウト可能な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)

    View Slide

  8. TiDBによってできること
    ● 読み込み/書き込み分割
    ○ どのTiDBサーバーに接続しても最新のデータを読み書き可能
    ● シャーディング
    ○ TiKVが内部的にテーブルをRegionという単位で分割する
    ○ テーブルにシャーディング用のキーは不要
    ○ DDLも一度実行すれば、すべてのサーバーに自動的に伝播されます
    ● データベースサーバーのスケールアップ
    ○ クエリー数の増加に応じてTiDBをスケールアウト可能
    ○ 容量、IO要件の増加に対してTiKVをスケールアウト可能

    View Slide

  9. TiDBと動作する各プログラミング言語、フレームワーク
    の紹介

    View Slide

  10. TiDBへの疑問
    ● TiDBがスケールアウトできるのはわかったけれど、そもそも利用しているフレーム
    ワークはTiDBに対応しているのだろうか。
    ● TiDBとMySQLの互換性について知りたい。

    View Slide

  11. Java環境へのTiDB対応状況

    View Slide

  12. 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がサポートしていない機能がある場合(例 外部キーなど)

    View Slide

  13. TiDBとJavaアプリケーションの関連
    TiDB
    Spring Data JPA
    Hibernate ORM (JPAプロバイダとして)
    レポジトリ
    MySQL Connector/J
    JDBC
    データベース(永続層)
    ORM (Javaのオブジェクトとデータベースの relationの相
    互変換)
    レポジトリ
    JDBC Data Source

    View Slide

  14. 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

    View Slide

  15. Spring Data JPA and ORM
    ● SQLレベル : “ORM Frameworks” にあたるもの
    ● Javaでは、多数のフレームワーク、ORMが存在
    ● 今回のウェビナーでは、Spring Data JPAとJPAプロバイダとしてのHibernate ORMを例に紹介します
    ○ それ以外のフレームワークや ORMをご利用の場合はお知らせください

    View Slide

  16. 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

    View Slide

  17. 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/

    View Slide

  18. デモ

    View Slide

  19. Spring Data JPA
    ● MySQL用に提供されたSpring Data JPAのサンプルコードを利用してTiDBに接続するデモ
    ● Getting Started | Accessing data with MySQL
    ● Spring Boot JPA で MySQL データアクセス - 公式サンプルコード

    View Slide

  20. リポジトリのチェックアウト
    % git clone
    https://github.com/spring-guides/gs-accessing
    -data-mysql.git
    % cd gs-accessing-data-mysql/complete

    View Slide

  21. 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'@'%';

    View Slide

  22. 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

    View Slide

  23. 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

    View Slide

  24. 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)

    View Slide

  25. データの作成と表示
    ● データの作成
    ○ 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_

    View Slide

  26. その他のベストプラクティス
    ● Best Practices for Developing Java Applications with TiDB | PingCAP Docs
    ● Batch API
    ● StreamingResultの利用
    ● Prepared Statement
    ○ server side
    ○ client side
    ● タイムアウトパラメータの調整
    ● Connection poolの利用

    View Slide

  27. まとめ
    ● TiDBを利用することでアプリケーション開発者が得られるメリット
    ● TiDBと動作する各プログラミング言語、フレームワークの紹介
    ● プログラミング言語Javaで広く利用されているWebアプリケーションフレームワーク
    Spring Boot(Spring Data JPAとHibernate ORM)へのTiDB対応状況

    View Slide

  28. Q&A / アンケートのお願い

    View Slide

  29. 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

    View Slide

  30. スケーラブル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円分をプレゼント!

    View Slide

  31. クラウドアプリのスタートをご支援!
    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 予定数に達し次第終了する可能性があります。


    View Slide

  32. Free Trialのご案内
    TiDB Cloud Free Trialはこちら
    https://tidbcloud.com/signup
    Developer Tierでは
    TiDB Cloudを無償で1年間ご利用頂けます。
    容量制限はありますが、
    本番と同等の機能を提供しているため、
    アプリとの接続試験などが容易に。
    *現在はAWSのみ対応

    View Slide

  33. 活発度が分かる分析サービス OSS Insight
    46億を超えるGitHub上のイベント分析するデータベースとして
    TiDB (TiFlash)を活用
    ①各イベント発生の推移
    ①GitHubイベント
    データを1時間おきに同期
    (1分おきに変更予定 )
    +TiFlash
    https://ossinsight.io/ ②Pull requests地域の表示
    ②分析クエリを
    TiFlash(カラムストア )
    で高速処理
    ③ジャンル内での比較(人気言語等)
    etc…

    View Slide

  34. お問い合わせ先
    お問い合わせ先
    [email protected]
    製品に関する問い合わせ以外にも
    ハンズオンや製品デモはじめ、
    勉強会などの実施も可能です。
    気兼ねなくご相談、ご連絡ください。
    *右の画像はCyberAgent様向けに実施したハンズオンの様子
    https://developers.cyberagent.co.jp/blog/archives/33416/

    View Slide

  35. We are hiring!(採用について)
    オープンソース、オープンコラボレーション、オープンコミュニケーションは私たちが最も大切にしていることです。
    毎朝目を覚ますと、困難で大きな課題を解決する為に立ち向かいたくなります。 (それをたのしんでください!)
    自発的で好奇心旺盛な方、PingCAPや業界を盛り上げていきたい方、ぜひ私たちと一緒に仕事をしましょう!
    募集中ポジション:
    ● セールス
    ● ソリューションアーキテクト
    ● テクニカルサポートエンジニア
    詳細はQRコードを読み取ってください➡

    View Slide

  36. Thank You!
    https://www.pingcap.com/
    [email protected]

    View Slide