Skip to content

LINSTOR — conceitos operacionais

LINSTOR — conceitos operacionais

Resumo pratico sobre LINSTOR/DRBD aplicado aos clusters SP e Franca. Complementa rede-sp.md (topologia) e storage-strategy.md (decisoes de arquitetura: por que LVM_THIN, cross-site SP↔Franca, alternativas).

O que e LINSTOR

LINSTOR e um orquestrador de storage replicado. Abaixo dele roda DRBD (block-level replication no kernel Linux). O modelo mental:

  • DRBD = “RAID 1 pela rede” — bloco a bloco, sincrono
  • LINSTOR = painel de controle que gerencia quais blocks vao em quais nodes

Nao e tipo ZFS (dado “mora” num node). E mais parecido com SAN — um volume logico acessivel por qualquer node autorizado.

Componentes

ComponenteO que faz
ControllerCerebro — metadados, API, decisoes de placement. Roda em 1-3 nodes (HA)
SatelliteAgente em cada node — cria LVs, gerencia DRBD local
Storage poolPool de espaco (LVM thin, ZFS, etc.) que satellite gerencia
Resource groupTemplate — define place_count, que pool usar, quais nodes candidatos
ResourceInstancia — o volume real (ex: disco de uma VM)

No SP temos controller HA em VIP 10.10.10.1 (rede LINSTOR dedicada).

Pools no SP

Estado atual (em producao):

PoolNodesVG/PoolRedeUso
ssd-poolpve-ippri-11, 12, 31linstor_ssd/thinpool10.10.10.0/24Ativo, todas VMs criticas
DfltDisklessStorPooltodos os COMBINED(sem disco)Default LINSTOR

Planejado (cluster NVMe expandindo o servico — ver linstor-sp.md):

PoolNodesStatus
nvme-poolpve-ippri-31, 33, 34nao deployado

Resource groups em producao:

  • sp-ssd-replicatedPlaceCount: 2, StoragePool(s): ssd-pool, ReplicasOnDifferent: ['Aux/Aux/floor']
  • DfltRscGrp — default, PlaceCount: 2

Modos de presenca de um resource num node

Um resource (volume) pode ter 3 representacoes num node:

1. Diskful (UpToDate)

  • Tem copia fisica completa do volume no pool local
  • Le do disco local (rapido)
  • Recebe writes pela rede e escreve no disco
  • Custo: espaco fisico

2. TieBreaker

  • Volume “diskless” mas participa de quorum (votacao)
  • Nao consome espaco significativo (~4 MiB)
  • Serve so pra evitar split-brain quando so tem 2 peers diskful

3. Diskless

  • Sem copia fisica — cliente DRBD puro
  • Le/escreve pela rede em peers diskful
  • Cria-se em milisegundos (so metadados)
  • Consume zero espaco

Writes sao sempre sincronos em todos os diskful

VM faz write
|
v
DRBD no node da VM
|
+--> disco local (se diskful) -----+
+--> rede --> peer 1 diskful ------|
+--> rede --> peer 2 diskful ------|
|
<------ ACK de todos <-------------+
|
v
Write completa

Implicacoes:

  • Write e tao lento quanto o peer mais lento
  • Misturar NVMe + SSD no mesmo pool = performance de SSD em writes
  • Rede 10G saturada = catastrofe (fallback pra 1G devastador)

Reads sao locais (quando possivel)

  • Node diskful: le do proprio disco
  • Node diskless: pede pra um peer diskful (sempre pela rede)

Live migration entre nodes

Sem LINSTOR (ZFS local): precisa mandar o disco todo pelo wire — minutos/horas.

Com LINSTOR: disco ja “esta” em todos os nodes que participam do cluster. So migra RAM/CPU.

Para node sem replica ainda (ex: migrar para node diskless novo)

  1. LINSTOR cria diskless replica no destino (~50ms, zero dados)
  2. DRBD client conecta aos peers diskful via rede
  3. Proxmox vive-migrate a VM (RAM)
  4. Pronto — VM agora roda no novo node, I/O vai pela rede

Se habilitar auto-diskless no Proxmox plugin, o passo 1 e automatico.

Mistura de storage types e tamanhos

Tamanhos diferentes no mesmo pool

Nao e problema — LINSTOR aloca por volume, respeitando espaco disponivel. Um volume de 2 TiB nao vai para um node com pool de 1 TiB.

Unico cuidado: thin provisioning pode mascarar superprovisionamento.

NVMe + SSD no mesmo pool

Funciona, mas:

  • Writes: velocidade do mais lento (SSD)
  • Reads: node NVMe le rapido local; node SSD le rapido local; diskless le pela rede
  • Sem ganho claro de performance

Melhor: pools separados com resource groups diferentes, workloads escolhem.

Pools conversam entre si

Um resource group pode listar multiplos pools:

StoragePool(s): ssd-pool, nvme-pool

