Skip to main content

Pterodactyl - Optimisation MariaDB pour HuskSync (Docker / Pterodactyl)

Objectif

Éliminer les erreurs du type :

Failed to validate connection (... Connection.setNetworkTimeout cannot be called on a closed connection)

en synchronisant les timeouts entre MariaDB et Hikari (HuskSync).


Configuration MariaDB (.my.cnf)

📁 Fichier : /home/container/.my.cnf


[client]
user = root
socket = /home/container/mysql/mysqld.sock
port = 8006
default-character-set = utf8mb4

[mysqld]
bind-address = 0.0.0.0
port = 8006
skip-name-resolve

# Timeouts réseau
net_read_timeout = 120
net_write_timeout = 120
connect_timeout = 30
wait_timeout = 300
interactive_timeout = 300

# Connexions et buffers
max_connections = 400
max_allowed_packet = 64M
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# InnoDB (adapte à la RAM du conteneur)
innodb_buffer_pool_size = 512M
innodb_log_file_size = 256M
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2
innodb_flush_neighbors = 0

# Logs
slow_query_log = ON
slow_query_log_file = /home/container/log/mysql/mariadb-slow.log
long_query_time = 10
log_error = /home/container/log/mysql/error.log
expire_logs_days = 10

# Fichiers runtime
socket = /home/container/mysql/mysqld.sock
pid-file = /home/container/mysql/mysqld.pid
datadir = /home/container/mysql

Permissions

chmod 644 /home/container/.my.cnf

Lancement MariaDB

Assure-toi d’utiliser ce fichier au démarrage :

/usr/sbin/mysqld --defaults-file=/home/container/.my.cnf   --socket=/home/container/mysql/mysqld.sock   --pid-file=/home/container/mysql/mysqld.pid   --datadir=/home/container/mysql   --port=${SERVER_PORT} &

Configuration HuskSync

Fichier : plugins/HuskSync/config.yml

database:
  type: MARIADB
  credentials:
    host: 153.31.100.0
    port: 8006
    database: username
    username: database_name
    password: password
    parameters: >
      ?useSSL=false
      &useUnicode=true
      &characterEncoding=UTF-8
      &socketTimeout=120000
      &connectTimeout=10000
      &tcpKeepAlive=true

  connection_pool:
    maximum_pool_size: 8
    minimum_idle: 2
    maximum_lifetime: 240000   # 4 min (< wait_timeout DB = 300s)
    keepalive_time: 120000      # 2 min (ping régulier)
    connection_timeout: 10000

Explication

Paramètre Côté Description
wait_timeout MariaDB Ferme les connexions inactives après 5 min
maximum_lifetime Hikari Recycle les connexions avant la fermeture DB
keepalive_time Hikari Envoie un ping pour garder les connexions vivantes
socketTimeout JDBC Aligne le timeout de lecture réseau sur la DB

Vérification rapide

Connecte-toi à MariaDB :

mysql -u root --socket=/home/container/mysql/mysqld.sock -P 8006

Puis exécute :

SHOW VARIABLES WHERE Variable_name IN
('wait_timeout','interactive_timeout','net_read_timeout','net_write_timeout');

(Optionnel) Modifier en live

Si tu veux tester sans redémarrer :

SET GLOBAL wait_timeout=300;
SET GLOBAL interactive_timeout=300;
SET GLOBAL net_read_timeout=120;
SET GLOBAL net_write_timeout=120;

Résultat attendu :

Variable_name Value
wait_timeout 300
interactive_timeout 300
net_read_timeout 120
net_write_timeout 120

Vérifier les connexions et erreurs

Liste des connexions actives

SHOW FULL PROCESSLIST;
  • Observe la colonne Command : les connexions Sleep sont inactives.
  • Trop de Sleep → tes plugins gardent des connexions ouvertes inutilement.
    ➤ Diminue minimum_idle dans leurs configs.

Vérifier les connexions abandonnées

SHOW GLOBAL STATUS LIKE 'Aborted_connects';
  • Ce compteur doit rester très bas (0 ou quelques unités).
  • S’il grimpe vite → timeouts ou crashs côté plugin.

Vérifier le nombre de connexions max

SHOW VARIABLES LIKE 'max_connections';

5. Résultat attendu

Plus de warnings du type

Failed to validate connection (Connection.setNetworkTimeout...)

✅ Des connexions stables entre tous les plugins.
✅ Moins de connexions “Sleep”.
Aborted_connects reste bas.


À appliquer aussi sur les autres plugins

  • maximum_pool_size: 5–10
  • minimum_idle: 1–2
  • maximum_lifetime: 240000
  • keepalive_time: 120000
  • connection_timeout: 10000

Rappel clé :

Toujours faire correspondre maximum_lifetime (Hikari) à une valeur inférieure à wait_timeout (MariaDB).
Ainsi, c’est le pool qui gère le recyclage, pas la base qui coupe brutalement.


📅 Dernière mise à jour : 2025-11-02