2013年3月23日土曜日

JAWS DAYS 2013 セッションメモ

2013年3月16日に行われた JAWS DAYS に参加してきました。
色々なセッションを聞いて、良いなと思った部分の羅列です。



クライドソーシングサービスを支えるクラウドコンピューティングサービス
ランサーズ株式会社 木下さん


AWS って何ですか?とサポートに問い合わせると、本社まで説明に来てくれる。
さらにその説明が詳しくて助かる(初心者には良く分からない事もある)
電話対応でも丁寧にサポートしてくれるので、何かあったらサポートに問い合わせるべき。

EC2 で CentOS 使いたい時は、提供されている AMI から作ったほうが手っ取り早い。
CentOS を初めから入れようと思ったら思わぬエラーの連続で、CloudPack の AMI を使うことにした。

画像を多く扱うサービスなので、画像や成果物は S3 へ。
サムネイル画像は EC2 にあるけど、アップされた画像や成果物は圧縮して S3 で保存している。
S3 へのアップは、PHP 版の SDK を利用。

負荷テストはスポットインスタンスで。
同じ構成をスポットインスタンスで再現して負荷テストすると、本番に影響出ないうえに安く済む。
負荷テストは短期間なので、途中でインスタンスが利用できなくなることもない。

あらかじめ予想されている負荷であれば、ELB を pre-warming しておくと便利。
ELB は負荷に応じてスケールアップするけど、5分経過しないと反応してくれない。
TV 効果など瞬間爆発的な負荷には対応出来ないので、事前にスケールアップしておくこと。
サポートに連絡すると対応してくれた。

AWS の機能はブラックボックスな所が多い。
なので、随時サポートに問い合わせるか、EC2 で実装して解析をする。
でも、AWS では通常のwebサービス稼働に使う機能が充実しているので、EC2 で独自実装するよりもサービスを使った方がお得だし簡単なので、できるだけそちらを利用する予定。



EventRegist on AWS: イベントレジストにおけるCDP
イベントレジスト株式会社 池田さん


インスタンスに付けられるタグを利用してバックアップ世代を管理している。
バックアップスクリプト中で、自分に付けられているタグからバックアップ世代を取り出して判断。
これならスクリプト修正しなくてもいいし、適宜変更可能。

静的コンテンツは外(S3)に出す。
イベント毎のヘッダー画像やサービス共通のCSSなど、読み込まれる事が多くて静的なものは全てS3へ。

トラフィックの特性が違うので、ELB は分ける。
webとDBではアクセス数も頻度も違うので、用途別に分けた方が最適化されるのでトラフィックが安定する。

AutoScaling は利用してない。
負荷の波が来たら、手動でインスタンスを起動していた。
でも今まで落ちたこと無い。

AMI はミドルウェアがインストールされた状態のもので、設定を修正反映するのは Chef に任せている。
インスタンスをコピーする際も、最初の1台を作って、そのAMIから次を作る。



無限にスケールし続ける写真共有SNSを運用するケーススタディ「snappeee」
株式会社マインドパレット 神尾さん


なるべくメンテナンスをしないような設計にした。
メンテナンスに手をかけるのは大変とわかっているから。
100% SimpleDB で動くように設計した。

サービスに合わせてプログラム・インフラを変えていく。
AWS は作り直しが簡単なので、壊せるし移動しやすい。
運用していく中で、どうしても現状に合わせて変更しなければいけない時がある。
その時はえいやと変えてしまう。恐れていては機会を逃してしまうから。

SimpleDB にも制限があるので DynamoDB に変更した。
10GB の制限があったので。

AutoScaling はスポットインスタンスで起動。
利用料金が10分の1になった。
シンガポールの c1.medium はあんまり使われていないようで、最低単価で入札できて
いる。

1,2台つぶれても仕方ない。気にせずガンガン行こうぜ。
運用している段階で、インスタンスが何らかの負荷で使えなくなることはある。
想定済みだし、1,2台潰れたぐらいでサービス止められないので、止まらないようにイ
ンスタンス数を調整している。
負荷が来るのは一瞬なので、その一瞬を逃さないようにすることが大事。

