Se você é novo no PostgreSQL, o desafio mais comum que você enfrenta é como ajustar seu ambiente de banco de dados.
Quando o PostgreSQL é instalado, ele produz automaticamente um arquivo postgresql.conf básico. Este arquivo de configuração é normalmente mantido dentro do diretório de dados dependendo do sistema operacional que você está usando. Por exemplo, no Ubuntu PostgreSQL coloca as configurações (pg_hba.conf, postgresql.conf, pg_ident.conf) dentro do diretório /etc/postgresql. Antes de ajustar seu banco de dados PostgreSQL, primeiro você precisa localizar os arquivos postgresql.conf.
Mas quais são as configurações corretas a serem usadas? e quais são os valores definidos inicialmente? O uso de ferramentas externas como o PGTune (e ferramentas alternativas como o ClusterControl) o ajudará a resolver esse problema específico.
O que é PGTune?
PGTune é um assistente de configuração que foi originalmente criado por Greg Smith do 2ndQuadrant. É baseado em um script Python que, infelizmente, não é mais suportado. (Ele não suporta versões mais recentes do PostgreSQL.) Ele então fez a transição para o pgtune.leopard.in.ua (que é baseado no PGTune original) e agora é um assistente de configuração que você pode usar para as configurações do banco de dados PG.
PGTune é usado para calcular os parâmetros de configuração do PostgreSQL com base no desempenho máximo de uma determinada configuração de hardware. No entanto, não é uma bala de prata, pois muitas configurações dependem não apenas da configuração do hardware, mas também do tamanho do banco de dados, do número de clientes e da complexidade das consultas.
Como usar o PGTune
A versão antiga do PGTune era baseada no script python que você pode invocar via comando 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
Mas o novo é muito mais fácil e conveniente, pois você pode acessar apenas via navegador. Basta acessar https://pgtune.leopard.in.ua/. Um bom exemplo é como abaixo:
Tudo o que você precisa fazer é especificar os seguintes campos abaixo:
- versão do banco de dados - a versão do seu PostgreSQL. Ele suporta versões do PostgreSQL de 9.2, 9.3, 9.4, 9.5, 9.6, 10, 11 e 12.
- Tipo de SO - o tipo de SO (Linux, OS X, Windows)
- Tipo de banco de dados - o tipo de banco de dados que é principalmente o tipo de processamento transacional que seu banco de dados manipulará (Aplicativo Web, OLTP, Data Warehousing, Aplicativo Desktop, Tipo Misto de Aplicativos)
- Memória total (RAM) - A memória total que sua instância do PG manipulará. Precisa especificá-lo em GiB.
- Número de CPUs - Número de CPUs que o PostgreSQL pode usar CPUs =threads por núcleo * núcleos por soquete * soquetes
- Número de conexões - Número máximo de conexões de clientes PostgreSQL
- Armazenamento de dados - Tipo de dispositivo de armazenamento de dados que você pode escolher entre armazenamento baseado em SSD, HDD ou SAN.
Em seguida, pressione o botão Gerar. Alternativamente, você também pode executar a instrução ALTER SYSTEM que gera postgresql.auto.conf, mas não demorará até que você reinicie o PostgreSQL.
Como ele define os valores
O algoritmo para esta ferramenta pode ser encontrado basicamente aqui em configuration.js. Ele compartilha o mesmo algoritmo do antigo PGTune começando aqui pgtune#L477. Por exemplo, versões do PostgreSQL <9.5 suportam checkpoint_segments, mas PG>=9.5 usa min_wal_size e max_wal_size.
A configuração de checkpoint_segments ou min_wal_size/max_wal_size depende do tipo de versão do PostgreSQL e do tipo de banco de dados da transação do aplicativo de banco de dados. Veja como no trecho abaixo:
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])
}
]
}
Só para explicar brevemente, ele detecta se dbVersion <9.5, então determina os valores sugeridos para as variáveis checkpoint_segments ou min_wal_size/max_wal_size com base no tipo de valor dbType definido durante o formulário de interface do usuário da web.
Basicamente, você pode aprender mais sobre o algoritmo sobre como ele decide sugerir os valores consultando este script configuration.js.
Ajuste de configuração do PostgreSQL com ClusterControl
Se você estiver usando o ClusterControl para criar, construir ou importar um cluster, ele fará automaticamente um ajuste inicial com base nas especificações de hardware fornecidas. Por exemplo, criando um cluster com as seguintes especificações de trabalho abaixo,
{
"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]"
}
Fornece-me o seguinte ajuste conforme mostrado abaixo:
[[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'.
Além disso, ele também ajusta os parâmetros do sistema ou do kernel, como,
192.168.30.50:5432: Tuning OS parameters.
192.168.30.50:5432: Setting vm.swappiness = 1.
Conclusão
Os parâmetros de ajuste do ClusterControl também são baseados no algoritmo compartilhado em pgtune#L477. Não é chique, mas você pode alterá-lo para os valores que desejar. Com esses valores de configuração, ele permite que você tenha um início bruto pronto o suficiente para lidar com uma carga de produção com base nos valores iniciais fornecidos.