Press "Enter" to skip to content

GOTO 2012 • Some Considerations for Scaling: What We Did At New Relic • Bjorn Freeman-Benson


alcune considerazioni per il ridimensionamento di tipo
cosa abbiamo fatto a New Relic e tu potevi
sorta di sottotitolo questo discorso 17 cose che noi
fatto così se si tiene il punteggio a casa
sai quando arriverai a 17 lo saprai
il discorso è fatto così solo un breve questo
non sta cercando di essere un passo di vendite ma tu
dobbiamo sapere qualcosa su ciò che facciamo
per capire alcune delle cose che noi
ha fatto questo lavoro così facciamo web
monitoraggio delle prestazioni delle applicazioni così noi
monitorare le prestazioni delle persone che
avere siti Web in genere persone che lo sono
vendere qualcosa così vogliono pagarci
soldi per monitorarlo controlliamo il reale
prestazioni dell’utente mediante l’iniezione di javascript
nel browser e restituisce i dati
per ogni singola pagina per ogni singolo
uno dei nostri clienti clienti ci vede
monitorare i server che conosci al server
livello monitoriamo le applicazioni e il
connettività di interconnessione a
applicazioni sai che monitora il
stack completo ha rapporti a breve termine e
rapporti a lungo termine e avvisi e tutto
quel genere di cose tanto più
cosa interessante per il gusto di questo
parlare è qual è l’architettura
sotto quello e quello che abbiamo è
abbiamo le tue cause, il nostro cliente
lì mette un piccolo agente che è il
piccolo logo sono seduti sul
server nella loro applicazione se è a
domanda di lavoro è un file jar se è
un’applicazione rubino è una gemma ecc
potrebbe strumenti automaticamente
strumenti e raccoglie i dati e
lo invia una volta al minuto ai nostri dati
centro dove lo raccogliamo e lo immagazziniamo
su molti database e poi abbiamo a
accoppiare server web dove puoi andare
alla nostra applicazione e vedere così i dati
è un software completo come servizio
soluzione in modo da non dover fare
qualsiasi cosa o i nostri clienti non devono
fare qualcosa sui loro server diversi da
installa questo piccolo agente così ma tu
sapere che sembra nel tipo di
il marketing parla qui in modo equo
usiamo l’architettura semplice che usiamo Ruby
Java usiamo il mio sequel piuttosto carina
roba standard la cosa interessante per
nell’interesse di questo discorso è che nel
quattro anni e mezzo il cliente che
la compagnia è stata un’esistenza che abbiamo
andato da zero account, ovviamente quando
abbiamo iniziato con 30.000 account là fuori
e ogni account ha tra uno e
il nostro account più grande ha 17.000 server
segnalando i dati a noi e segnalano
dati a noi ogni minuto da ogni
server e in realtà tutti
applicazione su ogni server segnala i dati
a noi ogni minuto
quindi stiamo raccogliendo oltre 40 40 milioni
metriche un minuto che è più di cinquanta
otto miliardi di metriche al giorno o cinque
terabyte al giorno ora questo è molto
meno dati rispetto al Large Hadron Collider
che abbiamo saputo di questa mattina
raccoglie in un istante di tempo e a
collisione ma va bene ora un’altra
cosa troverai in questo particolare
parlare è che ho messo le note sulle mie diapositive
perché sono stanco di andare a parlare
dove le persone fanno affermazioni arbitrarie e
non ho nulla per sostenerli così
Potresti avere un computer a portata di mano
digita quel collegamento e guarda
il i dati che sto parlando
in ognuna di queste diapositive um così
comunque siamo cresciuti, conosci i 30.000
conti e stiamo continuando a crescere
rapidamente e quindi come lo facciamo?
cosa interessante sai che è nuovo
Relic è stata una startup e quindi se tu
sapere qualcosa su questo Steve Blank
roba di verifica del cliente o la magra
avvio e così via come il
il modello di una start-up è prima di te
dimostrare che hai un modello di business
e poi ridimensiona quel modello di business
così all’inizio New Relic era finita
lì nella cosa scalabile di avvio
dove stiamo cercando di trovare un business
modello e ora stiamo passando
nel flusso di cassa pareggio redditizio
siamo in realtà un’azienda e in crescita
lato del business ma da quando eravamo
iniziato da lì nello scalabile
all’avvio non avevamo clienti che non avevamo
entrate non avevamo nulla di cui avevamo bisogno
costruisci un sistema che siamo in grado di fare
costruire molto rapidamente e uscire e
fare in modo che le persone inizino ad usare così abbiamo ospitato
il nostro sistema iniziale su Engine Yard on
la loro piattaforma come sistema di servizi
che avevano un po ‘ di virtuale
macchine abbiamo finito per essere su 8 fisiche
macchine lì abbiamo scritto tutto
Ruby è la nostra applicazione web era rubino
le rotaie sono applicazioni per i raccoglitori
dati raccolti dai clienti che era
Ruby on Rails abbiamo avuto un carico locale
bilanciatore basato su H un proxy e
avevamo processi separati per ognuno
delle attività che abbiamo fatto e così
questo era un ottimo modo per costruire rapidamente
questa soluzione in modo che potessimo
cercare quel modello di business che potremmo
scoprire se le persone sarebbero effettivamente
pagare per questo servizio che noi
il pensiero era prezioso e forse questo
pensavano che fosse prezioso ora, naturalmente
questo non sarebbe stato in grado di crescere
le dimensioni che siamo ora siamo siamo
raccogliere cinque terabyte di dati al giorno
ma è stato un ottimo punto di partenza
allora come ci spostiamo da un posto fantastico
per iniziare a qualcosa che funziona oggi
con le dimensioni che siamo oggi bene a
un paio delle caratteristiche che è
importante sapere del nostro software
beh prima di tutto come ho detto ogni app
l’istanza di ogni cliente ci manda i dati
ogni minuto e qualche volta più spesso
di così non è solo ogni
server ma è ogni istanza di app quindi se
stai per esempio unicorno acceso
come il tuo servizio Ruby che stai inviando
conosci 20 o 30 pacchetti di dati per noi
per server e se si dispone di 50 Apache
lavoratori su un processo PHP che stai inviando
50 pacchetti di dati per noi ogni minuto ecc
ora sono i dati a cui viene inviato
noi solo un sottoinsieme della nostra visione dei clienti
i dati su qualsiasi in qualsiasi momento giusto
quindi alcuni di loro si collegano al nostro sito web
e visualizzare i dati ma la maggior parte di essi
non lo sai che siamo in Danimarca
al momento la maggior parte degli americani
i clienti al momento sono ancora addormentati
giusto e quindi non stanno guardando a
il sito Web, ma i clienti europei sono
i nostri dati hanno un’emivita molto ripida
i dati più interessanti sono pochi secondi
gli anziani si preoccupano davvero di come sono loro
il sito Web sta funzionando in questo momento, lo sai
è lento in questo esatto momento
cura molto meno se fosse
lento un’ora fa o due ore fa o
la scorsa settimana teniamo i dati a lungo
periodi di tempo in modo che si può guardare
i dati da una settimana o due settimane o
tre mesi o qualche volta anche un anno
fa a seconda di cosa sai
piano di abbonamento che sei disposto a pagare
noi per ma per la maggior parte che il
i clienti sono interessati ai dati
è proprio ora e anche loro si preoccupano
che la precisione è essenziale cosa è
interessante è che troviamo i nostri clienti
scrivici e dì cose come me
guardando il tuo grafico e io no
credo che il nostro tempo di risposta web sia stato
250 millisecondi con cui stavo lavorando
alcune altre cose ed è 247
millisecondi Sono come i ragazzi di formaggio tre
millisecondi ma a loro importa davvero
rendilo davvero molto accurato
misura di queste cose e così noi
fare molta attenzione per assicurarci che il nostro
gli agenti stanno misurando la cosa
con precisione, ma significa anche che noi
non è possibile utilizzare uno stile di coerenza finale
database dove, ad esempio, avevamo tutto
i dati si alimentano in una sorta di no
sequel database che alla fine
ottenere tutti i dati in un unico luogo e
quindi interrogarlo e dire all’utente quale è il
i numeri sono perché si preoccupano per il
dati accurati proprio lì a destra
lì in quel breve periodo di tempo così
parliamo delle nozioni di base che siamo
andando a passare ho cinque basi
che tu attraversi e in qualche modo siamo andati
attraverso nel mettere questo insieme molti di
tu che esegui grandi applicazioni web
già conosco questo materiale di base così numeroso
uno si vuole ridurre il numero di
connessioni ai tuoi server così tipicamente
quando uno di questi elabora uno di questi
processi di agente o un sito web va e
può connettersi a uno dei nostri server
prenditi un po ‘per fare quella connessione e
avere la risposta tornare e quello
che tiene una presa aperta o un lavoratore
aprire sul server delle applicazioni così
soprattutto perché hai molto e molto
di persone che cercano di farlo, usiamo la parte anteriore
i server finali ci capita di utilizzare f5s come nostro
grandi interruttori per gestire SS a ssl e it
bufferizza le richieste e lo fa
certo che lo sai che sono gli F5
molto ben progettato per fare quel tipo
di cosa e poi tamponano il
chiedere e inviarli al nostro al nostro
server delle applicazioni e i nostri collezionisti
e riduce il numero di connessioni come
server che significa ognuno dei server
in grado di gestire più clienti piuttosto di base
roba ci siamo anche spostati dalla piattaforma
come servizio a Engine Yard sul nostro
bare metal nel nostro centro dati noi
trovato che le macchine virtuali non funzionavano
particolarmente bene per il nostro tipo di dati
throughput abbiamo scoperto che quando abbiamo avuto un
insieme virtualizzato di server che ha
molti buoni benefici ma per il tipo
della raccolta che stiamo facendo non ha funzionato
particolarmente bene perché con questi i / o
problemi di latenza quando stiamo condividendo
io / o in una macchina virtualizzata che abbiamo visto
jitter di larghezza di banda e alcuni dei
istanze virtualizzate che noi che noi
provato a usare abbiamo provato a mettere un po ‘di
le nostre cose su Amazon per un po ‘di tempo
ottimo per molte cose ma non lo è
utile per diritti di trasmissione ad alto throughput
database tipo di cose e rubino
rotaie che è ciò che sono le nostre applicazioni
scritto nella sua stessa memoria
e crediamo che la macchina virtuale
l’infrastruttura non è gestibile
mappatura della memoria così come potrebbe e
quindi ottieni una specie di esecuzione inferiore
velocità sui binari su una macchina virtuale
o così abbiamo trovato così siamo andati a nudo in metallo
usiamo lo stoccaggio collegato direttamente nel nostro
centro dati invece di un San che abbiamo trovato
che il mio seguito è il database
che usiamo dipende da molto velocemente
giusto commettere il che significa che vuoi
il denaro per essere il più vicino alla CPU come
possibile e stai pensando bene si
nella sabbia il denaro è nel disco
array e solo tu conosci pochi metri
lontano dalla CPU ma si scopre il
la velocità della luce conta e abbiamo un enorme
quantità di guadagno in termini di prestazioni usando
archiviazione collegata diretta anziché a
rete di archiviazione anche se questi sono
tutto nello stesso rack con gli stessi dati
centro e stiamo parlando di fili
abbiamo solo un paio di metri di lunghezza
un grande vantaggio nell’andare con
archiviazione diretta collegata ora quando si utilizza
archiviazione diretta collegata che hai
questo problema dove finisci con il silos
di dati perché puoi accedere solo a
dati dalla macchina che è collegata
ma la nostra architettura è tale che noi
non abbiamo quel problema che siamo in grado di
frammentare i nostri clienti in modo molto efficace
frammenti separati in modo che quando per
istanza Sam sta accedendo al sito noi
ottenere lui va solo a un server e
non deve guardare i dati sul
altri server perché non mescoliamo il
dati da diversi clienti in tutto
server così tutti i suoi dati
sarebbe dire sul server numero 4 quindi il
il director touch storage ha funzionato bene
beh, non usiamo molto i server delle app
in realtà così abbiamo sapete ricordare nella
diagramma di architettura abbiamo avuto il nostro
livello collezionista che raccoglie dati e
quindi abbiamo il nostro livello di server delle app quello
serve in realtà l’applicazione quando
vai alle pagine e al collezionista
lacrime solo applicazioni Java native come
è un vecchio programmatore di linguaggio assembly
sorta di strano per dire Java nativo ma è così
è NATO Java non c’è server web in
Davanti a ciò si apre semplicemente una presa
ha un molo incorporato lì così
fa la roba HDP ma in realtà lo è
solo throughput molto elevato nativo di Java
puoi vedere che ho scattato un’istantanea per dirla
sulla diapositiva qui stiamo guardando un milione
richiede un minuto sul nostro faro che è
il
collezionista che raccoglie dati dai nostri
visita la pagina Web dei clienti
questo è quel dato frontale con il
JavaScript ogni volta uno dei nostri
i clienti come groupon hanno un cliente
chi va a una pagina che è troppa
livelli in direzione comunque manda a
torna al nostro faro e così siamo
guardando una richiesta di milioni di pagine lì
e questi sono solo in realtà il tipo di
richieste medie di quando ho schioccato urlando
che le richieste di picco sono circa una cinquantina
per cento in più rispetto a questo, quindi è necessario
essere in grado di gestire un abbastanza alto
rendimento su queste cose ne abbiamo uno
macchina faro abbiamo otto aggregatori
macchine e sono a posto
stai guardando 3 millisecondi o 170
170 secondi secondi di risposta su quelli
processi in modo che sia abbastanza veloce
il lato Ruby on Rails per il nostro main
applicazione abbiamo passato a unicorno se
fai lo sviluppo di Ruby on Rails
sappi che l’ unicorno ha questo vantaggio
che non ha un dispatcher
la spedizione è la richiesta perché tutti loro
condividere una presa comune tutti i lavoratori
condividere un socket comune in modo che richieda un
un po ‘del ritardo fuori dal tutto
anche l’unicorno di processo sembra essere
più facile da fare distribuire il codice in tempo reale
non devi abbatterli abbastanza come
molto e ricominciamo da capo come noi
ha fatto in precedenza e quindi aiuta con
dispiegamento continuo quindi quelli sono i
basi così ora una volta che hai affrontato il
nozioni di base andiamo a trattare con il solito
sospetti che non sono così semplici ma
cose che puoi fare un po ‘di più
loro prendono un po ‘più conoscenza
su ciò che l’applicazione in realtà
sembra di modificare così il primo è
diamo un’occhiata al protocollo dell’agente ora il
agente è il piccolo pezzo di codice che
si trova nella tua applicazione e invia
dati ai nostri aggregatori e quindi ai nostri
il primo agente era davvero semplice il primo
il protocollo dell’agente era davvero semplice perché
eravamo originariamente un rubino su rotaie
negozio di monitoraggio e avevamo rubino su rotaie
nel nostro centro dati facendo la raccolta
e così abbiamo appena usato l’oggetto Ruby
serializzazione per inviare la data / inviarlo
oltre nessun problema ci ha permesso di alzarci
veloce e veloce e dimostrare se abbiamo avuto
un buon modello di business ora non appena noi
esteso dal fare semplicemente Ruby al fare
Java potremmo duplicare il Ruby
serializzazione di oggetti in codice Java per ottenere
quello o
noi potremmo venire con un protocollo di meglio
e così da quando ora ci rendiamo conto di noi
potrebbe avere un business in atto quando noi
stavano passando da Ruby a Ruby e Java noi
Detto bene, facciamogli un nuovo
protocollo e abbiamo progettato un nuovo protocollo
che era più ottimizzato per l’invio del
data over e capita di usare JSON ma
un altro paio di cose che ha fatto è stato
ridotto i viaggi di andata e ritorno in precedenza
quando abbiamo inviato abbiamo inviato i dati della metrica in uno
andata e ritorno e dati di errore in un round
tracce di viaggio e transazioni in un round
viaggio e dati di configurazione un giro
viaggio e così l’agente stava facendo quattro o
cinque diverse richieste al collezionista
ogni minuto e andava bene quando noi
aveva 16 clienti ma tu sai quando noi
siamo arrivati ​​a circa 10.000 clienti
iniziando a vedere un carico significativo di
viaggi di andata e ritorno al server così noi
ha cambiato il protocollo in modo che si pacchetti
tutti in pochi viaggi rotondi come
possibile lo tiene in vita così
che i viaggi di andata e ritorno non sono in realtà
chiudendo la presa su ogni round trip
e così via ovviamente siamo anche molto
attento nel nostro design del protocollo per mettere a
numero di versione in là in modo che potessimo
continuare a supportare le vecchie versioni di
agenti là fuori mentre continuiamo a
evolvere non ha dovuto insistere su questo
tutti aggiornano tutti i loro agenti ogni
tempo al momento stiamo supportando 12
diverse versioni del protocollo
lì come lo abbiamo evoluto come siamo cresciuti
la compagnia così un’altra cosa che abbiamo fatto
che abbiamo trovato molto importante nel ridimensionamento
il business è che se uno dei nostri
servizi è che temporaneamente non disponibile
accumulare i dati e riprovare a non farlo
raddoppiamo e riprovare, ma si accumulano esso
quindi per esempio se l’ agente sta provando
per segnalare all’aggregatore questo minuto
e trova che anche l’aggregatore
occupato a prendere i dati che dice va bene
troppo occupato questa volta e continua a
Agric Ummul otto dati dal dal
sito Web dei clienti e poi quello successivo
il minuto riprova con due minuti
vale la pena di dati che non riprova con
due richieste separate in quel secondo
minuto prova con due minuti
di dati e lo facciamo in ognuno di
i livelli a livello di agente noi
in realtà fare a un grande se stesso in modo che
se stiamo cercando di scrivere al
database e database sono
temporaneamente troppo impegnato per prendere i dati noi
accumulare i dati per un paio di minuti
o conosci un paio di interazioni che
potrebbe essere 30 secondi e quindi scrivere il
dati accumulati la seconda volta che è
davvero importante farlo
accumulo perché altrimenti finisci
up palude nel servizio quando viene
di nuovo su e specialmente in a
situazione come la nostra dove stai correndo
a un carico molto elevato all’interno del servizio
già intendo tu sai che abbiamo un molto
diritti di throughput elevati e costanti ai nostri
database e ai nostri servizi non è possibile
una sorta di doppio che si carica un minuto dopo
e aspettarsi che il servizio sia in grado di farlo
gestire quello suppongo che potresti se tu
mettere molto più Hardware in, ma non l’abbiamo fatto
voglio farlo così comunque ce l’abbiamo
a tutti i livelli e questo è stato un bene
vincere per ridimensionare il sistema su un altro
La cosa che abbiamo fatto è che sai originariamente quando
abbiamo iniziato l’azienda ai nostri clienti
erano tutte piccole aziende come noi
infatti ad essere onesti erano tutti
amici nostri che pensavano che potesse
sii gentile a provare quello che stavamo facendo
a poco a poco abbiamo iniziato a ricevere
clienti sempre più grandi hai visto la mia
Scorri prima che il nostro più grande cliente
ha oltre 17.000 server che abbiamo per
esempio atlassiano è uno dei nostri
i clienti e hanno 20.000 diversi
applicazioni ciascuna in esecuzione su un sottoinsieme di
i loro server e così quando sarebbero andati
alla nostra pagina web che mostra elencati tutti
le tue applicazioni in esecuzione sono state fantastiche
quando i nostri clienti ne avevano tre
le applicazioni non hanno funzionato così bene quando
i nostri clienti ne avevano mille
le applicazioni erano solo troppi dati
mostrandoci così di nuovo un disegno
decisione che abbiamo fatto presto
la compagnia per dare un inizio alla compagnia
dobbiamo modificare e quindi abbiamo fatto le cose
come il cercapersone e l’ordinamento intelligente e
cercare l’ordinamento intelligente è solo quello che sai
se ne hai un migliaio di applicazioni
stai cercando di vederti ovviamente
non mi importa di mille di loro tu
prendersi cura dei due che sono lenti così noi
ordina quelli verso l’alto e quel tipo di
cosa usiamo Ruby on Rails che tu
sapere per la nostra applicazione web principale che
ha certi vantaggi è fantastico
sistema per la costruzione di determinati tipi di
applicazioni ma dal momento che ha questo
ORM integrato che conosci i binari che può essere
molto spaventoso quindi c’è il tuo halloween
zucca dagli stati uniti con
queste rotaie spaventose su di esso la parte spaventosa
dell’ORM è questo se non stai attento
su come lo hai progettato puoi portarlo a
molti oggetti quando provi e tendi
cammina sul database usando ciò che sembra
come pezzi di codice innocui e così via
quello che abbiamo fatto è stato sapere prima di tutto
ha scritto il codice in rotaie e ha funzionato
bene quando stiamo osservando piccoli set
e poi come abbiamo ottenuto sempre di più
account e sempre più applicazioni
su quegli account e più altri server
su quelle applique
le cose hanno cominciato a impantanarsi così noi
usato intelligentemente il nostro software per guardare
a che cosa erano le transazioni lente
così avremmo trovato qualcosa lì dentro
basso a quella pagina impiega 2,2 secondi a
caricare ciò che è inaccettabile che vogliamo
tutto per essere meno di mezzo secondo
quindi potremmo immergerci con il nostro software
e se questa fosse una demo del prodotto, potrei
mostra esattamente come ti tuffi
il software e scopri quanti
oggetti errati vengono caricati e
poi entreremmo e sistemeremo il
Mapping ORM o aggiungere un indice o
qualcosa in modo che sarebbe più veloce e
ma sai che la lezione qui è che se
stai usando qualcosa di intelligente come un
ORM per rendere il tuo sviluppo più veloce
c’è un certo costo ad esso e al
inizio della vita della compagnia che era
i costi erano disposti a pagare perché noi
aveva un insieme di dati molto piccolo e come il
la società è diventata più grande e i nostri dati
i set sono diventati più grandi che abbiamo dovuto
allontanarsi da quella mappatura automatica a
oggetti e fare sempre di più della
domande manualmente noi stessi va bene così quelli
erano i soliti sospetti ora andiamo avanti
a quello che vorrei considerare l’intelligente
cose che ne ho fatte partire sei
con una delle cose intelligenti che facciamo
pre-calcolare alcune delle query ora se
non sei andato a parlare con Nathan Manses
ieri sul modo in cui fa Twitter
cose e lo chiama lambda
architettura questo è un tipo molto simile
di cosa anche se non siamo quasi a
la stessa scala di dati che sono ma per
esempio dato che puoi inviare i tuoi dati
da una delle tue applicazioni a
più applicazioni con nome sul nostro sito
quindi lo usi per fare i roll-up così per
esempio nel nostro caso abbiamo due server
uno caldo e uno stand uno di loro
raccogli i dati dei beacon e li segnaliamo
nella nostra dashboard come beacon one beacon
due e uno arrotolato chiamato faro
che è una combinazione di questi due e
così nel database questo è memorizzato di nuovo
ricorda che stiamo usando solo il mio sequel
Nativo diretto il mio sequel questo è memorizzato
come un sacco di file differenti per server e
per applicazione e per cliente e così via
fare una query su beacon uno dobbiamo
interrogare un gruppo di righe in una nuova query su
faro per avere e faro dovremmo
query sulle tue righe quindi invece cosa noi
fare nell’aggregatore è questo lo sappiamo
queste sono query standard che si verificano in
la nostra applicazione e li calcoliamo preventivamente
sull’aggregazione
lato perché possiamo farlo più velocemente come il
i dati arrivano quindi possiamo scriverci
al database e quindi interrogarlo
del database e quindi conoscendone alcuni
delle caratteristiche del modo in cui il nostro
l’applicazione web accede ai dati che possiamo
pre-calcolare alcune di quelle righe e scrivere
li nel database e poi andare a prendere
la riga pre calcolata e mostrarla e da
costruendo il software in modo robusto se noi
non riesco a trovare la riga pre calcolata che possiamo
in realtà però e poi andare e calcolare
è il modo lento nella nostra applicazione, quindi se
per qualche motivo la riga pre-computer
non siamo riusciti a scrivere siamo ancora in buona forma
modelliamo un problema simile con il nostro
lavori in background abbiamo i nostri dati
in un certo numero di tavoli diversi all’inizio
è dentro lo immagazziniamo nei tavoli che immagazziniamo
cose al minuto e poi rotoliamo
quelli su e immagazzinare le cose di ora in ora
e poi li arrotoliamo e li immagazziniamo
cose di giorno in modo che quando guardi
a dati più lontani in passato puoi guardare
a cose con una granularità diversa e
possiamo ottenere quei dati più velocemente e così via
quando abbiamo creato il software per primo
aveva ciascuno di questi lavori in background era
scritto in Ruby e una volta ogni ora c’è
un lavoro in background che ha preso tutto il
dati minuziosi e l’abbiamo arrotolato ai nostri dati
e tutto ha avuto senso e ha funzionato
grande tranne che alla fine
scoperto che il processo di roll up era
prendendo più di un’ora per completare e
stavamo iniziando a restare indietro e
arrotolando i dati è come se andasse bene
abbiamo risolto il problema e così abbiamo fatto
lo stesso tipo di cosa con cui abbiamo lavorato
il pre calcolo dei dati tranne in
questo caso quello che abbiamo è che abbiamo il
collezionista che scrive su entrambi
tavolo minuto e raccoglie dati e
diritti al nostro tavolo così una volta all’ora
ci sono alcuni diritti extra su cui scrivere
che il nostro tavolo e essenzialmente pre
calcolando quel lavoro in background e di nuovo
se quel collezionista fosse per esempio a
morire perché è solo un processo Java e
sai che potresti ucciderlo o no
potrebbe esaurire la memoria potrebbe morire e
riavviare perderebbe che i nostri dati che
stava iniziando a scrivere, quindi abbiamo ancora
ottenuto quel lavoro in background seduto intorno
e se nota che quello è il rotolo
per questo il nostro non è successo lo sarà
innescalo e inizia a farlo e così via
a lungo come il collezionista sta facendo la maggior parte di
i rollup vanno bene perché il
lavoro di background anche se ne occorrono di più
di un’ora per fare un’ora siamo ancora
in buona forma un’altra cosa che abbiamo fatto noi
utilizzare diversi database per diversi
tipi di dati che attualmente stiamo usando
il mio sequel sotto il tutto
sistema quindi non è che ti stiamo usando
conoscere il mio sequel per un set di dati e
e dì Cassandra per una serie diversa di
giorno in cui stiamo effettivamente usando il mio seguito
tutti questi casi ma stiamo usando un
relazionale sintonizzato il mio sequel per il nostro
dati dell’account come hai pagato noi questo
mese e qual è il nome del tuo account e
chi sono tutti gli utenti che possono usarlo e
usiamo un diritto solo sintonizzato o scritto
una volta sintonizzato il database per la nostra fascia oraria
dati perché tutti i dati della fetta di tempo
è effettivamente immutabile, giusto viene
una volta che i dati sono stati registrati, ce l’ha
non cambia di nuovo e ha questo
caratteristica dove puoi puoi te
può cambiare il modo in cui i parametri di sintonizzazione
sul mio sequel il diverso buffer
piscine e così via puoi ottenere il massimo
accelera lì e così sai se lo sai
qualcosa su come allocare la memoria
sono implementati in c conosci Malik e
così via c’è un algoritmo chiamato
allocazione di memoria buddy dove tu te
fare blocchi di blocchi di dimensioni diverse così
che se stai allocando piccoli lotti di
piccoli blocchi di memoria che escono
questo chunkin dei lotti di grandi blocchi
che viene fuori da questo pezzo questo
in pratica con cosa stiamo cercando di fare
il nostro database è qui separando il
database secondo il
caratteristiche dei dati che vanno
in loro e se tu sei se tu fossi in
il discorso del Collider del compilatore Large Hadron
stamattina che erano fondamentalmente
facendo la stessa cosa, naturalmente, di nuovo
non stanno usando semplicemente il mio
sequel ma stanno separando i dati
dalle diverse caratteristiche che esso
scrive un’altra cosa che abbiamo fatto noi
usa una spazzatura per i non garbage collector
soluzione di raccolta per i nostri database così
sai quando le persone ci inviano dati
stiamo scrivendo rose nel database
stiamo scrivendo 5850 miliardi di righe al giorno
nel database e da quando lo scriviamo
in una data su una base di minuto e poi noi
arrotolare fino a un’ora dopo
a volte i dati minuti non sono più
utile e possiamo buttarlo fuori così come fanno
tu raccogli la spazzatura che bene uno standard
modi in cui entreresti nel database e tu
basta cancellare tutti quei minuti rosa ma è così
scopre se lo fai nel mio sequel di
almeno usando uno standard mio
sequel backends diventa piuttosto lento
perché blocca il tavolo o le serrature
up rose stai cercando di usare e basta
blocca tutto così, invece cosa
abbiamo fatto è abbiamo detto bene facciamo solo un
tabella diversa per ogni account per
ogni x
sospira e poi quando quella volta è no
più usato cancelleremo quella tabella
basta fare un drop table così invece di
cancellando le file uno per uno siamo
cancellando l’intero tavolo ora ho lavorato
Amazon 1999 2000 2001 e abbiamo avuto un grande
eseguibile lì che è stato scritto in C
questo è prima che l’Amazzonia passasse a
facendo un modello di servizi e abbiamo avuto un reale
problema di allocazione della memoria perché le persone
allocherebbe la memoria dappertutto
provando a schierarsi bene dovremmo fare un
netturbino o quant’altro e noi
ha detto no, la soluzione più semplice è giusta
eseguire un centinaio di richieste attraverso il
attraverso l’eseguibile e quindi riavviare
così la raccolta della memoria consisteva in
utilizzando il sistema operativo per azzerare
tutte le pagine perché era estremamente
efficiente nel farlo e solo iniziare
tutto da capo e stiamo usando un simile
modello nel nostro database qui siamo solo
utilizzando il sistema operativo lasciando cadere a
tavolo tanto efficace quanto semplice nel mio
sequel come l’eliminazione di un file dal disco
e la cosa funziona molto velocemente
come un’altra cosa che facciamo è che facciamo
calcolo nel database anziché
in rotaie rubino è un bel linguaggio per
lavorare per apportare modifiche rapidamente ma
non è particolarmente efficiente
linguaggio in termini di velocità di esecuzione
questo è il motivo per cui abbiamo spostato il nostro back-end intelligente
collezionista di front-end da Ruby a Java
perché potremmo il processo Java
era molto più efficiente e il Jetson
in Java sono molto efficienti e abbiamo ottenuto
tempo di risposta molto elevato
lì ma noi non vogliamo non vogliamo
prendi il costo della scrittura e java se
per la nostra applicazione web principale siamo tutti
felice scrivere in rotaie, quindi vogliamo fare
come piccolo calcolo nei binari che possiamo
perché è solo non è quello
efficiente come linguaggio computazionale
il mio sequel back-end calcola effettivamente a
molte delle cose di cui abbiamo bisogno molto
in modo efficiente se guardi sai
di nuovo il tipo di dati che raccogliamo noi
raccogliere i dati della fetta di tempo per il tuo
applicazione e quindi vi forniamo
medie di questo per periodi di tempo
se questo è un periodo di un minuto o un
cinque minuti o dieci minuti o qualcosa del genere
bene la media è un calcolo che il mio
sequel può calcolare in modo molto efficiente
righe nella tabella e quindi lo facciamo
il database e quindi inviare alcune righe
sul lato Ruby da visualizzare sul
schermo ora questo è l’opposto di sorta di
il classico consiglio di non fare nulla in
il database e c’è un c’è
carta famosa da ebay e
Il forum del 2006 dove hanno spiegato
su come sono riusciti a scalare l’ebay
così bene e una delle cose che hanno detto
è non fare nulla nel database
non fare nulla nel database
e quindi non lo stiamo facendo
effettivamente facendo cose nel database noi
capita solo di fare calcoli
non siamo ancora noi non ne abbiamo
logica aziendale nel database ciò che noi
fai qualche calcolo lì e poi noi
passare a SSD e la cosa interessante
su SSD e hard ed è solo dentro
ruggine rotante in questo caso per il nostro
il set di dati è quello in cui quando riceviamo i dati
dai clienti riceviamo ogni minuto
ottenere da ogni cliente un dato
e così potremmo scriverli tutti
sequenzialmente nel database e poi
quando sei venuto a vedere i tuoi dati, lo faremmo
devi scegliere i tuoi dati da
questa pagina nel tuo pezzo di dati da
questa pagina e i tuoi dati da
questa pagina in modo che possiamo ottenere solo sequenziali
scrive e letture casuali che, naturalmente
porterebbe il database a bit
perché quella lettura casuale significa che lo è
dovrò recuperare praticamente ogni pagina
attraverso quei tavoli o potremmo farlo
l’altro modo in cui quando facciamo il
diritti abbiamo ragione qui abbiamo proprio qui noi
proprio qui e poi quando facciamo la lettura
possiamo leggerlo in sequenza ma di nuovo in
il caso per i diritti che stiamo per fare
così da scrivere su tutto il disco
stavamo gestendo costantemente i nostri dischi
molto caldo e abbiamo provato a fare cose del genere
inserire i nostri aggregatori dove vorremmo
Pre Chunk enorme scrive tutti insieme e
poi scriverli tutti in una volta, così loro
potrebbe fare più scrittura sequenziale come
possibile anche se stavamo raccogliendo
a caso e così via quindi abbiamo deciso
bene proviamo a passare agli SSD ora
Gli SSD hanno determinate caratteristiche
loro dovrebbero essere molto veloci
e sono in genere molto veloci
in realtà un po ‘ più lento a destra
lato almeno gli SSD che abbiamo scelto sono
un po ‘più lento da scrivere rispetto al difficile
dischi ma non c’è tempo di ricerca sul
canne e così possiamo fare letture casuali e
scritture sequenziali sugli SSD che noi
non poteva fare sugli hard disk e abbiamo ottenuto
un enorme vento dalle prestazioni
caratteristiche dei nostri dati a causa di
questo così possiamo scrivere i dati così come sono
arriva dritto attraverso il disco
e poi quando andiamo a leggere, noi
ottenere la lettura casuale senza costo del posto a
tutto usando l’SSD in modo che questo sia un
buona vittoria continuiamo a usare
dischi rigidi per la memorizzazione a lungo termine
perché le persone non accedono di nuovo
così tanto che abbiamo
processo che prende i dati SSD e
lo sposta sui dischi rigidi su a
base regolare e quindi da cui otteniamo
in qualsiasi posto si trovi in ​​una coppia
più cose qui è un tridimensionale
problema di imballaggio bin che penso sia
ottimo per le due ulteriori ottimizzazioni
che stiamo facendo per continuare a muoverci
verso diventare sempre più grandi
compagnia una delle cose che abbiamo fatto è stato
quando abbiamo iniziato , abbiamo solo
ha interrotto tutto il tipo di processo X su uno
macchina e processo di oliva tipo Y on
un’altra macchina ed è stato fantastico perché
avevamo un sacco di risorse macchine noi
abbiamo iniziato con zero clienti
a otto macchine fisiche così abbiamo avuto
un sacco di risorse macchina da gestire
tutto ma ognuno di questi
i processi ha una caratteristica diversa
nella quantità di memoria utilizza il
la quantità di i / o utilizza la quantità di CPU
usi e così via e l’abbiamo scoperto
spostando alcuni degli ex qui e a
alcuni dei saggi sotto la stessa macchina
possiamo ottimizzare le caratteristiche così
che stiamo usando tanto di quella macchina
CPU e tanto di quella macchina di memoria
il più possibile senza causare alcuno
questo è un manuale
processo in cui stiamo andando bene
sembra che possiamo spostare un paio di quelli
su questa macchina e guarda le curve
e assicurati che funzioni, ma ci stiamo arrivando
sempre più prestazioni fuori dal nostro
stesso hardware perché siamo passati da
otto macchine fisiche a dieci fisiche
macchine quando siamo passati da zero
clienti a cinque terabyte al giorno di
dati giusti quindi non abbiamo davvero aggiunto
qualsiasi macchina che abbiamo appena avuto
ottimizzandolo l’altra ottimizzazione noi
fare è spostare i clienti in giro
tra i nostri cocci abbiamo fatto un anticipo
decisione di architettura quando siamo
costruire il sistema per consentire ai clienti
da commutare tra i caratteri da dividere
tra i frammenti ora ovviamente abbiamo fatto un
prima decisione di avere frammenti nel
primo posto ma una volta che l’hai fatto
sai che normalmente metti tutto a
cliente su un chardon tutto l’altro
cliente un altro frammento ma abbiamo pensato
che sai che potremmo volerlo spostare
un giorno quindi abbiamo la possibilità di mettere
alcuni dei dati di alcuni clienti su un grafico
un altro in modo che possiamo muoverci gradualmente
li sopra ad un altro frammento senza
dover fare una copia gigante di tutto il
dati che cliente perché c’è abbastanza
un po ‘di dati quindi siamo stati in equilibrio
i clienti e questo è automatizzato
tra i frammenti in modo che tutto il
i frammenti rimangono all’incirca allo stesso livello di
caricare indipendentemente dalla dimensione del
clienti così in effetti ognuno dei nostri
grandi cocci affilati hanno uno dei nostri grandi
clienti su di esso e un sacco di nostri
i clienti più piccoli hanno ragione in modo che tu sappia
mentre stiamo crescendo continuiamo a farlo
quindi un paio di lezioni da prendere da questo
puoi tornare indietro nel discorso
e pensa cosa dirà bene
il numero uno fa le basi giusto
ci sono le cose di base che puoi fare
sai mettendo gli interruttori davanti e
configurare l’hardware correttamente così via
numero due quando stai costruendo un
affari come questo design in alcuni
scalabilità in cui non hai progettato
tutta la scalabilità che non è necessario
fare una soluzione magica che ha tutto il
possibile che tu non conosca parole d’ordine sequel o
qualunque cosa voglia dire che abbiamo costruito questo
affari che fanno cinquantotto miliardi
metriche al giorno e stiamo ancora correndo
il mio sequel è semplicemente il mio sequel e
stiamo scorrendo su un Linux generico
e stiamo correndo su di voi conoscete le guide di root
192 sai che non c’è niente noi
non ha fatto nulla di magico per arrivare qui
appena progettato in una certa scalabilità e
poi e poi iterarlo per arrivarci
quello che abbiamo fatto è usare l’unico
caratteristiche della nostra applicazione a
ottimizzare ciò che stiamo facendo, per esempio
quando abbiamo le nostre tabelle del database che abbiamo
ho due tipi di dati come ho detto che abbiamo
ha ottenuto il nostro tasso di dati relazionali come il nostro
dati dell’account e abbiamo il nostro tempo
fetta di dati abbiamo effettivamente progettato il nostro tempo
affettare i dati in modo che tutte le informazioni
nella porzione temporale viene effettivamente memorizzato
le chiavi dell’indice sono molto simili a quando
usi una tabella hash in cui hai il
le chiavi hanno un certo valore e quindi non lo fai
mi interessa davvero quale sia il valore dell’hash
è perché tutto quello che ti interessa è la chiave
esiste o no stiamo facendo la stessa cosa
nel database per i dati della sezione temporale
questo significa che nel mio seguito cosa
stiamo usando stiamo usando il b-tree di
l’indice e non i dati su dischi
conservazione e di conseguenza non hai mai
in realtà devo cercare la testa
dove sono archiviati i dati, basta guardare
nell’indice e quindi stiamo utilizzando alcune delle
quelle caratteristiche uniche dei nostri dati
per ottimizzare il modo in cui la nostra applicazione
funziona e come si memorizza e l’ accesso è
i dati quindi lo so come azienda
continua a crescere sai che intendiamo
raddoppiare questo numero nel prossimo anno
continueremo a ridimensionare
in orizzontale aggiungeremo qualche altro frammento
probabilmente anche noi dovremo farlo
apportare alcune modifiche all’architettura in questo modo
non è la fine – tutto – tutto dove saremo
probabilmente dovresti cambiarlo usando solo
il mio sequel di usare il mio sequel e alcuni
database specializzato
sotto e sai che c’è lì
altri cambiamenti dovranno fare ma
questo è quello che volevo dire e lo sono
felice di rispondere alle domande si bene loro
possono semplicemente farlo indirettamente
attraverso qualche servizio quindi non sta andando
per essere efficiente ma sai che abbiamo
i nostri processi in background si muovono e tu
sapere finchè non devono essere
accesso in tempo reale, quindi stiamo ancora bene
Voglio dire, soffriamo un po ‘
perché non abbiamo la storia
lo spazio di archiviazione è l’accesso diretto, quindi è necessario
passare attraverso quella macchina ma si scopre
non essere un problema così grande, sì
il calcolo che facciamo è il database di base
davvero semplice, è proprio quello che tu
può fare con le dichiarazioni sequel giusto e
di nuovo è una caratteristica del nostro
applicazione che ci permette di farlo
non noi non stiamo facendo sofisticati
il calcolo è solo questo piuttosto che
basta selezionare i dati grezzi e fare
il calcolo sul server delle app
lato che è una specie di modello standard
abbiamo scelto di fare tanto calcolo quanto noi
può farcela con il livello del database
per ridurre il numero di righe che dobbiamo
portare oltre ridurre la quantità di memoria di
il raccoglitore di immondizie Ruby e quel tipo
di cosa
stai iniziando ONU oggi pagheresti
tributo come il tuo potente religioso
servizi bene è un interessante
domanda perché siamo riusciti a farlo
dove stiamo usando oggi Ruby così
la domanda è c’è un modo per avere
arrivato qui senza usare Ruby e sì
ma non con le persone che abbiamo
Voglio dire, abbiamo un sacco di gente
chi è molto bravo a fare Ruby e così
continuare a fare Ruby è un buon modello
ora sai come siamo cresciuti e
abbiamo specializzato alcuni servizi
nuovi servizi ne stiamo scegliendo un altro
lingua e assumiamo persone che sono buone
a quella cosa particolare da fare
che sai che lo sapresti se fossi
ricominciando da quello che uso Ruby ehm si
Immagino dipenda molto dalle persone
che stavo iniziando con perché al
inizio dell’esistenza della società
la vera domanda sarebbe stata per chiunque pagare
questo diritto era che era ragionevole
modello di business e così ottimizzando per
scala o prestazioni e così via
punto sarebbe stata una mossa stupida noi
necessario ottimizzato per ottenere l’idea
di fronte a persone e scoprire
se le persone pagassero ora lo sai
come quando lavoravo ad Amazon avevamo il
tutto era in c ed è ora tu
conosci un sacco di servizi che sono in a
un’ampia varietà di lingue e loro hanno
fatto un buon lavoro con quello e così io
aspetto che qualche volta una nuova vita di reliquie
in un futuro non troppo lontano siamo
andando a dover fare una rottura simile
dove stiamo rompere i servizi fino a
non essere solo un sistema di rubini ma un numero
di diversi sistemi non abbiamo appena
arrivato a quel punto ancora si
la domanda è cosa dovrebbe non essere molto
su alcune cose che hai fatto a te
pensiamo che siamo una buona parte delle imprese
ridimensionamento di ciò che tipo di come all’inizio
hmm bene ce ne sono sicuramente alcuni
le decisioni del personale che abbiamo fatto in quel momento
vorrei che non avessimo fatto, ma tecnicamente voi
sapere di nuovo che vado a chiacchierare
su questa domanda di cosa le cose non vorrebbero
abbiamo fatto tecnicamente perché di nuovo
non saremmo qui se non avessimo fatto
le cose come abbiamo fatto così la domanda
sai che potremmo essere arrivati ​​qui
non prendendo alcune decisioni il
decisione, credo che presto userò il mio
sequel e solo il mio sequel ci è costato un
molto più tempo di sviluppo quindi noi
probabilmente avrebbe preferito giusto ma
una volta iniziato questo percorso, il
il costo affondato ha continuato a sapere
continuare era meglio che rifarlo
di nuovo ma forse se lo facessi di nuovo io
sai che sceglierei di fare a
tecnologia diversa per la fascia oraria
dati forse ma ma nel complesso penso
siamo abbastanza contenti del tecnico
decisioni che abbiamo preso e che c’è
non c’è niente là fuori che sia davvero
provocandoci un sacco di dolore tecnicamente
il prodotto adesso forse tu
di seguito si sta considerando il nostro
tecnologia per bambini perché girano davvero
accesso sequenziale in sì, penso che cosa
finiremo per fare è scrivere il nostro
perché un numero di persone che abbiamo
in compagnia lo hanno fatto nel
passato per esattamente questo problema di dati in
società precedenti e così abbiamo davvero
ho molta esperienza in esattamente il
pezzo di cui abbiamo bisogno lì, hey penso
questo è quello che finiremo per non farlo
in realtà so al momento così erano VM
ferire la tua personalizzazione dov’era
potrebbe essere in esecuzione un elastico
ambiente come Amazon o era così quando
eseguire macchine virtuali in cima a
hardware fisico che effettivamente conosci
Sì, così la virtualizzazione era
ferendoci con il nostro particolare
caratteristiche di prestazione se questo
era il nostro hardware o se lo era
Hardware di Amazon o se fosse rec
spazio o conosci qualcuno di questi
fornitori di virtualizzazione ci sono solo a
numero di caratteristiche che solo
non si adattano bene a questo elevato throughput
dati giusto modello giusto e se guardi
ad alcune altre persone che hanno fatto questo
hanno usato un modello ibrido dove loro
avere una versione in metallo grezzo della loro scrittura
dati di throughput e quindi hanno a
strato virtualizzato per fare l’applicazione
server e potremmo facilmente farlo
tranne che noi sappiamo che abbiamo appena messo
su metallo grezzo e ho detto che intendiamo noi
utilizzare ancora la virtualizzazione per un numero di
le cose del in azienda, ma non
l’applicazione principale e non l’ha fatto
importa se fosse nostro o
qualunque sia la posizione, in particolare, lo farà
pacchetto interessato al prossimo passo ed è
agendo le dita puoi usarlo per scegliere
il tuo iOS che va alle CPU e alle GPU lo sono
consumando che puoi vedere i colori e io
bisogno di due diversi
non l’abbiamo provato, ma quello
sarebbe qualcosa sì sì, intendo te
so che non è che sia banale e
abbiamo speso un sacco di tempo a costruire questo
roba e ottimizzazione di queste cose
e guardando le caratteristiche
della nostra applicazione e messa a punto del mio sequel
e così via, ma sai che c’è un
molte soluzioni a questi problemi e
non devi non andare e costruire
qualcosa di personalizzato che puoi evolvere
a modo tuo, lo sai così così tuo
domanda lì e lo sto ripetendo
il video è in SSD che conosci, vero?
abbi cura di non avere un problema
dove c’è un solo in un certo
numero di cicli che puoi fare prima del
il disco muore e la risposta è due
parti uno è il numero di scritture
che lo fai non ti costa
numero di letture e quindi una delle belle
le cose sui nostri dati è giusto una volta
e leggi molte volte e quindi si adatta molto
naturalmente con il modello SSD e il
il secondo è che il compromesso dei costi in
il business di anche diciamo gli SSD
durano solo per un anno prima di noi
per sostituirli è ancora una vittoria
termini di non dover fare altre cose
nell’applicazione che saremmo
disposto a pagare per gli Sds che sono durati
da un anno risulta che sembra
la nostra modellazione e il nostro test che il
Gli SSD ci dureranno circa tre
anni ciascuno e da allora tu sai chi
sa quello che la tecnologia sarà
dischi quantici o qualcosa così così tuo
la domanda è che manteniamo decenti
prestazioni nel back-end quando abbiamo
questi grandi clienti come diciassette anni
mille pagine immagino dipenda da
cosa intendi per il back-end giusto così
giusto così abbiamo passato un po ‘di tempo così
la cosa bella di essere il cliente
chi ha 17.000 server è quello che sei
pagandoci un sacco di soldi e così spendiamo
un sacco di tempo prestando attenzione a te
e così abbiamo trascorso una buona quantità di tempo
ottimizzare la nostra applicazione per affrontare
il caso di come 17.000 server così
cose come pre
sparando alcune di quelle domande così
sul disco invece di avere il nostro sul
database invece di dover andare a
17.000 sono saliti per ottenere un minuto di valore
dati dobbiamo andare tutti in fila per ottenere
un valore di pochi minuti di dati perché abbiamo
pre-calcolato il fatto che sappiamo di essere
andando a doverlo fare in modo particolare
query e così molti di questi
le ottimizzazioni delle applicazioni sono state
a causa dei nostri grandi clienti e di te
sappiamo che controlliamo il nostro sito e andiamo
sembra che il cliente X stia iniziando
avere una brutta esperienza cosa possiamo fare
entrare e aggiustarlo e farlo
la performance è migliore, sai
non si tratta solo di aggiungere un indice a a
tabella di database è bene che tu possa
in realtà devono modificare l’applicazione
fare le cose diversamente come spostare a
calcolo ad un diverso livello del
del servizio o qualcosa così noi
in realtà basta memorizzare tutti i dati nel
stesse tabelle del database solo con
diversi tipi di chiavi che conosci
una specie di chiavi magiche che abbiamo detto bene
questa è una riga di rollup e arrotonda il
seguenti tipi di informazioni e così via
è tutto appena iniziato nello stesso tavolo
e quindi è facile farlo
raccolta dei rifiuti raccolta dei rifiuti
quando non hai più bisogno di affittare e
così via è solo oui oui je in realtà solo
inizia nella stessa tabella, non è così?
non costruire speciale perché il nostro
le aggregazioni stanno appena producendo
aggregazioni o pre computazioni di questo
lo stesso output di dati non è vero
non è un’aggregazione che sembra diversa
è solo un pre-calcolo dello stesso
risultato che otterresti se lo avessi fatto
la query ben vivo vi ringrazio molto
apprezzare il tuo tempo

Please follow and like us: