スマホアプリ「モンスターストライク」のサーバー負荷は、年末年始に1年のピークを迎えます。2018年元旦のサーバー負荷に立ち向かうために実施した対策の一例として、データベースサーバー(MySQL)を安全に水平分割した事例を紹介します。見積もりから計画、実施に至るまでを時系列で振り返ります。
![モンストのサーバー負荷との戦い 〜あけおめ2018編〜 / bcu_30_server_9](https://cdn-ak-scissors.b.st-hatena.com/image/square/dc632328a7710ec84ff69b608d929d6c5bc9a097/height=288;version=1;width=512/https%3A%2F%2Ffiles.speakerdeck.com%2Fpresentations%2F12841d2b2a3445cc811626d98f27e2d2%2Fslide_0.jpg%3F9872229)
スマホアプリ「モンスターストライク」のサーバー負荷は、年末年始に1年のピークを迎えます。2018年元旦のサーバー負荷に立ち向かうために実施した対策の一例として、データベースサーバー(MySQL)を安全に水平分割した事例を紹介します。見積もりから計画、実施に至るまでを時系列で振り返ります。
指標に関していつもググってばっかりいたので、まとめてみました。 ツッコミ大歓迎。 CPU usage name detail User ユーザ空間(アプリケーション)でCPUが使われた時間の割合 Nice 優先度を変更された(nice値が変更された)プロセスにより、ユーザ空間でCPUが使われた時間の割合 System カーネル空間でCPUが使われた時間の割合 Idle CPUが何も処理をせずに待機していたCPUの時間の割合(ディスクI/O待ち以外) Wait(iowait) CPUがディスクI/O、またはネットワークI/Oの結果を待っていた時間の割合(I/O処理中で、その終了を待機している時間) Intr 割り込み SoftIRQ ソフト割り込み Steal 仮想サーバがCPUを使って待たされていた時間の割合 http://blog.suusuke.info/2011/10/24/365/
この記事は、MySQL Casual Advent Calendar 2017の20日目の記事です。 煽り気味のタイトルですがみなさん SHOW ENGINE INNODB STATUS 読んでますか? SHOW ENGINE INNODB STATUS \G 見づらいのなんとかならんのか。— そーだい@初代ALF (@soudai1025) 2016年12月20日 わかる。でもMySQLの振る舞いを知る中でSHOW ENGINE INNODB STATUSを読まざる得ない場面はそこそこあります。 どんな時に必要になるのでしょうか? そこでSHOW ENGINE INNODB STATUSにまつわる話を書きます。 SHOW ENGINE INNODB STATUS をまず読みやすくする まず末尾に \G を付けましょう。 これで3倍読みやすくなります。 次に pager less -S を
この記事は Mackerel プラグインアドベントカレンダー(全部CRE) の20日目です。 qiita.com soudai.hatenablog.com それでは20日目は mackerel-plugin-mysql 第二弾、InnoDBの監視です。 mackerel-plugin-mysqlはRDBMSとして広く使われているMySQL専用のプラグインです。 第一弾はこちら。 soudai.hatenablog.com インストール方法や使い方、MySQLのデータ取得で使っているSQLは前回説明したので割愛します。 前回はMySQL全般に言える監視の内容でした。 今回はその中でもInnoDBに特化した内容でお送りします。 見れるメトリック それでは各グラフ定義ごとに説明します。 また表に出てくるdiffとはプラグイン上で差分値計算をするかどうかです。 ◯ となっている項目はプラグインで
それほどDBに詳しくないアプリエンジニアが何かトラブった時にすぐさま行動して問題把握できるようになる情報を列挙しておきます。 開発時、障害時の対処療法やちょっとした定期監視方法などを対象にしています。 抜本的な対策などはインフラエンジニアさんにお任せしたほうがいいと思います。 DBはいろんな意味でこわいんでできれば触りたくないです>< 事前確認 MySQLサーバーのシステム設定値を確認しておく 以下のようにサーバーのシステム設定値を確認できます。 mysql> SHOW GLOBAL VARIABLES; # ワイルドカード(%)を用いた絞り込み mysql> SHOW GLOBAL VARIABLES LIKE 'performance_schema%'
※RDSは使っていません。 負荷を見てみる DBサーバーの負荷状況を見てみます。 当時の監視ツールの画像がないのですが、以下の状況でした。 LA(Load Average)が突き抜けている リクエスト数は「常識的に考えて」それほどでもない メモリの使用量にあまり変化がない swapはしていない ストレージ容量を結構食っている WEBサーバーから見れば、処理待ちのままプロセスが処理されていない典型的なパターンだったと思います。 DBサーバーとしては、LAに対し、メモリの使用量があっていないように思われました。 仮説 上記の状態から、仮説を立てます。 スロークエリ が頻発しているのではないか メモリ が正しく割り当てられていないのではないか 各種ログ の設定が適切ではないのではないか 仮説を検証することで、対策をしていきます。 設定を見直す 上記の仮説の設定は、MySQLの設定ファイルである「
前回から少し時間が空いてしまいましたがいよいよレプリケーションスレーブをマスターに昇格させます。 ※ この昇格の目的はマスターサーバからスレーブサーバへの機能の移転です。 マスター側の作業 昇格実行の前にDB更新を実行するアプリ等を停止させておきます。 WebサイトのDBであればhttpd自体を停止させたりします。ソフトが対応していればサブのDBへレプリケーションスレーブサーバを設定しておきます。 $ sudo service httpd stop スレーブ側の作業 まずスレーブのIOスレッドを停止させその後スレーブ自体をストップさせます。その後設定をリセットします。 mysql > STOP SLAVE IO_THREAD; mysql > STOP SLAVE ; mysql > SET GLOBAL read_only = 0; mysql > RESET SLAVE ALL; my
MySQLがダウンしたときに自動的に別のMySQLへ処理を引き継ぐことで、高可用性を実現するフェイルオーバーツール「MySQL-MHA: MySQL Master High Availability manager and tools」がオープンソースとして公開されたことを、作者の松信嘉範(まつのぶよしのり)氏がブログで伝えています。 Yoshinori Matsunobu's blog: Announcing MySQL-MHA: "MySQL Master High Availability manager and tools" 松信氏はモバゲーなどで知られるDeNAに勤務しており、MySQL-MHAによる自動フェイルオーバー機能はDeNAのインフラ運用を支えているとのこと。同氏のブログから引用します。 Difficulties of master failover is one of
CentOSにMySQLとMemcacheのインストールしてみる でMySQLをインストールした環境を使って、大量のデータをinsertしてみる。 【参考】 なんとなくやりたかった。MySQLのクエリのみで簡単に1億ものデータを作成する方法 | 株式会社LIG http://liginc.co.jp/programmer/archives/2707 SQLで大量データを一気に作るでござる(MySQL編) @ t100のプログラミング脱出作戦 http://t100life.blog121.fc2.com/blog-entry-205.html 今回はデフォルトで入ってるtestデータベースで試す。 mysql> use test 手順 下記のようなテーブルを作成する。 mysql> create table sample ( id int NOT NULL AUTO_INCREMENT,
デフォルト設定で構築してあったAmazon RDSMySQLの運用でちょっと困った事があったので。 SlowQueryを取りたいんだけど? MySQL運用あるあるです。 デフォルトOFFなので必要に迫られてONにするケースは多々あります。 どうぞどうぞ slow_query_log または log-slow-queries スロークエリログの有効/無効 slow_query_log_file スロークエリログファイル名 long_query_time スロークエリログに出力する閾値(デフォルト10秒) この辺りの 動的パラメーター を設定すれば良いのです。 もちろん 動的パラメーター なのでデータベースを停止することなく変更可能です。 では、適用しましょう まず、RDSなので権限が無いためSET GLOBALコマンドでの変更は行えません。 ERROR 1227 (42000): Acces
zabbixでMySQLを監視するためにテンプレートを適用したいと思います。 zabbixをインストールしただけではMySQLのテンプレートは無いので、 以前の記事を参考に、監視テンプレート追加してください。 また、MySQLの監視を行いたいサーバーにzabbixエージェントがインストールされていない場合には こちらの記事を参照してインストールまで行ってください。 ■手順1 MySQL監視対象サーバーでzabbixエージェントの設定の編集。 vi /etc/zabbix/zabbix_agentd.conf #Zabbixサーバーからのリモートコマンドを許可するかどうかを設定します。0:許可しない,1:許可する EnableRemoteCommands=1 #実行されたシェルコマンドの警告をログに記録するかを指定。0:無効,1:有効 LogRemoteCommands=1 #処理がタイムア
今回は、Mysqlサーバをリソース監視システム(Zabbix)でリソース・死活監視する方法について整理して見ました。 運用中のMysqlのリソースを監視し、パフォーマンスのチューニングポイントを見つけてみましょう。 インストール環境とバージョン 今回、インストールするサーバとzabbixのバージョンは以下のようになります。 名前 バージョン ダウンロード元 ubuntu 10.04.4(64bit) http://releases.ubuntu.com/lucid/ ZABBIX 2.2.0 http://www.zabbix.com/ Zabbix Serverインストール 「Zabbix Serverのインストール手順」を参照してください。 Zabbix Agentインストール 「Zabbix Agentのインストール手順」を参照してください。 ※AgentサーバにはMysqlが設置さ
MySQLのチューニングにおいて非常に重要となるメモリ(バッファ)関連のパラメータについて、 チューニングのポイント DSASのとあるDBサーバ(実メモリ4GB)の実際の設定値 をまとめてみます。 また、必要メモリの総量の計算や限界値を越えてないかチェックしてくれるスクリプトも紹介します。 是非、参考にしてみてください! まず最初に注意点を。 バッファには2つのタイプがあります。 グローバルバッファ スレッドバッファ グローバルバッファはmysqld全体でそのバッファが1つだけ確保されるもので、 これに対し、 スレッドバッファはスレッド(コネクション)ごとに確保されるものです。 チューニングの際にはグローバル/スレッドの違いを意識するようにしましょう。 なぜなら、スレッドバッファに多くのメモリを割り当てると、コネクションが増えたとたんにアッという間にメモリ不足になってしまうからです。 in
これから3回連載の予定で、SQL識別子のエスケープの問題について記事を書きます。SQL識別子のエスケープについてはあまり解説記事などがなく、エンジニア間で十分な合意がないような気がしますので、これらの記事が議論のきっかけになれば幸いです。 3回の予定は以下のとおりです。 間違いだらけのSQL識別子エスケープ(本稿) SQL識別子エスケープのバグの事例 SQL識別子は結局どうすればよいか ということで、まずはSQL識別子のエスケープの失敗例について説明します。この失敗例はあくまで説明のために作ったもので、実際のものではありません。また、想定が「ありえない」と思われるかもしれませんが、意図的なものですのでご容赦いただければと思います。また、「間違いだらけの」というタイトルは、今回の題材が間違いだらけという意味であり、巷のSQL呼び出しがそうであるという意味ではありません。本稿に登場する人物と団
私は、ソーシャル系とは縁遠い仕事ばっかりしているのですが、そういう依頼も若干増えてきたので話題になっている「艦これ」をお盆にやってみた。 残念ながら、「艦これ」の魅力は分からなかった。しかし、ミッションを用意されると、「クリアーしたい」という欲求から意地になるのは、何となく理解できました。それより、同時に始めた「Clash of Clans」には嵌まりました。気になっていた「ゲームの中に如何に自然に課金システムを取り入れるか」という課題についても、個人的には「Clash of Clans」の方が上手に解決しているように思います。 「艦これ」は、同時アクセスが10万以上あって、何度かシステム障害があったとのこと(そりゃあるでしょうが……)。私の興味の方向性は、課金システムであったり、システム構成にあるので、「艦これ」のシステム障害の方が強い興味の対象になります(苦笑) というわけで、「ソーシ
今はレンタルサーバは、さくらのレンタルサーバとロリポップの2つを借りている。さくらのレンタルサーバはDBサーバが物理FWの内側にあるようで、グローバル側からMySQLサーバへはTCPレベルで接続できない。 macbook:~ ozuma$ telnet mysql122.db.sakura.ne.jp 3306 Trying 59.106.188.8... telnet: connect to address 59.106.188.8: Operation timed out telnet: Unable to connect to remote hostまぁ、当たり前やな…… (´∀`) しかしロリポップの場合、なんと手元のPCからmysql501.phy.lolipop.jp宛てに、無造作にポート3306へ接続できてしまった……! macbook:~ ozuma$ telnet mys
MySQL Bugs: #20786: mysqldump always includes AUTO_INCREMENT 2006年6月29日に報告されたMySQLのバグ#20786は、7年たった2013年6月29日になっても、なお修正されていない。そこで、このバグに対し七歳の誕生日ケーキが送られた。 バグの内容は、mysqldumpの出力が、--no-dataを指定しても、テーブル定義にAUTO_INCREMENT=xxxが含まれてしまうというものである。これはバックアップ目的にはふさわしいかもしれないが、開発目的のダンプにはふさわしくない。現状では、開発目的に使うには、ダンプ後のファイルを手動や、あるいはsedなどで書き換えなければならない。 期待される修正は、出力しないオプションを付け加えるか、--no-dataオプションが指定されたときは出力しないようにするというものだ。 変更自体
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く