Mi chiamo Petr Zaytsev, sono il CEO e fondatore e voglio raccontare:
- come siamo passati dalle soluzioni open source a Database as a Service;
- quali approcci esistono per implementare database nel cloud;
- come Kubernetes può sostituire DBaaS, eliminando la dipendenza dal fornitore e mantenendo la semplicità dei database come servizio.
L'articolo è basato su una presentazione al @Databases Meetup di Mail.ru Cloud Solutions & Tarantool. Se non vuoi leggere, puoi guardare:

Come dall'open source siamo arrivati a Database as a Service nel cloud
Mi occupo di open source dalla fine degli anni '90. Venti anni fa, utilizzare l'open source, come ad esempio i database, non era così semplice. Dovevi scaricare il codice sorgente, applicare patch, compilarlo e solo dopo usarlo.
Poi l'open source ha attraversato una serie di semplificazioni:
- codici sorgenti 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, che rendevano l'installazione automatica;
- soluzioni come Docker e Snap, che permettono di ottenere pacchetti all'installazione senza dipendenze esterne.
Di conseguenza, l'uso del software open source diventa più semplice, riducendo anche la barriera d'ingresso per lo sviluppo di tali applicazioni.
A differenza di vent'anni fa, quando tutti erano esperti di compilazione, ora la maggior parte degli sviluppatori non riesce a compilare gli strumenti utilizzati.
In realtà, non è poi così male, perché:
- Possiamo usare software più complesso ma più comodo. Ad esempio, il browser è facile da usare, ma include molti componenti open source ed è scomodo compilarlo da zero.
- Più persone possono diventare sviluppatori di open source e di altri software, più software viene utilizzato dalle aziende, maggiore è la domanda.
Il rovescio della medaglia è che il prossimo passo nella semplificazione è legato all'uso di soluzioni cloud, il che porta a un certo vendor lock-in, ovvero legami con un solo fornitore. Utilizziamo soluzioni semplici e fornitori che impiegano componenti open source, ma in realtà sono vincolati a uno dei grandi cloud. Quindi, il modo più semplice e veloce per implementare open source (e software compatibile) è nel cloud, utilizzando API proprietarie.
Se parliamo di database nel cloud, ci sono due approcci:
- Costruire l'infrastruttura del database come in un normale data center. Ossia prendere componenti standard: compute, storage e così via, installarvi Linux, un database e configurarlo.
- Utilizzare Database as a Service, dove il fornitore offre già un database pronto nel cloud.
Ora DBaaS è un mercato in rapida crescita, perché tale servizio consente agli sviluppatori di lavorare direttamente con i database e minimizza il lavoro routinario. Il fornitore si occupa di garantire disponibilità elevata (high availability) e facile scalabilità, patching del database, backup e ottimizzazione delle prestazioni.
Due tipi di Database as a Service basati su open source e un'alternativa rappresentata da Kubernetes
Esistono due tipi di Database as a Service per database open source:
- Un prodotto open source standard, confezionato in un backend per l'amministrazione, che semplifica l'implementazione e la gestione.
- Una soluzione commerciale avanzata con vari add-ons, compatibile con open source.
Entrambe le opzioni riducono la possibilità di migrazione tra i cloud, diminuendo la portabilità dei dati e delle applicazioni. Ad esempio, nonostante i diversi tipi di cloud supportino, essenzialmente, lo stesso standard MySQL, tra di essi ci sono differenze significative in termini di operatività, prestazioni, backup e così via. Migrando da un cloud all'altro potrebbe non essere facile, specialmente per applicazioni complesse.
E qui nasce la domanda: è possibile ottenere la comodità di Database as a Service, ma come semplice soluzione open source?
La cattiva notizia è che, sfortunatamente, al momento non esistono soluzioni di questo tipo sul mercato. La buona notizia è che esiste Kubernetes, che permette di realizzare tali soluzioni.
Kubernetes è un sistema operativo per il cloud o un data center, che consente di distribuire e gestire applicazioni su molti server di un cluster, non su un solo host.
Attualmente Kubernetes è il leader nella categoria di questo tipo di software. Per tali compiti erano disponibili molte soluzioni diverse, ma è diventato lo standard. Molte aziende che precedentemente si occupavano di soluzioni alternative ora si concentrano sull'adattamento dei loro prodotti per supportare Kubernetes.
Inoltre, Kubernetes è una soluzione universale, supportata in cloud privati, pubblici e ibridi di molti fornitori, come: AWS, Google Cloud, Microsoft Azure, .
Come Kubernetes lavora con i database
Kubernetes è stato originariamente progettato per applicazioni stateless che elaborano dati senza memorizzarli, come i microservizi o le applicazioni web. I database rappresentano l'estremo opposto dello spettro, ossia sono applicazioni stateful. Pertanto, Kubernetes non era inizialmente destinato a tali applicazioni.
Tuttavia, ci sono funzionalità che sono emerse di recente in Kubernetes e che consentono di utilizzare database e altre applicazioni stateful:
- Il concetto di StatefulSet è una serie di primitive per gestire eventi di arresto dei pod e implementare il Graceful Shutdown (chiusura prevedibile dell'applicazione).
- Persistent Volumes sono archiviazioni di dati associate ai pod, oggetti di gestione di Kubernetes.
- Operator Framework, cioè la possibilità di creare componenti per gestire database e altre applicazioni stateful distribuite su più nodi.
Già ora, nei cloud pubblici sono disponibili grandi Database as a Service, nel cui backend viene utilizzato Kubernetes, come CockroachCloud, InfluxDB, PlanetScale. Pertanto, avere un database su Kubernetes non è solo teoricamente possibile, ma è una realtà operativa.
Percona offre due soluzioni open source per Kubernetes:
- Kubernetes Operator per Percona Server for MongoDB.
- Kubernetes Operator per XtraDB CLUSTER, un servizio compatibile con MySQL che garantisce alta disponibilità e coerenza. Può essere utilizzato anche in modalità single node, 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 direttamente i Kubernetes Operators: si tratta per lo più di utenti avanzati che comprendono bene il funzionamento della tecnologia. Altri lo eseguono sul backend: questi utenti sono interessati a soluzioni come Database as a Service e non vogliono entrare 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 chi desidera 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 offre un semplice e comodo Command Line Tool (SDK) che consente di creare script anziché gestire manualmente la piattaforma.
Affinché il nostro DBaaS funzioni, sono necessari i seguenti componenti:
- Kubectl.
- Google Cloud SDK.
- Percona DBaaS CLI.
Installiamo kubectl
Installa il pacchetto per il tuo sistema operativo, considereremo l'esempio di Ubuntu. Ulteriori 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
Installiamo Google Cloud SDK
Analogamente, installiamo il pacchetto software. Ulteriori 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
Installiamo Percona DBaaS CLI
Installiamo dai repository di Percona. Lo strumento Percona DBaaS CLI è ancora un prodotto sperimentale, quindi si trova in un repository sperimentale che deve essere abilitato separatamente, anche se hai già installato i repository Percona.
Scopri di più .
Algoritmo di installazione:
- Configura i repository Percona utilizzando lo strumento percona-release. Prima di tutto, 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 - Attiva 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
Ulteriori dettagli sulle impostazioni .
Prima di tutto, è necessario effettuare il login nel proprio account Google. Successivamente, Google Cloud consente a un utente di avere molti progetti indipendenti, quindi è necessario specificare il progetto di lavoro utilizzando il codice di questo progetto:
gcloud auth login
gcloud config set project hidden-brace-236921
Successivamente, creiamo un cluster. Per il demo, ho creato un cluster Kubernetes composto da soli tre nodi: è il minimo necessario per garantire alta disponibilità:
gcloud container clusters create --zone us-central1-a your-cluster-name --cluster-version 1.15 --num-nodes=3
Il comando successivo di kubectl dà i privilegi richiesti al nostro utente attuale:
kubectl create clusterrolebinding cluster-admin-binding-$USER
--clusterrole=cluster-admin --user=$(gcloud config get-value core/account)Quindi creiamo un namespace e lo attiviamo. Il namespace è, in poche parole, come un progetto o un ambiente, ma all'interno di un cluster Kubernetes. È indipendente dai progetti di Google Cloud:
kubectl create namespace my-namespace
kubectl config set-context --current --namespace=my-namespace
Avviamo il cluster
Dopo aver superato questi pochi passaggi, possiamo avviare un 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 collegarsi al cluster
Per impostazione predefinita, è accessibile solo all'interno di Kubernetes. Ciò significa che dal server da cui hai eseguito il comando "Crea", non è disponibile. Per renderlo accessibile, ad esempio per test con il cliente, è necessario mappare la porta tramite Port Mapping:
kubectl port-forward svc/example-proxysql 3306:3306 $Poi colleghiamo il tuo client MySQL:
mysql -h 127.0.0.1 -P 3306 -uroot -pNt9YZquajW7nfVXTTrP
Comandi avanzati per la gestione del cluster
Database su 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
Impostiamo esplicitamente la password
Invece di lasciare che il sistema generi casualmente una password, puoi specificare chiaramente la password:
# 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.
Disattiviamo l'alta disponibilità
Il comando successivo può disattivare 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 avviare MySQL in modo rapido e semplice, 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 sulle sue funzionalità e usabilità.
Questa relazione è stata presentata per la prima volta al by Mail.ru Cloud Solutions&Tarantool. Vedi altri interventi e iscriviti agli avvisi degli eventi su Telegram .
Cosa leggere ancora sull'argomento:
Fonte: habr.com
