arquitetura de armazenamento
Conteúdo da coluna :
análise de código-fonte do kernel postgresql
banco de dados manuscrito toadb
programação simultânea
página inicial pessoal : lema da minha página inicial
: Tian Xingjian, um cavalheiro se esforça para o autoaperfeiçoamento;
visão geral
Quando o serviço de banco de dados postgresql está em execução, como os dados são armazenados no disco? Isso envolve arquitetura de armazenamento.
No sistema de arquivos, podemos ver unidades de armazenamento na forma de diretórios e arquivos. Esta é a arquitetura de armazenamento físico.
Esses diretórios e arquivos realmente têm certas conexões e formas organizacionais. Por exemplo, o diretório mais externo é o diretório de dados do cluster. Cada um banco de dados terá um diretório, que é a arquitetura de armazenamento lógico.A arquitetura de armazenamento lógico mantém a forma organizacional dos arquivos de disco físico, e a arquitetura de armazenamento físico é a apresentação de arquivos de disco específicos.
Arquitetura de armazenamento lógico
Namespaces
Logicamente, o banco de dados tem várias camadas de namespaces de gerenciamento organizacional
Cluster->tablespace tablespace->database->schema
, em que o esquema é diferenciado pelo dicionário de dados no kernel do banco de dados, de modo que os três primeiros itens são todos fisicamente independentes do espaço por meio da organização da arquitetura de armazenamento.
Isso também é mencionado no artigo de análise de kernel anterior.A localização do arquivo de tabela também é identificada exclusivamente pelos três níveis de espaço de tabela/banco de dados/relação.Para o conceito de cluster, o cluster é criado pelo initdb, ou seja, o diretório onde os dados são armazenados, ele precisa ser especificado quando o serviço de banco de dados é iniciado, geralmente chamado de PGDATA.
arquivo de dados
arquivo de dados do usuário
Existem tabelas, índices e arquivos vm e fsm correspondentes, todos armazenados de acordo com o diretório hierárquico do namespace
dados relacionados à transação
Ele é gerenciado pelo espaço no nível do cluster e há um diretório público sob o diretório do cluster.
outros documentos organizacionais
Arquivos como arquivos de espaço de tabela, arquivos de dicionário de dados, bibliotecas de modelos e logs em execução são todos gerenciados no nível do cluster e têm seus próprios diretórios no diretório do cluster
arquivo de configuração
- arquivo de configuração do banco de dados
postgresql.conf
- Perfil de controle de acesso do cliente
pg_hba.conf e pg_ident.conf
documentos auxiliares
Como arquivos de versão, arquivos de informações em execução, etc., estão todos no diretório raiz do PGDATA
arquitetura de armazenamento físico
- Normalmente referenciado como PGDATA (usando o nome da variável de ambiente que o define). Um local comum para PGDATA é /var/lib/pgsql/data. Vários clusters gerenciados por diferentes instâncias de banco de dados podem coexistir na mesma máquina.
- Depois que uma tabela ou índice excede 1 GB, ela é dividida em segmentos de tamanho de 1 G.
O nome de arquivo do primeiro segmento é o mesmo do nó do arquivo, os segmentos subseqüentes são denominados filenode.1, filenode.2 e assim por diante. Este arranjo evita problemas em algumas plataformas com limitações de tamanho de arquivo (na verdade, 1GB é apenas o tamanho padrão do segmento. O tamanho do segmento pode ser ajustado usando a opção configure --with-segsize ao compilar o PostgreSQL). Em princípio, as ramificações do mapa de espaço livre e do mapa de visibilidade também podem exigir vários segmentos, mas na prática isso raramente acontece.- Cada banco de dados terá um diretório separado, que armazena os arquivos de tabela da biblioteca.
Estrutura de arquivo de cluster
Primeiro, inicialize um novo cluster de banco de dados e, em seguida, inicialize e inicie o banco de dados
# 初始化postgres数据库集簇
/opt/postgres/bin/initdb -D pgtest -W
# 启动数据库,监听端口指定为 8888
/opt/postgres/bin/pg_ctl -D pgtest -l logfile -o "-p 8888" start
# 以命令行客户端,登陆数据库,指定端口和数据库
/opt/postgres/bin/psql -p 8888 -d postgres
A seguir está a estrutura do diretório do cluster depois que o initdb é concluído e um novo espaço de tabela é criado
e, para ver alguns tipos de arquivo, tabelas temporárias, tabelas não registradas e índices são criados;
a lista de arquivos de algumas tabelas é omitida no meio, e a hierarquia de diretórios é mantida e os arquivos principais.
-- 表空间
create tablespace tblspc_test location '/mnt/sda1/data/pgdata/pgtblspc';
-- 普通表
create table tbl_account(id integer, name varchar, address varchar, tel varchar);
-- 临时表 会话退出后就会删除
create temporary table tmptbl_test(id int, c_id int);
-- unlogged 表,不会记录WAL,恢复时数据全部丢失
create unlogged table unlogtbl_test(c_id int ,consumer varchar);
create index on unlogtbl_test (c_id);
Após a construção da cena acima, vamos dar uma olhada na hierarquia de arquivos e diretórios no cluster de banco de dados
[senllang@hatch pgdata]$ tree pgtest
pgtest
├── base
│ ├── 1
│ │ ├── 112
│ │ ├── 113
│ │ ├── 1247
│ │ ├── 1247_fsm
│ │ ├── 1247_vm
│ │ ├── 1249
......
│ │ ├── 827
│ │ ├── 828
│ │ ├── pg_filenode.map
│ │ ├── pg_internal.init
│ │ └── PG_VERSION
│ ├── 4
│ │ ├── 112
│ │ ├── 113
│ │ ├── 1247
│ │ ├── 1247_fsm
│ │ ├── 1247_vm
......
│ │ ├── 6238
│ │ ├── 6239
│ │ ├── 826
│ │ ├── 827
│ │ ├── 828
│ │ ├── pg_filenode.map
│ │ └── PG_VERSION
│ └── 5
│ ├── 112
│ ├── 113
│ ├── 1247
│ ├── 1247_fsm
│ ├── 1247_vm
│ ├── 16403
│ ├── 16403_init
│ ├── 16406
│ ├── 16406_init
│ ├── 16407
│ ├── 16407_init
│ ├── 16408
│ ├── 16408_init
│ ├── t3_16409
│ └── t3_16412
......
│ ├── 827
│ ├── 828
│ ├── pg_filenode.map
│ ├── pg_internal.init
│ └── PG_VERSION
├── global
│ ├── 1213
│ ├── 1213_fsm
│ ├── 1213_vm
│ ├── 1214
│ ├── 1232
│ ├── 1233
│ ├── 1260
│ ├── 1260_fsm
│ ├── 1260_vm
......
│ ├── pg_control
│ ├── pg_filenode.map
│ └── pg_internal.init
├── pg_commit_ts
├── pg_dynshmem
├── pg_hba.conf
├── pg_ident.conf
├── pg_logical
│ ├── mappings
│ ├── replorigin_checkpoint
│ └── snapshots
├── pg_multixact
│ ├── members
│ │ └── 0000
│ └── offsets
│ └── 0000
├── pg_notify
├── pg_replslot
├── pg_serial
├── pg_snapshots
├── pg_stat
├── pg_stat_tmp
├── pg_subtrans
│ └── 0000
├── pg_tblspc
│ └── 16388 -> /mnt/sda1/data/pgdata/pgtblspc
├── pg_twophase
├── PG_VERSION
├── pg_wal
│ ├── 000000010000000000000001
│ └── archive_status
├── pg_xact
│ └── 0000
├── postgresql.auto.conf
├── postgresql.conf
├── postmaster.opts
└── postmaster.pid
introdução detalhada
Diretório de arquivos | descrever |
---|---|
PG_VERSION | Um arquivo contendo o número da versão principal do PostgreSQL |
base | Um subdiretório contendo um subdiretório para cada banco de dados |
current_logfiles | Um arquivo que registra os arquivos de log atualmente sendo gravados pelo coletor de log |
global | Subdiretórios contendo tabelas de todo o cluster, como pg_database |
pg_commit_ts | Subdiretório contendo dados de registro de data e hora de confirmação de transação |
pg_dynshmem | subdiretório contendo arquivos usados pelo subsistema dinâmico de memória compartilhada |
pg_logical | Subdiretório contendo dados de estado para replicação lógica |
pg_multixact | Subdiretório contendo dados de estado de várias transações (para bloqueios de linha compartilhados) |
pg_notify | Subdiretório contendo dados de status LISTEN/NOTIFY |
pg_replslot | Subdiretório contendo dados do slot de replicação |
pg_serial | Subdiretório contendo informações de transações serializáveis confirmadas |
pg_snapshots | Subdiretório contendo instantâneos exportados |
pg_stat | Subdiretório contendo arquivos permanentes para o subsistema de estatísticas |
pg_stat_tmp | subdiretório contendo arquivos temporários para o subsistema de estatísticas |
pg_subtrans | Subdiretório contendo dados de estado de subtransação |
pg_tblspc | Subdiretório contendo links simbólicos para tablespaces |
pg_twophase | Contém subdiretórios para preparar arquivos de estado da transação |
pg_wal | Subdiretório contendo arquivos WAL (write-ahead log) |
pg_xact | Subdiretório contendo dados de status de confirmação da transação |
postgresql.auto.conf | Um arquivo usado para armazenar parâmetros de configuração definidos por ALTER SYSTEM |
postmaster.opts | Um arquivo que registra os argumentos da linha de comando usados na última vez em que o servidor foi iniciado |
postmaster.pid | Um arquivo de bloqueio que registra o ID do processo do postmaster atual (PID), o caminho do diretório de dados do cluster, o carimbo de data/hora de inicialização do postmaster, o número da porta, o caminho do diretório do soquete do domínio Unix (vazio no Windows), o primeiro listen_address disponível (endereço IP ou *, ou vazio significa não está escutando no TCP) e ID do segmento de memória compartilhada (o arquivo não existe depois que o servidor é fechado) |
espaço de mesa
Criou uma tabela temporária, uma tabela comum e um banco de dados no espaço de tabela
-- 创建数据库,指定存储的表空间
create database test tablespace tblspc_test ;
-- 在指定表空间创建临时表
create temporary table tmptbl_test1(id int, c_id int) tablespace tblspc_test;
-- 在指定表空间创建普通表
create table tbl_salary(id integer, level float, performance float) tablespace tblspc_test;
Estrutura física
Visualize os arquivos no diretório tablespace, a hierarquia de diretórios e a lista de arquivos são as seguintes
[senllang@hatch pgdata]$ tree pgtblspc/
pgtblspc/
└── PG_16_202306141
├── 16389
│ ├── 112
│ ├── 113
│ ├── 1247
│ ├── 1247_fsm
│ ├── 1247_vm
│ ├── 1249
│ ├── 1249_fsm
│ ├── 1249_vm
......
│ ├── 826
│ ├── 827
│ ├── 828
│ ├── pg_filenode.map
│ └── PG_VERSION
└── 5
├── 16395
└── t3_16413
Pode-se observar que sob o diretório do espaço de tabela, existe um diretório PG_16_202306141, cujo nome começa com PG, seguido da versão do banco de dados e a data de criação.
Os espaços de tabela definidos pelo usuário possuem um link simbólico no diretório PGDATA/pg_tblspc, que aponta para o diretório do espaço de tabela físico (ou seja, o diretório especificado no comando CREATE TABLESPACE).
O link simbólico é nomeado com o OID do tablespace.
Descrição do Princípio
No diretório do tablespace físico existe um subdiretório com um nome que depende da versão do servidor PostgreSQL, como PG_16_202306141 (a razão para usar este subdiretório é que as versões subseqüentes do banco de dados podem usar CREATE TABLESPACE para especificar a mesma localização do diretório sem causando conflitos).
Dentro deste subdiretório específico da versão, há um subdiretório para cada banco de dados que possui elementos neste espaço de tabela, nomeado após o OID do banco de dados. Tabelas e índices neste diretório seguem o esquema de nomeação de nó de arquivo.
Depois que o cluster é inicializado, existem dois espaços de tabela padrão, pg_default e pg_global.Quando não especificamos um espaço de tabela, o banco de dados criado, tabelas, etc., são armazenados no espaço de tabela pg_default.
pg_default não precisa ser acessado através de pg_tblspc, mas corresponde a PGDATA/base. Da mesma forma, o tablespace pg_global não é acessado por meio de pg_tblspc, mas corresponde a PGDATA/global.
base de dados
Para cada banco de dados no cluster, existe um subdiretório correspondente em PGDATA/base, e o nome do subdiretório é o OID do banco de dados em pg_database.
Este subdiretório é o local padrão para os arquivos do banco de dados; em particular, os catálogos do sistema para o banco de dados são armazenados aqui.
arquivo de dados
A função pg_relation_filepath() exibe o caminho completo (relativo a PGDATA) de qualquer relação.
Pode ser usado como uma alternativa para memorizar tantas regras acima.Mas lembre-se que esta função apenas dá o nome do primeiro segmento do ramo mestre da relação - você pode precisar anexar um número de segmento ou _fsm, _vm, _init para encontrar todos os arquivos relacionados à relação.
Tabela e arquivos de índice
Cada tabela e índice são armazenados em um arquivo separado.
Para tabelas comuns, esses arquivos são nomeados de acordo com o número do filenode da tabela ou índice, que pode ser encontrado em pg_class.relfilenode.
Tabelas temporárias
Para tabelas temporárias, o nome do arquivo está no formato tBBB_FFF, onde BBB é o ID do backend que criou o arquivo e FFF é o número do nó do arquivo.
mapa do espaço livre fsm
Em cada caso, fora do arquivo master (a/k/a branch master), existe um mapa de espaço livre para cada tabela e índice, que armazena informações sobre o espaço livre disponível na tabela.
O mapa de espaço livre é armazenado em um arquivo com o nome do número do nó com o sufixo _fsm.
mapa de visibilidade vm
A tabela também possui um mapa de visibilidade, armazenado em um arquivo com o número do nó sufixado com _vm, que é usado para rastrear quais páginas são conhecidas por conter tuplas não mortas.
tabela não registrada
Tabelas e índices que não são registrados, ou seja, tabelas não registradas, também possuem uma terceira ramificação, a ramificação de inicialização, que é armazenada no arquivo de ramificação com o número do nó mais o sufixo _init.
A ramificação de inicialização é uma tabela ou índice vazio do tipo apropriado.
Quando uma tabela não registrada deve ser redefinida como vazia devido a uma falha, a ramificação de inicialização é copiada junto com a ramificação principal, enquanto quaisquer outras ramificações são limpas (elas são reconstruídas automaticamente quando necessário).
mesa de torradas
Se uma coluna de uma tabela pode armazenar itens muito grandes, então a tabela terá uma tabela TOAST associada, que é
usada para armazenamento off-line de valores de campo que não podem ser mantidos na linha da tabela.Se a tabela tiver uma tabela TOAST, o pg_class.reltoastrelid da tabela será vinculado à sua tabela TOAST;
Arquivos temporários
Arquivos temporários (para operações como classificação de dados que não cabem na memória) são criados em PGDATA/base/pgsql_tmp. Se os arquivos temporários forem especificados em um tablespace diferente de pg_default, eles serão criados em pgsql_tmp desse tablespace, no subdiretório. O nome do arquivo temporário está no formato pgsql_tmpPPP.NNN, onde PPP é o PID do backend ao qual pertence, e NNN é usado para distinguir diferentes arquivos temporários do backend.
fim
Muito obrigado pelo seu apoio. Não se esqueça de deixar seus comentários valiosos enquanto navega. Se você acha que vale a pena encorajar, por favor, curta e marque, vou trabalhar mais!
E-mail do autor: [email protected]
Se houver algum erro ou omissão, por favor, aponte-os e aprendam uns com os outros.
Nota: Não reimprima sem consentimento!