タグ

ブックマーク / dsas.blog.klab.org (57)

  • LVSの高負荷対策 その1 ~障害発生~ : DSAS開発者の部屋

    こんにちは。インフラ担当の岡村です。 昨年、あるサービスで使用中のロードバランサが停止してしまうという事件が起こりました。 事の顛末を、数回に分けて紹介していきたいと思います。 もし同様の事象にお困りの場合は、役立てて頂ければと思います。 システム構成 KLabのDSASでは、ロードバランサにLVS (Linux Virtual Server) を使用しています。 ロードバランサはマスタ-バックアップ構成になっており、マスタ側が停止してしまっても、通常はバックアップ側がマスタに昇格し、サービスを継続できるようになっています。 おおまかな構成は下図のようになります。 ある日の晩、突然ロードバランサ(マスタ側)の死活監視のアラート通知が届きます。 (なんだろう..。電源障害? その他HW障害? もしくはカーネルのバグを踏んだ?) 原因調査・復旧はもちろん必要ですが、冗長構成のため、とりあえずサ

    LVSの高負荷対策 その1 ~障害発生~ : DSAS開発者の部屋
    dann
    dann 2017/04/21
  • Unbound のリトライ処理を追跡してみました : DSAS開発者の部屋

    この記事は KLab Advent Calendar 2016 の 15 日目の記事です。 こんにちは。大野です。 KLab では最近、ローカルの DNS キャッシュサーバとして Unbound を使うようになりました。 今までは dnscache を利用していたのですが、キャッシュ削除のためにプロセスを再起動しなければならなかったり、特定のレコードのみを削除することができないといった課題や一部の問合せをキャッシュサーバ内部で解決したいといった要求があり Unbound を導入するに至りました。 Unbound を運用していく中でつまずいた点もありましたので、今回この記事で紹介します。 とある案件で AWS を利用した構成の運用を任されていたのですが、アプリケーションのエラーログには以下のような記録が残っており、何らかの理由で RDS で運用している DB サーバの名前解決に失敗し接続でき

    Unbound のリトライ処理を追跡してみました : DSAS開発者の部屋
    dann
    dann 2016/12/15
  • pixiv private isucon 2016 攻略 (1/5) : DSAS開発者の部屋

    攻略記事一覧: pixiv private isucon 2016 攻略 (1/5) pixiv private isucon 2016 攻略 (2/5) pixiv private isucon 2016 攻略 (3/5) pixiv private isucon 2016 攻略 (4/5) pixiv private isucon 2016 攻略 (5/5) pixiv さんが社内で開催したプライベート ISUCON の AMI を公開してくれたので、手順を残しながら攻略していきます。 ISUCON6出題チームが社内ISUCONを開催!AMIも公開!! リポジトリ この記事の対象読者は途中で何をすればいいかわからなくなってしまう ISUCON 初心者です。 Go を利用して攻略していきますが、他の言語で参加する場合でも考え方などは参考になると思います。 最低限の初期設定 ssh の公開

    pixiv private isucon 2016 攻略 (1/5) : DSAS開発者の部屋
    dann
    dann 2016/05/30
  • リアルタイム通信環境の(一部)構成紹介 : DSAS開発者の部屋

    こんにちは。 今回は、当社で稼働させているリアルタイム通信環境について、ご紹介させて頂きます。 ご紹介する環境に対する要件は、以下となります。 ・ゲーム内の期間限定イベントで使用し、イベント開催中のみサーバを稼働 ・リアルタイム通信。プロトコルは、websocket を使用 ・同じチームに所属するユーザを同じサーバへ接続 ・とりあえずいっぱいスケールできるように(笑 最後の要件は冗談で、実際にはちゃんとした数値を頂いているのですが、このような環境構築を依頼されましたので、AWS 上で以下にあるような構成を考えてみました。 構成図 ※ 主要なサーバのみを抜粋 ELB 外部のクライアントから、websocket な接続を受け付けます。 http(s) モードでは、websocket の通信確立に必要なヘッダが消去されてしまうため、tcp モードを使用しています。 tcp モードを有効にすると、

    リアルタイム通信環境の(一部)構成紹介 : DSAS開発者の部屋
    dann
    dann 2015/06/29
  • Go ではエラーを文字列比較する?という話について : DSAS開発者の部屋

    Go で関数の戻り値のエラーを判別するときに、エラーメッセージの文字列をチェックするコードが存在します。 (例) これは、 Go が言語設計としてエラー処理が貧弱だったり、標準ライブラリがエラー処理を軽視しているからでしょうか? 言語設計や標準ライブラリのAPIの設計をみて行きましょう。 TL;DR 言語設計としては、Java的例外機構と同等以上の(文字列比較によらない)エラー検査が可能 ただし Go のエラーに関する哲学により、公開されていないエラーが多い 実際にエラーを文字列比較されている実例についての解説 Go のエラー検査方法 Java の例外機構では、例外をキャッチするために専用の構文が用意されており、型によりマッチングすることができます。 これはクラスのツリー構造を利用してサブクラスをまとめて分岐することもできます。 一方で、同じクラスでも値によりエラー処理が異なる場合には、

    Go ではエラーを文字列比較する?という話について : DSAS開発者の部屋
    dann
    dann 2015/05/02
  • Goでアロケーションに気をつけたコードを書く方法 : DSAS開発者の部屋

    GoPythonのようなLLと比べると実行速度は速いのですが、GCは特別速いわけではないので、相対的にGCがパフォーマンスに与える影響は大きくなります。 また、Java に比べると、一時オブジェクトなどのために頻繁にヒープアロケーションを行うとGCの停止時間が長くなりがちですが、一方でヒープアロケーションを避けたプログラミングがしやすい言語でもあります。 MySQL ドライバのような低レイヤーのライブラリを作る場合、アプリケーション側の性能要件を勝手に決めることができないので、現実的な範囲でアロケーションを減らす努力をするべきです。 ということで、前回の記事 で紹介したプレースホルダ置換を実装するにあたって経験した、アロケーションに気を使ったプログラミングについて、チューニングする手順やコード上のテクニックを紹介したいと思います。 1. まずは正しく動くものを作る go-sql-driv

    Goでアロケーションに気をつけたコードを書く方法 : DSAS開発者の部屋
    dann
    dann 2015/02/18
  • Redis Sentinel で冗長構成を組む際の注意点 : DSAS開発者の部屋

    KVS界隈ではすっかりおなじみ(?)のRedisですが、当社でも徐々にそのニーズが高まってきました。 標準機能として、レプリケーション、Pub/Sub、ソート等の便利機能が満載のRedisですが、サービスに投入する際に冗長構成をどう組むかといった点が気になっている方もいるのではないでしょうか。 まだまだ検証中ではあるのですが、Redisに実装されているRedisSentinelを用いて冗長構成を組んだ際にハマった所をご紹介したいと思います。 RedisSentinelとは Redisに標準実装されている機能の一つで、Redisのステータス監視、通知、自動フェイルオーバーが行なえます。 詳細な仕様、設定に関しては以下のドキュメントをご確認下さい。 http://redis.io/topics/sentinel RedisSentinel導入前の構成 特に何の変哲も無い構成です。 Redisサ

    Redis Sentinel で冗長構成を組む際の注意点 : DSAS開発者の部屋
    dann
    dann 2013/07/25
  • Webアプリ開発者のための MySQL 基礎研修の資料を公開します : DSAS開発者の部屋

    新卒や海外拠点の新しい Web プログラマーMySQL のインデックスや explain, トランザクションと MVCC について説明するための研修資料を作りました。特に社内情報が含まれていないのでそのまま公開します。 MySQL Bootcamp 他人に講師役を任せたり、ある程度独習もできるようにしたつもりなので、よかったらご活用ください。

    Webアプリ開発者のための MySQL 基礎研修の資料を公開します : DSAS開発者の部屋
    dann
    dann 2013/05/20
  • gitでバイナリファイルを気軽に扱えるフィルターを作りました : DSAS開発者の部屋

    ネイティブアプリの開発とかしてると、ついつい git にスプライトの png とか一緒にコミットしてしまって、気づいたらリポジトリサイズが 1GB 超えてたとかありますよね。 git annex とか、格的なアセット管理システムとか使えば良いんだけど、普通のgitコマンド覚えるだけでいっぱいいっぱいな人にさらに他のツールまで覚えてもらうのは大変です。 そこで、登録しておいた拡張子のファイルはハッシュ値だけをリポジトリに格納し、ファイルの内容は別のディレクトリやAmazon S3に格納する git-largefile/gits3 を作りました。 git-largefile/gits3 は git の filter として動きます。 filter は通常改行コードの変換をしたり $Id$ のようなキーワードを変換したり行末のスペースを消す、文字通りフィルターなのですが、ここでファイル体から

    gitでバイナリファイルを気軽に扱えるフィルターを作りました : DSAS開発者の部屋
    dann
    dann 2013/03/23
    素晴らしい!
  • WebSocket アプリの負荷分散 : DSAS開発者の部屋

    最近 SPDY と WebSocket がアツいですね。 再来週の SPDY & WS 勉強会 も、定員100名に対して 参加者が 247 名とかなりアツいことになっています。 その予習というわけでもないですが、最近 WebSocket を実サービスへの 導入方法を考えながら遊んでいたので、 WebSocket の負荷分散方法について 考えていることを書いておこうと思います。 ステートフルな WebSocket アプリケーション HTTP サービスは基的にステートレスな実装になっており、リクエストが来るたびに DBサーバーや memcached などのバックエンドから情報を取得して返していました。 この構成では Web アプリ自体は完全にステートレス化することができているので、 負荷分散機はラウンドロビン等のアプリケーションを無視した負荷分散をすることができました。 しかし、 WebSo

    WebSocket アプリの負荷分散 : DSAS開発者の部屋
  • iPXE導入でサーバ機種にあわせたネットブートを : DSAS開発者の部屋

    さて、 前回は、iPXEを利用してサーバの機種情報等から動的にパラメータを生成してLinuxを起動する方法を簡単に紹介しました。 今回は、syslinuxのmenu.c32を利用した起動メニューの利用と機種情報によって動的にメニュー設定を変更する方法を紹介していきたいと思います。 (タイトルはそれらしいのにかえてみました(^^;;) 起動メニューを利用するには DSASでは、PXELINUX+menu.c32を利用して起動時に使用するカーネルやイメージを選択できるようにしており、OSの起動中や起動後に使用する変数などをカーネルパラメータに記述したりしています。 状況によっては、起動時にパラメータを追加したり変更して起動したいケースがあるのですが、前回も書いたように、iPXEに用意されているメニューコマンドを使って作成したメニューでは、起動時にメニューを手動で変更することは現時点では難しいよ

    iPXE導入でサーバ機種にあわせたネットブートを : DSAS開発者の部屋
    dann
    dann 2012/07/31
  • ログからは見えてこない高負荷サイトのボトルネック : DSAS開発者の部屋

    ちょうど1年前に「高負荷サイトのボトルネックを見つけるには」という記事を掲載していますが、この手のトラブルシューティングって結構大変で悩ましいですよね。はじめまして、新入りの@pandax381です。 ログからは見えてこないもの 「サイトの応答が遅い」という問題が発生した場合、その原因はどこにあるでしょうか。 Webアプリケーションの処理に時間が掛かっている DBサーバに投げたクエリーの応答が遅い サーバの処理能力を超えている などなど、いくつもの可能性があります。通常、上に挙げているような問題は、アプリケーションやサーバのログを調査することで、原因を突き止めることができます。 一方で、こういったログの調査だけでは、その原因にたどり着くことができなかったり、相当な苦労が伴うケースもあります。 あるサイトのある日の出来事 つい先日のことですが、KLabの運営している某ソーシャルゲームにて、サ

    ログからは見えてこない高負荷サイトのボトルネック : DSAS開発者の部屋
  • KLab勉強会#6の資料公開 : DSAS開発者の部屋

    6/25に開催した、KLab勉強会#6の資料を公開します。 『名状し難きDBアンチパターン』 〜 牧内 大輔(KLab株式会社) 発表資料 (PDF, 200KB) 『圧縮されたログファイルの活用ツール』 〜 於保 俊(KLab株式会社) 発表資料 (PDF, 270KB) 『ソーシャルゲームのデータマイニング的な話』 〜 高田 敦史(KLab株式会社) 発表資料 (PDF, 1.0 MB) 当日の動画はこちら 勉強会に参加して下さった皆様、当にありがとうございました。 お陰様で、懇親会も楽しく過ごすことができました。

    KLab勉強会#6の資料公開 : DSAS開発者の部屋
  • iPXE を導入した記念に blog を書いてみたけど、タイトルが悩ましいので、この記事のタイトル募集中! : DSAS開発者の部屋

    iPXE を導入した記念に blog を書いてみたけど、タイトルが悩ましいので、この記事のタイトル募集中! PXEと同じネットワークブートファームウェアの一つであるiPXE(gPXE)を実運用に取り入れてみたので、今回はiPXE(gPXE)を紹介していきたいと思います。 (自分の書いたタイトルはダメ出しされたので、募集することにしてみました(^^;;記事を読んでいただいて、もし、よいタイトルを思いついたら、ぜひ、コメントにでもお願いしますm(_ _)m。次回のタイトルに使わせていただくかも(^^) PXEとは、ネットワークブートのための仕組みの1つ。NIC上のフラッシュROM に書き込まれている。ネットワークブートに必要なファイルの取得には、DHCPとTFTP を用いる iPXE(gPXE)とは、PXEを拡張したオープンソースなネットワークブートファームウェア/ローダ iPXE(gPXE)

    iPXE を導入した記念に blog を書いてみたけど、タイトルが悩ましいので、この記事のタイトル募集中! : DSAS開発者の部屋
    dann
    dann 2012/06/13
  • DSAS環境でのDNS活用法2 〜tinydns-get活用術〜 : DSAS開発者の部屋

    KLab Advent Calendar 2011 「DSAS for Social を支える技術」 の13日目です。 先週に引き続き、DSAS 環境での DNS 活用法を紹介します。 スクリプト中でのゾーン参照方法 DSAS で使用している各種スクリプト内で、DNS の情報を参照する際に使ってるコードを紹介します。 # 設定情報用のゾーン(.dsas)を検索 mzone () { R="$1"; ( cd $INTERNALZONE 2> /dev/null; _zone TXT $R.dsas ) } # 名前解決を行う # tinydnsのゾーンファイルのコピーがあればtinydns-getを使用 # ゾーンファイルがなければDNS問い合わせを行う _zone () { if [ -r data.cdb ]; then DNSCMD="_zonedjb"; else DNSCMD="

    DSAS環境でのDNS活用法2 〜tinydns-get活用術〜 : DSAS開発者の部屋
  • DSAS環境でのDNS活用法 〜ネットワーク設定の格納にDNSを使う〜 : DSAS開発者の部屋

    KLab Advent Calendar 2011 「DSAS for Social を支える技術」 の12日目です。 昨日までの apache の話題からガラリとかわって DNS についてお話します。 DSAS 内では、サービスに用いるドメインに関する権威サーバのほかに、システム内部の各サーバのホスト名や DB、memcache などの役割に応じた名前を登録した内部向けドメインの権威サーバやキャッシュサーバを運用しています。 システム内に、内部向けの権威サーバや、キャッシュサーバを設置するのは、珍しい構成ではありませんが、DSAS では、内部向け DNS サーバに、システムの設定情報を一部格納しています。 今回は、DSAS 環境で DNS サーバに設定情報を格納している理由や運用方法を紹介します。 ネットブートと設定ファイルの動的生成 DNS の話題に入る前に、DSAS の特徴を 1 つ

    DSAS環境でのDNS活用法 〜ネットワーク設定の格納にDNSを使う〜 : DSAS開発者の部屋
  • DSAS開発者の部屋:network

    在宅勤務に移行してから1ヶ月半ほど経過しました。通勤という概念が消滅したおかげで午前中から活動できるようになった @pandax381 です。 要約 フルスクラッチで自作した TCP/IP プロトコルスタックを xv6 に組み込み、一通りの機能が動作するようになりました。 I publish the implementation of TCP/IP network stack on xv6. I ported my user-mode TCP/IP stack, which was originally developed for learning, and added the e1000 driver and socket system calls. Some parts are still not enough, but they are working.https://t.co/nh

    dann
    dann 2012/01/21
  • トラフィックが急増! ボトルネックを退治しよう〜 【設定編】 : DSAS開発者の部屋

    KLab Advent Calendar 2011 「DSAS for Social を支える技術」 の16日目。最終日?です。 今日は、14日目の続きになります。前回は、ネットワーク通信において負荷分散機がボトルネックになっているのを解消するために、DSR構成をとるための設定項目をあげて、それぞれに関して説明したところで終わっていました。今日は具体的な設定について説明していきます。 DSR構成のレシピ まずは、設定項目をおさらいしておきましょう。次の6つでした。 LVS の負荷分散の設定をDSRに変更する(ipvs の設定) Webサーバが、DSRなリクエストパケットを扱えるようにする(iptables の設定) Webサーバを、outer VLAN に参加させる(L2 スイッチの設定) Webサーバが、outer VLAN において通信できるように設定する(VLAN 用インタフェースの

    トラフィックが急増! ボトルネックを退治しよう〜 【設定編】 : DSAS開発者の部屋
  • Apache の並列数を CPU コア数に応じて決定する : DSAS開発者の部屋

    KLab Advent Calendar 2011 「DSAS for Social を支える技術」の10日目です。 昨日の記事 では並列数を設定する基的な方法を紹介しました。 今日は実際に DSAS for Social で利用している設定方法を紹介します。 背景 実際の並列数の設定はマシンのCPUスペックやアプリの特性(レスポンスタイムの 何割をWebサーバーのCPUを使う処理が占めているか)に応じて設定するのですが、 DSAS for Social ではアプリの負荷に応じて柔軟にWebサーバーを 追加・削除するので、CPUスペックが一定ではありません。 具体的に言えば、 Core2 世代の4コアサーバーと、Core i7世代の4コア8スレッド サーバーが Web サーバーとして利用されています。 でも、Webサーバーごとに違う設定ファイルを用意したくはありません。 なんとかできない

    Apache の並列数を CPU コア数に応じて決定する : DSAS開発者の部屋
    dann
    dann 2011/12/15
  • 過負荷をかわす Apache の設定 : DSAS開発者の部屋

    KLab Advent Calendar 2011 「DSAS for Social を支える技術」の9日目です。 前回は php を動かしている Apache の手前にリバースプロキシを 置く必要性を解説しました。 今日は、 その前の php のプロセス数を絞る設定と合わせて、実際に Apache で 設定する方法を紹介します。 以降、 php を動かしている Apache の事をアプリサーバー、リバースプロキシ+ 静的ファイル配信を行っている Apache の事をプロキシサーバーと呼びます。 基設定 まずは基的な設定のおさらいです。 アプリサーバー 並列数を絞るには MaxClients を設定します。アプリがどれくらいの時間を CPUの処理で使って、どのくらいの時間を外部リソース待ちに使っているかにも よりますが、だいたいCPU数の1.5倍〜2倍くらいが適当だと思います。 Hyp

    過負荷をかわす Apache の設定 : DSAS開発者の部屋