Si vous débutez avec PostgreSQL, le défi le plus courant auquel vous êtes confronté est de savoir comment optimiser votre environnement de base de données.
Lorsque PostgreSQL est installé, il produit automatiquement un fichier postgresql.conf de base. Ce fichier de configuration est normalement conservé dans le répertoire de données en fonction du système d'exploitation que vous utilisez. Par exemple, dans Ubuntu, PostgreSQL place les configurations (pg_hba.conf, postgresql.conf, pg_ident.conf) dans le répertoire /etc/postgresql. Avant de pouvoir régler votre base de données PostgreSQL, vous devez d'abord localiser les fichiers postgresql.conf.
Mais quels sont les bons paramètres à utiliser ? et quelles sont les valeurs définies initialement? L'utilisation d'outils externes tels que PGTune (et d'autres outils tels que ClusterControl) vous aidera à résoudre ce problème spécifique.
Qu'est-ce que PGTune ?
PGTune est un assistant de configuration créé à l'origine par Greg Smith de 2ndQuadrant. Il est basé sur un script Python qui n'est malheureusement plus supporté. (Il ne prend pas en charge les versions plus récentes de PostgreSQL.) Il est ensuite passé à pgtune.leopard.in.ua (qui est basé sur le PGTune d'origine) et est maintenant un assistant de configuration que vous pouvez utiliser pour les paramètres de configuration de votre base de données PG.
PGTune est utilisé pour calculer les paramètres de configuration de PostgreSQL en fonction des performances maximales pour une configuration matérielle donnée. Ce n'est pas une solution miracle, car de nombreux paramètres dépendent non seulement de la configuration matérielle, mais également de la taille de la base de données, du nombre de clients et de la complexité des requêtes.
Comment utiliser PGTune
L'ancienne version de PGTune était basée sur un script python que vous pouvez invoquer via la commande shell (en utilisant Ubuntu) :
[email protected]:~/pgtune-master# $PWD/pgtune -L -T Mixed -i /etc/postgresql/9.1/main/postgresql.conf | sed -e '/#.*/d' | sed '/^$/N;/^\n/D'
stats_temp_directory = '/var/run/postgresql/9.1-main.pg_stat_tmp'
datestyle = 'iso, mdy'
default_text_search_config = 'pg_catalog.english'
default_statistics_target = 100
maintenance_work_mem = 120MB
checkpoint_completion_target = 0.9
effective_cache_size = 1408MB
work_mem = 9MB
wal_buffers = 16MB
checkpoint_segments = 32
shared_buffers = 480MB
Mais le nouveau est beaucoup plus simple et pratique puisque vous pouvez simplement y accéder via un navigateur. Allez simplement sur https://pgtune.leopard.in.ua/. Un bon exemple est comme ci-dessous :
Il vous suffit de spécifier les champs suivants :
- Version de la base de données - la version de votre PostgreSQL. Il prend en charge les versions de PostgreSQL à partir de 9.2, 9.3, 9.4, 9.5, 9.6, 10, 11 et 12.
- Type de système d'exploitation - le type d'OS (Linux, OS X, Windows)
- Type de base de données - le type de base de données qui correspond principalement au type de traitement transactionnel que votre base de données gérera (application Web, OLTP, entrepôt de données, application de bureau, type mixte d'applications)
- Mémoire totale (RAM) - La mémoire totale que votre instance PG gérera. Besoin de le spécifier en Gio.
- Nombre de processeurs - Nombre de CPU que PostgreSQL peut utiliser CPU =threads par cœur * cœurs par socket * sockets
- Nombre de connexions - Nombre maximum de connexions client PostgreSQL
- Stockage des données - Type de périphérique de stockage de données que vous pouvez choisir parmi un stockage basé sur SSD, HDD ou SAN.
Ensuite, appuyez sur le bouton Générer. Alternativement, vous pouvez également exécuter l'instruction ALTER SYSTEM qui génère postgresql.auto.conf, mais cela ne prendra pas tant que vous n'aurez pas redémarré PostgreSQL.
Comment définit-il les valeurs
L'algorithme de cet outil se trouve essentiellement ici dans configuration.js. Il partage le même algorithme de l'ancien PGTune commençant ici pgtune # L477. Par exemple, les versions de PostgreSQL <9.5 prennent en charge les checkpoint_segments, mais PG>=9.5 utilise min_wal_size et max_wal_size.
La définition de checkpoint_segments ou min_wal_size/max_wal_size dépend du type de version de PostgreSQL et du type de base de données de transaction d'application de base de données. Découvrez comment dans l'extrait ci-dessous :
if (dbVersion < 9.5) {
return [
{
key: 'checkpoint_segments',
value: ({
[DB_TYPE_WEB]: 32,
[DB_TYPE_OLTP]: 64,
[DB_TYPE_DW]: 128,
[DB_TYPE_DESKTOP]: 3,
[DB_TYPE_MIXED]: 32
}[dbType])
}
]
} else {
return [
{
key: 'min_wal_size',
value: ({
[DB_TYPE_WEB]: (1024 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_OLTP]: (2048 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_DW]: (4096 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_DESKTOP]: (100 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_MIXED]: (1024 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB'])
}[dbType])
},
{
key: 'max_wal_size',
value: ({
[DB_TYPE_WEB]: (4096 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_OLTP]: (8192 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_DW]: (16384 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_DESKTOP]: (2048 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB']),
[DB_TYPE_MIXED]: (4096 * SIZE_UNIT_MAP['MB'] / SIZE_UNIT_MAP['KB'])
}[dbType])
}
]
}
Juste pour expliquer brièvement, il détecte si dbVersion <9.5, puis il détermine les valeurs suggérées pour les variables checkpoint_segments ou min_wal_size/max_wal_size en fonction du type de valeur dbType défini lors du formulaire d'interface utilisateur Web.
En gros, vous pouvez en savoir plus sur l'algorithme sur la façon dont il décide de suggérer les valeurs en regardant ce script configuration.js.
Réglage de la configuration PostgreSQL avec ClusterControl
Si vous utilisez ClusterControl pour créer, construire ou importer un cluster, il effectue automatiquement un réglage initial basé sur les spécifications matérielles données. Par exemple, en créant un cluster avec les spécifications de travail suivantes ci-dessous,
{
"command": "create_cluster",
"group_id": 1,
"group_name": "admins",
"job_data": {
"api_id": 1,
"cluster_name": "pg_11",
"cluster_type": "postgresql_single",
"company_id": "1",
"datadir": "/var/lib/postgresql/11/",
"db_password": "dbapgadmin",
"db_user": "dbapgadmin",
"disable_firewall": true,
"disable_selinux": true,
"generate_token": true,
"install_software": true,
"nodes": [
{
"hostname": "192.168.30.40",
"hostname_data": "192.168.30.40",
"hostname_internal": "",
"port": "5432"
},
{
"hostname": "192.168.30.50",
"hostname_data": "192.168.30.50",
"hostname_internal": "",
"port": "5432",
"synchronous": false
}
],
"port": "5432",
"ssh_keyfile": "/home/vagrant/.ssh/id_rsa",
"ssh_port": "22",
"ssh_user": "vagrant",
"sudo_password": "",
"user_id": 1,
"vendor": "default",
"version": "11"
},
"user_id": 1,
"user_name": "[email protected]"
}
Me fournit le réglage suivant comme indiqué ci-dessous :
[[email protected] ~]# s9s job --log --job-id 84919 | sed -n '/stat_statements/,/Writing/p'
192.168.30.40:5432: Enabling stat_statements plugin.
192.168.30.40:5432: Setting wal options.
192.168.30.40:5432: Performance tuning.
192.168.30.40: Detected memory: 1999MB.
192.168.30.40:5432: Selected workload type: mixed
Using the following fine-tuning options:
checkpoint_completion_target: 0.9
effective_cache_size: 1535985kB
maintenance_work_mem: 127998kB
max_connections: 100
shared_buffers: 511995kB
wal_keep_segments: 32
work_mem: 10239kB
Writing file '192.168.30.40:/etc/postgresql/11/main/postgresql.conf'.
192.168.30.50:5432: Enabling stat_statements plugin.
192.168.30.50:5432: Setting wal options.
192.168.30.50:5432: Performance tuning.
192.168.30.50: Detected memory: 1999MB.
192.168.30.50:5432: Selected workload type: mixed
Using the following fine-tuning options:
checkpoint_completion_target: 0.9
effective_cache_size: 1535985kB
maintenance_work_mem: 127998kB
max_connections: 100
shared_buffers: 511995kB
wal_keep_segments: 32
work_mem: 10239kB
Writing file '192.168.30.50:/etc/postgresql/11/main/postgresql.conf'.
En outre, il ajuste également les paramètres de votre système ou du noyau tels que,
192.168.30.50:5432: Tuning OS parameters.
192.168.30.50:5432: Setting vm.swappiness = 1.
Conclusion
Les paramètres de réglage de ClusterControl sont également basés sur l'algorithme partagé dans pgtune#L477. Ce n'est pas fantaisiste, mais vous pouvez le changer en toutes les valeurs que vous souhaitez. Avec ces valeurs de réglage, cela vous permet d'avoir un démarrage brut suffisamment prêt pour gérer une charge de production basée sur les valeurs initiales données.