horizontální škálování Deltacloud API
2 Horizontální škálování webové app.
Horizontální škálování webové app. HI SCALE HIGH AVAILABILITY 3
Horizontální škálování webové app. Vysoká dostupnost redundance infrastruktury biodiverzita failover disaster recovery monitoring zálohování 4
Horizontální škálování webové app. Překážky ve škálování bottle-necks blob, blackbox statefull aplikace absence dokumentace nepredikovatelné chování 5
Horizontální škálování webové app. Postup při škálování vytvoření test-suite a vývojového prostředí performance test, stanovení cílové performance bottle-neck analýza optimalizace as-is rozdělení rolí horizontální škálování v rámci stejných rolí 6
Horizontální škálování webové app. Vytvoření test-suite klon konfigurace produkčního systému jeden nebo více výkonných klientů stejné prostředí, jako bude použito po optimalizaci nikdy netestujeme na produkčním systému 7
Horizontální škálování webové app. Performance test metriky pro web request per second concurrency, maximální udržitelný počet spojení time per request bandwidth user experience 8
Horizontální škálování webové app. Performance test nástroje YSlow AB httperf 9
Horizontální škálování webové app. Optimalizace as-is klást rozumné limity vlastním uživatelům optimalizace konfigurace serveru SQL slow queries komprese redukce počtu http objektů (assets merging, sprites) overload page 10
11 Horizontální škálování webové app.
Horizontální škálování webové app. Optimalizace as-is IO intenzivní operace přesunout do paměti lazy loading pro neklíčové elementy (FB like buttons, etc) optimalizace kódu (rekurze, memory leaks) code coverage test minimalizace overload recovery time 12
Horizontální škálování webové app. Rozdělení rolí použití http proxy zařazení http cache pro dynamický obsah oddělení databáze a aplikačního serveru oddělení http statického obsahu použití Memcached/Membased/Redis 13
Horizontální škálování webové app. Horizontální škálování stejných rolí loadbalancing DNS RRs resource pooling 14
Horizontální škálování webové app. Performance test obecné bottle-necky filesystem databáze session management paměť cpu síť bandwitdth síť, latence 15
Horizontální škálování webové app. Nástroje pro diagnostiku free top iotop iostat collectd mysql slow query log mysqltuner.pl vmstat netstat iptraf ntop strace mtop 16
17 DeltacloudAPI seznámení
DeltacloudAPI seznámení Infrastructure as a Service (IaaS) kdykoli vytvářet servery provádět akce (zapnout, vypnout, restartovat, smazat) zjistit stav, ip adresy, hw konfiguraci, název image Jak? web UI - prototyping API - integrace 18
DeltacloudAPI seznámení Many clouds = many APIs Many APIs = many problems Michal Fojtik, RedHat neexistuje standard vendor lock-in sledování změn složitá implementace parsování, generování XML, SOAP, JSON, binární @!#$%^&* 19
20 http://incubator.apache.org/deltacloud/
DeltacloudAPI seznámení Proč další API? industry standard vyvíjeny společností RedHat abstrakční vrstva nad cloud providery 0 % vendor lock-in legacy support zpětně kompatibilní RESTful API podpora Ruby, Python, Java dostupná dokumentace 21
DeltacloudAPI seznámení Datový model instances název, veřejné IP, lokální IP, možné akce images název hardware profiles ram, storage, CPU realms, flavours tarify, úrovně, datacentra základní akce vytvořit, zapnout, vypnout, restartovat a odstranit server 22
DeltacloudAPI seznámení Podpora providerů v core Amazon EC2 GoGrid Rackspace OpenNebula RHEV-M 23
DeltacloudAPI seznámení Nativní implementace odpadá instalace proxy zabezpečení HTTPS cool debugging console rychlost implementace 24
25 DeltacloudAPI ukázka
DeltacloudAPI ukázka RESTful API HTTP protokol HTTP methods CRUD URL namespace according to data model XML 26
DeltacloudAPI ukázka HTTP is the lingua Franca of our age, it opens up all sort of doors. Karel Minařík 27
DeltacloudAPI ukázka Curl seznam serverů CREDENTIALS= 6yvc3:wb97o1ijwWx7kRpzIlc8xLm8yH+NqOTvCpy5B1A BASEURL= https://www.virtualmaster.cz/services/deltacloud curl -s -X GET -u $CREDENTIALS $BASEURL/instances <instances> <instance href= https://www.virtualmaster.cz/services/deltacloud/instances/15844 id= 15844 > <owner_id>2531</owner_id> <name>master</name> <image href= https://www.virtualmaster.cz/services/deltacloud/images/124 id= 124 /> <hardware_profile href= https://www.virtualmaster.cz/services/deltacloud/hardware_profiles/virtual-15844 id= virtual-15844 /> <realm href= https://www.virtualmaster.cz/services/deltacloud/realms/prague-l1-personal id= prague-l1-personal /> <state>running</state> <actions> <link method= post href= https://www.virtualmaster.cz/services/deltacloud/instances/15844/start rel= start /> <link method= post href= https://www.virtualmaster.cz/services/deltacloud/instances/15844/stop rel= stop /> <link method= post href= https://www.virtualmaster.cz/services/deltacloud/instances/15844/reboot rel= reboot /> 28
DeltacloudAPI ukázka Curl seznam serverů CREDENTIALS= 6yvc3:wb97o1ijwWx7kRpzIlc8xLm8yH+NqOTvCpy5B1A BASEURL= https://www.virtualmaster.cz/services/deltacloud curl -s -X GET -u $CREDENTIALS $BASEURL/instances \ grep name sed -e s/<name>//g -e s/<\/name>//g sed s/^[ \t]*// master worker-stale worker-1300959292 worker-1300960167 29
DeltacloudAPI ukázka Curl vytvoření serveru BASEURL= https://www.virtualmaster.cz/services/deltacloud IMAGE_ID= 942 HWP_ID= 2513 REALM_ID= prague-l1-personal COUNT= 1 CREDENTIALS= 6yvc3:wb97o1ijwWx7kRpzIlc8xLm8yH+NqOTvCpy5B1A NAME= worker- `date +%s` DATA= image_id=$image_id&name=$name&realm_id=$realm_id&hwp_id=$hwp_id curl -s -X POST -u $CREDENTIALS -d $DATA $BASEURL/instances 30
DeltacloudAPI ukázka Ruby příprava # apt-get update # apt-get install -y ruby ruby-dev rubygems libxml2-dev libxslt-dev \ build-essential libopenssl-ruby # gem install deltacloud-client # irb 31
DeltacloudAPI ukázka Ruby připojení k API require rubygems require deltacloud api_url = https://www.virtualmaster.cz/services/deltacloud api_name = 6yvc3 api_password = wb97o1ijwwx7krpzilc8xlm8yh+nqotvcpy5b1a api = DeltaCloud.new( api_name, api_password, api_url ) => #<DeltaCloud::API:0x7f38d85125a8 @api_driver=nil, @driver_name= mock, @api_uri=#<uri::https:0x7f38d8512300 UR- L:https://www.virtualmaster.cz/services/deltacloud>, @verbose=false, @entry_points={:images=> https://www.virtualmaster.cz/services/deltacloud/images, :instances=> https://www.virtualmaster.cz/services/deltacloud/instances, :instance_states=> https://www.virtualmaster.cz/services/deltacloud/instance_states, :hardware_profiles=> https:// www.virtualmaster.cz/services/deltacloud/hardware_profiles, :realms=> https://www.virtualmaster.cz/services/deltacloud/realms }, @password= wb97o1ijwwx7krpzilc8xlm8yh+nqotvcpy5b1a, @api_provider=nil, @api_version= 1.0, @features={}, @username= 6yvc3 > 32
DeltacloudAPI ukázka Ruby běžící instance instance api.instances.map{ i i.name} => [ master, worker-stale, worker-1300959292, worker-1300960167 ] 33
DeltacloudAPI ukázka Ruby ip exisutjících adresy instancí h = {} api.instances.each{ i h[i.name] = i.public_addresses.first} h => { worker-1300959292 => 80.79.23.90, master => 83.167.232.91, worker- 1300960167 => 83.167.232.116, worker-stale => 80.79.23.171 } 34
DeltacloudAPI ukázka Ruby nová instance instance = Api.create_instance( 5, :name => api-test ) => #<DeltaCloud::API::Stateful::Instance:0x7f38d89d83d0 @actions=[[ start, https://www.virtualmaster.cz/services/deltacloud/instances/15970/start ], [ stop, https://www.virtualmaster.cz/services/deltacloud/instances/15970/ stop ], [ reboot, https://www.virtualmaster.cz/services/deltacloud/instances/15970/reboot ], [ shutdown, https://www.virtualmaster.cz/services/deltacloud/instances/15970/shutdown ], [ destroy, https://www.virtualmaster.cz/services/deltacloud/instances/15970/destroy ]], @base_name= instance, @state= PENDING, @client=#<delta- Cloud::API:0x7f38d85125a8 @api_driver=nil, @driver_name= mock, @api_uri=#<uri::https:0x7f38d8512300 URL:https:// www.virtualmaster.cz/services/deltacloud>, @verbose=false, @entry_points={:images=> https://www.virtualmaster.cz/ services/deltacloud/images, :instances=> https://www.virtualmaster.cz/services/deltacloud/instances, :instance_ states=> https://www.virtualmaster.cz/services/deltacloud/instance_states, :hardware_profiles=> https://www.virtualmaster.cz/services/deltacloud/hardware_profiles, :realms=> https://www.virtualmaster.cz/services/deltacloud/realms }, @password= wb97o1ijwwx7krpzilc8xlm8yh+nqotvcpy5b1a, @api_provider=nil, @api_version= 1.0, @features={}, @ username= 6yvc3 >, @url= https://www.virtualmaster.cz/services/deltacloud/instances/15970, @action_urls=[ https:// www.virtualmaster.cz/services/deltacloud/instances/15970/start, https://www.virtualmaster.cz/services/deltacloud/instances/15970/stop, https://www.virtualmaster.cz/services/deltacloud/instances/15970/reboot, https:// www.virtualmaster.cz/services/deltacloud/instances/15970/shutdown, https://www.virtualmaster.cz/services/deltacloud/instances/15970/destroy ], @id= 15970, @objects=[{:type=>:state, :method_name=> stopped?, :state=> S- TOPPED }, {:type=>:state, :method_name=> running?, :state=> RUNNING }, {:type=>:state, :method_name=> pending?, :state=> PENDING }, {:type=>:state, :method_name=> shutting_down?, :state=> SHUTTING_DOWN }, {:type=>:text, :value=>2531.0, :method_name=> owner_id }, {:type=>:text, :value=> api-test, :method_name=> name }, {:type=>:link, :method_name=> image, :id=> 5 }, {:type=>:text, :value=> 5, :method_name=> image_id }, {:type=>:link, :method_ name=> hardware_profile, :id=> virtual-15970 }, {:type=>:text, :value=> virtual-15970, :method_name=> hardwa- 35
DeltacloudAPI ukázka Ruby změna stavu polling instance.state => PENDING loop do break if api.instance(i.id).state == RUNNING sleep 5 end ips = api.instances.map{ i i.public_addresses.first} LoadBalancer.update_backend_pool(ips) 36