ログはDBへ。
ログをファイルに書き込むと、I/O がボトルネックになりやすい。
なので、DynamoDB につっこんで、整形したものを RDB に吐き出している。
サービス側のユーザログは最終的に1ヶ所に集めるから SimpleDB に書き込んでいる。


クラウドな働き方

福岡支部 小室さん

雲(クラウド)を雲の上から操って、人間らしく生きよう。
便利なツールをただ使うだけじゃ何も変わらない。
自分が自分でいられる時間を作り出すために活用する。

札幌支部 田名部さん

そのためにも、信頼出来る関係が大事。
信頼がなければ、協力も得られないし理解してもらえない。
部分的でもいいので、ちょっとだけ試してみる。
だめだったら止めればいいだけの話。
問題なければ、すこしずつ広げていけばいい。

北陸支部 相羽さん

仕事をしている場所、環境が、本当に必要なのかを考えてみる。
常識を疑うと、人生が変わる。
今の方法ではない、他の方法が見えてくるはず。

2013年3月14日木曜日

[error]ファイルサイズ制限を超過しました


ステージング環境で symfony の test:all を実行した時、
エラーが大量に発生して、テストが通らなかったのです。

■エラー
sh: line 1:  4611 ファイルサイズ制限を超過しました
Test returned status 153


何?何事?

Linux はファイルサイズに制限があります。
基本2GBです。
http://blog.livedoor.jp/cielo_cielo/archives/65189748.html


そんなに肥大化したファイルって何だろう…あ、ログか(;・∀・)

$ ls -lh log/frontend_*
-rw-rw-rw- 1 user user 2.0G  3月 14 11:20 log/frontend_test.log


oh... orz
ということで、ログをローテートして、無事解決!

$ php symfony log:rotate frontend test --priod=7 --history=5

2012年12月23日日曜日

負荷対策・負荷分散の勉強会に行ってきた

2012年12月20日(木) に渋谷 ヒカリエで行われた負荷分散の勉強会に行って来ました。
そのメモです。

勉強会の募集ページはこちら。
好評で超満員だったので、第2回が開催されるそうです。
【負荷対策・負荷分散】勉強会!! ~原因究明から、対処法、実例発表まで~ ロードバランサ、DBチューニング、NoSQLと幅広くお話します!

以下メモ。
----------------------------------------

自社のサービスで、リスティング広告のレポートをまとめるのが主な負荷。
サーバの基本構成は。CentOS + Apache + PHP + MySQL。
そこに追加するのが、Memcached。


----------------------------------------

■MySQL
MyISAM でやってたけど、テーブル単位でロックされるから管理画面の表示ができない!
→InnoDB に変更して解消。なお、InnoDB は行単位でロックする仕組み。

でも、InnoDB には罠が!
ログファイルが膨大になって、レコードを DELETE してもログが更新されない。
→ ibdata をテーブル単位にして解消。
=> innodb_file_per_table

さらに、ログファイルのサイズやログのファイル数を設定して使いやすく。
→ innodb_log_file_size = 1364M
→ 
innodb_log_files_in_group = 3

なぜ、ログファイルが膨大になって問題になったのか。
ログは30日分を insert or update していた。
でも、update するにも一回 select してみないとあるかどうか分からない。
→ じゃあ、全部 DELETE して 全部 INSERT したらいいよ!
→ SQL増えた!ログも増えた!ログが!!

insert or update を判断する MySQL の便利な機能があるよ
=> INSERT ... ON DUPLICATE KEY UPDATE
指定された PrimaryKey があれば、UPDATE。なければ INSERT をしてくれる。

インデックスをはろう!はるとすごい速度が上がる!
はっただけで満足せずに、
・良く Where で使うワードを調査
・遅いクエリが無いか slow-query-log で確認
・インデックスがきちんと使われているか explain で検証
を忘れずに。

