mabulog

このブログは、mabuの平凡な日常を淡々と描く物です。 過度な期待はしないでください。 あと、部屋は明るくして、 モニターから3メートルは離れて見やがってください。

"MySQL 5.7 初心者向けセミナー"に参加した(後半)

レプリケーション

資料

高可用性構成

重要なのはSlaveはバックアップではないという事です。MasterでDROPしたらSlaveにも伝搬するため、バックアップとしては使えません。 また、マルチソースレプリケーションはn台マスターから、n台のスレーブに反映できます。

レプリケーションの仕組み

MasterDBのbinary logをSlaveサーバに送る、Slaveサーバはrelay_logで受け取り、 relay_logからSlaveDBに反映する。

バイナリログの種類

  • SBR(Statement Based Replication)

SQLとPositionが格納されています。
そのため、SYSDATE()など実行タイミングに依存するSQLレプリケーションに使えません。
ちなみにNOW()とはじめ書いていたが、あれは勘違いでした。資料でもNOW()とは書かれていません。
NOW()の実行結果をバイナリにログに保存しているため、SlaveDBで再度実行される事はありません。 yoku0825.blogspot.jp

  • RBR(Row Based Replication)

変更された結果とPosition情報をバイナリログに書き込んでいます。
そのため、UPDATE文でWHEREをつけずに100万行更新した場合に、差分も確保する必要があるため変更前と変更後の200万行分のバイナリログが生成されます。SBRSQLを出力しているだけのため、1行で済みます。
Position情報を含んでいるという事を失念していましたが、MBRやその他の処理を行う上でPosition情報を更新しないと、障害になるわけで大変重要な事を記載漏れしていました。

  • MBR(Mixed Based Replication)

RBRとSBRを状況に応じて切り替えます。
MySQL 5.1.12以降は、デフォルトで採用されています。

5.1系の5.1.12~5.1.28の間だけがbinlog_format=MIXEDがデフォルトでした(5.1のGAは5.1.30なので、GA期間はずっとSTATEMENT) それ以外は5.6とそれ以前でSTATEMENT, 5.7とそれ以降でROWがデフォルトです。
詳しくは追記参照

時間ができた際には切り替え条件を調べたいと思います。

レプリケーション種類

非同期レプリケーションはコミットで返しつつ、裏でレプリケーションを実施します。

relay_logに入れてからコミットします。 言い換えるとrelay_logからSlaveDBには"まだ"反映されていないため、障害発生時に差分が発生する可能性があります。

GTID

MySQL5.6で追加された機能で今後主流になるかもな機能です。
まだ、理解が浅いので実際にサーバを立てる事で理解が進むんじゃないかなと思ってます。
障害発生時にmaster昇格する際にPOSITIONの状況を見て、昇格するGTID(サーバ)を指定する運用になるそうです。
リストア後にはスレーブのauto.cnfを削除します。これはmasterのUUIDが変わるためです。

物理のフルバックアップからリストアした時に、auto.cnfを削除します。 これは既存のスレーブと同じserver_uuid(auto.cnfに保管される)が指定されるのを防ぐためです。
追記参照です。

GTIDが有効な場合にはsql_slave_skip_counterはサポートされませんが、
代替手段があるため、過去やらかした私としては大変ホッとしました。

資料にはそれ以外にも設定情報などが記載されていますが、
これは実際に構築してみないとピンとこなそうなため、今回は割愛。

「mysqlnd_ms」なるエクステンション情報を得たのだけど、PHP7対応がなされていなそうだったのでフィードバックをしました。

まとめ

レプリケーションの設定方法とポイントを学べたのが大変ためになりました。 また、今回のセミナーはOracle様から直接教えて頂き、初心者がDB構築し、レプリケーションの設定まで出来るようになるというとても素晴らしいセミナーでした。インフラエンジニアもさることながら、MySQLを操作する人も積極的に受けた方が良いのではと思いました。

追記

yoku0825さんにアドバイスを頂き、ブログを修正しました。 圧倒的感謝🙇

"MySQL 5.7 初心者向けセミナー"に参加した(前半)

普段はVimPHPJavaScriptSQLで戯れる日々を送っている私ではありますが、MySQLサーバ構築はyumやhomebrewなどで最低限の環境を構築した事しかありませんでした。MySQLサーバを構築する上で気をつけるポイントとレプリケーションの設定などが学べるという事で、「MySQL 5.7 初心者向けセミナー」にエントリーしました。

会場

大変きれいなフロアで電源・Wifiがある環境ですごく快適でした。

インストール、アーキテクチャ基礎編

資料

背景

DBの普及度ランキングはOracleMySQLがダントツで1、2位の人気を誇っているとの事です。マルチプラットフォームである事とダウンロードからデータベース起動まで15分以内に完了するという運用の容易性から2番目に人気なDBとしての強みだそうです。今回のセミナーの題材であるレプリケーションは3.23とだいぶ前に追加されています。その後、多々吸収合併が行われ、現在のOracle様で落ち着いたとの事です。当時は開発が止まるのではという心配があったのですがドンドン開発が進み現在8.0.1がリリースされています。

