Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

Replication

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

Replication Topology

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

MySQL InnoDB Cluster

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

MySQL InnoDB Cluster 構成要素 MySQL Group Replication ✓ MySQL Router ✓ MySQL Shell ✓

Slide 13

Slide 13 text

MySQL InnoDB Cluster 特徴 簡易なセットアップ ✓ 自動フェイルオーバー ✓ マスタの自動昇格 ✓ M/Sの接続自動切り替え ✓ 容易なスケールアップ ✓

Slide 14

Slide 14 text

MySQL InnoDB Cluster

Slide 15

Slide 15 text

MySQL Group Replication

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

MySQL Router

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

MySQL Shell

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

Demo

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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>"

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

Demo MySQL Router の設定 /work で作成 mysql ユーザーに書き込み権限が必 要 # cd work # # mysqlrouter --bootstrap localhost:3310 --user=mysql --directory myrouter

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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台で構成せれている

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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が自動で行う

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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 | | +----+----------+-------+

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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 | | +----+----------+-------+

Slide 51

Slide 51 text

おし まい