機能追加 #541

負荷分散&フェイルオーバー環境構築

山本 義治約9年前に追加. ほぼ9年前に更新.

ステータス:進行中開始日:2015/10/28
優先度:通常期日:
担当者:山本 義治進捗 %:

0%

カテゴリ:サーバ環境構築作業時間の記録:-
対象バージョン:-

説明

検討するサービス
・mesos+spark - リソース監視+自動スケールアウト
・nginx proxy - ロードバランス+死活監視
・redis sentinel or redis cluster - API分散
・mongo cluster

ME-02-Tokyo-Summit-2015.pdf (858.825 KB) 山本 義治, 2015/12/21 11:41

Dev-07d-Tokyo-Summit-2015.pdf (2.03 MB) 山本 義治, 2015/12/21 13:04

AWS-RatesSystem-JP_201310.pdf (644.317 KB) 山本 義治, 2016/01/25 17:23

JOJIサーバー料金比較.pdf (158.119 KB) 山本 義治, 2016/01/27 16:29

JOJIサーバー構成検証.pdf (579.842 KB) 山本 義治, 2016/01/27 16:29

履歴

#1 山本 義治約9年前に更新

  • ステータス新規 から 進行中 に変更
  • 担当者山本 義治 にセット

ad.i-joji.com

nginx

参考サイト
http://qiita.com/cubicdaiya/items/235777dc401ec419b14e
http://nodejs.osser.jp/server/nginx-max-performance/

nginx.conf

worker_processes auto;
worker_rlimit_nofile 100000;
error_log logs/error.log debug;

events
{
  worker_connections 2048;
  #multi_accept on;
  use epoll;
}

http
{
  log_format xgeneration '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    '"$x_app_params"';

  server
  {
    listen 443 ssl;
    server_name ad.i-joji.com
    charset utf-8;

    ssl_certificate /usr/local/openresty/nginx/conf/ssl/ad.i-joji.com.crt;
    ssl_certificate_key /usr/local/openresty/nginx/conf/ssl/ad.i-joji.com.key;
    ssl_session_cache shared:SSL:120m;
    ssl_session_timeout 5m;

    sendfile on;
    tcp_nopush on;
    #tcp_nodelay on;
    open_file_cache max=100 inactive=20s;
    keepalive_timeout  65;
    server_tokens off;
    access_log  /usr/local/openresty/nginx/logs/access.log xgeneration;

    set $x_app_params '-';
    set $template_root /usr/local/openresty/nginx/html/templates;

    location /nginx_status
    {
      stub_status on;
      access_log off;
      #allow 127.0.0.1;
      #deny all;
    }
    location /
    {
      default_type text/html;
      content_by_lua '
                ngx.say("<p>x-generation-api</p>")
            ';
    }
    location /favicon
    {
      access_log off;
    }
    location /create_init
    {
      content_by_lua_file lua/create_init.lua;
    }
    location /app/create
    {
      content_by_lua_file lua/app_create.lua;
    }
    location /app/update
    {
      content_by_lua_file lua/app_update.lua;
    }
    location /app/delete
    {
      content_by_lua_file lua/app_delete.lua;
    }
    location /campaign/create
    {
      content_by_lua_file lua/campaign_create.lua;
    }
    location /campaign/update
    {
      content_by_lua_file lua/campaign_update.lua;
    }
    location /campaign/delete
    {
      content_by_lua_file lua/campaign_delete.lua;
    }
    location /network/create
    {
      content_by_lua_file lua/network_create.lua;
    }
    location /network/update
    {
      content_by_lua_file lua/network_update.lua;
    }
    location /network/delete
    {
      content_by_lua_file lua/network_delete.lua;
    }
    location /click
    {
      content_by_lua_file lua/click.lua;
    }
    location /install
    {
      root html;
      content_by_lua_file lua/install.lua;
    }
    location /event/set
    {
      content_by_lua_file lua/event_set.lua;
    }
  }
}

#2 山本 義治約9年前に更新

テストサーバー構成

