heroku add-on bounscaleでplay2/scalaをオートスケールする
DESCRIPTION
2013/10/19に開催された「怖くないScala勉強会」で発表したLTの資料です。 http://connpass.com/event/3420/TRANSCRIPT
Heroku add-on BounscaleでPlay2/Scalaをオートスケールする
Shota Onishi
13年10月21日月曜日
はじめに
13年10月21日月曜日
About this LT
• DTSでBounscaleというオートスケールするHerokuのadd-onを作っています。紹介させてください。
• Play2/Scalaに対応してます。(Experimental)
対応した時に得たトピックも少し紹介します。
13年10月21日月曜日
About me• 大西 正太 @shouta_dev
• (株)DTS
• 2005年位からRailsやってます
• ScalaもPlayも初心者です!
• マイブームは重力
• お酒が大好き!クズ居酒屋が大好き!吉田類の酒場放浪記が大好き!
13年10月21日月曜日
Bounscaleの機能
13年10月21日月曜日
Heroku?
• いろいろ動くPaaS (Play/Scalaも)
• スライダずらすとスケールアウト
• Rubyの有名人が社員
13年10月21日月曜日
Bounscale?
Heroku上のサービス運営者が
四六時中手作業で
スケールアウトをせずに
突如の高負荷時に一定のレスポンスタイムを
維持できる
13年10月21日月曜日
Install
$ heroku addons:add bounscale
OR
https://addons.heroku.com/bounscale/
13年10月21日月曜日
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日月曜日
Open dashboard
13年10月21日月曜日
Settings
13年10月21日月曜日
Auto-scaling config
• レスポンスタイム+別指標値で負荷を測定
• ビジー率 / スループット / cpu / memory
• グラフ上でスケールアウトの閾値を指定
13年10月21日月曜日
Dyno History
13年10月21日月曜日
Bounscale Inside(Play/Scala対応の話)
13年10月21日月曜日
トピック(1)agentの実装(2)ライブラリの公開
13年10月21日月曜日
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日月曜日
agent?
• agentとは
• リクエストの事前・事後処理でメトリクス情報を収集してログに書きだすライブラリ
• CPU情報とか、スループットとか
• Zabbixでそのログを見てオートスケールの判断をしている
• フレームワーク毎に作る必要性13年10月21日月曜日
Rails => Rack Middleware
Rack Server (Unicorn/Passenger)
Rack Middleware
Framework(Rails)
Application
HTTP req HTTP res
Log
cpumemorythrouput
13年10月21日月曜日
Framework(Play!2)
Play! =>Filter
Web Server (Netty)
Filter (after Play 2.1.1)
Application
HTTP req HTTP res
Log
cpumemorythrouput
13年10月21日月曜日
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日月曜日
Publishing agentsPublished
gem push
Publishednpm publish
Published
Create JIRA Ticket
Ack (operator 2-3days?)
Upload library
Update JIRA Ticket
Ack (operator)
至れり尽くせりの重厚さ13年10月21日月曜日
Publish to Github pages
• 今回はGithub Pages使って野良Mavenリポジトリを作って公開しました
• やり方公開してます• Play2/Scala向けライブラリを公開する(SBTでGithub上のMavenに)
• http://qiita.com/bounscale/items/44b1729db39edbb507fd
13年10月21日月曜日
Try it out !!
$ heroku addons:add bounscale
現在Public Betaで利用は無料です!
13年10月21日月曜日
Resources
• https://devcenter.heroku.com/articles/bounscale
• https://github.com/bounscale
• http://qiita.com/bounscale/
• https://twitter.com/bounscale/
13年10月21日月曜日