発行するSQLにコメントを付けてデバッグしやすくしてみる。
コメントに、どのサーバから来てどのセッションで実行された SQL なのかを残すと、show processlist や slow-query-log でわかりやすくなるよ。
ただし、コメントが毎回違うからクエリキャッシュ出来ない。
※これは素晴らしいアイディア!気付かなかった!

無理に正規化しない。
JOIN すると遅くなることもあるので、それだったら欲しい情報が全て1レコードにあったほうがいい。


----------------------------------------

■Memcached
導入に手間がかかるけど、静的でかつ頻繁にデータが変わらない SELECT 結果なら、毎回クエリを実行するのではなく、Memcached にキャッシュさせておいた方がいい。
メモリ上に展開されるので、HDD へのアクセスが発生する方法より格段に速くなる。
----------------------------------------

■PHP
フレームワークや、大量のソースを読み込む必要がある PHP を使ったサービスなら、アクセラレーターは導入した方がいい。
PHP は、実行する時にバックでコンパイルしている。
コンパイルするファイルが多ければ多いほど処理完了までに時間がかかる。
アクセラレーターはコンパイル結果をキャッシュしておくものなので、表示までの速度が速くなる。

改善のための解析用にログを残すのも大切。
どのページ(URL)で、誰が、どのくらいのメモリーを使って、何秒で表示まで終了したかを記録すると、わかりやすいよ。
----------------------------------------

■いろいろパワーアップするために
HDD より高速化したいので、Fusion-io が気になる。
DB に SSD を使ってみたけど、書き込み制限ですぐにダメになってしまった。

MySQL5.6 は、まだ正式リリースではないのだけど、InnoDB まわりが進化しているので早く実戦投入したい!

2012年12月21日金曜日

Linux サーバ上でエンコードされたメールを PHP でデコードして確認する方法



Postfix 設定に失敗して、送信されるはずだったメールがローカルユーザと勘違いされ、
でもローカルユーザにそんなやつはいないから root 宛に転送されていた。
mail コマンドで確認したら、メールの内容が残ってた!助かった!でも文字化けしてる…

=E3=81=93=E3=81=AE=E3=83=A1=E3=83=BC=E3=83=AB=E3=81=AF=E3=80=81 ...


http://d.hatena.ne.jp/minesouta/touch/searchdiary?word=*%5BPerl%5D&of=10
これは文字化け?いいえ、Quoted Printable です。
エンコードされているんですよ。
Perl でデコード出来ます。


http://www.plus-a.net/tools/text_tool/
試しにデコードをしてみよう。
お!読める文字になった!


http://pentan.info/php/quoted_printable.html
php でも Quoted Printable 文字列の変換することができるんですよ。
quoted_printable_decode っていう関数があるんです。


php がインストールされているからデコードできそうだ!
早速やってみよう!


メールが記録されているファイルを確認
# less /var/spool/mail/root


あったあった!
これらを別のファイルに書き出す
# cp /var/spool/mail/root /root/mails.txt


書きだしたファイルをデコードして別に保存する
# php -r "echo quoted_printable_decode( file_get_contents('mails.txt') );" > decode_mails.txt


サーバからダウンロードしてきて確認。
subject に余計な文字が紛れていて、所々おかしいけど、これで読めるようになった!


2012年11月25日日曜日

vim : netrw の note が出て困る


最近、windows で vim を使い始めました。
NetBeans だと、自動で補完されるので忘れっぽい私にはとても助かっていたのですが、毎日2回は反応しなくなるという困ったちゃん。
そこで、社内の Vimmer から色々頂いて vim に挑戦したわけです。

しかし、vim を使っていると次のような注意書きが毎回出てきて、ちょっと困ってました。

**note** (netrw) consider setting g:netrw_localcopycmd<copy> to something that works


検索したら、対処法が見つかったのでやってみます。




vim ~/.vimrc

" ファイルの最後に以下を追加しました。
let g:netrw_localcopycmd=''


これで、エラーが出なくなりました。

ちなみに、netrw は ファイルブラウザ。:Explore コマンドのやつです。

Netrwを使いこなす
http://d.hatena.ne.jp/hagure_beans/20100603/1275591475


2012年11月12日月曜日

mysql に 4バイトutf8 の文字を入れたい

MySQL に iOS の絵文字など、4バイトUTF-8 の文字を入れると、そこで途切れるという現象がありました。
残念ながら発生したサーバの MySQL バージョンは5.1系でバージョンアップせずに対応したのですが、最近構築したサービスイン前のサーバは5.5系だったので設定してみました。


■設定内容
1. 文字コードを utf8 → utf8mb4 に変更
2. skip-character-set-client-handshake を設定


■詳細
1. 文字コードを utf8 → utf8mb4 に変更

MySQLの UTF-8 は4バイトに対応していません。
ですが、絵文字や中国漢字、日本語でも特殊漢字などは4バイトが含まれています。

詳しくはこちら↓
iOS の絵文字(4bytes UTF-8)が入った文字列を MySQL に INSERT/UPDATE すると絵文字以降の文字がぶった切られる件

------------

2. skip-character-set-client-handshake を設定

mysql.cnf の character-set-server を変更しただけでは、PHP で取得した時の文字コードがビルドした時のものが使用されます。
そうすると、MySQLのエラーが出てしまうのです。

General error: 1267 Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation ...

これを、ビルドした情報ではなく、MySQL サーバの文字コードで取得するには次のオプションを使います。

skip-character-set-client-handshake

詳しくはこちら↓
PHPとMySQLの個人的まとめ


■変更内容
# vi my.cnf

[client]
-- default-character-set = utf8
++ default-character-set = utf8mb4

[mysqld]
-- character-set-server = utf8
++ character-set-server = utf8mb4
++ skip-character-set-client-handshake


■phpから文字コードを見るコード

<?php

$mysql_host = 'localhost';
$mysql_user = 'root';
$mysql_pw   = '';
$mysql_db   = 'mysql';

$conn = mysqli_connect($mysql_host, $mysql_user, $mysql_pw, $mysql_db);

$sql = "SHOW VARIABLES LIKE 'char%'";
$result = mysqli_query($conn, $sql);

while ($data = mysqli_fetch_array($result, MYSQLI_NUM)) {
    echo str_pad($data[0], 24) ." | ". $data[1]."\n";
}

?>
-------------

以下、実行結果です。

character_set_client     | utf8mb4
character_set_connection | utf8mb4
character_set_database   | utf8mb4
character_set_filesystem | binary
character_set_results    | utf8mb4
character_set_server     | utf8mb4
character_set_system     | utf8
character_sets_dir       | /usr/local/mysql/share/charsets/

2012年10月29日月曜日

新しいサービスの提案:写真に署名を入れるサービス


ちょっと思いついたのでメモしておきます。
今はアイディアレベルですので、作ってやるぜ!という方、アイディア頂き!という方、どうぞ宜しくお願いします。
こここうするとイイヨ!とか、同じサービスあるよ!とかでも構いません。
ご連絡は @netsket_koshiba まで。

このアイディアで(・∀・)ニヤニヤ出来たら、お酒1杯ご馳走してもらえれば(ゴニョゴニョ…



■どんなサービス?
SNSやブログにアップする写真に、サイトURLやアカウント名などの定型文(署名)を入れて返却するサービス。


■どうして?
お気に入りのブロガーさんが写真をSNSにアップした所、勝手に使われてしまって困っているとつぶやいていたから。(複数)


■どうする?
入れたい文字と写真を選んで送信。
文字入れした写真をダウンロード。


■どうやって儲ける?
定型文の登録、アップできる写真数の制限解除が出来るアカウント作成。
月の利用料ではなくデポジット制。
アカウント削除時にデポジットが残っていたら返却。