6,7が飛ばされた理由でとりわけ6が飛ばされた理由がとてもしっくり来ました。

リリースフロー

大きく分けて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さんに教えて頂き、スッキリ度が高かったです。

バイナリ?ログファイルは2ファイルを交互に使われます。 そのため、ファイルサイズが小さいと片方を消費後、もう片方に切り替えそちらもすぐに消費されてしまう。 すると前のファイルに切り替えるのだけど、relay_logへの反映などの処理完了に間に合わないなどの障害がありうるとの事、。

まとめ

レプリケーション編もあるので、一旦ここで〆。

FTP, SFTP, FTPS adn SCP Clients by PHP

bardicheというPHPプラグインを作り始めた。 きっかけはawesomeに無い事に気づいたからだ。 最近のトレンドなどにはめっぽう疎いが最新の機能を知るという意味も込めて、 率先して意味もなく最新の機能を投入した。

インターフェースを共通化させて、引数で処理を分岐している部分が、 PHPのインターフェースと相反するため、ココらへんは要修正項目で今後も改修したいと思う。

#vimconf2015 に参加した

vimconfへ先日行ってきました。会場は去年同様にmixiさんです。

f:id:kazuomabuo:20141109091952p:plain

スタッフ参加

今回はスタッフ参加で途中ピザを受け取りに行ってきました。 道中は高低差が多く、ピザが滑り落ちそうになるなどあまり速度が出せず、 行きで使ったルートがあまりにも台車には不向きだったため、帰りは別ルートで帰るなどありましたが、 無事配達できたので良かったです。

セッション

去年と違い発表している内容がある程度わかるようになった気がしました。 これは1年間、Vimに関しての情報追い、勉強してきたおかげだと思います。

@kamichidu さんのlibcall呼び出しは全く知らなかったので、 ユースケースが発生したら積極的に活用したいと思いました。

@lambdalisue さんのvim-gitaが良さそうだでした。 vim-fugitiveを入れてもステータスバーにどのブランチで開発しているか確認するためにしか利用していなかったため、だいぶ前に削除してしまい、それっきりでした。 vim-gitaに乗り換えるにあたってポイントは一度起動したVimは閉じない運用が必須な印象でした。(ターミナル運用を想定)
私はある程度できたらVimを閉じてUndo履歴を整理しているのですが、":h clear-undo"にある設定をvimrcに設定し、 また1つVimを閉じる必要がなくなりました。Vimshell, Vimfilerを入れて本格的にVimを閉じなくなるにはまだまだ時間がかかりそう。

突然ですが、ここでvimconf中に質問したアンケートの結果発表。 結果では必要なときに立ち上げる人が7割近くもあり、とても興味深い結果となりました。

最近、JavaScriptの気運が高まってきたのでとてもタイムリーな感じで、 @yoshiko_pg さんのフロントエンド目線からのスライドがすごく勉強になりました。 エディタの使い分けは必要だと思いますが、emmetをフル活用してその他のPluginでよしなに使いこなしてベースを作る速さはヤバかったです。

Vim

vimconf2015の日も開催した毎週土曜日のVimrc読書会を除いて最近、Vim活ができていなかったので、 GitHubで管理しているhombrew-macvimの(野良)formulaをTravisCIに対応させました。 設定方法をネットで調べながら、適時修正して無事にテストが通りました。

Attended "次世代 Web カンファレンス"

次世代 Web カンファレンスに行ってきました。
当日は河合塾の模試が会場である法政大学の1,2Fであり、他所では情報技術者試験もありで、
TwitterのTLが面白い感じに流れてました。

以下、カンファレンスのセッションメモの雑書き。

f:id:kazuomabuo:20151018230352p:plain

Accessibility

メタデータを改良し、ブラウザ等に解釈しやすいようにする「マシンリーダブル」、コンテンツ自体の色を反転するボタン、文字サイズの切替をするボタンなど、人が解釈しやすいようにする「ヒューマンリーダブル」という2種類の考え方。
ユーザがブラウザの機能を理解しているならば、文字サイズ切替ボタンは本来は不要ではあるが、モバイルサイトでは拡大を禁止するなどあるため、一概にボタンが不要とは言いきれないのも実情。

健常者である事を前提としたAccessibility。
わりとよくあるのは健常者で更に"日本語を理解できる人"を前提という問題がある。これに関してはどこまで許容するかで開発コストが肥大化するので、大変かなぁと思いました。

Googleで商品を検索すると価格まで出るのはメタデータのおかげという話。
スクレイピングで価格情報を取得する場合には、ページ内にある複数の料金情報から該当するものが判断できないため、メタデータに価格情報を埋め込む事でGoogleに理解できるようにしてあるとの事。

所感、マシンリーダブルの発展をすごく感じたし、もう少し理解を深める必要があるかなと感じた。

JS Next

ES6を利用している登壇者だが、IE8(ES3)は実際問題捨てられないという過去の精算ができていない感じから始まったセッション。
後半で出てきたが、BabelはES6からES5にトランスレータと出来るものらしい(名前は知ってたよ、名前は)。
ESはドンドン先に進んでいくが、ブラウザが追いついていない。その差分をBabelで吸収する形で今後も活用される存在になるだろうとの事。

