Si es nuevo en PostgreSQL, el desafío más común al que se enfrenta es cómo ajustar el entorno de su base de datos.
Cuando se instala PostgreSQL, genera automáticamente un archivo postgresql.conf básico. Este archivo de configuración normalmente se guarda dentro del directorio de datos según el sistema operativo que esté utilizando. Por ejemplo, en Ubuntu PostgreSQL coloca las configuraciones (pg_hba.conf, postgresql.conf, pg_ident.conf) dentro del directorio /etc/postgresql. Antes de que pueda ajustar su base de datos PostgreSQL, primero debe ubicar los archivos postgresql.conf.
Pero, ¿cuáles son las configuraciones correctas para usar? y ¿cuáles son los valores establecidos inicialmente? El uso de herramientas externas como PGTune (y herramientas alternativas como ClusterControl) lo ayudarán a resolver este problema específico.
¿Qué es PGTune?
PGTune es un asistente de configuración creado originalmente por Greg Smith de 2ndQuadrant. Se basa en un script de Python que, lamentablemente, ya no es compatible. (No es compatible con las versiones más nuevas de PostgreSQL). Luego pasó a pgtune.leopard.in.ua (que se basa en el PGTune original) y ahora es un asistente de configuración que puede usar para la configuración de la base de datos de su PG.
PGTune se utiliza para calcular los parámetros de configuración de PostgreSQL en función del rendimiento máximo para una configuración de hardware dada. Sin embargo, no es una bala de plata, ya que muchas configuraciones dependen no solo de la configuración del hardware, sino también del tamaño de la base de datos, la cantidad de clientes y la complejidad de las consultas.
Cómo usar PGTune
La versión anterior de PGTune se basaba en un script de python que puede invocar mediante un comando de shell (usando 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
Pero el nuevo es mucho más fácil y conveniente ya que solo puede acceder a través del navegador. Simplemente vaya a https://pgtune.leopard.in.ua/. Un buen ejemplo es el siguiente:
Todo lo que necesita hacer es especificar los siguientes campos a continuación:
- Versión de la base de datos - la versión de su PostgreSQL. Admite versiones de PostgreSQL de 9.2, 9.3, 9.4, 9.5, 9.6, 10, 11 y 12.
- Tipo de sistema operativo - el tipo de sistema operativo (Linux, OS X, Windows)
- Tipo de base de datos - el tipo de base de datos, que es principalmente qué tipo de procesamiento transaccional manejará su base de datos (aplicación web, OLTP, almacenamiento de datos, aplicación de escritorio, tipo mixto de aplicaciones)
- Memoria total (RAM) - La memoria total que manejará su instancia de PG. Es necesario especificarlo en GiB.
- Número de CPU - Número de CPU que PostgreSQL puede usar CPU =subprocesos por núcleo * núcleos por socket * sockets
- Número de conexiones - Número máximo de conexiones de cliente PostgreSQL
- Almacenamiento de datos - Tipo de dispositivo de almacenamiento de datos que puede elegir entre almacenamiento basado en SSD, HDD o SAN.
Luego presione el botón Generar. Alternativamente, también puede ejecutar la instrucción ALTER SYSTEM que genera postgresql.auto.conf, pero no tardará hasta que reinicie PostgreSQL.
Cómo establece los valores
El algoritmo para esta herramienta se puede encontrar básicamente aquí en configuration.js. Comparte el mismo algoritmo del antiguo PGTune que comienza aquí pgtune#L477. Por ejemplo, las versiones de PostgreSQL <9.5 admiten segmentos de puntos de control, pero PG>=9.5 usa min_wal_size y max_wal_size.
La configuración de checkpoint_segments o min_wal_size/max_wal_size depende del tipo de versión de PostgreSQL y del tipo de base de datos de transacción de la aplicación de la base de datos. Vea cómo en el fragmento a continuación:
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])
}
]
}
Solo para explicar brevemente, detecta si dbVersion <9.5, luego determina los valores sugeridos para las variables checkpoint_segments o min_wal_size/max_wal_size en función del tipo de valor de dbType establecido durante el formulario de la interfaz de usuario web.
Básicamente, puede obtener más información sobre el algoritmo y cómo decide sugerir los valores consultando este script configuration.js.
Ajuste de la configuración de PostgreSQL con ClusterControl
Si está utilizando ClusterControl para crear, construir o importar un clúster, realiza automáticamente un ajuste inicial basado en las especificaciones de hardware proporcionadas. Por ejemplo, crear un clúster con las siguientes especificaciones de trabajo a continuación,
{
"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 proporciona la siguiente sintonía como se muestra a continuación:
[[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'.
Además, también ajusta su sistema o los parámetros del kernel como,
192.168.30.50:5432: Tuning OS parameters.
192.168.30.50:5432: Setting vm.swappiness = 1.
Conclusión
Los parámetros de ajuste de ClusterControl también se basan en el algoritmo compartido en pgtune#L477. No es elegante, pero puede cambiarlo a los valores que desee. Con estos valores de configuración, le permite tener un inicio sin procesar que está lo suficientemente listo para manejar una carga de producción basada en los valores iniciales dados.