Slide 1

Slide 1 text

DATABASE

Slide 2

Slide 2 text

Database • Amazon Aurora ➡ データストアとして利⽤ • Couchbase server ➡ データストアとして⼀部で利⽤ • Redis ➡ キャッシュ / セッション管理として利⽤

Slide 3

Slide 3 text

Amazon Aurora

Slide 4

Slide 4 text

What is Amazon Aurora? Photo by Tachina Lee on Unsplash • AWSの完全マネージド型のリレー ショナルデータベースエンジン • MySQL および PostgreSQL と互 換性がある

Slide 5

Slide 5 text

Why use Amazon Aurora? • MySQL5.7互換 • 完全マネージド型のデータベースサービスな ので、メンテが(ほぼ)不要 • 3つのアベイラビリティーゾーンを跨いでレプ リケーションを作れる • フェイルオーバーは60秒未満

Slide 6

Slide 6 text

Couchbase

Slide 7

Slide 7 text

What is COUCHBASE? Photo by Tachina Lee on Unsplash • オープンソースの分散型ドキュメン ト指向データベース • 「開発者がリラックスして、 カウ チソファに座っているようにデータ ベースの設計・構築・運⽤ができる ように」という思想の元、
 Simple (シンプル) 
 Fast (⾼速性)
 Elastic (柔軟) 
 をコンセプトにして作られている。

Slide 8

Slide 8 text

採⽤前 • RDBMSで作っていた • 関連テーブルが多くなりすぎて管理が煩雑化 した • Go⾔語を使っているので、スキーマ定義をア プリケーションとデータベース両⽅で必要

Slide 9

Slide 9 text

Why use COUCHBASE? Photo by Tachina Lee on Unsplash

Slide 10

Slide 10 text

検討したDB • Amazon DynamoDB • インデックスが限定的
 (ユニークとレンジが1つずつ) • 環境別の切り分けが難しい • ローカル環境で開発がしづらい • Cassandra • データの偏りが発⽣しやすい(チューニングが難しい) • スキーマ定義は必要 • ArangoDB • AQL(クエリ)を使う∕使わない場合と⽐較して極端に遅くなる場合があ る • 公式でGoのClient libraryが作られていない

Slide 11

Slide 11 text

採⽤理由(他社の利⽤状況) etc…

Slide 12

Slide 12 text

採⽤理由(学習コスト) DB RDBMS Couchbase クエリ SQL N1QL(SQL準拠) インデックス ◯ ◯ ジョイン ◯ ◯ 取得/保存形式 テーブル (⼀階層のKey/Value) JSON 多階層構造 △(*1) ◯ スキーマ設計 必要 不要 ※1 MySQL5.7でjson型を使えば⼀部対応可

Slide 13

Slide 13 text

採⽤理由(その他) • GoのSDKが⽤意されていた • docker上での実⾏が公式に検証されている • オフライン設計がなされている • ネイティブアプリを作る時など • マルチマスタ • 単⼀障害点が存在しない • ほぼすべての⾔語・プラットフォームの公式SDKが存在する • Enterprise Edition(商⽤サポート)が存在する • ⽇本に代理店がある

Slide 14

Slide 14 text

Good • 出⼒/保存形式はJSON • SQL準拠 • スキーマレス • マルチマスタ • LRUキャッシュ • フォーラムや開発が活発 • インフラの構築・管理が簡易 • etc Photo by Isaiah McClean on Unsplash

Slide 15

Slide 15 text

Good • 出⼒/保存形式はJSON • SQL準拠 • スキーマレス • マルチマスタ • LRUキャッシュ • フォーラムや開発が活発 • インフラの構築・管理が簡易 • etc Photo by Isaiah McClean on Unsplash

Slide 16

Slide 16 text

SQL準拠 SELECT id, airline, sourceairport, destinationairport, schedule FROM `travel-sample` WHERE type="route" AND airline="KL" AND sourceairport="ABQ" AND destinationairport="ATL" LIMIT 1; { "results": [ { "airline": "KL", "destinationairport": "ATL", "id": 36159, "schedule": [ { "day": 0, "flight": "KL858", "utc": "18:59:00" }, { "day": 1, "flight": "KL672", "utc": "19:19:00" }, { "day": 2, "flight": "KL173", "utc": "07:18:00" }, { "day": 5, "flight": "KL169", "utc": "23:41:00" } ], "sourceairport": "ABQ" } ] } ग़ྗ݁Ռ͸JSON

Slide 17

Slide 17 text