LINSTOR escolhe 2 nodes que tenham qualquer desses pools. Pode colocar uma replica em ssd-pool de ippri-11 e outra em nvme-pool de ippri-32.

Resiliencia: quorum e split-brain

Por que quorum existe

DRBD/LINSTOR e CP em CAP — prefere parar I/O a aceitar dados divergentes. Quorum e o mecanismo que decide qual lado de uma particao tem direito de escrever.

Sem quorum, dois lados de uma particao podem virar primary simultaneamente. Quando a rede se reconecta, dados divergiram e DRBD precisa descartar um lado (perda silenciosa).

O cenario “particao parece morte”

DRBD nao tem como saber, do ponto de vista de um node, se a rede caiu ou se os outros nodes morreram. Os sintomas sao identicos: peers param de responder.

Estado normal:
A <==> B <==> C todos se enxergam
primary secondary tiebreaker
Cabo de A solta (mas A continua vivo):
A B <==> C A acha que B,C morreram
B,C acham que A morreu

Sem quorum, A continua aceitando writes em primary. B/C podem promover B a primary tambem (HA). Os dois aceitam writes diferentes. Quando rede volta — split-brain.

Com quorum (maioria de 3 = 2):

  • A sozinho: 1/3 nao e maioria → A bloqueia I/O (io-error)
  • B+C juntos: 2/3 e maioria → B vira primary, aceita writes
  • Quando A volta: A vira secondary, sincroniza de B (sem perda)

Formula da maioria estrita

VotantesQuorumTolerancia a falhas
220 (qualquer falha trava)
321
431 (mesma do 3 — par nao ajuda)
532
743

Numero impar e sempre mais eficiente.

Duas camadas de quorum

DRBD aplica quorum em dois lugares independentes:

  1. Por volume — cada resource (PlaceCount + tiebreaker) precisa de maioria pra aceitar writes
  2. Controller LINSTOR — o database (linstor_db) e replicado via DRBD; precisa de maioria pra o controller funcionar

Ambos podem perder quorum simultaneamente, mas tem mecanismos independentes pra sobreviver.

Configuracao de comportamento sem quorum

DRBD options (global ou por resource):
on-no-quorum io-error # I/O retorna erro imediato (default SP)
on-no-quorum suspend-io # I/O pendurado ate quorum voltar
on-no-quorum freeze # I/O para, recurso vira read-only

io-error e honesto mas pode trigger timeout/abort em apps. suspend-io e melhor pra apps que retomam sozinhas (DBs transacionais que reconectam).

Split-brain: o que e e como recuperar

Definicao

Dois ou mais nodes acreditam ser primary do mesmo recurso simultaneamente e aceitam writes independentes. Quando reconectam, DRBD detecta via “generations id” (UUID por write) e refuse a sincronizar automaticamente.

Como detectar

drbdadm status mostra:

<resource> connection:Connecting role:Secondary
peer-node connection:StandAlone role:Primary # SPLIT-BRAIN

Logs mostram Split-Brain detected, dropping connection!.

Recovery manual (perde dados de um lado)

Terminal window
# 1. Decide quem perde (geralmente o lado com menos writes recentes)
# 2. No node "perdedor":
drbdadm disconnect <resource>
drbdadm secondary <resource> # se ainda primary
drbdadm -- --discard-my-data connect <resource>
# 3. No node "vencedor":
drbdadm connect <resource> # aceita o resync

Atencao: o lado descartado perde todas as escritas durante a particao. Sempre snapshot antes.

LINSTOR oferece after-sb-Xpri policies pra automatizar a escolha (ex: discard-younger-primary), mas pra dados criticos a recomendacao e split-brain ser incidente humano, nao automatico.

Tres saidas pra sobreviver com 1 node

Padrao quorum-majority em cluster de 3 trava com 2 falhas. Pra mudar isso ha 3 caminhos. Cada um e um tradeoff CAP diferente.

Opcao 1: STONITH (fencing)

Antes de virar primary sozinho, o sobrevivente mata os outros via canal independente (IPMI, iDRAC, PDU gerenciada, switch port). Se confirmar morte, sabe que pode escrever sem split-brain.

DRBD config:
fencing resource-and-stonith;
handlers {
fence-peer /usr/lib/drbd/crm-fence-peer.9.sh;
after-resync-target /usr/lib/drbd/crm-unfence-peer.9.sh;
}

Requisitos:

  • IPMI/iDRAC configurado em todos os PVE
  • Rota IPMI separada da rede de cluster (senao a particao cobre IPMI tambem)
  • Handler testado regularmente — fencing quebrado e pior que sem fencing (falsa seguranca)

Modelo CAP: continua CP, mas com C+A=disponibilidade total se IPMI funcionar. Custo: complexidade e disciplina operacional.

Opcao 2: Arbiters distribuidos

Adicionar TieBreakers leves (sem dados) em locais separados do dominio de falha principal. Exemplo: 4 nodes com NVMe + 2 arbiters em VMs/containers em rede ou rack distinto.

