本記事ではインターリーブテーブルを使いこなす、ちょっとしたテクニックを紹介します。

TL;DR

Cloud Spanner では SELECT AS STRUCT 構文をサブクエリに使うことで、親のテーブルとインターリーブされたテーブルのレコードを一発で高速に取得することができます。更に Cloud Spanner の CPU 使用率も抑えることができるので非常に効率的にクエリできます。

はじめに

Cloud Spanner ではインターリーブと呼ばれる、あるテーブルのレコードの物理的な配置を別のテーブルのレコードの配下に置ける仕組みがあります。この仕組みを使ってテーブル間に親子関係を作ることで、複数のテーブル間に参照整合性制約を持たせたり、パフォーマンスを向上させることができます。

このインターリーブですが、親のテー …


はじめに

NEG (Network Endpoint Group) というと Container-native Load Balancing の文脈で話されることが多く、パフォーマンスを向上させるためのものという認識が強いと思います。もちろん結果としてパフォーマンス向上が見込まれる場面もあると思いますが、それと同じく個人的に重要だと思うのが、NEG には Kubernetes の世界とその外のプラットフォーム (GCP) を繋ぐ大事な役割があるという点です。

本記事では NEG とは何か、なぜ重要なのかというのを一から説明したいと思います。

尚、NEG には大きく分けて Zonal NEGInternet NEG という2種類がありますが、本記事では Zonal NEG に絞って記載します。ま …


TL;DR

GAE 2nd-gen では X-Appengine-Inbound-Appid ヘッダの代わりに、ID Token + Identity-Aware Proxy を使った方式をサービス間認証に使えます。

はじめに

GAE でマイクロサービスを構成する場合、各サービス同士を呼び合うときに同一 GAE アプリからのリクエストであるかを確認したい場面があります。シンプルな例だと、サービスがフロントエンドとバックエンドに別れていて、バックエンドはフロントエンドからしか呼び出せないようにしたい場合です。

GAE 1st-gen では X-Appengine-Inbound-Appid ヘッダという魔法のヘッダがありました。このヘッダは URLFetch を使用して別の GAE サービスにアクセスする時に、GC …


はじめに

前回google-cloud-go/spanner のセッション管理について見てみました。セッション管理だけでも Session Pool や Session のライフサイクルの管理など、やっていることは非常に多岐に渡っていましたね。

今回はそのセッションの上でどのように Cloud Spanner のトランザクションが動くのか、クライアントライブラリの実装を元に見ていきたいと思います。

具体的には以下のような点について述べます。

  • トランザクションとは
  • トランザクションの種類
  • トランザクションを高速化する方法
  • トランザクションのリトライ
  • トランザクションの冪等性
  • トランザクションの終了処理

前回と同じく google-cloud-go の v0.38.0 時点のものを参照して記述しています。実装に踏 …


はじめに

Cloud Spanner では各言語ごとにライブラリが提供されており、アプリケーションはそれを使うことで非常に簡単にデータベースにアクセスすることができます。しかし Cloud Spanner の性能を最大限引き出すためには、クライアント側の設定値をチューニングしたりなど、クライアントライブラリの挙動を知っておくことが不可欠です。そこで本記事では Go 言語のクライアントライブラリ (google-cloud-go) を例に、クライアントライブラリがどのような処理をしているかをじっくりと紐解いてみたいと思います。

全てを一度にカバーすると結構なボリュームになってしまうので、まずは本記事で Spanner の「セッション管理」の部分について説明します。本記事を通して ClientConfig


GKE の L4 Load Balancer と L7 Load Balancer でパケットの流れをキャプチャして追ってみたので、どのように IP:Port が切り替わってパケットが流れていくか、メモがてら結果を残しておきます。尚記載されている IP:Port は自分が試した時のものなので環境によって変わります。

その他の設定値:

  • 各 Service には externalTrafficPolicy: Local を設定して自分の Node にある Pod にしかルーティングされないようにしています。
  • VPC-native Cluster ではなく従来の Routes-based Cluster で試しています。

L4 Load Balancer (Service type: LoadBalancer)

  1. Client → L4LB → Node: GKE の L4LB は Networ …


はじめに

GCP にはあらかじめ HTTP のエンドポイントを登録しておくと、そこに対して HTTP リクエストが送られてくるようなプロダクトがいくつか存在します。

  • Cloud Pub/Sub
  • Cloud Tasks
  • Cloud Scheduler

どれも非同期系の処理を行うプロダクトであり、非同期処理を行う Worker を HTTP の Web サーバとして記述できるのが大きなメリットになっています。

しかしそれらの Web サーバはパプリックなエンドポイントとして用意することも多いことから、送られてきた HTTP リクエストが本当に GCP の特定のプロダクトから送られてきたものなのか?という「認証」をどうやるかが長らく問題になっていました。

既存のやり方としては Web サーバの実装方式によっていくつか …


Introduction

Cloud Spanner offers the strictest concurrency-control with external consistency. This guarantees for multiple transactions to run concurrently without the possibility of inconsistencies.

In this article, I’m going to demonstrate how the following 6 transaction isolation phenomenon aren’t allowed in Cloud Spanner.

  1. Dirty Reads
  2. Lost Updates
  3. Non-repeatable Reads
  4. Phantom Reads
  5. Read Skew
  6. Write Skew

Testing tool

We’re going to use the interactive CLI tool called spanner-cli to run multiple transactions. With spanner-cli we can interactively run arbitrary SQL statements similar to using the mysql command.

You can find the source code on GitHub at https://github.com/yfuruyama/spanner-cli

  1. Preparing the database for our tests:
$ spanner-cli…


本記事は Google Cloud Platform その2 Advent Calendar 2018 の4日目の記事です。

はじめに

Cloud Spanner はトランザクションの一貫性保証のレベルに External Consistency を採用しており、複数のトランザクションが一貫性のある状態で並行に走れるよう制御されています。
ではその一貫性保証とは、具体的にどのような問題 (Anomaly) を防いでくれるのでしょうか。

本記事では、一貫性保証のレベルが弱い時に起こりうる以下の様々な Anomaly を Cloud Spanner ではどのように防いでくれるか、実際に複数のトランザクションを実行して検証していきたいと思います。

  • Dirty Read
  • Lost Update
  • Non-repeat …


Cloud Spanner is a Google-managed horizontal scalable relational database.
There are lots of official client implementations such as,

  • gcloud spanner
  • Web console
  • Client libraries for each language (ex. Go, Python, Node.js)

but it is missing some handy tools…, yes, the interactive command line interface!

So I have created spanner-cli, which is an interactive command line tool for controlling Spanner databases.

Quick demo

This GIF demonstrates what spanner-cli looks like.

spanner-cli demo

As you can see, you can use idiomatic MySQL commands in this tool, such as

  • SHOW TABLES
  • SHOW CREATE TABLE
  • SELECT / INSERT / UPDATE / DELETE
  • BEGIN / COMMIT / ROLLBACK
  • And…

Yuki Furuyama

Strategic Cloud Engineer @Google Cloud. Opinions are my own and not the views of my employer.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store