Dacă te-ai trezit dimineața cu eroarea “Database connection refused” pe forum sau pe site-ul comunității, primul instinct este să dai un restart rapid la VPS și să speri că nu se mai întâmplă. Din experiență, asta nu rezolvă nimic pe termen lung. Pe mașinile virtuale ieftine, cu 1GB sau 2GB RAM, serviciul MariaDB este prima victimă când sistemul rămâne fără memorie.
Nu este vorba de un bug în MariaDB, ci de un mecanism de protecție din Linux numit OOM (Out Of Memory) Killer. Când memoria RAM se epuizează complet, kernelul Linux este forțat să ucidă cel mai mare consumator pentru a preveni blocarea totală a sistemului. Și, aproape întotdeauna, acel consumator este serverul tău de baze de date.
Cum verifici dacă OOM Killer ți-a omorât baza de date
Înainte să schimbi configurații la întâmplare, trebuie să fii sigur că asta a fost cauza. Conectează-te prin SSH la VPS și rulează următoarea comandă:
dmesg -T | grep -i -E 'oom|kill'
Dacă vezi linii de log care conțin text de tipul Out of memory: Kill process [PID] (mysqld), tocmai ai găsit vinovatul. Sistemul a rămas fără memorie fizică, iar Linux a oprit forțat procesul MariaDB.
Un alt mod de a verifica este să te uiți în logul general de sistem:
grep -i 'killed process' /var/log/syslog
Pasul 1: Activarea unui fișier SWAP (Plasa de siguranță)
Majoritatea providerilor de VPS-uri ieftine oferă șabloane de instalare fără partiție sau fișier SWAP activat implicit. SWAP-ul acționează ca o memorie virtuală pe SSD atunci când memoria RAM se umple. Nu este la fel de rapid ca memoria RAM reală, dar previne crash-urile instantanee.
Eu recomand să pui un SWAP de 2GB pentru un VPS care are 1GB sau 2GB RAM. Iată comenzile pentru a-l crea:
# Creăm un fișier de 2GB gol
sudo fallocate -l 2G /swapfile
# Setăm permisiunile corecte (doar root trebuie să aibă acces)
sudo chmod 600 /swapfile
# Formatăm fișierul ca spațiu de swap
sudo mkswap /swapfile
# Activăm swap-ul în sistem
sudo swapon /swapfile
Pentru ca setarea să rămână activă și după un restart al serverului, trebuie să adaugi fișierul în configurația sistemului. Deschide fișierul /etc/fstab:
sudo nano /etc/fstab
Adaugă următoarea linie la sfârșitul fișierului, apoi salvează și închide:
/swapfile Action none swap sw 0 0
Poți verifica dacă swap-ul este activ rulează comanda free -m.
Pasul 2: Ajustarea comportamentului de Swap (Swappiness)
Implicit, Linux tinde să folosească swap-ul destul de agresiv (valoarea implicită este adesea 60). Pe un VPS cu stocare SSD, nu vrei ca sistemul să scrie și să citească constant de pe disc dacă nu este absolut necesar, deoarece asta va încetini site-ul.
Eu aș merge pe o valoare de 10 sau 15. Asta îi spune kernelului să folosească swap-ul doar ca ultimă soluție, când RAM-ul este aproape plin.
Verifică valoarea curentă:
cat /proc/sys/vm/swappiness
Pentru a schimba valoarea la 10 temporar, rulează:
sudo sysctl vm.swappiness=10
Pentru a face modificarea permanentă, editează /etc/sysctl.conf:
sudo nano /etc/sysctl.conf
Adaugă sau modifică linia următoare:
vm.swappiness=10
Pasul 3: Îmblânzirea consumului de memorie în MariaDB
Configurația implicită din MariaDB este adesea gândită pentru servere cu resurse medii spre mari. Pe un VPS de 1GB, setările implicite pentru InnoDB pot fi prea mari.
Trebuie să edităm fișierul de configurare MariaDB. Pe Ubuntu/Debian, acesta se află de obicei la /etc/mysql/mariadb.conf.d/50-server.cnf sau /etc/mysql/my.cnf.
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Caută secțiunea [mysqld] și ajustează următoarele valori (sau adaugă-le dacă nu există). Aceste valori sunt optimizate pentru a reduce consumul de RAM, păstrând în același timp o performanță decentă pentru un forum de dimensiuni mici sau medii:
[mysqld]
# Buffer-ul de bază pentru InnoDB. Implicit poate fi prea mare.
# Pentru 1GB RAM, 128M sau 256M este ideal.
innodb_buffer_pool_size = 128M
# Reducem numărul maxim de conexiuni simultane.
# Default este adesea 151, ceea ce consumă mult RAM per conexiune.
max_connections = 50
# Limităm buffer-ele folosite pentru sortări și tabele temporare
key_buffer_size = 16M
thread_cache_size = 8
query_cache_size = 0
query_cache_type = 0
Salvează fișierul și restartează serviciul pentru a aplica setările:
sudo systemctl restart mariadb
Pasul 4: Auto-restart dacă MariaDB totuși se oprește
Chiar și cu optimizări, este bine să ai o plasă de siguranță automată. Putem configura systemd să restarteze automat MariaDB dacă procesul moare pe neașteptate.
Rulează comanda de editare pentru serviciul MariaDB:
sudo systemctl edit mariadb
Această comandă va deschide un fișier gol în care poți adăuga directive suplimentare de configurare. Adaugă exact aceste linii:
[Service]
Restart=on-failure
RestartSec=5s
Salvează și închide. Acum, dacă procesul MariaDB crapă dintr-un motiv oarecare, sistemul va aștepta 5 secunde și va încerca să îl pornească automat înapoi, fără intervenția ta manuală.
Prin acești pași simpli, ar trebui să scapi definitiv de crash-urile enervante ale bazei de date pe serverele de buget.
Voi ce setări folosiți pentru MariaDB pe mașini virtuale de buget? Preferați să limitați buffer pool-ul sau mergeți pe baze de date managed în cloud?