Terminal window
linstor node create arbiter-01 <ip> --node-type auxiliary
linstor node create arbiter-02 <ip> --node-type auxiliary

Com 5 votantes (3 storage + 2 arbiters):

  • Quorum = 3
  • 1 storage node + 2 arbiters = 3 ✓ (sobrevive a 2 storage caidos)

LINSTOR suporta Auxiliary — node so de voto, zero storage local, custo minimo.

Modelo CAP: continua CP, mas move a fronteira pra “preciso perder 3 votantes”. Custo: hosts adicionais (leves), redes distintas.

Opcao 3: quorum off

DRBD options:
quorum off

1 node sempre aceita escrita, mesmo sozinho. Aceita split-brain silencioso: quando particao cura, DRBD escolhe um lado pelo after-sb-Xpri policy e descarta o outro — perda de dados sem aviso.

Modelo CAP: vira AP — disponibilidade prioritaria, consistencia eventual com perda. Aceitavel pra labs, inadequado pra dados que importam.

Comparacao final

ModoCAPQuando
Quorum default (3 nodes)parcialProducao “padrao”, perde 1 OK
STONITHProducao critica, n-1 OK se IPMI ok
Arbiters extrasparcial+Producao com mais redundancia distribuida
quorum offLab, dados nao-criticos

SP atual: quorum default. Franca pos-reset (recomendado): arbiters extras (.33 + 1-2 leves), ou STONITH se IPMI esta configurado.

Outras caracteristicas centrais

Anti-afinidade automatica

ReplicasOnDifferent: Aux/<chave> impede que duas replicas de um volume caiam no mesmo “andar”/rack/zona. Cada node recebe uma chave auxiliary, e o resource group enforça diversidade.

Terminal window
# Marcar nodes por andar (usa-se "Aux/floor" — o "Aux/" e o namespace)
linstor node set-property pve-ippri-31 Aux/floor 1
linstor node set-property pve-ippri-32 Aux/floor 1
linstor node set-property pve-ippri-11 Aux/floor 0
linstor node set-property pve-ippri-12 Aux/floor 0
# Aplicar restricao no resource group
linstor resource-group modify sp-ssd-replicated \
--replicas-on-different=Aux/floor

Nota sobre o display: ao listar linstor resource-group list, a coluna mostra ReplicasOnDifferent: ['Aux/Aux/floor'] — duplica o Aux/ por como o LINSTOR exibe o full path da property. Voce define Aux/floor, mas ve Aux/Aux/floor. E o mesmo valor.

Resultado: nenhum volume coloca ambas as replicas em nodes do mesmo andar. Reduz risco de queda do andar inteiro (energia, switch, refrigeracao) — nao elimina, depende da configuracao fisica real.

Em SP isso esta ativo. Em Franca pos-reset, configurar.

AutoEvict

Quando um node fica offline por tempo configuravel, LINSTOR pode automatically remove-lo dos resources e recriar replicas em outro node disponivel:

controller props:
DrbdOptions/AutoEvictAfterTime 30 # minutos offline
DrbdOptions/AutoEvictAllowEviction True
DrbdOptions/AutoEvictMaxDisconnectedNodes 1 # quantos pode evictar simultaneamente
DrbdOptions/AutoEvictMinReplicaCount 2 # nao deixa ficar abaixo disso

Util pra self-healing. Cuidado: se o node “morto” voltar com seu disco intacto, vai chegar com uma replica que LINSTOR ja considera obsoleta — precisa intervir manualmente (linstor resource delete no node retornado, depois recriar — ou usar fluxo de toggle-disk).

Auto-Tiebreaker

DrbdOptions/auto-add-quorum-tiebreaker: True — quando voce cria resource com PlaceCount 2 em cluster de 3+ nodes, LINSTOR automaticamente cria o TieBreaker no terceiro node (sem dados, ~4 MiB de metadata).

Sem isso, voce teria 2 votantes pra cada resource — paridade, qualquer falha trava. Com TieBreaker virtua-livre, 3 votantes — aguenta 1 falha.

Modo COMBINED vs satellite-only vs auxiliary

TipoRoda controller?Roda satellite?Tem storage?Uso
Combinedsim (em HA com peers)simsimPadrao em clusters pequenos (3-5)
ControllersimnaonaoController dedicado (cluster grande)
SatellitenaosimsimStorage-only
AuxiliarynaonaonaoSo vota — arbiters

SP e Franca usam Combined — controller HA sai de graca, sem VM/container extra.

Controller HA via VIP DRBD-replicado

O linstor-controller armazena estado em banco H2 embutido (linstordb.mv.db — formato .mv.db e do H2, escrito em Java). Em modo HA, esse arquivo vive num resource DRBD especial (linstor_db), replicado entre os nodes combined. O controller ativo monta o resource como primary; se cair, outro node detecta e promove sua replica a primary, e sobe o controller.

