Slide 1

Slide 1 text

新卒研修でも Vitessが使いたい! 2019/07/01 岡野兼也(@Juju_62q) cndjp第12回@日本オラクル

Slide 2

Slide 2 text

Okano Kenya / @Juju_62q Belonging: - “CyberAgent, Inc” Team: “OpenSaaS Studio” Role: - “Backend Engineer” - “ほうれん草エバンジェリスト” Interest: - CloudNative - DevOps Dream: 働かないこと 2 2

Slide 3

Slide 3 text

注意事項 本日、 Vitessが動かないみたいなことを幾度か言いますが、 全て発表者の技量の問題であり、 Vitessや開発者を非難するものではありません。 3 3

Slide 4

Slide 4 text

目次 1. Introduction 2. Getting Failed on Kubernetes 3. Yattemi? 4. Summary 4 4

Slide 5

Slide 5 text

Vitess動かしたことある人〜? 5 5

Slide 6

Slide 6 text

“ハマらずに”動かすところまで こぎつけた人〜? 6 6

Slide 7

Slide 7 text

今日は新卒研修でVitessを試してみて 死ぬほどハマった話をします (未解決多数ごめんなさい) 7 7

Slide 8

Slide 8 text

研修概要 - チームでTwitterをつくろう - インフラの講師は某完全ガイド著者 - 12営業日で設計からデプロイまで - (僕らのチームは役割を得意なところ以外で割り振る) 8 8

Slide 9

Slide 9 text

コンテナの基本おさらい 9 9

Slide 10

Slide 10 text

コンテナを使うときに言われること 10 10 ログはファイルじゃなくて 標準出力に流しましょうねー

Slide 11

Slide 11 text

コンテナを使うときに言われること 11 11 データストアは 別の場所に持ちましょうねー

Slide 12

Slide 12 text

コンテナを使うときに言われること 12 12 ポータビリティを意識して どこでも同じように動くようにしましょうねー

Slide 13

Slide 13 text

新卒研修: 僕 13 13 Vitess使いたい!!!

Slide 14

Slide 14 text

Vitessおさらい - ファイルにログを書き込む - そもそもデータストア自身(バックアップ機構あり) - データあるしどこでも同じように動くというわけ には・・・ 14 14

Slide 15

Slide 15 text

あれ、なんかだめそうじゃね? でも難しいことを考えずにやっていくよ! 15 15

Slide 16

Slide 16 text

目次 1. Introduction 2. Getting Failed on Kubernetes 3. Yattemi? 4. Summary 16 16

Slide 17

Slide 17 text

Getting Failed on Kubernetes Helmを初めから使うと 全体を把握できなくなるんじゃないかと懸念 17 17 doc/GettingStartedKubernetes.md を採用!

Slide 18

Slide 18 text

Getting Failed on Kubernetes 18 18 結果!!!!

Slide 19

Slide 19 text

Getting Failed on Kubernetes 19 19 Step by Step で動かない

Slide 20

Slide 20 text

Getting Failed on Kubernetes 20 20 # Copy binaries (placed by build.sh) COPY --from=staging /vt/ /vt/ # Create mount point for actual data (e.g. MySQL data dir) VOLUME /vt/vtdataroot USER vitess command: - sh - "-c" - >- mkdir -p $VTDATAROOT/tmp && chown -R vitess /vt && su -p -c "/vt/bin/vtctld -cell {{cell}} Dockerfile yaml

Slide 21

Slide 21 text

Getting Failed on Kubernetes 21 21 # Copy binaries (placed by build.sh) COPY --from=staging /vt/ /vt/ # Create mount point for actual data (e.g. MySQL data dir) VOLUME /vt/vtdataroot USER vitess command: - sh - "-c" - >- mkdir -p $VTDATAROOT/tmp && chown -R vitess /vt && su -p -c "/vt/bin/vtctld -cell {{cell}} Dockerfile yaml ユーザ切り替え前にCOPY

Slide 22

Slide 22 text