ESの仕様はふんわり決まっていて、明確に決まっていないとの事。

"scriptタグは複数書ける"×"+attributeが複数ある"問題。
複数のJSが共通するJSをimportしている場合に、attributeが異なると問題が発生する。個人的にはimport方法のルールを共通するJS側で制御するのがいいんじゃないかという気がする。

TypeScirptでは型定義が出来るとの事(JS界隈わからなす)。
PHP7でも型宣言(関数の引数と返戻値)出来るので、やっぱり型大事、絶対。型宣言が良いのはエディタ(IDE)が理解しやすい事で、言われてみればという感じだった。

Standardization

@ourmaninjapan さんから言語の壁からの「そもそも英語が読み辛い」。@lef さんからIETFは章組立にルールがなく、とても読み辛い。@azu_re さんからES5の仕様書はWordだったという事に驚きました。全体的に保守的で昔のフォーマットを引きずっているが、GitHubを使ったりと変わりだしたとの事。
標準仕様を策定するにあたり、negotiationがとても重要、自分よりもその規格で詳しい(偉い人)に一人づつ勝っていき提案を通すのが、すごく生々しかった。

今のウェブはレンダリングエンジンにベッタリのため、実装は楽だが、
少しの事をやるにもレンダリングエンジンがフルフルについてくるのが問題である。

HTTP2

HTTP2はブラウザに対応してもらう事が待たれるとの事。
FireFoxは優秀、ChromeFireFoxに負けないために対応するだろうとの事。IEについては残念至極らしい。

並列に送る処理の中で優先順位という考え方があるが、「Priorityが銀の弾丸」だとは思わない方がいいとの事。

HTTPS(TLS)時代におけるTCPの負荷が高まる中で、TCPコネクションを束ね、HTTP2のメリットの高速化をはかるとの事。
特にGoogleTwitterなどの高負荷サイトで最高のエクスペリエンスを味わえると。

Monitoring

監視とは障害の検知だけでなく、将来を見据えたシステムの最適化などのために必要。
監視の間隔が1分でもスパイク見逃す時があるので辛い時もある。
インフラエンジニアが少ないので、ミドルウェアを大量に入れると手がまわらないので、
少ないミドルウェアを秘伝のタレで良しなにこなすのは知見というか、すごい。
最近のスタートアップは最初からMackerel、DataDogなどの監視SaaSを活用する傾向との事。
秘伝のタレを作る前から監視をしっかり+インフラエンジニアが少なく、サーバ/ネットワーク設定に人をさいている場合に良さそう。

RDSのようなマネージッドサービスが増えた反面、ブラックボックスが増えた。
ただ、全体的には負荷の軽減方向に寄せたい(切実。

感想

名前を知っているだけの知識が多く、全体的に初めての情報が多かった。
ココらへんは情報追ってるだけではわからない部分も多々あり、
アプリ開発をしている自分としてはJSの理解をもう少し深めたいかなという思いがある。

vim-sqlfix を改良した(1)

前回の記事からもろもろ改良したので備忘録を残しておく。

追加した機能

対括弧チェック機能

整形する過程で対括弧が一致しないとよろしく挙動をしていたので、
いっそ対括弧をチェックすれば良いかなと思い、チェック機能を追加しました。

EXPALIN文追加オプション機能

SQLを整形する際に整形したSQLをそのまま、EXPLAINにかけるケースが多々あるため、
オプション機能を追加しました。

一行の文字列長制限オプション機能

テーブルのカラムを全て出力している場合などで1行が長くなって見辛いので、
指定した文字列長になった際に改行するオプション機能を追加しました。

[BugFix]閉じ括弧チェック処理をスタック化

元々は関数の閉じ括弧を優先し、その後通常の閉じ過去を処理するロジックになっていました。
ただ、関数の括弧、通常の括弧を交互に利用しているSQLを整形した際に期待した動きになっていなかったため、スタック化し、LIFOで処理するように修正しました。

感想

ボチボチ良さ気になってきたので、使ってみてよかったら、
右上のStarをクリックして頂けると私が幸せになれます。

github.com

vim-sqlfix を作った

前々からVimでのSQLの整形に違和感と不要な手間が気になっていたのですが、
幾つかプラグインを作ってなんとなくそろそろいけそうな気がしたので自作した。
ただの整形ならVimというカテゴリーでもすでにありますし、Vim以外も大量にあります。

ただ、私が求めているのはFrameWorkのログを即座に整形して、
実行可能な形式にできるVimプラグインです。
そういったニッチなプラグインは聞いた事がなかったのが、作った大きな理由です。

使用方法などについては、GitHubリポジトリを参照して頂けると幸いです。

github.com

今のところ、PHPのYiiにのみ対応しているのですが、
今後はいろいろなフレームワークに対応していきたいと思います。
特にRailsに対応して認知度を上げたいなと個人的に思っていますが、
railsインストールにてこずってる雑魚なので、railsSQLを実行した時のログを教えて頂けるとうれしいです。