O VIP (10.10.10.1 em SP) flutua junto — clientes (Proxmox, CLI) sempre falam com o IP unico, sem saber qual node esta ativo.

Em Franca atual: controller fixo no .31 sem VIP — ponto unico de falha. Reset deve criar VIP HA.

O failover automatico do controller pode ser orquestrado por drbd-reactor (componente separado da LINBIT) que monitora estado DRBD e dispara systemctl start linstor-controller no novo primary. Em SP nao usamos ainda — failover atual e manual quando o nó dono cai. Ver “drbd-reactor” em Outras caracteristicas.

Storage pool drivers

LINSTOR suporta varios providers — escolhe-se um por pool:

DriverProvisioningQuando usar
LVM_THINthinPadrao recomendado — overcommit, snapshots CoW eficientes
LVMthickIOPS predicaveis, sem overcommit (DBs sensiveis a latencia)
ZFS_THIN / ZFSthin/thickZFS native snapshots, mas conflita com DRBD sync (raro)
FILE / FILE_THINloop fileLab/dev — volume em arquivo, baixa performance
DISKLESSCliente DRBD puro (sem disco local)
SPDKthickNVMe-oF / userspace, alto desempenho (raro)
EBS / OPENFLEX / EXOSStorage gerenciado externo (cloud/array)

Camadas de cache podem ser combinadas com qualquer dos drivers acima:

  • dm-cache — cache de leitura/escrita em SSD/NVMe sobre disco lento (write-back ou write-through)
  • dm-writecache — so cache de escrita (sem cache de leitura)
  • bcache — equivalente kernel-side, mais maduro pra cache hibrido

LINSTOR cria/gerencia esses pools combinados (ver secao “Tipos de midia”).

SP e Franca usam LVM_THIN com thinpool sobre VG dedicado, sem cache.

Snapshots LINSTOR

Terminal window
linstor snapshot create <resource> <snap-name>
linstor snapshot list
linstor snapshot rollback <resource> <snap-name>
linstor snapshot delete <resource> <snap-name>

Snapshots sao consistentes multi-volume (todos os volumes do resource snapshot ao mesmo tempo) e atomicos com pmxcfs. Sao CoW no thin pool — usam espaco proporcional ao delta.

Diferente de qm snapshot (Proxmox) que opera no nivel do qcow2/raw — LINSTOR snapshot e block-level, mais rapido e nao precisa parar a VM.

Protocolos DRBD

ProtocoloWrite retorna ack quandoRiscoQuando
A (async)Local + enviado ao buffer de redeCrash do primary perde writes nao chegados ao peerDR cross-site
B (semi-sync)Local + peer recebeu (mas nao gravou)Crash do peer perde writes em bufferCompromisso
C (sync)Local + peer gravouZero perdaPadrao LINSTOR

LINSTOR usa Protocolo C por padrao em todos os pares. Latencia maior, garantia maxima — write so confirma quando ambos os lados tem o dado em disco.

auto-diskless-allow-cleanup e auto-resync-after-disable

  • auto-diskless-allow-cleanup: quando node fica diskless (manualmente ou via auto-evict), LINSTOR libera o LV automaticamente — recupera espaco no thin pool.
  • auto-resync-after-disable: quando resource desabilitado e re-habilitado, LINSTOR dispara resync automatico em vez de esperar comando manual.

Ambos sao True em SP — operacao mais self-service.

LINSTOR GUI (interface web)

LINSTOR tem interface web open-source desde 2022 — pacote linstor-gui, repo https://github.com/LINBIT/linstor-gui.

Cobertura:

  • Listagem de nodes, storage pools, resource definitions, resources
  • Snapshots e schedules de backup
  • Error reports e events
  • Properties de nodes/resources (read-mostly — algumas operacoes complexas so via CLI)

Stack: React frontend + REST API do controller. Distribuido como pacote Debian no repo LINBIT.

Terminal window
# Instalar (LINBIT repo ja configurado)
apt install linstor-gui
# Servido pelo proprio controller na porta 3370
# http://10.10.10.1:3370/ (em SP)
# http://<vip-controller>:3370/ (em geral)

Limitacoes:

  • Nao substitui o CLI pra operacao complexa (placement custom, properties avancadas, troubleshooting)
  • Em evolucao — algumas releases do LINSTOR core saem antes da GUI suportar features novas
  • Sem auth nativa robusta — depende do controller ter REST configurado com TLS+auth se exposto fora da rede de gestao

Recomendado pra: observability cotidiana, status checks rapidos, dashboards pra equipe nao-operadora. Nao recomendado como unica interface.

drbd-reactor (failover automatico do controller)

drbd-reactor e um daemon que monitora estado DRBD e dispara acoes em resposta. Os 3 plugins principais:

PluginFuncao
promoterQuando DRBD vira Primary num node, sobe automaticamente um servico associado (ex: linstor-controller, NFS server)
prometheusExporta metricas DRBD pra Prometheus (resource state, replication lag, etc.)
debuggerLoga eventos DRBD pra troubleshooting