Getting Failed on Kubernetes 22 22 # Copy binaries (placed by build.sh) COPY --from=staging /vt/ /vt/ # Create mount point for actual data (e.g. MySQL data dir) VOLUME /vt/vtdataroot USER vitess command: - sh - "-c" - >- mkdir -p $VTDATAROOT/tmp && chown -R vitess /vt && su -p -c "/vt/bin/vtctld -cell {{cell}} Dockerfile yaml ユーザ切り替え前にCOPY rootの所有物をvitessユーザでchown

Slide 23

Slide 23 text

全体的にちょっと古そうな印象?? - シェルスクリプトと噛み合っていないdocs - Dockerfileと噛み合わないK8sのyaml - Replication Controller - vitess.io では存在していない 23 23 少なくとも、メインでメンテしているわけではなさそう

Slide 24

Slide 24 text

目次 1. Introduction 2. Getting Failed on Kubernetes 3. Yattemi? 4. Summary 24 24

Slide 25

Slide 25 text

Helmを使おう - https://vitess.io/ でもHelm推し - commit日時的にも更新は盛ん - 割と丁寧な記述 25 25

Slide 26

Slide 26 text

コマンド流してみると…? 26 26

Slide 27

Slide 27 text

GCSにバックアップできない config: # Backup flags will be applied to components that need them. # These are defined globally since all components should agree. backup: enabled: true # this creates 1 cron job per shard that will execute a backup using vtctlclient # on this schedule. The job itself uses almost no resources. cron: # the default schedule runs daily at midnight unless overridden by the individual shard schedule: "0 0 * * *" # if this is set to true, the cron jobs are created, but never execute suspend: false 27 27 ここのvalueがエラーになる(未解決)

Slide 28

Slide 28 text

おもむろにfalseにする 28 28

Slide 29

Slide 29 text

疎通はできた 29 29

Slide 30

Slide 30 text

実際に使ってみる - 垂直分割、水平分割共にVSchemaに定義するだけでいい 感じに動く!すごい! - 分割したのに全部VTgateに投げれば平気!すごい! - MySQLで開発してたアプリ(Node.js + knex)も普通に ・・・普通に動く??? 30 30

Slide 31

Slide 31 text

壁1: Transaction > The feature is implemented using traditional MySQL transactions, and hence inherits the same guarantees. 31 31 BEGIN; - ER_UNKNOWN_ERROR: vtgate: http://hogehoge: unrecognized statement: BEGIN;

Slide 32

Slide 32 text

壁1: Transaction 32 32 switch stmtType { case sqlparser.StmtBegin: return e.handleBegin(ctx, safeSession, sql, bindVars, destTabletType, logStats) case sqlparser.StmtCommit: return e.handleCommit(ctx, safeSession, sql, bindVars, logStats) case sqlparser.StmtRollback: return e.handleRollback(ctx, safeSession, sql, bindVars, logStats) case sqlparser.StmtSet: return e.handleSet(ctx, safeSession, sql, bindVars, logStats) case sqlparser.StmtShow: return e.handleShow(ctx, safeSession, sql, bindVars, dest, destKeyspace, destTabletType, logStats) case sqlparser.StmtOther: return e.handleOther(ctx, safeSession, sql, bindVars, dest, destKeyspace, destTabletType, logStats) case sqlparser.StmtComment: return e.handleComment(sql) } return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unrecognized statement: %s", sql)

Slide 33

Slide 33 text

壁1: Transaction 33 33 switch stmtType { case sqlparser.StmtBegin: return e.handleBegin(ctx, safeSession, sql, bindVars, destTabletType, logStats) case sqlparser.StmtCommit: return e.handleCommit(ctx, safeSession, sql, bindVars, logStats) case sqlparser.StmtRollback: return e.handleRollback(ctx, safeSession, sql, bindVars, logStats) case sqlparser.StmtSet: return e.handleSet(ctx, safeSession, sql, bindVars, logStats) case sqlparser.StmtShow: return e.handleShow(ctx, safeSession, sql, bindVars, dest, destKeyspace, destTabletType, logStats) case sqlparser.StmtOther: return e.handleOther(ctx, safeSession, sql, bindVars, dest, destKeyspace, destTabletType, logStats) case sqlparser.StmtComment: return e.handleComment(sql) } return nil, vterrors.Errorf(vtrpcpb.Code_INVALID_ARGUMENT, "unrecognized statement: %s", sql) パースがおかしい?(未解決) マッチしていない

