Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MySQLやSSDとかの話・前編

gree_tech
December 16, 2015

 MySQLやSSDとかの話・前編

MySQL User Conference Tokyo 2015での登壇資料です
https://www.mysql.com/news-and-events/events/mysql-user-conference-tokyo-2015/

gree_tech

December 16, 2015
Tweet

More Decks by gree_tech

Other Decks in Technology

Transcript

  1. 自己紹介 • わりとMySQLのひと • 3.23.58 から使ってる • むかしは Resource Monitoring

    も力入れてやってた • ganglia & rrdcached の(たぶん)ヘビーユーザ • 5年くらい前から使い始めた • gmond は素のまま使ってる • gmetad は欲しい機能がなかったので patch 書いた • webfrontend はほぼ書き直した • あとはひたすら python module 書いた • ganglia じゃなくても良かったんだけど、とにかく rrdcached を使いたかった • というわけで、自分は Monitoring を大事にする • 一時期は Flare という OSS の bugfix などもやってた
  2. • 最近の HW や InnoDB の I/O 周りについて考えつつ、取り組んで おりまして •

    さいきん、そのあたりを資料にまとめて slideshare で公開しており ます • 後日、あわせて読んでいただけると、よりわかりやすいかと思いま す • 参考: • 5.6以前の InnoDB Flushing • CPUに関する話 • EthernetやCPUなどの話 本日のお話の補足資料
  3. • GREEのサービスは歴史が古い • 古いサービスはコードが密結合な部分がある • むかしから動いてるMySQLのサーバは、かなり sharding されてい た •

    2000年代、GREEは SAS HDD 146GB 15krpm * 4本使ったRAID10の前提で、 データベースを設計してるところが多かった • そういうストレージでも動くように、データベースのサイズは 100-200GB以下 のものが多かった • わたしが入社した2010年のころはよくサービスささっていて、各エ ンジニアが協力して改善してた • アプリケーションレイヤーでがんばってもらったり、力の限り sharding したり • わたしは、 ganglia で問題切り分けて、チューニングなどに力いれた 背景
  4. • masterを切り替えた後に、古いmasterに対してINSERTが実行され たときのための対策 • 例えば、次のような状態になっていれば、auto_increment の値は duplicate しない • 旧master

    にINSERTすると、auto_increment のカラムは101以降の値を発番 する • 新master にINSERTすると、auto_increment のカラムは131以降の値を発番 する • 新masterには、master切り替えが完了するまでの間、 auto_incrementの値がduplicateしない程度の値を、 INSERT&DELETEし、 auto_increment の値を更新しておく • master切り替えの間、更新を完全にブロックできるなら、やらなく てもいい auto_increment更新する理由
  5. • database や table を最初からある程度分割しておいたほうが、 -- replicate-do-db や --replicate-do-table で簡単に分割できるけど

    • TRIGGER 使って table を分割することもできる • binlog_format=’STATEMENT’ だと、 TRIGGER によって発生した binlog event は binary log に落ちないけど、 binlog_format=’ROW’ だと binary log に落ちる。 • それらを組み合わせることによって、TRIGGER によって更新された table だけ replication することが可能 • サービス無停止で column の追加や削除などにも対応できるので、 statement-based replication (& --log-slave-updates)& TRIGGER の組み合わせは、切り札として有用 sharding は後からでもできる
  6. • 「MySQLのバージョンが上がってN倍性能が良くなった」というの は • (ほとんどの場合)MySQLがたくさんのCPUを活用できるようにな って、スループットが改善していってるという話だと • InnoDB Adaptive Flushing

    などの改善もありますけどね • MySQL5.5あたりから強く意識するようになった • それまでは、とにかくHDDが圧倒的に遅かったけど • SSDの登場により、CPUとメモリがボトルネックになるケースを、 強く意識し始めた 強く意識したのは、 MySQL5.5 あたりから
  7. • Fusion-IO 流行し始めたころ、調達できたのは ioDrive MLC 320GB • 先ずは KVS に投入したり、

    sharding が困難だったDBに投入した けど • ほとんどのDBはHDDでも動くように sharding したり、アプリケー ション工夫したりしていたから、 320GB という容量は使いドコロ が難しかった • また、当時はHDDのサーバが大量にあったので、 ioDrive に依存し た設計にしてしまうと、今後どれだけリプレースすればいいの、と いう恐れもあった • 他社のワークロードとGREEのワークロード違うから、他社の事例は 参考にしにくかった 先ずは ioDrive 導入した
  8. • ioDrive や一般的な PCI-e SSD は、 latency が異常によい • これは現代においても言える、オンプレミス環境のメリット

    • ストレージというより、「ちょっと遅いメモリ」と考える • ちょっと遅いメモリなので、 buffer pool のヒット率を少し下げて も大丈夫 • ピークタイムに、ユーザのデータの大半がヒットするなら、性能あまり変わらな い • buffer pool の割当を意図的に減らして、そのぶん max_connections を増やす。具体的にはHDDのサーバの三倍以上 に上げる • (高価だから)それほど多くないDRAM、 latency のすぐれた ioDrive という組み合わせで、HDDのサーバの三倍以上のqueryを 受けさせて、MySQLのCPU利用率引き上げる buffer pool のヒット率をうまく下げる
  9. • slave は O_DIRECT 使えばメモリあけられるけど • master は binlog が

    page cache に乗り続けてしまう • そこで、 buffer pool の割当減らしてる master では、 cron で posix_fadvise(2) たたいて、古い binlog は page cache からちょ っとずつ落とすようにしてます。 • (言語はなんでもいいんですけど) いまのところ ruby で IO#advise つかって :dontneed 叩いてます。 ちょっと一工夫
  10. • ioDriveのサーバ1台と、HDDのサーバ三台程度を等価交換できるよ うにした • どうしても I/O の性能が必要になった場合、 ioDrive のサーバを、 大量にある

    HDD のサーバ三台で置き換えることによって確保でき るように • むかしからあるHDDなサーバの在庫も活用できるように • これで、 ioDrive のサーバの稼働台数を増やすことが可能になった • ioDrive たくさん使うことによって、どんなふうに故障するのかがわ かってきた • ハードウェアは故障するまで使わないと、次のステージに踏み込めない HDDのサーバとの互換性
  11. • 時は流れ、NAND Flash の価格が下がり、大容量化が進んでいった • 800GB以上のエンタープライズ仕様のSSDが普通に買えるようにな った • これは使いたい •

    当時、容量大きいSSD使ってる他社事例それほど多くは聞かなかったので、使っ てやりたい • いまは珍しく無いと思いますけど • 他社が活用できてないものを活用することによって、サービスの競争力を向上さ せる • かつて、masterはHDD、slaveは一台の物理サーバに複数mysqld 起動してSSDで集約するという他社事例あったけど、それだと運用 の手間が増えるし、 Monitoring が難しくなるなと思った NAND Flash の価格が下がってきた
  12. • 高い random I/O 性能というのもあるけれど • HDDと比べて消費電力が低く、熱にも強い • 消費電力が少ないので、それだけ一つのラックにたくさんのサーバ 積めるようになるし

    • TurboBoost 使って clock あげて、CPUぶん回してやることもやり やすくなる • かつてHDDのために使っていた電力を、より多くのCPUのために使 う • ラック単位で電力を考えたとき、ストレージよりもCPUに多くの電 力を回すようにする そもそも、NAND Flash は何がうれしいか
  13. • New Master -> New Slave 間で、全力で binary log が転送され

    てしまうケースがあった。ネットワークの帯域を圧迫するのがコワ イ • いろいろ改善策はあると思うけど • slave_compressed_protocol がお手軽でいいかも • いつもは有効にしたくないなら、 dump 流しこむときだけ有効にし ても良い • 動的に変更できるので便利 mysqldump の結果を流しこむときに
  14. • change master したあとに start slave すると、一気に binary log 転送され、一気に

    binary log を SQL_Thread が処理してしま うので • ここで書いたスクリプト 使って、ちょっとずつ binary log 転送し て、ちょっとずつ binary log を適用させるように • あと、 binary log は大き過ぎない方が良い感じ • 弊社の場合は 200MB 程度にしてます ちょっとだけ工夫