Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MySQL InnoDB Cluster を使って運用を手抜きしよう

Masa
May 11, 2018

MySQL InnoDB Cluster を使って運用を手抜きしよう

[京都] テクテクTech #2 - MySQL, Nuxt, Processing 2018/05/11
MySQL InnoDB Cluster の紹介と簡単なデモ

資料リポジトリ https://github.com/masayuki14/tekuteku-tech-2
イベント情報 https://spookies.connpass.com/event/84973/

Masa

May 11, 2018
Tweet

More Decks by Masa

Other Decks in Technology

Transcript

  1. MySQL InnoDB
    Cluster を使って運
    用を手抜きしよう
    @masayuki14

    View full-size slide

  2. 自己紹介
    もりさきまさゆき
    @masayuki14
    Twitter
    GitHub
    HatenaBlog

    View full-size slide

  3. 自己紹介
    コミュニティ
    はんなりPython
    OSS Gate
    仕事
    主夫
    パートタイム エンジニア
    スプーキーズアンバサダー

    View full-size slide

  4. スプーキーズ@京都
    Webシステム開発
    ソーシャルゲーム開発
    ボードゲーム開発
    https://spookies.co.jp/

    View full-size slide

  5. アジェンダ
    Replication
    1.
    MySQL InnoDB Cluster
    2.
    MySQL Group Replication
    3.
    MySQL Router
    4.
    MySQL Shell
    5.
    デモ
    6.

    View full-size slide

  6. Replication
    データの複製を別サーバーにもたせる
    MySQLの標準機能
    Master -> Slave という構成

    View full-size slide

  7. Replication Topology

    View full-size slide

  8. Replication 参照性能の向上
    スレーブを増やし負荷分散を行う

    View full-size slide

  9. MySQL
    InnoDB
    Cluster

    View full-size slide

  10. MySQL InnoDB Cluster
    3つのコンポーネントを組み合わせて作
    るMySQLの高可用性構成。

    View full-size slide

  11. MySQL InnoDB Cluster
    構成要素
    MySQL Group Replication

    MySQL Router

    MySQL Shell

    View full-size slide

  12. MySQL InnoDB Cluster
    特徴
    簡易なセットアップ

    自動フェイルオーバー

    マスタの自動昇格

    M/Sの接続自動切り替え

    容易なスケールアップ

    View full-size slide

  13. MySQL InnoDB Cluster

    View full-size slide

  14. MySQL
    Group
    Replication

    View full-size slide

  15. MySQL Group Replication
    フェイルオーバーが自動化
    構成の拡張・縮小が容易
    単一障害点がない
    自動再構成
    MySQL 5.7.17 以降で利用可能

    View full-size slide

  16. MySQL Group Replication
    全ノードがマスターで等価の関係のグ
    ループを構成
    MySQL側でのフェイルオーバー処理が不

    View full-size slide

  17. MySQL Group Replication
    全ノードがマスターで等価の関係のグ
    ループを構成
    MySQL側でのフェイルオーバー処理が不

    View full-size slide

  18. MySQL Group Replication
    シングルプライマリモード
    Primary: 更新できるマスタ
    Secondary: 参照およびスタンバイ

    View full-size slide

  19. MySQL Group Replication
    シングルプライマリモード
    プライマリーに障害があれば別インス
    タンスが昇格

    View full-size slide

  20. MySQL Group Replication
    シングルプライマリモード
    セカンダリーとして復帰

    View full-size slide

  21. MySQL Router
    MySQL Connectionの振り分け
    ラウンドロビン
    自動検出
    メタデータ・キャッシュ

    View full-size slide

  22. MySQL Router
    設定、メタデータに基づき接続

    View full-size slide

  23. MySQL Router
    メタデータを更新し参照先を変える

    View full-size slide

  24. MySQL Shell
    MySQL運用管理のためのCLIツール
    JavaScript, Python, and SQL
    開発と管理用に完全なAPIを提供
    バッチ処理の実行

    View full-size slide

  25. MySQL Shell
    MySQL InnoDB Cluster 管理用API
    クラスター作成
    MySQLインスタンスの構築
    クラスターの状況を確認可能
    MySQLインスタンスの開始・停止
    MySQLインスタンスの検証 …

    View full-size slide

  26. Demo
    Vagrant で仮想マシンを使う
    MySQL
    MySQL Router
    MySQL Shell
    インストールする

    View full-size slide

  27. Demo
    /usr/local に配置
    # groupadd mysql
    # useradd -r -g mysql -s /bin/false mysql
    #
    # tar zxvf mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz
    # tar zxvf mysql-router-2.1.6-linux-glibc2.12-x86-64bit.tar.gz
    # tar zxvf mysql-shell-1.0.11-linux-glibc2.12-x86-64bit.tar.gz
    #
    # ln -s ./mysql-5.7.21-linux-glibc2.12-x86_64 ./mysql
    # ln -s ./mysql-router-2.1.6-linux-glibc2.12-x86-64bit ./mysqlrouter
    # ln -s ./mysql-shell-1.0.11-linux-glibc2.12-x86-64bit ./mysqlshell

    View full-size slide

  28. Demo
    PATHを通す
    /usr/local/mysql/bin
    /usr/local/mysqlshell/bin
    /usr/local/mysqlrouter/bin

    View full-size slide

  29. Demo
    MySQL Shellを使って環境構築
    # sudo -i mysqlsh
    mysql-js> dba.deploySandboxInstance(3310)
    mysql-js> dba.deploySandboxInstance(3320)
    mysql-js> dba.deploySandboxInstance(3330)
    /root にSandboxが作られる

    View full-size slide

  30. Demo
    MySQL Shellを使って環境構築
    各インスタンスに接続
    $ mysql -u root -p -h 127.0.0.1 -P3310 --prompt="mysql-\p>"
    $ mysql -u root -p -h 127.0.0.1 -P3320 --prompt="mysql-\p>"
    $ mysql -u root -p -h 127.0.0.1 -P3330 --prompt="mysql-\p>"

    View full-size slide

  31. Demo
    Group Replication の設定
    mysql-js> shell.connect('root@localhost:3310')
    mysql-js> cluster = dba.createCluster('mycluster')
    クラスターの作成
    シングルプライマリモード

    View full-size slide

  32. Demo
    Group Replication の設定
    mysql-js> cluster.addInstance('root@localhost:3320')
    mysql-js> cluster.addInstance('root@localhost:3330')
    クラスターにインスタンスを追加

    View full-size slide

  33. Demo
    Group Replication の設定完了
    create database tech_db;
    create table member (
    `id` int auto_increment,
    `name` varchar(64) default null,
    `score` float default 0
    );
    プライマリーに変更を加えてみよう

    View full-size slide

  34. Demo
    MySQL Router の設定
    /work で作成
    mysql ユーザーに書き込み権限が必

    # cd work
    #
    # mysqlrouter --bootstrap localhost:3310 --user=mysql --directory myrouter

    View full-size slide

  35. Demo
    MySQL Router の起動
    # myrouter/start.sh
    6446 : 更新用ポート
    6447 : 参照用ポート

    View full-size slide

  36. Demo
    MySQL Router の設定ファイル
    # cat mysqlrouter.conf
    ~~~
    [metadata_cache:mycluster]
    router_id=1
    bootstrap_server_addresses=mysql://localhost:3310,mysql://localhost:3320,mysql://localhost:3330
    user=mysql_router1_rmh5z6v6t93g
    metadata_cluster=mycluster
    ttl=300
    ~~~
    3台で構成せれている

    View full-size slide

  37. Demo
    自動フェイルオーバーを試す
    3310 インスタンスを落とす
    1.
    3320 が自動昇格
    2.
    ルーター経由で接続が切り替わる
    3.
    データを更新する
    4.
    3330 に反映される
    5.

    View full-size slide

  38. Demo
    自動フェイルオーバーを試す
    3310 をクラスターに戻す
    1.
    3310 がセカンダリーになる
    2.
    3310 のデータが更新される
    3.

    View full-size slide

  39. Demo 自動フェイルオーバー
    3310 インスタンスを落とす
    mysql-js> dba.stopSandboxInstance(3310)

    View full-size slide

  40. Demo 自動フェイルオーバー
    3320 が自動昇格
    1.
    mysql-js> \connect root@localhost:3320
    mysql-js> cluster = dba.getCluster()
    mysql-js> cluster.status()
    3320が R/W になっているのがわかる

    View full-size slide

  41. Demo 自動フェイルオーバー
    ルーター経由で接続が切り替わる
    1.
    $ mysql -u root -p -h 127.0.0.1 -P6446 --prompt="mysql-\p> "
    mysql-6446> show variables like 'port';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | port | 3320 |
    +---------------+-------+
    接続先の切替はRouterが自動で行う

    View full-size slide

  42. Demo 自動フェイルオーバー
    データを更新する
    1.
    mysql-6446> insert into member set name = 'morisaki';

    View full-size slide

  43. Demo 自動フェイルオーバー
    3330 に反映される
    1.
    $ mysql -u root -p -h 127.0.0.1 -P3330 --prompt="mysql-\p> "
    mysql-3330> select * from member;
    +----+----------+-------+
    | id | name | score |
    +----+----------+-------+
    | 1 | morisaki | |
    +----+----------+-------+

    View full-size slide

  44. Demo 自動フェイルオーバー
    3310 をクラスターに戻す
    1.
    mysql-js> cluster.rejoinInstance('root@localhost:3310')

    View full-size slide

  45. Demo 自動フェイルオーバー
    3310 がセカンダリーになる
    1.
    mysql-js> cluster.status()
    3310が R/O ONLINE になっているのがわ
    かる

    View full-size slide

  46. Demo 自動フェイルオーバー
    3310 のデータが更新される
    1.
    $ mysql -u root -p -h 127.0.0.1 -P3310 --prompt="mysql-\p> "
    mysql-3310> select * from member;
    +----+----------+-------+
    | id | name | score |
    +----+----------+-------+
    | 1 | morisaki | |
    +----+----------+-------+

    View full-size slide

  47. おし
    まい

    View full-size slide