LBサーバー x 2
Webサーバー x 2
APIサーバー x 2
集計サーバー x 2
DBサーバー x 2

テスト項目

LBサーバー

・フェイルオーバーテスト
 ・死活監視
 ・障害時アラート通知
 ・障害発生時に自動フェイルオーバー

その他各サーバー

・パフォーマンステスト
 ・1台あたりのリクエスト処理能力とステータス監視
・フェイルオーバーテスト
 ・死活監視
 ・障害時アラート通知
 ・障害発生時に自動フェイルオーバー
・負荷分散テスト
 ・正常に負荷が分散されること
 ・高負荷時のアラート通知
・スケールアウト
 ・高負荷時にシステム稼働した状態でサーバー増設
・監視ツール
 ・各サーバーステータス監視
 ・アラート通知(メール、Slack)

成果物

・サーバー構成
・サーバースペック選定(CPU、メモリ、ディスク)
・データセンター選定

#4 山本 義治約9年前に更新

API

サーバー構成

redis sentinel採用
http://redis.io/topics/sentinel

master x 1
slave x 2

※redis clusterは最低6台必要なので不採用
http://redis.io/topics/cluster-tutorial

アプリケーション

nginx + lua + redis

(1) read

localhostへ接続

(2) write:

(2-1) masterのIPをsentinelに問い合わせ
SENTINEL get-master-addr-by-name <master name>

(2-2) masterへ接続

redis-sentinel対応ライブラリを使えば上記アプリケーション側対応は不要!?
https://github.com/pintsized/lua-resty-redis-connector

参考サイト
http://tech.gmo-media.jp/post/48748908427/introduce-redis-sentinel

#6 山本 義治約9年前に更新

ドワンゴのライブドアブログ譲渡〜オンプレミス→AWS移行体験記

AWSビギナーが3日でインフラ構築

#8 山本 義治約9年前に更新

サイバーエージェント~Dynalyst DSP配信システム
・Amazon Kinesisを活用したリアルタイムデータ処理
・RedshiftからSpark on EMRへ

#11 山本 義治約9年前に更新

JoJi AWSシステム構成(新)
http://calculator.s3.amazonaws.com/index.html?lng=ja_JP#key=calc-7C77BC68-C5DF-4E95-B442-2876557C721E&r=NRT

#Amazon EC2
API / nginx (ELB) - m4.large x 2
AP / nodejs (ELB) - m4.large x 2
DB / mongoDB - m4.large x 2
AG / kafka - m4.large x 1
AG / zookeeper - m4.large x 1

#Amazon EBS
DB / data - SSD500GB x 2
AG / data - SSD500GB x 1

#Amazon ElastiCache
API / redis - m3.large x 2

#Amazon S3
AG - 1TB

#Amazon EMR
AGG / spark - MapR M3 m3.xlarge x 2

#Amazon Route53

#12 山本 義治ほぼ9年前に更新

AWS課金体系

#13 山本 義治ほぼ9年前に更新

http://www.slideshare.net/GedowFather/gedow-style-aws-spot-instance

スポットインスタンスを併用することで大幅コスト削減

#14 山本 義治ほぼ9年前に更新

http://dev.classmethod.jp/cloud/apache-jmeter-master-slave-100mil-req-min/

Jmeter+スポットインスタンスで負荷テスト
ELB1台 + EC2: m3.xlarge (4core, 15GB) x 3台
静的PHPで66000req/s

#15 山本 義治ほぼ9年前に更新

#16 山本 義治ほぼ9年前に更新

「AWSからGCPに切り替えたらコストが1/10になった」
http://engineer.recruit-lifestyle.co.jp/techblog/2015-11-27-yoshida-interview-2/

#17 山本 義治ほぼ9年前に更新

大規模Redisサーバ縮小化の戦い
http://www.slideshare.net/ssuserf3788f/redis-58419914
・負荷テストでデータ量テストを省いたら台数膨れ上がってコスト増大
・dumpマージで64→8台に縮小化

他の形式にエクスポート: Atom PDF