SQL拡張 (配列絞込み) { "results": [ { "fri_evening_flights": [ { "day": 5, "flight": "KL169", "utc": "23:41:00" } ] } ] } { "results": [ { "airline": "KL", "destinationairport": "ATL", "id": 36159, "schedule": [ { "day": 1, "flight": "KL672", "utc": "19:19:00" }, { "day": 2, "flight": "KL173", "utc": "07:18:00" }, { "day": 5, "flight": "KL169", "utc": "23:41:00" } ], "sourceairport": "ABQ" } ] } SELECT ARRAY v FOR v IN schedule WHEN v.utc > "19:00" AND v.day = 5 END AS fri_evening_flights FROM `travel-sample` WHERE type="route" AND airline="KL" AND sourceairport="ABQ" AND destinationairport="ATL" AND ANY v IN schedule SATISFIES v.utc > "19:00" END LIMIT 1; SELECT id, airline, sourceairport, destinationairport, schedule FROM `travel-sample` WHERE type="route" AND airline="KL" AND sourceairport="ABQ" AND destinationairport="ATL" LIMIT 1; ഑ྻΛߜΓࠐΈ ઌఔͷΫΤϦ

Slide 18

Slide 18 text

Good • 出⼒/保存形式はJSON • SQL準拠 • スキーマレス • マルチマスタ • LRUキャッシュ • フォーラムや開発が活発 • インフラの構築・管理が簡易 • etc Photo by Isaiah McClean on Unsplash

Slide 19

Slide 19 text

LRUキャッシュ σʔλߋ৽

Slide 20

Slide 20 text

LRUキャッシュ σʔλࢀর

Slide 21

Slide 21 text

Good • 出⼒/保存形式はJSON • SQL準拠 • スキーマレス • マルチマスタ • LRUキャッシュ • フォーラムや開発が活発 • インフラの構築・管理が簡易 • etc Photo by Isaiah McClean on Unsplash

Slide 22

Slide 22 text

フォーラムや開発が活発 σʔλࢀর

Slide 23

Slide 23 text

ϑΥʔϥϜ΍։ൃ͕׆ൃ σʔλࢀর Couchbaseࣾͷissue͕ݟΕΔ

Slide 24

Slide 24 text

Good • 出⼒/保存形式はJSON • SQL準拠 • スキーマレス • マルチマスタ • LRUキャッシュ • フォーラムや開発が活発 • インフラの構築・管理が簡易 • etc Photo by Isaiah McClean on Unsplash

Slide 25

Slide 25 text

インフラの構築・管理が簡易 σʔλࢀর ほぼ全てWebUIで完結

Slide 26

Slide 26 text

Bad • docker/ECSͱͷ૬ੑ͕ྑ͘ͳ͍ • ΫΤϦʹΑͬͯϨεϙϯεܗࣜ ͕ҟͳΔ • ࠷దԽʹؔ͢Δ஫ҙ Photo by Thought Catalog on Unsplash

Slide 27

Slide 27 text

docker/ECSͱͷ૬ੑ͕ྑ͘ͳ͍ • ノードの情報がIPアドレスで管理されてるの で、containerのオートスケール対応が困難 • 利⽤ポート数が多いので、ECSのポート制限を 超える • 最新版だとKubernetes対応がはいっているの で、EKSやGCPだと問題が起きないかも

Slide 28

Slide 28 text

クエリによってレスポンス形式が異なる { "results": [ { "travel-sample": { "airportname": "Calais Dunkerque", "city": "Calais", "country": "France", "faa": "CQF", "geo": { "alt": 12, "lat": 50.962097, "lon": 1.954764 }, "icao": "LFAC", "id": 1254, "type": "airport", "tz": "Europe/Paris" } } ] } { "results": [ { "callsign": "MILE-AIR" }, { "callsign": "TXW" }, { "callsign": "atifly" }, { "callsign": null }, { "callsign": "LOCAIR" } ] } SELECT * FROM `travel-sample` WHERE type="airport" LIMIT 1; SELECT callsign FROM `travel-sample` LIMIT 5; HASH ARRAY

Slide 29

Slide 29 text

࠷దԽʹؔ͢Δ஫ҙ • େྔʹσʔλมߋ͕ߦΘΕͨ࣌ʹRebalance ͕૸Δ ✦ Rebalance͕ߦΘΕͯΔϊʔυ͸࢖༻Ͱ͖ͳ͍ ✦ ϊʔυ਺͕଍Γͳ͍৔߹͸೺Ѳͭͭ͠࢖Θͳ͍ͱ͍͚ͳ͍ ʢ։ൃ؀ڥͳͲʣ

Slide 30

Slide 30 text

Practices ⼀対多のデータを持ちたい • データの分割(関連テーブル)が不要になり、設計・監理も楽になる 階層構造のデータを管理したい • 基本的にCouchbaseがよい • 下位の階層が検索対象になる場合はRDBMSのほうがいい場合も いろんなソート、絞り込みをしたい • RDBMSのほうがいい。あくまでもNoSQLなので プロトタイプのアプリでDBを使いたい • スキーマレスなので、スピーディに構築できる • ただしそのまま商品化できるかは検討が必要