tep

【予告】GREE Advent Calendar 2014 はじまります!

開発PRチームの三木です。

いつもGREE Engineers’ Blogをご覧頂いている皆さま、(かなり気が早いですが)本年もお世話になりました。年の瀬も近づいて来ましたが、皆様にとって実りある2014年でしたでしょうか?やり残している事などありませんでしょうか?と、完全に自分に棚を置きつつ・・・

さて、12月はというと、エンジニアコミュニティはAdvent Calendarで盛り上がる季節です。Qiitaでも100個以上のAdvent Calenderが募集中の様子で、完全にこの季節の風物詩ですね。

遅ればせながらグリーも本ブログにて昨年からAdvent Calendarをスタートさせて頂きました。(昨年の25本の記事はこちらからご覧ください)「GREEを支える技術」というテーマで社内で執筆者を募集したところ、新卒/中堅/ベテランまで意欲の高いエンジニアが手を挙げてくれて、12/1-25まで書いてもらいました。非常に好評を博しまして、社内でもTweet/いいね!/はてぶ数を競い合うなど、盛り上がりを見せました。

というわけで、今年もやります!
来週月曜からGREE Advent Calendar2014開始ということで、グリーのエンジニアが本ブログを25日間続けて更新させて頂きます。(執筆予定者は以下の表を参照ください)

今年のテーマは迷ったのですが、昨年に引き続き(無難に)「GREEを支える技術」とさせて頂きました。とはいえ、業務に直結する技術だけに絞るのも面白くないよね、という事でそこは執筆者の自由度に任せておりますのでご了承ください。既に25名のうち何人からかはサマリが上がって来ているのですが、それを見る限りバラエティにとんだ記事を皆様にご覧いただけるものと思っております。

GREE Advent Calendar 2014,乞うご期待!

日付 担当
12/1(月) 岸田崇志
12/2(火) @watermint
12/3(水) 松橋洋平
12/4(木) @beketa
12/5(金) 山田幸司
12/6(土) @watilde
12/7(日) 戸井田明俊,亀井利光
12/8(月) 岩間裕和
12/9(火) 森田想平
12/10(水) @nagaseyasuhito
12/11(木) @OsamuKurokochi
12/12(金) 橋本順之
12/13(土) 山本健
12/14(日) @y2_lan
12/15(月) 後藤浩行
12/16(火) @ryukbk
12/17(水) いわなちゃん
12/18(木) @hosi_mo
12/19(金) @foostan
12/20(土) 堀口真司
12/21(日) @haruna_nishi,@hujuu,@fujiemon_828
12/22(月) 二宮啓聡
12/23(火) 大山裕泰
12/24(水) @takano32
12/25(木) @masaki_fujimoto
chobi_e

MySQLユーザーのためのMySQLプロトコル入門 #4

なんとなく気分で始めたMySQLプロトコル入門ですが今回は少し趣向をかえてbinlog formatについて書いてみたいと思います。

MySQLでのレプリケーションのメッセージ単位として使われているbinlogですが、そもそもbinlog(バイナリーログ)とはどういったものなのでしょうか?実際問題よくわからなくてもちょちょっと設定すれば素敵に動いてくれるのでわからなくても大丈夫っちゃー、大丈夫なんですがせっかく興味が湧いてしまった事ですし調べていきましょう。

http://dev.mysql.com/doc/internals/en/replication-protocol.html より引用してみます。

Replication uses binlogs to ship changes done on the master to the slave and can be written to Binlog File and sent over the network as Binlog Network Stream.

ええっと、要するにレプリケーションという仕組みはbinlogというものを使ってmasterでの変更をslaveに伝えられるもので、Binlog Network Streamというものでnetwork上を流れるモノのようです。

ううん、なんだか分かるような、わからないような。ちょっとややこしいですね。
今日のところはひとまずBinlog Fileというものがどういったものなのかについて見て行きましょう。

Binlog File

http://dev.mysql.com/doc/internals/en/binlog-file.html
BinlogファイルはBinlog File Headerで始まり、Binlog Eventが連続したものである。と書かれています。

そのまんますぎますが、図で書いてみるとこんな感じでしょうか。
Screen Shot 2014-11-17 at 1.28.48 PM

Binlog File Headerとはどういうものか、というと
http://dev.mysql.com/doc/internals/en/binlog-file-header.html