Caso de uso classico: HA do controller LINSTOR sem precisar de Pacemaker.

/etc/drbd-reactor.d/linstor-controller.toml
[[promoter]]
[promoter.resources.linstor_db]
start = ["linstor-controller.service"]
on-stop-failure = "exit"

Quando linstor_db vira Primary num node, drbd-reactor sobe linstor-controller. Se o node cair, outro vira Primary e o controller migra junto.

Em SP/Franca atual: nao usado. Failover de controller e manual quando o nó dono cai. Adicionar drbd-reactor esta em storage-strategy.md como melhoria P3.

Mais info: https://github.com/LINBIT/drbd-reactor

Placement strategies

Ao criar resource, LINSTOR decide em quais nodes colocar replicas. Estrategias disponiveis (em linstor resource-group create --place-count ou via --storage-pool):

EstrategiaComportamento
MaxFreeSpace (default)Escolhe nodes com mais espaco livre — equaliza uso
MinRscCountEscolhe nodes com menos recursos — equaliza numero de volumes
MinReservedSpaceConsidera overcommit thin — mais conservador
OldestSatelliteNodes adicionados primeiro tem prioridade

Combinaveis com --replicas-on-same/--replicas-on-different (anti-afinidade) e --storage-pool (filtros de pool).

QoS por volume

LINSTOR pode aplicar limites de IOPS/bandwidth via blkio cgroup:

Terminal window
linstor volume-definition set-property <res> 0 \
Sys/fs/blkio_throttle_read 50000000 # 50 MB/s read
linstor volume-definition set-property <res> 0 \
Sys/fs/blkio_throttle_write 30000000 # 30 MB/s write

Util pra evitar que VM “barulhenta” sufoque vizinhas no mesmo node.

Over-provisioning ratios

Em LVM_THIN, voce pode alocar volumes somando mais do que existe fisicamente (thin overcommit). LINSTOR oferece guard-rails:

controller props:
StorDriver/MaxOversubscriptionRatio 20 # max 20x o tamanho fisico
StorDriver/MaxOversubscription True # ativa

Com MaxOversubscriptionRatio: 2: pool de 3 TiB nao pode ter mais de 6 TiB alocados. Sem o guard-rail, e facil over-allocar e estourar o thin pool — quando isso acontece, todas as VMs no pool param.

Tipos de midia: NVMe, SSD, HDD — como usar e combinar

LINSTOR e agnostico de midia — ele orquestra LVs/ZFS volumes, e o desempenho vem de baixo. Mas a forma como voce organiza pools e mistura midias muda drasticamente latencia, custo e durabilidade.

Caracteristicas por tipo

MidiaLatencia (4K)ThroughputIOPSEndurance$/TiB
HDD 7.2k5-10 ms150-200 MB/s100-200alta (mecanico)baixo
SATA SSD0.1-0.3 ms500 MB/s50k-100kmedia (DWPD ~0.5-1)medio
NVMe consumer0.05-0.1 ms3-7 GB/s200k-1Mbaixa (DWPD ~0.1-0.3)medio
NVMe enterprise0.02-0.08 ms6-14 GB/s1M+alta (DWPD 1-3+)alto

DWPD = Drive Writes Per Day. NVMe consumer morre rapido sob workload de DB/DRBD sync (writes constantes em todos peers). Enterprise tem PLP (power-loss protection) e endurance suficiente.

Estrategia 1 — Pools separados por tier (recomendado, simples)

Cada tipo de midia vira um pool independente. Resource groups apontam pra pools especificos.

Node ippri-31:
/dev/nvme0n1 + nvme1n1 → VG linstor_nvme → pool nvme-pool
/dev/sda + sdb → VG linstor_ssd → pool ssd-pool
/dev/sdc + sdd + sde → VG linstor_hdd → pool hdd-pool
Terminal window
linstor resource-group create vms-hot --place-count 2 --storage-pool nvme-pool
linstor resource-group create vms-std --place-count 2 --storage-pool ssd-pool
linstor resource-group create archive --place-count 2 --storage-pool hdd-pool

Pros:

  • Performance previsivel por workload
  • Sem overhead de cache, sem complexidade
  • Falha de NVMe nao quebra HDD e vice-versa
  • Capacidade total = soma de tudo

Contras:

  • Espaco rigido — VM em hdd-pool nao usa NVMe folgado
  • Operador precisa decidir o pool certo na criacao
  • Mais SKUs pra comprar/operar

Quando usar: workloads bem definidos (DBs em NVMe, fileserver em HDD, VMs comuns em SSD). E o que SP e Franca usam (so SSD/NVMe hoje).

Estrategia 2 — Cache hibrido (NVMe sobre HDD)

Coloca NVMe pequena como cache, HDD grande como capacidade. Aplicacao “ve” um unico volume com latencia ~NVMe pra dados quentes e capacidade de HDD pra arquivamento.

