heroku add-on bounscaleでplay2/scalaをオートスケールする

24
Heroku add-on BounscalePlay2/Scalaオートスケールする Shota Onishi 131021日月曜日

Upload: shota-onishi

Post on 22-Nov-2014

788 views

Category:

Technology


2 download

DESCRIPTION

2013/10/19に開催された「怖くないScala勉強会」で発表したLTの資料です。 http://connpass.com/event/3420/

TRANSCRIPT

Page 1: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Shota Onishi

13年10月21日月曜日

Page 2: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

はじめに

13年10月21日月曜日

Page 3: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

About this LT

• DTSでBounscaleというオートスケールするHerokuのadd-onを作っています。紹介させてください。

• Play2/Scalaに対応してます。(Experimental)

対応した時に得たトピックも少し紹介します。

13年10月21日月曜日

Page 4: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

About me• 大西 正太 @shouta_dev

• (株)DTS

• 2005年位からRailsやってます

• ScalaもPlayも初心者です!

• マイブームは重力

• お酒が大好き!クズ居酒屋が大好き!吉田類の酒場放浪記が大好き!

13年10月21日月曜日

Page 5: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Bounscaleの機能

13年10月21日月曜日

Page 6: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Heroku?

• いろいろ動くPaaS (Play/Scalaも)

• スライダずらすとスケールアウト

• Rubyの有名人が社員

13年10月21日月曜日

Page 7: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Bounscale?

Heroku上のサービス運営者が

四六時中手作業で

スケールアウトをせずに

突如の高負荷時に一定のレスポンスタイムを

維持できる

13年10月21日月曜日

Page 8: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Install

$ heroku addons:add bounscale

OR

https://addons.heroku.com/bounscale/

13年10月21日月曜日

Page 9: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Adding the agent to your app# Rails (Rack) :Gemgem ’bounscale’ #Gemfile

# node.js/express:npm [EXPERIMENTAL]”dependencies” : {”bounscale”, ”*”} // package.jsonapp.use(require(’bounscale’)); // app.js

# Play Framework2:sbt [EXPERIMENTAL]/* Build.scala */"bounscale" % "bounscale_2.10" % "0.0.1";resolvers += "r" at "http://bounscale.github.io/maven/";

/* Global.scala */import play.api.GlobalSettingsimport play.api.mvc.WithFiltersimport com.bounscale.BounscaleFilter

object Global extends WithFilters( new BounscaleFilter) with GlobalSettings

more detail: https://devcenter.heroku.com/articles/bounscale13年10月21日月曜日

Page 10: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Open dashboard

13年10月21日月曜日

Page 11: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Settings

13年10月21日月曜日

Page 12: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Auto-scaling config

• レスポンスタイム+別指標値で負荷を測定

• ビジー率 / スループット / cpu / memory

• グラフ上でスケールアウトの閾値を指定

13年10月21日月曜日

Page 13: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Dyno History

13年10月21日月曜日

Page 14: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Bounscale Inside(Play/Scala対応の話)

13年10月21日月曜日

Page 15: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

トピック(1)agentの実装(2)ライブラリの公開

13年10月21日月曜日

Page 16: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Architecture

AWS

CentOS

Apa

che

Twitte

r Boo

tstr

ap

Rack Server

Ruby on Rails

MySQLZab

bix

API (A

pach

e/PHP)

AWS

CentOS

ProvisionController

Bizca Multitenant

Zabbix Server

Zabbix Custom Items Zabbix Custom Action

Heroku

Developer

User Addon Provisioning API

Heroku API

Service Appliction

www.heroku.com(heroku console)

bounscale gem

(middleware)

Rac

k Ser

ver

Rails/Application

Heroku LogsResource Data

UserATenant

ConsoleController

UserATenant

Zabbix Access Model

Tenantdatabase

Tenantdatabase

Tenantdatabase

zabbix cachedata

UserATenant

UserATenant

Multitenant Access Model

UserATenant

UserATenant

