"MySQL 5.7 初心者向けセミナー"に参加した(前半)
普段はVimとPHPとJavaScriptとSQLで戯れる日々を送っている私ではありますが、MySQLサーバ構築はyumやhomebrewなどで最低限の環境を構築した事しかありませんでした。MySQLサーバを構築する上で気をつけるポイントとレプリケーションの設定などが学べるという事で、「MySQL 5.7 初心者向けセミナー」にエントリーしました。
会場
大変きれいなフロアで電源・Wifiがある環境ですごく快適でした。
#mysql_jp ORACLE様オフィスにご訪問。雨が降っていますが、駅とオフィスが直結しているため、被弾0です(かなり重要)。
— KazuakiM (@NanohaAsOnKai) 2017年6月1日
インストール、アーキテクチャ基礎編
背景
DBの普及度ランキングはOracle、MySQLがダントツで1、2位の人気を誇っているとの事です。マルチプラットフォームである事とダウンロードからデータベース起動まで15分以内に完了するという運用の容易性から2番目に人気なDBとしての強みだそうです。今回のセミナーの題材であるレプリケーションは3.23とだいぶ前に追加されています。その後、多々吸収合併が行われ、現在のOracle様で落ち着いたとの事です。当時は開発が止まるのではという心配があったのですがドンドン開発が進み現在8.0.1がリリースされています。
6,7が飛ばされた理由でとりわけ6が飛ばされた理由がとてもしっくり来ました。
#mysql_jp 6って数字は縁起が悪いからね(PHP脳)
— KazuakiM (@NanohaAsOnKai) 2017年6月1日
リリースフロー
大きく分けて3フェーズとなります。
- DMR:開発途上版(年2,3回リリース)
- RC:リリース候補
- GA:製品版
その他に実験的な機能追加バージョンがあります。
- Lab Releases:評価されるとDMRに取り込まれる。
種類
MySQLにはサポートが受けられる商用版とコミュニティ版があるのは知っていましたが、商用版のライセンス周りでGPLでなくなるという所も重要なポイントなんだろうなと感じました。また、MySQL自体の製品にも種類がありMySQL ServerとMySQL Clusterは別商品で、「18.1.5 InnoDB を使用した MySQL Server と MySQL Clusterの比較」が参考になりそうです。まず第1に違うのはストレージエンジンが違います。この時点で私はMySQL Clusterを利用できる自信がなくなりました。そのくらいInnoDBは素晴らしいストレージエンジンだと思います。MySQL Clusterは障害耐性が高いらしいです。
インストール方法
インストールフローは非常にシンプルだった印象があり、私の認識とも大きく差異はありませんでした。インストール後はシステム変数(my.cnf, my.ini)を設定する必要があります。これはMySQLのデフォルト値の設定はあまり細かく設定されていないため、各サービスの想定に合わせて適当に設定する必要があるためです。 my.cnf以外にもコネクション中に一時的な設定変更(SET [GLOBAL|SESSION])が可能です。設定変更の中には再起動が不要なもの、必要なものがあります。 また、パスワード検証プラグインはデフォルトで有効となっている場合があり(yum, rpm, etc)、特殊記号などが必須となているなどセキュリティレベル高めです。
tarでのインストール方法も手順としてありました。 ステーブル版であれば不要だと思われるため、パッチ適用とかを想定した場合に覚えておいた方が良いのかもしれません。
資料にはシステム変数について触れていたのであとで確認します。 注意すべきシステム変数は特に違和感はありませんでしたが、設定しないと警告が出るシステム変数は注意が必要そうな雰囲気でした。 explicit_defaults_for_timestampをtrueに設定すると更新処理が自動で設定されるようですが、このシステム変数自体非推奨との事でこれに頼る思想のシステムは改修しておいた方が良さそうです。 これは先日調べて知った「MySQL5.6.5からDATETIME型で行生成時刻と更新時刻を自動でセットすることができるようになりましたよ」を使うべきところなんだと思われます。 secure_file_privはよく話題になるセキュリティホールになるポイントだからOFFがいいと思います。特定ディレクトリのみ読み込み可でも良いのかもしれませんが、運用経験がないためピンときませんでした。 また、log_errorを設定しないと初期パスワードがコンソールに出力されるため、流れてしまうという悲劇がありえます、こわいですね。
バイナリログは更新処理時のみ記録されるが、デフォルトでログ出力されてないない事が注意との事、後半のレプリケーション編にも影響し、 必ず設定した方が良さそうな感じを受けました。
アーキテクチャ基礎、操作例
クライアントプログラムに5.7.8からmysqlpumpが追加されました。 mysqlpumpはmysqldumpの後継的な位置づけで、使用条件が若干あり、(過去に作られ)廃れた機能の一部を廃止したとの事。 私はサーバサイドのアプリエンジニアなのでmysqldumpはよく使うため、だいぶ衝撃的でした。 mysqlpumpはあとで調べて別途使用方法はまとめて、積極的煽っていきたいと思います。 youku0825さんの記事が参考になりそう(参考になる)ので、ここにメモを残します。 yoku0825.blogspot.jp yoku0825.blogspot.jp
mysqlimportはすごく便利だと隣の席のイケメンに教えてもらったので、積極的に使っていきたいです。 使い方は自分なりにまとめたので、いいかな(割愛)。 github.com
通信プロトコル
基本的にはTCP/IPだけ覚えておけば良いけど、自分で小さなサービスを立ち上げる際には、 WebとDBが共存する形にすると思うので、その場合にはソケット接続にしたいと思いました。
デモ
tarからのデモを実演して頂いた。 DBを作るとディレクトリができ、テーブルを作成するとそのテーブルのエンジンに合わせて拡張子が設定されたファイルが作成されていた。 また、information_schemaはviewなので、/var/lib/mysql の下にディレクトリはないとの事で、なるほど度が高かったです。
クラスタインデックスも教えてもらい、 主キーのリーフノードにデータが格納されいているため、リーフが特定できた段階でデータフェッチが完了しているとの事。 セカンダリインデックスはBツリーを辿って主キーを特定して、主キーからデータを取得する。 ここで何気なく気になった事をつぶやいたら、youku0825さんに教えて頂き、スッキリ度が高かったです。
ユニークキーがあればそれがプライマリーキーの代わりに、ユニークキーもなければ「暗黙の行ID」が振られます https://t.co/I1PILYbsrr
— yoku0825 (@yoku0825) 2017年6月1日
バイナリ?ログファイルは2ファイルを交互に使われます。 そのため、ファイルサイズが小さいと片方を消費後、もう片方に切り替えそちらもすぐに消費されてしまう。 すると前のファイルに切り替えるのだけど、relay_logへの反映などの処理完了に間に合わないなどの障害がありうるとの事、。
まとめ
レプリケーション編もあるので、一旦ここで〆。