Wanna Use Vitess in Orientation

0b5a8c592b267d1cc8d5d6a9577bdd34?s=47 @ジュジュ
July 01, 2019
880

Wanna Use Vitess in Orientation

0b5a8c592b267d1cc8d5d6a9577bdd34?s=128

@ジュジュ

July 01, 2019
Tweet

Transcript

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

  2. Okano Kenya / @Juju_62q Belonging: - “CyberAgent, Inc” Team: “OpenSaaS

    Studio” Role: - “Backend Engineer” - “ほうれん草エバンジェリスト” Interest: - CloudNative - DevOps Dream: 働かないこと 2 2
  3. 注意事項 本日、 Vitessが動かないみたいなことを幾度か言いますが、 全て発表者の技量の問題であり、 Vitessや開発者を非難するものではありません。 3 3

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  20. 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
  21. 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
  22. 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
  23. 全体的にちょっと古そうな印象?? - シェルスクリプトと噛み合っていないdocs - Dockerfileと噛み合わないK8sのyaml - Replication Controller - vitess.io

    では存在していない 23 23 少なくとも、メインでメンテしているわけではなさそう
  24. 目次 1. Introduction 2. Getting Failed on Kubernetes 3. Yattemi?

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

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

  27. 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がエラーになる(未解決)
  28. おもむろにfalseにする 28 28

  29. 疎通はできた 29 29

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

    ・・・普通に動く??? 30 30
  31. 壁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;
  32. 壁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)
  33. 壁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) パースがおかしい?(未解決) マッチしていない
  34. 壁1: Transaction - とりあえず研修の期間も限られていた - 作っているものを完成させる必要があった -> Transaction無しで進めてしまう 34 34

    暇なときにコード読んでいるが原因わからず(MySQLだと動く)
  35. 壁2: etcd落ちちゃった 35 35

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

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

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

  39. 今回の学び 39 39

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

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

    41 etcdをおもむろに3台にした 金銭的制約でリソースは増やさず
  42. 目次 1. Introduction 2. Getting Failed on Kubernetes 3. Yattemi?

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

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

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

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

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

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

    人類には早い分散データry ストレージ そもそも難しいストレージ 人類には早いステートフルアプリケーション
  49. 49 49

  50. 感想: 使い心地 50 50 - 全体的に個人としてただただ力不足 - etcd, PV, MySQL等使う上で理解しないといけないことは非常に多い

    - 一方でシャード、レプリケーションを包括的に管理できるのは非常に魅力的 - アプリケーションエンジニアの負荷を圧倒的に削減できる - アプリケーションからDB選択の機構が切り離されシンプルになるのでバグが減る - DBがKubernetesに置けるという事実にとても”夢”を感じた
  51. まとめ 51 51 - VitessのGettingStartedはそれなりに大変でした - 試すときは複雑なことを考えずHelmを使うといいと思います - 使うときはアーキテクチャやソフトウェアの責任範囲をきちんと認知しない と予期せぬトラブルを招きます

    - 少なくともまだ、自分には使いこなせないと感じた(RDS, CloudSQL最高!) - Kubernetes × ステートフルアプリケーションは今後もどんどん進化してい くと思うので期待して、情報を追って、手を動かしましょう! (僕も早く問題解決できるよう頑張ります)