$30 off During Our Annual Pro Sale. View Details »

Wanna Use Vitess in Orientation

@ジュジュ
July 01, 2019
1.1k

Wanna Use Vitess in Orientation

@ジュジュ

July 01, 2019
Tweet

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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がエラーになる(未解決)

    View Slide

  28. おもむろにfalseにする
    28
    28

    View Slide

  29. 疎通はできた
    29
    29

    View Slide

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

    View Slide

  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;

    View Slide

  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)

    View Slide

  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)
    パースがおかしい?(未解決)
    マッチしていない

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    VTGate死す
    37
    37

    View Slide

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

    VTGate死す


    38
    38

    View Slide

  39. 今回の学び
    39
    39

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide


  49. 49
    49

    View Slide

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

    View Slide

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

    View Slide