Post on 04-Sep-2020
transcript
horizontální škálování
Deltacloud API
2
Horizontální škálování webové app.
3
HI SCALE ≠ HIGH AVAILABILITY
Horizontální škálování webové app.
4
Vysoká dostupnost
• redundanceinfrastruktury
• biodiverzita
• failover
• disasterrecovery
• monitoring
• zálohování
Horizontální škálování webové app.
5
Překážky ve škálování
• bottle-necks
• blob,blackbox
• statefullaplikace
• absencedokumentace
• nepredikovatelnéchování
Horizontální škálování webové app.
6
Postup při škálování
• vytvořenítest-suiteavývojovéhoprostředí
• performancetest,stanovenícílovéperformance
• bottle-neckanalýza
• optimalizaceas-is
• rozdělenírolí
• horizontálníškálovánívrámcistejnýchrolí
Horizontální škálování webové app.
7
Vytvoření test-suite
• klonkonfiguraceprodukčníhosystému
• jedennebovícevýkonnýchklientů
• stejnéprostředí,jakobudepoužitopooptimalizaci
• nikdynetestujemenaprodukčnímsystému
Horizontální škálování webové app.
8
Performance test – metriky pro web
• requestpersecond
• concurrency,maximálníudržitelnýpočetspojení
• timeperrequest
• bandwidth
• userexperience
Horizontální škálování webové app.
9
Performance test – nástroje
• YSlow
• AB
• httperf
Horizontální škálování webové app.
10
Optimalizace as-is
• klástrozumnélimityvlastnímuživatelům
• optimalizacekonfiguraceserveru
• SQLslowqueries
• komprese
• redukcepočtuhttpobjektů(assetsmerging,sprites)
• overloadpage
Horizontální škálování webové app.
11
Horizontální škálování webové app.
12
Optimalizace as-is
• IOintenzivníoperacepřesunoutdopaměti
• lazyloadingproneklíčovéelementy(FBlikebuttons,etc)
• optimalizacekódu(rekurze,memoryleaks)
• codecoveragetest
• minimalizaceoverloadrecoverytime
Horizontální škálování webové app.
13
Rozdělení rolí
• použitíhttpproxy
• zařazeníhttpcacheprodynamickýobsah
• oddělenídatabázeaaplikačníhoserveru
• odděleníhttpstatickéhoobsahu
• použitíMemcached/Membased/Redis
Horizontální škálování webové app.
14
Horizontální škálování stejných rolí
• loadbalancing
• DNSRRs
• resourcepooling
Horizontální škálování webové app.
15
Performance test – obecné bottle-necky
• filesystem
• databáze
• sessionmanagement
• paměť
• cpu
• síťbandwitdth–síť,latence
Horizontální škálování webové app.
16
Nástroje pro diagnostiku• free
• top
• iotop
• iostat
• collectd
• mysqlslowquerylog
• mysqltuner.pl
• vmstat
• netstat
• iptraf
• ntop
• strace
• mtop
Horizontální škálování webové app.
17
DeltacloudAPI – seznámení
18
DeltacloudAPI – seznámení
Infrastructure as a Service (IaaS)
• kdykolivytvářetservery
• provádětakce(zapnout,vypnout,restartovat,smazat)
• zjistitstav,ipadresy,hwkonfiguraci,názevimage
Jak?
• webUI-prototyping
• API-integrace
19
„Many clouds = many APIsMany APIs = many problems”
• neexistujestandard
• vendorlock-in
• sledovánízměn
• složitáimplementace–parsování,generováníXML,SOAP,JSON,binární@!#$%^&*
MichalFojtik,RedHat
DeltacloudAPI – seznámení
20
http://incubator.apache.org/deltacloud/
21
Proč další API?
• industrystandardvyvíjenyspolečnostíRedHat
• abstrakčnívrstvanadcloudprovidery
• 0%vendorlock-in
• legacysupport–zpětněkompatibilní
• RESTfulAPI–podporaRuby,Python,Java…
• dostupnádokumentace
DeltacloudAPI – seznámení
22
Datový model
• instances–název,veřejnéIP,lokálníIP,možnéakce
• images–název
• hardwareprofiles–ram,storage,CPU
• realms,flavours–tarify,úrovně,datacentra
základní akce
• vytvořit,zapnout,vypnout,restartovataodstranitserver
DeltacloudAPI – seznámení
23
Podpora providerů v core
• AmazonEC2
• GoGrid
• Rackspace
• OpenNebula
• RHEV-M
DeltacloudAPI – seznámení
24
Nativní implementace
• odpadáinstalaceproxy
• zabezpečeníHTTPS
• cooldebuggingconsole
• rychlostimplementace
DeltacloudAPI – seznámení
25
DeltacloudAPI – ukázka
26
RESTful API
• HTTPprotokol
• HTTPmethods–CRUD
• URLnamespaceaccordingtodatamodel
• XML
DeltacloudAPI – ukázka
27
„HTTP is the lingua Franca of our age, it opens up all sort of doors.”KarelMinařík
DeltacloudAPI – ukázka
28
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-perso-nal“/> <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=“re-boot“/>
DeltacloudAPI – ukázka
29
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]*//‘
masterworker-staleworker-1300959292worker-1300960167
DeltacloudAPI – ukázka
30
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
DeltacloudAPI – ukázka
31
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
DeltacloudAPI – ukázka
32
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.virtual-master.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/delta-cloud/realms“}, @password=“wb97o1ijwWx7kRpzIlc8xLm8yH+NqOTvCpy5B1A“, @api_provider=nil, @api_version=“1.0“, @fea-tures={}, @username=“6yvc3“>
DeltacloudAPI – ukázka
33
Ruby – běžící instance instance
api.instances.map{|i| i.name}
=> [„master“, „worker-stale“, „worker-1300959292“, „worker-1300960167“]
DeltacloudAPI – ukázka
34
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“}
DeltacloudAPI – ukázka
35
Ruby – nová instance
instance = Api.create_instance( „5“, :name => ‚api-test‘ )
=> #<DeltaCloud::API::Stateful::Instance:0x7f38d89d83d0 @actions=[[„start“, „https://www.virtualmaster.cz/servi-ces/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.virtualmas-ter.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.virtu-almaster.cz/services/deltacloud/hardware_profiles“, :realms=>“https://www.virtualmaster.cz/services/deltacloud/re-alms“}, @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/delta-cloud/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/del-tacloud/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, :va-lue=>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-
DeltacloudAPI – ukázka
36
Ruby – změna stavu polling instance.state
=> „PENDING„
loop do break if api.instance(i.id).state == „RUNNING“ sleep 5end
ips = api.instances.map{|i| i.public_addresses.first}
LoadBalancer.update_backend_pool(ips)
DeltacloudAPI – ukázka