Upload
Download free for 30 days
Login
Submit search
Spannerをrestでつかってみた
2 likes
1,249 views
Hayato Ito
SpannerをRESTで扱ってみた話
Technology
Read more
1 of 46
Download now
Download to read offline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
More Related Content
PDF
異種ブロックチェーン統合ツールHyperledger Cactiご紹介
LFDT Tokyo Meetup
PDF
これからはじめるインフラエンジニア
外道 父
PDF
TLS, HTTP/2演習
shigeki_ohtsu
PDF
ドキュメントを作りたくなってしまう魔法のツールSphinx
Takayuki Shimizukawa
PPTX
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
PDF
FPGA+SoC+Linux実践勉強会資料
一路 川染
PDF
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
Hironobu Suzuki
PDF
Hyperledger Besuの動向
LFDT Tokyo Meetup
異種ブロックチェーン統合ツールHyperledger Cactiご紹介
LFDT Tokyo Meetup
これからはじめるインフラエンジニア
外道 父
TLS, HTTP/2演習
shigeki_ohtsu
ドキュメントを作りたくなってしまう魔法のツールSphinx
Takayuki Shimizukawa
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
FPGA+SoC+Linux実践勉強会資料
一路 川染
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
Hironobu Suzuki
Hyperledger Besuの動向
LFDT Tokyo Meetup
What's hot
(20)
PDF
SSIとDIDで何を解決したいのか?(β版)
Naohiro Fujie
PDF
OSSはどこまで産業用機器に使えるか_20230520.pdf
Kioto Hirahara
PDF
インフラエンジニアってなんでしたっけ(仮)
Akihiro Kuwano
PDF
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
PDF
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
PDF
Twitterのsnowflakeについて
moai kids
PDF
実環境にTerraform導入したら驚いた
Akihiro Kuwano
PDF
PHPからgoへの移行で分かったこと
gree_tech
PDF
webエンジニアのためのはじめてのredis
nasa9084
PPTX
マスタデータの管理と運用について
Kentarou Takeda
PDF
ゼロからはじめるKVM超入門
VirtualTech Japan Inc.
PDF
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
Satoshi Shimazaki
PDF
こんなRFPは嫌だ!
Naoki Ishimitsu
PPTX
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
sairoutine
PDF
遠隔デバイスとの信頼を築くための技術とその標準(TEEP RATS)
Kuniyasu Suzaki
PPTX
分散システムについて語らせてくれ
Kumazaki Hiroki
PDF
暗号技術の実装と数学
MITSUNARI Shigeo
PPTX
Redisの特徴と活用方法について
Yuji Otani
PDF
Go 製リアルタイムサーバーの Kubernetes での運用について
KairiOkumura
PPTX
Edge Computing と k8s でなんか話すよ
VirtualTech Japan Inc.
SSIとDIDで何を解決したいのか?(β版)
Naohiro Fujie
OSSはどこまで産業用機器に使えるか_20230520.pdf
Kioto Hirahara
インフラエンジニアってなんでしたっけ(仮)
Akihiro Kuwano
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
Twitterのsnowflakeについて
moai kids
実環境にTerraform導入したら驚いた
Akihiro Kuwano
PHPからgoへの移行で分かったこと
gree_tech
webエンジニアのためのはじめてのredis
nasa9084
マスタデータの管理と運用について
Kentarou Takeda
ゼロからはじめるKVM超入門
VirtualTech Japan Inc.
OSC2011 Tokyo/Spring 自宅SAN友の会(前半)
Satoshi Shimazaki
こんなRFPは嫌だ!
Naoki Ishimitsu
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
sairoutine
遠隔デバイスとの信頼を築くための技術とその標準(TEEP RATS)
Kuniyasu Suzaki
分散システムについて語らせてくれ
Kumazaki Hiroki
暗号技術の実装と数学
MITSUNARI Shigeo
Redisの特徴と活用方法について
Yuji Otani
Go 製リアルタイムサーバーの Kubernetes での運用について
KairiOkumura
Edge Computing と k8s でなんか話すよ
VirtualTech Japan Inc.
Ad
Similar to Spannerをrestでつかってみた
(7)
PDF
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
Google Cloud Platform - Japan
PDF
元OracleMasterPlatinumがCloudSpanner触ってみた
Kumano Ryo
PDF
超実践 Cloud Spanner 設計講座
Samir Hammoudi
PDF
国内Cloud spanner初事例!「迎車料金無し!新感覚タクシーアプリ「フルクル」」
Hayato Ito
PDF
[db analytics showcase Sapporo 2018] B13 Cloud Spanner の裏側〜解析からベストプラクティスへ〜
Insight Technology, Inc.
PDF
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
Google Cloud Platform - Japan
PDF
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Rakuten Group, Inc.
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
Google Cloud Platform - Japan
元OracleMasterPlatinumがCloudSpanner触ってみた
Kumano Ryo
超実践 Cloud Spanner 設計講座
Samir Hammoudi
国内Cloud spanner初事例!「迎車料金無し!新感覚タクシーアプリ「フルクル」」
Hayato Ito
[db analytics showcase Sapporo 2018] B13 Cloud Spanner の裏側〜解析からベストプラクティスへ〜
Insight Technology, Inc.
[GKE & Spanner 勉強会] Cloud Spanner の技術概要
Google Cloud Platform - Japan
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Rakuten Group, Inc.
Ad
Recently uploaded
(8)
PPTX
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
Akira Tanaka
PDF
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
Masaki Yamakawa
PDF
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
池田 直哉
PPTX
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
Ko Jikawa
PDF
20250823_IoTLT_vol126_kitazaki_v1___.pdf
Ayachika Kitazaki
PDF
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
Takuya Minagawa
PPTX
Vibe Codingを触って感じた現実について.pptx .
iPride Co., Ltd.
PDF
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
Kannabi1
生成AIとモデルベース開発:実はとても相性が良いことを説明します。まあそうだろうなと思われる方はご覧ください。
Akira Tanaka
20250826_Devinで切り拓く沖縄ITの未来_AI駆動開発勉強会 沖縄支部 第2回
Masaki Yamakawa
Geminiの出力崩壊 本レポートは、Googleの大規模言語モデル「Gemini 2.5」が、特定の画像と短文入力に対して、誤った地名を推定し、最終的に...
池田 直哉
Cosense - 整えずして完全勝利!Cosenseが他のwikiツールと違う理由
Ko Jikawa
20250823_IoTLT_vol126_kitazaki_v1___.pdf
Ayachika Kitazaki
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual...
Takuya Minagawa
Vibe Codingを触って感じた現実について.pptx .
iPride Co., Ltd.
Yamaha DT200WR Real Enduro ENGINE CYLINDER TRANSMISSION
Kannabi1
Spannerをrestでつかってみた
1.
SpannerをRESTでつかってみた 2017-08-30 ExistMikan
2.
自己紹介 @ExistMikan ・会津大学卒 (2012年) →
IT系の猛者が集う大学 ・上記大学発ベンチャー企業に就職 → スマートフォンアプリ(Android/iOS)の開発に従事 ・現職場(吉積情報株式会社)に転職 (今年) → GCP中心の開発へ ・先週、パパエンジニアと化す 寝不足多幸感 VS 大分前から放置気味の アカウント(´・ω・`)
3.
SpannerをRESTでつかってみた ざっくり目次 ・spannerの話 ・RESTの話 ・セッションのキャッシュの話 ・ベストプラクティスの話 ・検証してみた話
4.
Spannerとは? 水平スケーリング可能でグローバルな整合性を備えた、 初のリレーショナル・データベース
5.
提供状況 ・2017/02/14 ベータ発表 ・2017/05/16 GA ・2017/06/16
東京リージョン選択可 こりゃ使うしかな い!
6.
大まかな構造 インスタンス データベース テーブル インデックス インスタンスの下に、各種構成要素がぶら下がる形。 インスタンスはノード数を設定でき、この数が性能と料金に直結する。
7.
Spanner Consoleで出来ること ・インスタンスの作成 /削除 ・データベースの作成
/削除 ・テーブルの作成/削除 ・インデックスの作成 /削除 ・クエリ 出来無さそうなこと。。。 ・データの追加/削除 → クエリ入力欄にINSERT文を入れても反応せず。。
8.
インスタンスの設定 asia-northeast1だけ割高 ノード数を上げると、性能が向上。 これがスケールアウトに相当。 現在は手動切替のみ。 ベストプラクティスが 重要になってくる ここに指定したインスタンス IDが、 そのままREST APIのパスとして使われていきます。 例:"projects/<projectId>/instances/<instanceId>/databases/<databaseName> 他のリージョン
9.
データベース/テーブル/インデックスの作成 データベース データベース名を決めるだけ テーブル インデックス テーブルもインデックスも UIで作成可能
10.
DDLの使用 スキーマ定義用のテキストで作成することも可能
11.
クエリ クエリもサクッとコンソールから実行可能
12.
RESTでアクセス! なぜREST? → GAE +
SE(Java)の環境で、DBをDataStoreからSpannerに切り替えたくなった → しかし、GAE + SEではgRPC系ライブラリが提供されていない → RESTでやるしかない GoではGAE + SEでもライブラリが 動作するらしい。。 Goのライブラリでは Socket APIを裏で使っているため、 OverQuotaに注意 つらい RESTでやる場合はURL Fetchの OverQuotaに注意。
13.
RESTライブラリ for JAVA Cloud
Spanner API Client Library https://developers.google.com/api-client-library/java/apis/spanner/v1?hl=ja RESTをラッパしたいつもの Googleライブラリは提供されている Eclipseでの導入方法 (プロジェクトを右クリック →Google→Google APIの追加) ※Google Plugin for Eclipseの場合。Cloud Tool for Eclipseのパターンは未検証。。。
14.
REST APIの一覧 認証周り インスタンスの情報 インスタンスの管理 データベースの管理 データベースオペレーションの管理 セッションが絡む処理 (セッションの作成/削除、データの作成 /更新/削除、クエリ) インスタンスオペレーションの管理
15.
SpannerAPIの利用方法 ・認証 ・インスタンス/データベース/テーブル/イ ンデックスのAPIを実行 ・時間がかかるものはオペレーション API をポーリングして状況把握 管理系 データ操作系 ・認証 ・操作するデータが入っているデータベー スのセッションを取得 ・セッションAPIにて、 データの操作を行う ・取得したセッションを削除する (必要であれば) GAEの1リクエストの中で、下記のような流れで
APIを叩いていく
16.
認証 SpannerのAPIにアクセスするためのオブジェクトを下記の様に生成 認証に関係するHttpRequestInitializerの生成コードは下記 デプロイ環境でのアクセスはAppIdentityCredentialにスコープを設定するだけでOK ローカルとかで触りたい場合は認証用のキーを入手しておき、それを指定して作成
17.
インスタンスを作成する:REST API リファレンス REST
APIのリファレンス GCP ProjectのIDが入る
18.
インスタンスを作成する:APIライブラリ APIのパラメータを作成する部分 APIを実行する部分
19.
長時間実行オペレーションの管理 オペレーション名をパスに含め、 オペレーションのステータスを 問い合わせるAPI。 instance用とdatabase用でクラスが 違うので注意(パスが異なるため。 スーパークラスは同じ ) ポーリングしてオペレーションの状態を確認できる API
20.
データベース/テーブル/インデックスの作成 ※やり方はインスタンスと同様の手順につき割愛
21.
セッションの生成 セッションを作成したいデータベースまでのパス +”/sessions”となるパスに対してPOST (パラメータは空) SessionオブジェクトのgetName()で取得できる文字列がセッション。
22.
データの書き込み commitというAPIがあり、それに更新内容を詰めてPOSTする形。パスの殆どはセッションで、下記のような文字列になる。 projects/project-amaterasu/instances/main-instance/databases/main-db/sessions/AO6KeAX4B5A0hUz3_d1bjBQ0T8wrsxNqS-lbplIDWcM8_X727kVAlK9Fm40 変更内容のオブジェクト トランザクションの指定
23.
データの書き込み ライブラリ側は対応するオブジェクトを下記のように作り込む形となる。 下記は単一の行を単純に書き込む例。 writeXXXX(Object, xxx)は適切に キャストするための即席関数
24.
データの書き込み:即席関数 Spannerが認識する型のオブジェクトに適宜変換。 INT64にはIntegerでは入れられないなどがあった。 (実質Longだから? しかしLongも文字列..)
25.
データの書き込み:プチハマりポイント タイムスタンプ型は日付フォーマットの文字列指定する → ドキュメントにはタイムゾーン設定などができそうな形だったが、 実際はオフセットなし、 UTC固定のRFC3339文字列しか入らなかった 何故
26.
データの読み込み データ操作系なので書き込みなどと同様、セッションが必要。 SQL文字列を指定する。 ‘@’パラメータによるプレースホルダー指定も可能(大事)
27.
データの読み込み 実行結果からgetRows()でオブジェクトのリスト、のリストを取得。入れた順に入っているので都度 キャストしながら取得。※以下サンプルはplaceholder無し版
28.
データの読み込み:即席関数 書き込みのときと同じノリで変換。
29.
データの読み込み:プチハマリポイント 概ね”yyyy-MM-dd’T’HH:mm:ss.SSS’Z’でくるのだが、ミリ秒以下がちょうど 0だと、 ピリオド以下がばっかり切られる →上記フォーマットだとパース失敗 (´・ω・`) →暫定対処で対応した。。
30.
データの削除 データ書き込みのときの commit APIを利用するが、Mutationの中身をinsertOrUpdate 等ではなく、deleteを使用する。(サンプルコード省略)
31.
セッション管理 読み書きするために必ず必要になる、Cloud Spanner データベース
サービスとの通信チャネル。 Client Libraryには、Channnelという概念があり、そこでセッションプールのような管理がされているようだが RESTでは該当する概念無し。 生成のためのレイテンシがそれなりにかかる(100ms~1000msくらい?) → リクエストするたびに生成/削除をやるのはコストが高い 毎回やりたくな い! そうだ、 キャッシュしよう
32.
セッション管理 1個のセッションを全てのリクエストで使いまわして負荷を掛けてみた 秒間100リクエストくらいの書き込みまでは 200ms程度で捌けたっぽい 秒間300リクエストくらいになってくると、 10秒以上のレイテンシが発生するように。 完全にアウト 検証用のフロントエンドインスタンスも爆速で増加(´・ω・`) 良い子はまねしてはいけない
33.
セッション管理:キャッシュ セッションの各種制限 使ってなければ勝手に消してくれる 削除 トランザクションとの関係 キャッシュする場所はどこ? ・インスタンス毎にメモリに持つ ・Memcache/DataStoreに入れる readでもwriteでもトランザクションは貼られる。読み書きはロックするが、読み取り専用はロックしない。
34.
セッション管理:キャッシュ場所 ・簡単そうだが、インスタンス間で共有できない → インスタンス数の増加によっては、 セッション数の上限に達してしまうのでは? → コワイ インスタンス セッション セッション セッション インスタンス セッション セッション セッション ・インスタンス毎にメモリに持つ ・Memcache/DataStoreに入れる インスタンス セッション セッション インスタンス セッション セッション ・全インスタンス間で共有できる ・状態をもたせるのはつらそう(atomicに更新が厳しい) ・max値を決めておけば、上限を超えることはない →
負荷が高まった時は、1つのセッションを同時に使うリクエストが増える → 読み込みは快速だが、書き込みが1つのセッションに集中するとロックがかかるの でその分遅くなる ・併用しているのは毎回DataStoreにreadしにいくとread entitiy分の料金が発生する ため。 管理しやすそう
35.
セッション管理:フローチャート ランダムなキーでセッションを取って、なければ作り、あればそのまま利用する形で Try (簡単化のため毎回セッション有効判定を実施 ) 多量のリクエストを捌けた
(・∇・)
36.
ベストプラクティスとホットスポット Spannerには、パフォーマンスを最大化するために、スキーマの設計などに関してベストプラクティスがある。
37.
ベストプラクティスとは? 主キーの選択 → 値が単調に増加する列を最初のキー部分に選択すると、キー空間の最後にすべての挿入が実行されるため、 誤ってホットスポットが作成される可能性がある Cloud Spanner
は分散データベースなので、データベースが 大きくなると、Cloud Spanner は「スプリット」と呼ばれる塊に データを分割します。各スプリットは、相互に独立して移動で き、異なるサーバーに割り当てることができます。サーバーは異 なる物理的なロケーションに存在することもあります。 連続しているデータは別のスプリットに分割されにくい 挿入が同じスプリット =同じDBになるので、負荷が集中する
38.
ホットスポットの影響(イメージ) ノードA ノードB ノードC スプリットA スプリットB スプリットC スプリットD ID:111112 ID:111111 ID:111110 ID:111109 : ID:2222 ID:2221 ID:2220 ID:333 ID:332 ID:331 ID:9 ID:8 ID:7 ・単調増加だと、赤字の行が追加される時は一番上のスプリットにアクセスが発生する。 ・近いKeyの範囲でスプリットは作られるため、単調増加の際は必ずスプリット Aを管理するノードAにアクセスが かかる ・ノードB、ノードCをフル活用できていないので、ノード数を追加しても性能向上の恩恵が受けられない
39.
脱ホットスポット ノードA ノードB ノードC スプリットB スプリットC スプリットD ID:ohwoehlife ID:ohwoexlife ID:ohwoedlife ID:ohwoeflife ID:bfewpof ID:bfewpeg ID:bfewpwg ID:bfewpdg ID:xpihufnew ID:xpihufnv ID:pdihufnoew ID:brejefiewi ・keyがuuidのような形だと、新規追加の場合であっても、追加されるのはその keyと近い範囲のスプリット ・スプリットが別になるので、管理しているノードへの負荷も分散される スプリットA
40.
・タイムスタンプをキーにしたテーブルと、UUIDをキーにしたテーブルを用意し、負荷を掛けて比較 ・ノード数1の場合と、ノード数3の場合で検証する ・GCEから秒間リクエスト500になるように、GAEにデプロイしたAPIを叩く → 30分継続実行 ・APIでは、リクエストを受けたら新しい行をテーブルに追加するREST
APIを実行する ・30分の実施後、DBは一回DB毎削除する→世代管理されているので中身をカラにするだけではダメ ホットスポット検証 ちゃんと分散されるほう ベストプラクティスに沿わないヤツ
41.
SimpleTable TimestampTable 25.11% 26.45% ノード数1では対してCPU使用率に変化なし。全スプリットを 1ノードで管理するためと思われる。 ノード数1
42.
SimpleTable TimestampTable ・ノード数3にしたことで、CPU使用率がきっちり下がっている ・タイムスタンプをキーにしているテーブルは、 UUIDをキーにしているテーブルより CPUを喰っている! 8.728% 12.49% ノード数3
43.
検証まとめ ・高い処理効率を維持するには、ベストプラクティス準拠 & ノード数を3以上にするのが良い →
キー選択以外にも多くのベストプラクティスがある → 想定リクエスト数で、 CPU使用率が75%を下回っているなら、ノード数は 1でも問題にはならない
44.
超実践 Cloud Spanner
設計講座 https://www.slideshare.net/HammoudiSamir/cloud-spanner-78081604 Spannerユーザ必読。ノードやスプリットの関係についても言及されています。 普通のエンジニアが【Cloud Spanner】使ってみた https://www.slideshare.net/ssuserc49633/20170822-cloud-spanner こちらも参考情報盛りだくさんです。 参考資料
45.
吉積情報とクラウドエースでは、 一緒に働いてくれる社員を募集しています!
46.
Spanner使い放題!! 多分! JOINした暁には・・・
Download