Já falei do pgconfig.org antes. Ele, até o momento, é uma ferramenta que faz sugestões de tuning do PostgreSQL. Acesse o site e mata a curiosidade de como funciona. Eu espero, fique tranquilo.
Hoje eu quero comentar um pouco mais sobre como ele funciona, e explicar como você pode usar sua API nos seus projetos/scripts/coisas divertidas sem depender mais da interface web.
Na prática, a interface web (que agora vou chamar de UI
), acessa a api no endereço https://api.pgconfig.org/v1/tuning/get-config
. Caso você queira simular a chamada, é só clicar no link que eu citei, mas já que o foco é automatizar as coisas, faça o mesmo teste como curl
:
$ curl 'https://api.pgconfig.org/v1/tuning/get-config'
{"data": [{"category": "memory_related","description": "Memory Configuration","parameters": [{"config_value": "512MB","format": "Bytes","name": "shared_buffers"},{"config_value": "2GB","format": "Bytes","name": "effective_cache_size"},{"config_value": "20MB","format": "Bytes","name": "work_mem"},{"config_value": "128MB","format": "Bytes","name": "maintenance_work_mem"}]},{"category": "checkpoint_related","description": "Checkpoint Related Configuration","parameters": [{"config_value": "512MB","format": "Bytes","name": "min_wal_size"},{"config_value": "2GB","format": "Bytes","name": "max_wal_size"},{"config_value": 0.7,"format": "Float","name": "checkpoint_completion_target"},{"config_value": "15MB","format": "Bytes","name": "wal_buffers"}]},{"category": "network_related","description": "Network Related Configuration","parameters": [{"config_value": "*","format": "String","name": "listen_addresses"},{"config_value": 100,"format": "Decimal","name": "max_connections"}]}],"jsonapi": {"version": "1.0"},"links": {"self": "http://api.pgconfig.org/v1/tuning/get-config"},"meta": {"arguments": {},"copyright": "PGConfig API","version": "2.0 beta"}}
Ok, já que o JSON+API
que a URL retona fica um pouco dificil de ler, eu vou formatar ele pra você:
{
"data":[
{
"category":"memory_related",
"description":"Memory Configuration",
"parameters":[
{
"config_value":"512MB",
"format":"Bytes",
"name":"shared_buffers"
},
{
"config_value":"2GB",
"format":"Bytes",
"name":"effective_cache_size"
},
{
"config_value":"20MB",
"format":"Bytes",
"name":"work_mem"
},
{
"config_value":"128MB",
"format":"Bytes",
"name":"maintenance_work_mem"
}
]
},
{
"category":"checkpoint_related",
"description":"Checkpoint Related Configuration",
"parameters":[
{
"config_value":"512MB",
"format":"Bytes",
"name":"min_wal_size"
},
{
"config_value":"2GB",
"format":"Bytes",
"name":"max_wal_size"
},
{
"config_value":0.7,
"format":"Float",
"name":"checkpoint_completion_target"
},
{
"config_value":"15MB",
"format":"Bytes",
"name":"wal_buffers"
}
]
},
{
"category":"network_related",
"description":"Network Related Configuration",
"parameters":[
{
"config_value":"*",
"format":"String",
"name":"listen_addresses"
},
{
"config_value":100,
"format":"Decimal",
"name":"max_connections"
}
]
}
],
"jsonapi":{
"version":"1.0"
},
"links":{
"self":"http://api.pgconfig.org/v1/tuning/get-config"
},
"meta":{
"arguments":{
},
"copyright":"PGConfig API",
"version":"2.0 beta"
}
}
Basicamente, os dados importantes estão dentro de "data"
, aonde são agrupados por categoria, igualzinho no site. ;)
Uma coisa importante sobre isso é que você pode formatar a saida apresentada de forma mais conveniente, apenas informando o parâmetro format=conf
, conforme o exemplo abaixo:
$ curl 'https://api.pgconfig.org/v1/tuning/get-config?format=conf'
# Generated by PGConfig 2.0 beta
## http://pgconfig.org
# Memory Configuration
shared_buffers = 512MB
effective_cache_size = 2GB
work_mem = 20MB
maintenance_work_mem = 128MB
# Checkpoint Related Configuration
min_wal_size = 512MB
max_wal_size = 2GB
checkpoint_completion_target = 0.7
wal_buffers = 15MB
# Network Related Configuration
listen_addresses = '*'
max_connections = 100
Outras opções para o format
são json
(que é a default) e alter_system
, veja:
$ curl 'https://api.pgconfig.org/v1/tuning/get-config?format=alter_system'
-- Generated by PGConfig 2.0 beta
---- http://pgconfig.org
-- Memory Configuration
ALTER SYSTEM SET shared_buffers TO '512MB';
ALTER SYSTEM SET effective_cache_size TO '2GB';
ALTER SYSTEM SET work_mem TO '20MB';
ALTER SYSTEM SET maintenance_work_mem TO '128MB';
-- Checkpoint Related Configuration
ALTER SYSTEM SET min_wal_size TO '512MB';
ALTER SYSTEM SET max_wal_size TO '2GB';
ALTER SYSTEM SET checkpoint_completion_target TO '0.7';
ALTER SYSTEM SET wal_buffers TO '15MB';
-- Network Related Configuration
ALTER SYSTEM SET listen_addresses TO '*';
ALTER SYSTEM SET max_connections TO '100';
Pegou a idéia aqui? pra mudar a saida, tudo o que você precisa é ir informando os parâmetros na URL.
A relação abaixo lista os parâmetros disponíveis:
Parâmetro | Possíveis valores | Valor padrão | Descrição |
---|---|---|---|
pg_version |
da versão 9.0 até a 9.6 |
9.6 |
Informa a versão do PostgreSQL |
total_ram |
qualquer valor acima de 1GB |
2GB |
Quantidade de memória dedicada ao PostgreSQL. |
max_connections |
qualquer valor acima de 1 |
100 |
Quantidade esperada de conexões |
env_name |
WEB , OLTP , DW , Mixed e Desktop |
WEB |
Define o ambiente que o servidor vai rodar (mais detalhes abaixo) |
os_type |
Linux , Windows e Unix |
Linux |
Define o tipo do sistema operacional utilizado |
arch |
x86-64 e i686 |
x86-64 |
Define a arquitetura do servidor |
format |
json , conf e alter_system |
json |
Muda o formato de saída |
show_doc |
true e false |
false |
Mostra a documentação (valido apenas pro formato json ) |
include_pgbadger |
true e false |
false |
Adiciona as configurações para habilitar o pgbadger |
Importante Não esqueça de, ao informar o parâmetro
total_ram
, passar o valor formatado conforme a expressão[0-9]{1,}GB
, por exemplo:4GB
.
A relação abaixo explica um pouco mais sobre os ambientes:
Nome | Descrição | Exemplos de uso |
---|---|---|
WEB |
Aplicações web geral | Aplicações com perfil web, como um portal ou aplicativo corporativo |
OLTP |
Aplicações com grande volume de transações | Sistemas do tipo ERP ou grandes sistemas corporativos com muitas transações simultâneas |
DW |
Aplicações de DataWare House | Sistemas de BI em geral |
Mixed |
Ambientes que compartilham o banco e a aplicação no mesmo servidor | Pequenos sistemas, normalmente rodando na web |
Desktop |
Ambiente de desenvolvimento | Máquina de desenvolvimento, suporte ou pré-vendas |
Segue abaixo um exemplo completo, igualzinho ao utilizado pela UI
:
$ curl 'https://api.pgconfig.org/v1/tuning/get-config?env_name=WEB&format=alter_system&include_pgbadger=true&log_format=stderr&max_connections=100&pg_version=9.6&total_ram=2GB'
A fim de deixar o processo mais claro, eu criei uma entrada na API pra listar as regras. Ele pode ser acessado na URL abaixo:
Importante: A chamada pra esse contexto permite filtrar
os_type
,arch
eenv_name
.
Os dados que contem detalhes de como cada parâmetro é caculado são formula
e max_value
, por exemplo:
...
"format": "Bytes",
"formula": "TOTAL_RAM / 4",
"max_value": "2047MB",
"name": "shared_buffers"
...
Note que os valores são influenciados pelos filtros citados acima.
Recomendo que você abra a URL no navegador pra facilitar a visualização (ou formate o json):
curl 'https://api.pgconfig.org/v1/tuning/get-rules?os_type=Windows&arch=i686&env_name=OLTP'
Endereço | Descrição | exemplo de saída |
---|---|---|
/v1/tuning/get-config-all-environments |
Lista as regras pra todos os ambientes |
|
/v1/tuning/list-enviroments |
Lista todos os ambientes |
|
/v1/generators/pgbadger/get-config |
Lista as configurações do pgbadger (aceita o parametro format ) |
|
Outras opções estão sendo desenvolvidas e em breve vou postar mais detalhes.