ふとしたことから LINE Developer Conference の存在を知り、その中の「高可用データベース」という文字列をみて高可用データベースを作っている身としては黙っていられないので行ってきた。喉がかわいたので水をもらえてよかった。
ひとつめのセッションはLINEのシステム運用。インフラは基本に忠実に、無駄に安いハードウェア買って困るくらいならそこそこの値段でいいヤツ買います、ソフトウェアも同様、必要なところでは VMware vSphereやOracleを使いますといった感じだった。やはりメッセージングなのでバーストトラフィックがあるらしく、それのせいでスイッチのパケットバッファが普通に溢れてパケ落ちが発生するらしい。ふつうのTCP/IPならその後の再送はランダムに時間置いて飛ぶはずだからそんなに溢れないと思ってたんだけど、TCP周りの設定をいじったらなんとかなりそうな気もする(※個人の感想です
それでバルスとかも普通に乗りきれるんだけど、今年の正月はRedisクラスタの1台が謎の高負荷状態になって、リトライの嵐になってシステムが不安定になるという障害があった。MSI-X(ってなんだ??)が動作しているときにirqbalanceが割り込みまくっていた。Redisが使うCPUがなぜか奇数番のCPUに集中してしまうのが高負荷の原因だったので、なんとかというマクロ?を設定して済ませたとか。さすがはLivedoorといったところか。あとHBaseのディスクはPCIE-SSDというハードウェアを使っている(使うことにした?)らしいですよ。まあIOPSは桁違いだもんね…
で、ノベルティを沢山もらいました。
ふたつめのセッションはお目当ての高可用データベース。データベースが数千台もあるとか。Percona MySQL使っていて、マルチマスターで運用しているぜーとのこと。なんとMMMを使っていると(その後某MySQLな人と話したら「MMM使ってる人いたんだ…」と驚かれたのできっとすごいことなのだろう)。Write conflictが起きたらどうするのだろうとか、切り替えにかかる停止時間はどの程度なのだろう、とか、VIP張って切り替えを管理するノードは別にいるみたいなのでそいつの冗長化はどうするの、とか、ネットワーク分断が起きたらどうなるのかなー(;◔ิд◔ิ)とか、気になった。
次はN-baseというおそらく本邦初公開のソフトウェア。MySQLのシャーディングができて、無停止でノード追加ができるというミドルウェアで、gizzerdとかPNUTSみたいなヤツかな。ルーティングのアイディアはCouchBaseとかRiakに似てて、PKEYを使ったConsistent Hashing *1だった。で、ハッシュにかけたあとパーティションに区切るのかな?そのパーティション毎に(おそらく)テーブルを作って、その単位で管理する。どのパーティションをどのサーバーが持ってるかはマスターがいて、そいつがルーティングする(っぽい…ここがRiakやCouchBaseと違うところ)。ノードを追加するときはバックグラウンドでパーティションを渡す。Select/Insertをまわしつつ、全部渡したらテーブルをドロップしちゃう。渡している途中にSelectが来たら、渡す先と渡す元のデータを比較してタイムスタンプが新しい方を使うとのこと。各ノードの死活監視は select now() でやっているらしい。合理的だ。
いくつか気になる質問があったのだけど、懇親会は出れなかったのでここにメモをしておこう。
- インデックスを張ってあるカラムからのSelectはどういう動作になるのか
- ルーティング表を持っているノードの冗長化はどうやってるのか、その子が死んだらダウンタイムになるのでは(そもそもMasterがいないなら、ルーティング表の共有はどうやってる?)
- 複数テーブルや、複数行の同時更新したい場合は分散トランザクションを使っているのか
- パーティションを渡すときの負荷と速度はどのように制御しているのか
- どのパーティションをどのノードが持つかの配置はどういうアルゴリズムでやっているのか
- JOIN使ってるかどうか
- aggregation系のクエリのパフォーマンスは?
- select now(); みたいな死活監視だと故障時にダウンタイムが20とか30秒くらいは出るがそれは許容範囲なのか*2
ダブルブッキングでケツカッチンだったので3つ目のネットワークのセッションを諦めて品川に移動。なんか知り合いが沢山いたらしく、懇親会に出たらもっと別の話も聞けたのかなあとちょっと後悔した。それにしても、なんかいっぱいグッズもらったし渋谷は華やかだった。雨が降ったくらいで出社しないなんてとても勿体ないなあと切に思う。