Mi chiamo Pëtr Zaicev, sono il direttore generale, fondatore e voglio raccontare:
- come siamo passati dalle soluzioni open source al Database as a Service;
- quali approcci esistono per il deployment di database nel cloud;
- come Kubernetes può sostituire DBaaS, eliminando la dipendenza dal fornitore e mantenendo la semplicità del DBMS come servizio.
L'articolo è stato preparato sulla base di una presentazione al @Databases Meetup di Mail.ru Cloud Solutions & Tarantool. Se non vuoi leggere, puoi guardare:

Come siamo passati dall'open source al Database as a Service nel cloud
Mi occupo di open source dalla fine degli anni '90. Vent'anni fa utilizzare l'open source, ad esempio i database, non era così semplice. Bisognava scaricare il codice sorgente, applicare patch, compilare e solo dopo utilizzare.
Poi l'open source ha vissuto una serie di semplificazioni:
- codice sorgente Tar.gz e INSTALL, che dovevano essere compilati;
- pacchetti con dipendenze come .deb e .rpm, dove bastava installare un insieme di pacchetti;
- repository di pacchetti come APT e YUM, grazie ai quali l'installazione avviene automaticamente;
- soluzioni come Docker e Snap, che permettono di ottenere pacchetti per l'installazione senza dipendenze esterne.
Di conseguenza, utilizzare software open source diventa più semplice e il barriera d'ingresso allo sviluppo di tali applicazioni si riduce.
A differenza della situazione di vent'anni fa, quando tutti erano esperti nella compilazione, oggi la maggior parte degli sviluppatori non è in grado di compilare gli strumenti che utilizzano.
In realtà, non è una cosa negativa, poiché:
- Possiamo utilizzare software più complesso, ma più conveniente. Ad esempio, il browser: è comodo da usare, ma contiene molti componenti open source ed è scomodo compilarlo da zero.
- Sempre più persone possono diventare sviluppatori di open source e di altro software, più software viene utilizzato dalle aziende, maggiore è la domanda.
Il rovescio della medaglia è che il passo successivo nella semplificazione è legato all'uso di soluzioni cloud, il che porta a un certo vendor lock-in, cioè una dipendenza da un unico fornitore. Utilizziamo soluzioni semplici e i provider utilizzano componenti open source, ma in effetti sono inchiodati a uno dei grandi cloud. Pertanto, il modo più semplice e veloce per implementare open source (e software compatibile) è nei cloud, utilizzando API proprietarie.
Se si parla di database nel cloud, ci sono due approcci:
- Costruire l'infrastruttura di un database, come in un normale data center. Vale a dire, utilizzare blocchi di composizione standard: compute, storage e così via, installare Linux su di essi, un database, e configurarlo.
- Utilizzare Database as a Service, dove il fornitore offre già un database pronto all'interno del cloud.
Attualmente, DBaaS è un mercato in rapida crescita, poiché questo servizio consente agli sviluppatori di lavorare direttamente con i database, riducendo al minimo il lavoro routinario. Il fornitore si occupa della High Availability (alta disponibilità) e della facile scalabilità, patching del database, backup, e ottimizzazione delle performance.
Due tipi di Database as a Service basati su open source e un'alternativa sotto forma di Kubernetes.
Ci sono due tipi di Database as a Service per database open source:
- Prodotto open source standard, confezionato in un backend per la gestione, che semplifica il deployment e la gestione.
- Soluzione commerciale avanzata con diversi add-on, compatibile con open source.
Entrambi i modi riducono la possibilità di migrazione tra i cloud, diminuendo la portabilità dei dati e delle applicazioni. Ad esempio, pur essendo diversi tipi di cloud che supportano, di fatto, lo stesso standard MySQL, ci sono sostanziali differenze: nel funzionamento, nelle prestazioni, nei backup e così via. Migrare da un cloud all'altro può essere complicato, specialmente per applicazioni complesse.
E qui sorge la domanda: è possibile ottenere la comodità di un Database as a Service, ma come semplice soluzione open source?
La cattiva notizia è che, sfortunatamente, attualmente non ci sono soluzioni di questo tipo sul mercato. La buona notizia è che c'è Kubernetes, che consente di implementare tali soluzioni.
Kubernetes è un sistema operativo per il cloud o data center, che consente di distribuire un'applicazione e gestirla su numerosi server in un cluster, anziché su un singolo host.
Attualmente, Kubernetes è il leader nella categoria di software simile. Ci sono state molte soluzioni diverse per queste esigenze, ma è diventato lo standard. Molte aziende che in precedenza si occupavano di soluzioni alternative ora si concentrano sull'adattamento dei loro prodotti per supportare Kubernetes.
Inoltre, Kubernetes è una soluzione versatile, supportata nei cloud privati, pubblici e ibridi di molti fornitori, come: AWS, Google Cloud, Microsoft Azure, .
Come Kubernetes lavora con i database
Kubernetes è stato originariamente sviluppato per applicazioni stateless, che elaborano dati ma non archiviano nulla, come i microservizi o le applicazioni web. I database sono all'estremo opposto dello spettro, ovvero sono applicazioni stateful. E Kubernetes non era stato progettato inizialmente per tali applicazioni.
Tuttavia, ci sono funzionalità che sono emerse in Kubernetes di recente e consentono di utilizzare database e altre applicazioni stateful:
- Il concetto di StatefulSet è una serie di primitive per gestire eventi di arresto dei pod e per effettuare un Graceful Shutdown (arresto predicibile dell'applicazione).
- Persistent Volumes — aree di archiviazione dei dati collegate ai pod, oggetti di gestione di Kubernetes.
- Operator Framework — la possibilità di creare componenti per la gestione dei database e altre applicazioni stateful distribuite su più nodi.
Già ora, nei cloud pubblici ci sono grandi Database as a Service, il cui backend è Kubernetes, come ad esempio: CockroachCloud, InfluxDB, PlanetScale. Quindi, un database su Kubernetes non è solo qualcosa di teoricamente possibile, ma è anche qualcosa che funziona nella pratica.
Percona ha due soluzioni open source per Kubernetes:
- Kubernetes Operator per Percona Server per MongoDB.
- Kubernetes Operator per XtraDB CLUSTER — un servizio compatibile con MySQL, che garantisce alta disponibilità e coerenza. È anche possibile utilizzare un nodo singolo, se l'alta disponibilità non è necessaria, ad esempio per un database di sviluppo.
Gli utenti di Kubernetes possono essere divisi in due gruppi. Alcuni utilizzano i Kubernetes Operators direttamente — si tratta principalmente di utenti avanzati che comprendono bene come funziona la tecnologia. Altri lo eseguono nel backend — questi utenti sono interessati a qualcosa come Database as a Service e non vogliono immergersi nei dettagli del funzionamento di Kubernetes. Per il secondo gruppo di utenti abbiamo un'altra soluzione open source — Percona DBaaS CLI Tool. Questa è una soluzione sperimentale per coloro che desiderano avere un DBaaS open source basato su Kubernetes senza una comprensione approfondita della tecnologia.
Come avviare DBaaS di Percona su Google Kubernetes Engine
Google Kubernetes Engine, a mio avviso, è una delle implementazioni più funzionali della tecnologia Kubernetes. È disponibile in molte regioni del mondo e dispone di un semplice e comodo Command Line Tool (SDK) che consente di creare script, invece di gestire la piattaforma manualmente.
Perché il nostro DBaaS funzioni, servono i seguenti componenti:
- Kubectl.
- Google Cloud SDK.
- Percona DBaaS CLI.
Installa kubectl
Installa il pacchetto per il tuo sistema operativo, lo esamineremo con Ubuntu. Maggiori dettagli .
sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl
Installa Google Cloud SDK
Analogamente, installiamo il pacchetto software. Maggiori dettagli .
# Add the Cloud SDK distribution URI as a package source
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg]
http://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
# Import the Google Cloud Platform public key
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -
# Update the package list and install the Cloud SDK
sudo apt-get update && sudo apt-get install google-cloud-sdk
Installa Percona DBaaS CLI
Installa dai repository Percona. Percona DBaaS CLI Tool è un prodotto ancora sperimentale, quindi si trova in un repository sperimentale che deve essere abilitato separatamente, anche se hai già i repository Percona installati.
Ulteriori informazioni .
Algoritmo di installazione:
- Configura i repository Percona utilizzando lo strumento percona-release. Prima devi scaricare e installare il pacchetto ufficiale percona-release di Percona:
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb sudo dpkg -i percona-release_latest.generic_all.deb - Abilita il componente sperimentale del repository degli strumenti nel seguente modo:
sudo percona-release enable tools experimental - Installa il pacchetto percona-dbaas-cli:
sudo apt-get update sudo apt-get install percona-dbaas-cli
Configuriamo il funzionamento dei componenti
Maggiori dettagli sulle impostazioni .
Prima devi effettuare il login nel tuo account Google. In seguito, Google Cloud consente a un utente di avere diversi progetti indipendenti, quindi devi specificare il progetto di lavoro utilizzando il codice di questo progetto:
gcloud auth login
gcloud config set project hidden-brace-236921
Poi creiamo un cluster. Per il demo, ho creato un cluster Kubernetes composto da sole tre nodi: è il minimo richiesto per alta disponibilità:
gcloud container clusters create --zone us-central1-a your-cluster-name --cluster-version 1.15 --num-nodes=3
Il comando kubectl seguente fornisce i privilegi necessari al nostro utente attuale:
kubectl create clusterrolebinding cluster-admin-binding-$USER
--clusterrole=cluster-admin --user=$(gcloud config get-value core/account)Successivamente, creiamo un namespace e lo rendiamo attivo. Un namespace è, grossolanamente, simile a un progetto o a un ambiente, ma all'interno di un cluster Kubernetes. È indipendente dai progetti Google Cloud:
kubectl create namespace my-namespace
kubectl config set-context --current --namespace=my-namespace
Avviamo il cluster
Dopo aver completato questi passaggi, possiamo avviare il cluster di tre nodi con questo semplice comando:
# percona-dbaas mysql create-db example
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider: k8s
Engine: pxc
Resource Name: example
Resource Endpoint: example-proxysql.my-namespace.pxc.svc.local
Port: 3306
User: root
Pass: Nt9YZquajW7nfVXTTrP
Status: ready
Come connettersi al cluster
Per impostazione predefinita, è accessibile solo all'interno di Kubernetes. Cioè, da questo server, da cui hai eseguito il comando "Crea", non è accessibile. Per renderlo disponibile, ad esempio per i test con il client, è necessario mappare la porta tramite Port Mapping:
kubectl port-forward svc/example-proxysql 3306:3306 $Poi connetti il tuo client MySQL:
mysql -h 127.0.0.1 -P 3306 -uroot -pNt9YZquajW7nfVXTTrP
Comandi avanzati per la gestione del cluster
Database con IP pubblico
Se desideri una soluzione più permanente per l'accessibilità del cluster, puoi ottenere un indirizzo IP esterno. In questo caso, il database sarà accessibile da qualsiasi luogo. È meno sicuro, ma spesso più conveniente. Per ottenere un IP esterno, utilizziamo il seguente comando:
# percona-dbaas mysql create-db exposed
--options="proxysql.serviceType=LoadBalancer"
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider: k8s
Engine: pxc
Resource Name: exposed
Resource Endpoint: 104.154.133.197
Port: 3306
User: root
Pass: k0QVxTr8EVfgyCLYse
Status: ready
To access database please run the following command:
mysql -h 104.154.133.197 -P 3306 -uroot -pk0QVxTr8EVfgyCLYse
Imposta esplicitamente la password
Invece di far generare casualmente una password dal sistema, puoi impostarla esplicitamente:
# percona-dbaas mysql create-db withpw --password=mypassword
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider: k8s
Engine: pxc
Resource Name: withpw
Resource Endpoint: withpw-proxysql.my-namespace.pxc.svc.local
Port: 3306
User: root
Pass: mypassword
Status: ready
Mostro l'output degli script in un formato leggibile, ma è supportato anche il formato JSON.
Disabilitiamo l'alta disponibilità
Con il comando seguente è possibile disabilitare l'alta disponibilità per distribuire un nodo singolo:
# percona-dbaas mysql create-db singlenode
--options="proxysql.enabled=false, allowUnsafeConfigurations=true,pxc.size=1"
Starting ......................................... [done]
Database started successfully, connection details are below:
Provider: k8s
Engine: pxc
Resource Name: singlenode
Resource Endpoint: singlenode-pxc.my-namespace.pxc.svc.local
Port: 3306
User: root
Pass: 22VqFD96mvRnmPMGg
Status: ready
Questa soluzione è per compiti di test, per sollevare MySQL in modo semplice e veloce, testarlo e poi chiuderlo o utilizzarlo per lo sviluppo.
Lo strumento Percona DBaaS CLI aiuta a ottenere una soluzione su Kubernetes simile a DBaaS. Continuiamo a lavorare sulla sua funzionalità e usabilità.
Questa presentazione è stata pronunciata per la prima volta a da Mail.ru Cloud Solutions&Tarantool. Vedi altre presentazioni e iscriviti agli annunci di eventi su Telegram .
Ulteriori letture sull'argomento:
Fonte: habr.com
