YAPC::Asia Tokyo 2015 Day2
Google Cloud Platform Googleエヴァンジェリスト¶
https://speakerdeck.com/googlecloudjapan/deep-dive-into-google-cloud-technology
なぜGoogle Cloud Platform?
+他社はクラウドサーバー用にサーバー使っている
++GCPならGoogleとまったく同一のインフラが使える
++ハードウェアを全部自社で開発している
++Googleが公開してきたMapReduceからHadoopが開発
++Googleが使っているサーバーをそのまま使ってもらおう
++Snapchat100万リクエスト/秒など
+BigData
++MapReduceは時間がかかるからDremel FlumeJava Millwheelを使っている
++Googleではビッグデータは枯れた技術
++Dremel 400GBをSQLで正規表現フルスキャンして10秒
++なぜ速いのか?他社とは全然違うから
++どのサーバーも特定のサービスのためのものではない
++Google検索の為のネットワークのおかげで可能
++10億行と10億行のJoinに30秒
++DremelはあくまでSQL
++大規模バッチはFlumeJava データパイプライン
++Millwheelアドワーズ リアルタイムスパム対策 Twitterに対抗するような
++Flumejava+MillWheel→Google Cloud Dataflow
++Fluentd AtReastOnce(失敗したら二つ)
++DataflowはExactlyOnce
++バッチ処理をストリーム処理に簡単に書き換えれる
+Container
++Googleは最初からContainerで動いていた
++VMはオーバーヘッドでしかない。マジョリティ達は使っていなかった。
++10年以上前からGoogleはContainer 「Borg」
++最近はGoogleも外に技術を出すようにしてきた
++23ヶ月前にずっと使ってたBorgの技術を発表した
++LinuxにCgroupsをいれた Dockerなどとは規模が違う
++GoogleのデータセンターのCPU使用率メモリ使用率はほぼ100%
++BorgがGoogleAppEngine、色々な制約はBorgの為
++40msで起動 Scale to 1Mreq/s
++クローズドソースなのがやっぱり問題
++DockerのKubernatesがOSS版 Borgの規模までは行かない
++GoogleCloudStorage Nearlineは安い
++Googleデータセンターに行くとすべてのサーバーのDiskIOが高い
+Networking
++Googleはファイバーからスクラッチで作っている
++1PbpsのスイッチJupiterも最近公開した、全部が光ファイバ
++AndromedaでGoogleComputeEngineは9Gbps出せる
++リージョンをまたいだネットワークが構築できる
++GCE Load BalancerはGoogleが使ってるから暖気など必要ない
++100万リクエスト/sを簡単にクリア、クライアントマシンの性能次第だったGoogle.comが落ちない限り無限
++GIP1個でロードバランスできる 5秒でフェイルオーバー
+TheFuture
++LargeScaleDeepLearning
++GooglePhotoの検索など画像の認識など
++昨日発表したのがVisionAPI
++論文では出ているが、もうサービスで提供したい
+質疑
++IAMロールみたいなの出す!
++Asiaのデータセンター GAEが来てないがいい感じのタイミングで出す!
++ロードバランサーから何万コネクションとはられちゃう問題など
++自分の鍵で保存するとかはGCPとかなら出た
++AppsScriptは色々できちゃう権限とかほしい
++ビッグクエリ ユーザー定義関数が出ない あと23週間ででるはず
++GoogleAppEngineはまだつづくContainerEngineとかもでてきた
++GAEから学び、Googleのサービスをそのまま出してもだめだなとなっている
冗長化を失敗 宇宙の人¶
式年遷宮インフラストラクチャ
平均故障間隔
RedisSentinel
Consulでフェイルオーバーさせよう
Consulとはいい感じにDNSレコードを返す
MysqlはGTID mysqlfailoverでやろう
Before_exec After_execが嬉しい
Consul-templateでHostsに書いちゃお
こんな感じで遷宮キメりゃいいじゃん
DnsmasqでDNSラウンドロビンされるように
Mysqlfailoverでなんかおかしいので冗長化やめた
VPNで日本を駆け巡っていた
謎のスロークエリ:VPS業者にDBホスト変えてもらったら良くなった
迫り来る圧倒的成長機会に感謝しながら対応していた
→自分でやるのやめて外部に投げちゃお
EtcdやZookeeperとかあるやん?
MySQLで2億件のシリアルデータ DNPデジタルコム¶
シリアルをWebから登録するとポイントがたまる
2億のマスターからシリアルが生成される
Countに84秒、Order ByやAlterでtmpが枯渇
LoadDataで3億件、70分ぐらいで完了した
本番でやったら2億件が75時間かかった
8000万ぐらいから急激に遅くなっていった
Innodb_buffer_poolを大きく取ると遅延が治った
主キーがシリアルから連番にすると早くなった
100万件の紐付けが時間かかる
1回のアップデートで35秒かかっていた
ステータス管理をやめ、管理テーブルを作成し
Update自体をやめた。→インデックス再構築怖い
Nginxモジュール開発 メルカリ¶
Nginxのアーキテクチャ
+event-driven
+non-blocking
+asynchronous
+single-threaded(multi-threaded partially)
+multi-processes
+modular
ほとんどがモジュールで開発されている
3rd-party-moduleが簡単に作れる
ngx_small_light:リサイズとかシャープとか画像操作
ngx_dynamic_upstream
rsync-pathオプションでがんばってる
+nginx API
Nginxのアーキテクチャを見ればなぜこのAPIがあるかわかる
Memory-Pool、Slab(SharedMemory)
ngx_http_request_t
ngx_http_headers_in
ngx_http_headers_out
... see ngx_http_request.h
Test::NginxというPerlで書くテストがある
やっぱLuaモジュールで書くと非常に楽
正規表現ならLua Builtin-reを使った方が速い
Ngx_luaならOpenRestyを使うと良い
Lua-resty-coreがピュアなLuaが使える(JIT)
Lua-resty-mysql Lua-resty-redisなど
以下のドキュメントが良い
+Nginx Internals
+The Architecture of Open Source App Nginx
+Nginx Module Development
ソーシャルゲームにおけるAWS移行事例 カヤック¶
MySQLのReconnectを無効にしないとinit_connectが消えちゃう
DSNにTimeoutを設定しないとフェイルオーバーに問題が出る
Dbh->ping失敗でdisconnect&reconnectするようにした
早くインポートするために
+Innodb_flush_log_at_trx_cmmit=0
+Innodb_support_xa=0
+sync_binlog=0
ENIを無効にするとVIPが使えるようになる
HTTP2時代のWeb¶
http://www.slideshare.net/Jxck/http2-web-web-over-http2-51943080
ブラウザーキャッシュは75%の人は48時間で使い切る
よって積極的にPushしていくほうがいい
WebSocket over HTTP2 (策定中)
gRPC (Pushは未サポート?)
Servlet 4.0 (Pushの扱いを論議中)
QUICはUDPで実装