Tres tecnologias suportadas pelo LINSTOR:

TecnologiaCache deQuando usar
dm-cacheleitura e escritaWorkload misto, hot data identificavel
dm-writecacheso escritaApps write-heavy onde leitura ja vem rapida
bcacheleitura e escritaMais maduro, requer formatar disco backing

Configuracao no LINSTOR:

Terminal window
# Pool com dm-cache: precisa criar 2 LVs (origin + cache) e LINSTOR junta
linstor storage-pool create lvm-thin <node> hdd-cached \
linstor_hdd/thinpool \
--shared-space hdd-cached
# Property no node aponta o cache LV
linstor node set-property <node> StorDriver/<pool>/CacheDevice /dev/nvme0n1p1
linstor node set-property <node> StorDriver/<pool>/CachePolicy writeback

Pros:

  • “Melhor dos dois mundos” — latencia NVMe + capacidade HDD
  • Aproveita hot data (~80% dos accessos em ~20% dos dados)
  • Custo por TiB efetivo bem menor que NVMe puro

Contras:

  • Complexidade — uma camada extra a debugar
  • Falha do NVMe-cache pode comprometer integridade se write-back e cache nao replicado
  • Cold reads (primeira vez) ainda vao no HDD — latencia variavel
  • Sob pressao de write sustentado (>capacidade do cache), degrada pra HDD-puro
  • Endurance do NVMe-cache acelera (e cache, escreve muito)

Quando usar: arquivamento ativo (NextCloud, file server), backup repository, workloads cold/warm. Nao usar pra DB transacional — latencia nao e previsivel.

Estrategia 3 — Mistura no mesmo pool (geralmente NAO)

LVM permite criar VG com PVs heterogeneos (NVMe + SSD + HDD juntos), e LINSTOR aceita esse pool. Geralmente e ruim:

  • LVM aloca extents linearmente — primeiro PV ate encher, depois proximo. Resultado: alguns LVs caem em NVMe, outros em HDD, sem controle.
  • DRBD sync sera limitado pelo peer mais lento envolvido na escrita — se a replica caiu em HDD num node, todo write da VM espera HDD.
  • Diagnostico de performance vira loteria.

Excecao razoavel: stripe controlado (lvcreate --stripes) entre 2 NVMe identicos pra dobrar throughput. Mas nunca misture tipos diferentes.

Estrategia 4 — Diskless + diskful seletivo

Nem todo node precisa de disco. Em cluster com 6 PVE mas so 3 com NVMe:

  • 3 nodes diskful (storage real, contribuem pro pool)
  • 3 nodes diskless (so clientes DRBD via 10G)

VMs podem rodar em qualquer um dos 6 — diskless le/escreve via rede no peer diskful. SP usa esse padrao (ippri-33/34 sao GPU, nao tem SSD-pool, mas sao diskless do linstor-ssd-01).

Pros: aproveita nodes que tem CPU/GPU/RAM mas nao tem disco bom. Live migration entre todos.

Contras: I/O da VM diskless saturra rede 10G facil — limita ao throughput da NIC.

Recomendacao por workload

WorkloadEstrategiaPool sugerido
DB transacional (Postgres, MySQL)Pool dedicado, NVMe enterprisenvme-db-pool, sem overcommit
VMs gerais (web, app servers)Pool padraossd-pool ou nvme-pool LVM_THIN
File server / NextCloudCache hibridohdd-pool com dm-cache em NVMe
Backup repositoryHDD purohdd-pool LVM_THIN, sem cache
AI/ML training (dataset grande, leitura sequencial)NVMe puro, diskless onde for treinarnvme-pool
Cold archiveHDD puro, replication 2xhdd-pool

Custo da replicacao por tier

DRBD escreve em N replicas — duplica/triplica IOPS de escrita no cluster. Em NVMe enterprise, isso e absorvido. Em SSD consumer, voce queima o disco em 1-2 anos. Em HDD, a latencia se acumula (cada peer ack adiciona ~5-10ms).

Por isso producao seria bom em NVMe enterprise com PLP mesmo sendo mais caro — DRBD-sync precisa de baixa latencia e endurance alta.

LINSTOR e backup: replicacao nao e backup

Erro comum: tratar DRBD/LINSTOR como backup. Nao e.

Por que replicacao != backup

CenarioReplicacao DRBDBackup
1 disco falhaProtege ✓Protege ✓
1 node morreProtege ✓Protege (mais lento) ✓
rm -rf / na VMReplica o rm instantaneamenteProtege ✓
Ransomware criptografa dadosReplica a criptografiaProtege (se backup imutavel) ✓
Bug que corrompe DBReplica a corrupcaoProtege ✓
Operador apaga VM (qm destroy)Apaga em todas as replicasProtege ✓
Datacenter pega fogoTudo no mesmo lugar fisicoProtege (se off-site) ✓
Update do Proxmox quebra storage layerPossivelmente corrompe replicasProtege ✓