Slide 34

Slide 34 text

壁1: Transaction - とりあえず研修の期間も限られていた - 作っているものを完成させる必要があった -> Transaction無しで進めてしまう 34 34 暇なときにコード読んでいるが原因わからず(MySQLだと動く)

Slide 35

Slide 35 text

壁2: etcd落ちちゃった 35 35

Slide 36

Slide 36 text

壁2: etcd落ちちゃった VSchema死す 36 36

Slide 37

Slide 37 text

壁2: etcd落ちちゃった VSchema死す ↓ VTGate死す 37 37

Slide 38

Slide 38 text

壁2: etcd落ちちゃった VSchema死す ↓ VTGate死す ↓ 38 38

Slide 39

Slide 39 text

今回の学び 39 39

Slide 40

Slide 40 text

きちんとやろう、冗長化(戒め) 40 40

Slide 41

Slide 41 text

壁2: etcd落ちちゃった - StackDriverを見る限り原因は”ノード”のリソース不足 - 他のコンテナは再起動で上がってきたけどetcdの中身は適切に上がってこな かったっぽい - 結果的にデータベースが死んでアプリケーションも開発も止まった 41 41 etcdをおもむろに3台にした 金銭的制約でリソースは増やさず

Slide 42

Slide 42 text

目次 1. Introduction 2. Getting Failed on Kubernetes 3. Yattemi? 4. Summary 42 42

Slide 43

Slide 43 text

感想: アーキテクチャ 43 43 etcd Kubernetes etcd Vitess ストレージ

Slide 44

Slide 44 text

感想: アーキテクチャ 44 44 etcd Kubernetes etcd Vitess 人類には早い分散データストア ストレージ

Slide 45

Slide 45 text

感想: アーキテクチャ 45 45 etcd Kubernetes etcd Vitess 人類には早い分散データストア 人類には早いことが広く知られているKubernetes ストレージ

Slide 46

Slide 46 text

感想: アーキテクチャ 46 46 etcd Kubernetes etcd Vitess 人類には早い分散データストア 人類には早いことが広く知られているKubernetes 人類には早い分散データry ストレージ

Slide 47

Slide 47 text

感想: アーキテクチャ 47 47 etcd Kubernetes etcd Vitess 人類には早い分散データストア 人類には早いことが広く知られているKubernetes 人類には早い分散データry ストレージ そもそも難しいストレージ

Slide 48

Slide 48 text

感想: アーキテクチャ 48 48 etcd Kubernetes etcd Vitess 人類には早い分散データストア 人類には早いことが広く知られているKubernetes 人類には早い分散データry ストレージ そもそも難しいストレージ 人類には早いステートフルアプリケーション

Slide 49

Slide 49 text

49 49

Slide 50

Slide 50 text

感想: 使い心地 50 50 - 全体的に個人としてただただ力不足 - etcd, PV, MySQL等使う上で理解しないといけないことは非常に多い - 一方でシャード、レプリケーションを包括的に管理できるのは非常に魅力的 - アプリケーションエンジニアの負荷を圧倒的に削減できる - アプリケーションからDB選択の機構が切り離されシンプルになるのでバグが減る - DBがKubernetesに置けるという事実にとても”夢”を感じた

Slide 51

Slide 51 text

まとめ 51 51 - VitessのGettingStartedはそれなりに大変でした - 試すときは複雑なことを考えずHelmを使うといいと思います - 使うときはアーキテクチャやソフトウェアの責任範囲をきちんと認知しない と予期せぬトラブルを招きます - 少なくともまだ、自分には使いこなせないと感じた(RDS, CloudSQL最高!) - Kubernetes × ステートフルアプリケーションは今後もどんどん進化してい くと思うので期待して、情報を追って、手を動かしましょう! (僕も早く問題解決できるよう頑張ります)