Heroku Access Model

UserATenant

UserATenant

Cache Model

MySQL

memory Item

Throughput Item

Web ItemBusyness

Item

Trigger(scale condition)

CPU Item

shell scipt / Ruby

Zabbix database

Tenant1zabbix history

data

Tenant1zabbix config

data

Tenant2zabbix history

data

Tenant2zabbix config

data

Tenant3zabbix history

data

Tenant3zabbix config

data

shell scipt / Ruby

ScaleoutAction

Scalein Action

Resource Data

Resource Data

Provisioning Request

Update Scale Config

Create tenant

Provisioning Response

Get Cache Data

Create tenant

Tenant Control

Provisioning

Heroku SSO

Show Resource Graph

Update Zabbix

Cache CollectorResource

Data

Update&Create Items, Triggers, Actions

Collect History Data

Save Cache Data

Get cache

Resource Data

Per

iodi

cally

Kic

k Ret

urn

Res

ourc

e

Resource Data

Sav

e Res

ourc

e Dat

a

Get

Ite

m,

Trig

ger,

Act

ion

Conditionally Kick Actions

Scale out Scale in

Use this service

Collect and Write Resource Datas

Request Addon / Request SSO

redirect

Get Logs(heroku logs)

Extract resource datas

Update/Get

Sav

e Sca

lein

/ou

t hi

tories

Bounscale Architecture

agentLog

Web Console Zabbix

Application

13年10月21日月曜日

Page 17: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

agent?

• agentとは

• リクエストの事前・事後処理でメトリクス情報を収集してログに書きだすライブラリ

• CPU情報とか、スループットとか

• Zabbixでそのログを見てオートスケールの判断をしている

• フレームワーク毎に作る必要性13年10月21日月曜日

Page 18: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Rails => Rack Middleware

Rack Server (Unicorn/Passenger)

Rack Middleware

Framework(Rails)

Application

HTTP req HTTP res

Log

cpumemorythrouput

13年10月21日月曜日

Page 19: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Framework(Play!2)

Play! =>Filter

Web Server (Netty)

Filter (after Play 2.1.1)

Application

HTTP req HTTP res

Log

cpumemorythrouput

13年10月21日月曜日

Page 20: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Agent’s source codeclass BounscaleFilter extends Filter { def apply(next: (RequestHeader) => Result)(rh: RequestHeader) = { val collectors = List( new CpuCollector(), new MemoryCollector(), new BusynessCollector(), new ThroughputCollector() )

def post(result: PlainResult): Result = { collectors.foreach(collector => collector.post()) val writer = new HerokuWriter() writer.write(collectors) result }

collectors.foreach(collector => collector.pre())

next(rh) match { case plain: PlainResult => post(plain) case async: AsyncResult => async.transform(post) } }}

https://github.com/bounscale/bounscale_play2/blob/master/src/main/scala/BounscaleFilter.scala

<=post def

<=pre exe

<=post exe

13年10月21日月曜日

Page 21: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Publishing agentsPublished

gem push

Publishednpm publish

Published

Create JIRA Ticket

Ack (operator 2-3days?)

Upload library

Update JIRA Ticket

Ack (operator)

至れり尽くせりの重厚さ13年10月21日月曜日

Page 22: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Publish to Github pages

• 今回はGithub Pages使って野良Mavenリポジトリを作って公開しました

• やり方公開してます• Play2/Scala向けライブラリを公開する(SBTでGithub上のMavenに)

• http://qiita.com/bounscale/items/44b1729db39edbb507fd

13年10月21日月曜日

Page 23: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Try it out !!

$ heroku addons:add bounscale

現在Public Betaで利用は無料です!

13年10月21日月曜日

Page 24: Heroku add-on BounscaleでPlay2/Scalaをオートスケールする

Resources

• https://devcenter.heroku.com/articles/bounscale

• https://github.com/bounscale

• http://qiita.com/bounscale/

• https://twitter.com/bounscale/

13年10月21日月曜日