DRBD replica eventos, nao estados consistentes no tempo. Qualquer dano logico vai pras replicas no mesmo segundo.

O que LINSTOR oferece pra backup (limites e usos)

LINSTOR tem features de backup, mas com escopo especifico:

1. Snapshots LINSTOR (point-in-time local)

Terminal window
linstor snapshot create <resource> snap-2026-04-29
  • CoW no thin pool, instantaneo
  • Permite rollback rapido (dia anterior, etc.)
  • Mora no mesmo storage — nao protege de falha do storage, datacenter, etc.
  • Bom pra: testes, upgrades reversiveis, “ctrl-z” curto.
  • Nao serve como backup independente.

2. Snapshot shipping (cluster→cluster)

LINSTOR pode “enviar” snapshots de um cluster pra outro (LINSTOR remoto), mantendo replica off-site.

Sintaxe (validada no client v1.27):

Terminal window
# 1. Registrar o cluster remoto como "remote"
linstor remote create linstor franca-cluster http://10.10.10.99:3370
# 2. Enviar um backup pontual (gera snapshot + envia)
linstor backup create franca-cluster <resource>
# Ou enviar via ship explicito (com mais opcoes)
linstor backup ship franca-cluster <source-resource> <target-resource>

Requisitos:

  • Cluster destino tambem rodando LINSTOR
  • Controller remoto alcancavel via HTTP (porta 3370)
  • Storage pools compativeis no destino (mesmo nome OU usar --storpool-rename)

Use case: replicar Franca → SP (ou vice-versa) periodicamente. Funciona como DR async.

3. Scheduled backup shipping (S3, agendado)

LINSTOR tem agendador nativo pra exportar snapshots periodicamente. Sintaxe validada (v1.27):

Terminal window
# 1. Registrar remote S3 (MinIO ou AWS)
linstor remote create s3 my-s3 \
https://s3.example.com bucket-name region-name <access-key>
# Solicitara secret-key interativamente; ou passar como ultimo arg
# 2. Criar schedule (full_cron e POSITIONAL)
linstor schedule create daily-backup "0 2 * * 0" \
-i "0 2 * * 1-6" \
-l 7 -r 30 \
--on-failure RETRY --max-retries 3
# 3. Enable schedule pra um resource (--rd) ou resource group (--rg)
linstor backup schedule enable my-s3 daily-backup --rg sp-ssd-replicated
# Ou pra um resource especifico:
# linstor backup schedule enable my-s3 daily-backup --rd vm-103-disk-0

Suporta:

  • S3 (AWS, MinIO, Wasabi, etc.) — ou cluster LINSTOR remoto
  • Full + incremental
  • Retencao local e remota separadas
  • Compressao + (opcional) encriptacao

Esse e o caminho mais proximo de “LINSTOR como backup” — exporta volumes pra storage remoto independente.

Limites do LINSTOR como backup

Mesmo com shipping pra S3, LINSTOR nao substitui uma estrategia 3-2-1 completa:

  • Granularidade e o resource inteiro — pra recuperar 1 arquivo, voce restaura o volume todo, monta, copia o arquivo. Lento.
  • Sem deduplicacao cross-volume — backup de 10 VMs identicas ocupa 10x espaco.
  • Sem indice de conteudo — voce nao busca “qual VM tinha o arquivo X em Y data”.
  • Pra VMs Proxmox, vzdump complementa — gera arquivos .vma granulares, integrados com agendamento Proxmox/PBS.

Estrategia recomendada (3-2-1 adaptado)

Camada 1 (replicacao online):
DRBD/LINSTOR — protege de falha de hardware
→ 1-2 falhas concorrentes sem downtime
Camada 2 (snapshots locais):
LINSTOR snapshots agendados — protege de erro humano/bug recente
→ rollback rapido (minutos), retencao curta (7 dias)
Camada 3 (backup off-site):
Proxmox Backup Server (PBS) ou vzdump → S3/PBS remoto
→ protege de ransomware, dano logico, perda do site
→ retencao longa (30-365 dias), imutabilidade quando possivel

PBS faz dedup, indice, restore granular — e o complemento natural ao LINSTOR. Em SP/Franca, recomenda-se PBS ou vzdump+S3 pra camada 3, alem dos snapshots LINSTOR pra camada 2.

LINSTOR backup ship pra S3 substitui camada 3 se voce nao precisa de granularidade de arquivo (ex: VMs que voce trata como pets/imutaveis).

Replicacao remota e disaster recovery

DRBD Proxy (sync sob latencia)

DRBD sync padrao (Protocolo C) precisa de latencia baixa entre peers (~ms). Cross-site (SP↔Franca, ~5-15ms RTT), o write fica esperando a confirmacao remota — performance despenca.