0xfe, 0x62, 0x69, 0x6e (0xfe bin)の4byteから始まるファイルとかいてありますが単なるMagicですね。あまり重要ではないので次に進みましょう

Binlog Event Header

Binlog Eventが続いたもの……と書いてあるぐらいなのでここが一番重要なポイントっぽいですね。Binlog EventはMySQL Packetと同じようにHeader + Payload形式となっています。

http://dev.mysql.com/doc/internals/en/binlog-event-header.html から定義を引用します。

binlogのversionによって定義が分岐しますが、現状のMySQLではlog pos, flagsは必ずつくようになっています。今までのMySQLプロトコルをParseしていれば簡単にParse出来そうですね。

それでは早速Binlog Event Headerをparseするプログラムを書いてみましょう。

毎度の通り、PlayGroundで試せます。実行結果は下記の通りです。
http://play.golang.org/p/2QL3ZD7b29

Parse出来てそうですね!これで中身はともかく、Binlogが読み進められるようになりました。

Binlog Event Type

ひとまずBinlogのメッセージをParseできるようになりましたが、先ほどParseした0x0f(15)のEvent Typeとはなんだったのでしょうか?

全部のEventを解説していく結構な量になってしまうので
http://dev.mysql.com/doc/internals/en/binlog-event-type.html から私が興味有る部分だけ抜粋してみます。

と、これぐらいですかね。せっかくBinlogをparseするのですし自力でクエリが見れるようになりたいですよね(mysqlbinlogでqueryみれますが、まーそれはおいといて)。あとはFORMAT DESCRIPTION EVENTとROTATE EVENTぐらいがわかればとりあえず肝は分かりそうです。

それではFormat Description Eventを見ていきます

Format Description Event

http://dev.mysql.com/doc/internals/en/format-description-event.html Format Description Eventはbinlog version 4において最初のイベントで、binlog formatのバージョンや, binlogを作成したMySQL Serverのバージョン情報などが入っています。

細かい話は置いといて、まずはParseしてみましょう。

event type header lengthsの項目だけが解釈がしづらい上に解説が少ないですね。

こういった説明が少ないのはMySQLに限らずよくあるパターンなんですが、いくつか実際のバイナリを眺めていればなんとなく理解しやすいものです。

ざっくりと説明するとこの項目はuint8の配列で各種Event Headerの大きさを明記だけのものです(配列のOffsetはEventType – 1という仮定になっています)
例えば先ほどの0x0f format descriptionの大きさがどれくらいか、という場合はEvent Type – 1のOffsetを見れば大きさが書いてある、ということになります。

Binlog HeaderをParseするプログラムにFormat Description EventをParseする機能を追加してみましょう。

Format Description EventをParseすることで各イベントのサイズがわかるようになりました。
http://play.golang.org/p/m8cFKfsLIG

そいでは次すすみます。

Rotate Event

Replicationをしているとbinlogがrotationしていることに気がつくと思います。このRotate Eventでは主にbinlogのrotationを行う時にどうしたらよいか、ということが記されています。
http://dev.mysql.com/doc/internals/en/rotate-event.html から抜粋すると

binlog version 1は現状のversionではないので省いておきました。

uint64のpositionと次のbinlog fileの名前が入っているだけなのでparse簡単ですね。適当に書くとこんな感じでしょうか

実際Rotate EventはRotation以外の用途にも使われたりするのですが、現状はとりあえずParseしてみる事が目的なのでまた後日にでも解説しようと思います

Query Event

さぁ、ようやくおまちかねのQuery Eventです。
http://dev.mysql.com/doc/internals/en/query-event.html

ここらへんまでやってきた皆さんであればもうサクサクとParseできるはずです。決して解説が面倒になってきたわけではありませんヨ!?

一箇所status-varsの部分だけ分かりづらいので補足しておきます。
status-varsは連続したbyteで表したkey valueでkeyが1byte, value sizeはkeyによって事前に定義された長さを使います。

例えばstatus-varsのoffset 0が0x00の場合はKeyがQ_FLAGS2_CODEとなり、Valueの長さは4byteとなります。

まー、ぶっちゃけこれらのstatus-varsの情報は自前でReplicationをしようとかいった場合以外には不要な情報ですし実装するのが結構面倒だったりするのでスルーしておきましょう。

終わりに

Binlog FileのParseを通してEventについて学ぶことが出来ました。