DRBD Proxy e um daemon (entre o DRBD primary e o link WAN) que:

  • Bufera writes localmente em RAM
  • Comprime + envia em batch pelo WAN
  • Trabalha em modo async (Protocolo A) — write retorna apos buffer local, peer remoto recebe depois
  • Sobrevive a glitches de rede sem disconnect

Use case: DR ativo entre 2 sites. Site B mantem replica “minutos atrasada” do A. Falha do A → promove B (perde-se ~RPO de minutos).

Limites:

  • Nao e free — DRBD Proxy e parte do LINBIT SDS comercial (subscricao)
  • Async = aceita perda de janela curta de writes
  • Requer banda dedicada e tuning

Alternativas livres: snapshot shipping LINSTOR (cobertura mais grossa, RPO de horas, mas gratuito).

Estrategia DR para SP↔Franca

MecanismoRPORTOCusto
DRBD Proxy SP↔Francaminutosminutos (failover)$$$, banda dedicada
Snapshot shipping diario24hhoras (restore + reconfig)$, agendamento
Backup PBS cross-site24hhoras-dia$, simples
Sem DR0

Pra labs/pesquisa academica, snapshot shipping diario + backup PBS e usualmente suficiente.

Encriptacao em repouso (LUKS)

LINSTOR integra LUKS (dm-crypt) pra encriptar volumes em repouso:

Terminal window
# 1. Definir master passphrase no controller (uma vez)
linstor encryption create-passphrase
# 2. Criar resource encriptado
linstor resource-definition create encrypted-vm
linstor volume-definition create encrypted-vm 100G --encrypt
linstor resource create --auto-place 2 encrypted-vm

Operacao:

  • Cada write/read passa por dm-crypt no kernel — overhead de CPU (5-15% sob carga write-heavy)
  • Master passphrase precisa ser fornecida ao controller a cada start (linstor encryption enter-passphrase)
  • LUKS default: AES-128, HMAC-SHA-512, PBKDF2

Quando usar:

  • Compliance (LGPD, HIPAA, PCI-DSS)
  • Disco fisico pode ser roubado/extraviado (ex: laptop, edge)
  • Dados de pesquisa com IRB

Quando nao usar (overhead nao compensa):

  • Datacenter fisicamente seguro com discos descartados via wipe + destruicao
  • Workload latency-critical onde 5-15% CPU importa

Em SP/Franca: nao usado (datacenter controlado, dados nao-sensiveis em repouso).

Manutencao

OperacaoComo
Adicionar disco no nodevgextend VG + lvextend thinpool — LINSTOR detecta
Adicionar novo nodelinstor node create + storage-pool create + satellite
Remover nodeEvacuar resources primeiro (resource create em outro, depois delete)
Trocar disco com falhaReplace no VG — LINSTOR refaz DRBD sync automatico
Promover diskless a diskfullinstor resource toggle-disk <node> <resource> --storage-pool <pool>
Mudar resource group de um resourcelinstor resource-definition modify <res> --resource-group <novo>

Tudo online. VMs nao param.

Performance — numeros aproximados

OperacaoDiskful (local)Diskless (via 10G)
Read latency~0.1ms~0.2ms
Read throughput~500 MB/s (SSD SATA)~1.2 GB/s (10G cap)
Write latency~0.3ms (sync todos peers)~0.3ms
Write throughputLimitado pelo peer mais lentoIgual

Para a maioria dos workloads (VyOS, Traefik, K3s control-plane) a diferenca diskful vs diskless nao e perceptivel.

Workloads I/O-bound (DB hot, AI training com dataset local): preferir diskful no node que roda a VM.

Gargalos em ordem de impacto

  1. Rede 10G saturada
  2. CPU do peer diskful (DRBD consome 5-10% sob carga)
  3. Disco do peer mais lento
  4. Fragmentacao thin LVM (longo prazo)

Por que aparece ”?” em alguns nodes do Proxmox

Storage LINSTOR e definido cluster-wide em /etc/pve/storage.cfg. Nodes que nao alcancam o controller (10.10.10.1 em SP) veem ”?” — isso significa “storage existe mas esta inacessivel daqui”.

Fix: conectar node a rede 10G + configurar IP em 10.10.20.x + instalar satellite + linstor node create.

Depois disso, o node pode usar o storage mesmo sem disco local (diskless).

Diskless — vantagem concreta

Cenario: cluster SP tem 6 nodes Proxmox. So 3 tem disco no ssd-pool.

Sem diskless: so 3 nodes rodam VMs no linstor-ssd-01. Os outros 3 (incluindo ippri-33/34 com GPU A5000) ficam trancados fora.

Com diskless: todos os 6 rodam VMs. CPU/RAM ficam no node onde a VM esta; I/O vai pela rede 10G para os peers com disco.

Ganhos:

  • Live migration entre qualquer par de nodes
  • HA — VM pode reiniciar em qualquer node se um falhar
  • Aproveita hardware (GPUs em 33/34) sem comprar SSD para todos

Referencias

Documentos internos

Documentacao upstream LINBIT