実際はmysqlbinlogコマンドを使うだけで十分なんですが、ファイルフォーマットまで詳しくなっているとbinlogが壊れた時もバイナリを眺めればどこが悪いのか想像がつくようになるので覚えておいて損はないですね。

今日説明した内容のサンプルを ここ においておきますので興味がある人は書いてみて答え合わせしてみたりしてください。

そうそう、こういった新しい事とか知らない事についてやらない理由とかわからない理由こねくり回すのはそれはそれで楽しいんですが、ぼくたち創造的な開発者ですし、ごたごたいってねーでコード書こうって姿勢って大事だったりします。最初は難しいかもしれないけどちょっとトライしたら絶対できるから。
こういった事は「やるかやったか」(やるかやらないか、じゃないよ)なのでどんどん書いて引き出し増やしていきましょ。

そんなことはさておき、次回はBinlog Eventの中でもRow Based Replication部分に焦点を当てて解説して行きたいと思います。年末進行&私がAdvent Calendarに参加しすぎてしまい次の記事まで期間があいてしまうかもしれませんが、いましばらくお待ちいただければと思います。

Treasure Data Advent Calendarへのお誘い

今年はhttp://qiita.com/advent-calendar/2014/td というのを主催しておりますので、みなさんも是非是非ご参加いただければと思います。私もGREEで実際の現場で使われている中からちょろちょろと事例をご紹介できるように調整すすめています。

TD使い始めの方へのtipsや実際の事例などの共有ができれば幸いです。

それでは

sashima

GREEのUserAgent比率を公開します(2014/11)

開発企画室の佐島です。
今週末に開催されるGREE (Internal) Tech Summitという社内イベントの準備で猫の手も借りたいほど忙しいのですが、今月もGREEを利用して頂いているクライアントのUA比率を公開したいと思います。
イベントの模様は、たぶんこのblogで紹介できるんじゃないかと思ってます。

グラフは以下のデータを元に作成しています。

  • 本データはGREEのSNSサービスのブラウザに基くデータです。
  • 本データの内容の正確性・信頼性については保証いたしかねます。
  • データはスマートフォンに限ったブラウザ比率を元に集計しています。
tep

2014/11 Mini Tech Talk(グリー社内勉強会)

こんにちは、開発企画室の三木です。
グリーの社内勉強会「Mini Tech Talk」、今月のラインナップをお届けします。

今月のラインナップ

  • 毎月1日にその月のラインナップを公開させていただきます(今月はもはや12日ですが・・・)
  • 基本的にグリー社員が発表する勉強会ですが、他社からゲストスピーカーをお招きしてお話し頂く事もあります。
  • 発表終了後に資料を公開いたします。ただし【社内限定】となっている発表については資料の公開はございませんのでご了承ください。
【社内限定】2014/11/06

「MySQL Central 2014 レポート」

瀬島 貴則

MySQL Central @ Oracle Open World 2014 で話された、 MySQL5.7 や他社事例について

  • キーワード:MySQL5.7, Facebook, Twitter
  • 難易度:初心者向け
【社内限定】2014/11/14

「アカマイのプラットフォームとワールドカップ事例紹介」

アカマイ・テクノロジーズ合同会社 岡本智史さん/土屋貴史さん

今、アカマイがインターネットの全トラフィックの15%~30%を配信する企業まで成長したのは、高い技術力とそれに裏付けられた信頼性の高いプラットフォーム基盤です。今年開催したブラジルワールドカップでは、1イベントにおける配信量の記録を更新した。インターネットが社会基盤となり、それを支えるアカマイのプラットフォームについてご紹介致します。

  • キーワード:アカマイ、CDN、大規模配信、ワールドカップ、クラウド、インターネット、高速
  • 難易度:アカマイの社名を知っていて、CDNベンダーであることは知っているが、あまり知らない方、アカマイがどのような会社か興味がある方
2014/11/28

「サービスの効果を高めるグリー内製ツールの技術と紹介」

堀口 真司

お客様に、よりよいサービスを届けるために開発されたツールの紹介をします。またそれらの需要変化や規模、技術、今後の展開などをお見せします。
SAPPORO CEDEC 2014(11/21-22)での発表内容を社内向けに発表

  • キーワード:グリーを支えてきたツール
  • 難易度:初心者

Pickupレポート

上記のラインナップの中から、社内でも反響が大きかった発表をピックアップして簡単にレポートさせて頂きます(後日掲載予定です)