
Não faz muito tempo, o pessoal do LINBIT apresentou sua nova solução SDS - Linstor. Este é um armazenamento totalmente gratuito, baseado em tecnologias comprovadas: DRBD, LVM, ZFS. Linstor combina simplicidade e uma arquitetura bem projetada, o que permite estabilidade e resultados impressionantes.
Hoje, gostaria de falar um pouco mais sobre isso e mostrar como é fácil integrá-lo ao OpenNebula usando o linstor_un, um novo driver que desenvolvi especificamente para esse fim.
O Linstor, em combinação com o OpenNebula, permite criar uma nuvem rápida e confiável, que pode ser facilmente implementada em sua própria infraestrutura.
Arquitetura Linstor
O Linstor não é um sistema de arquivos nem um repositório de blocos em si; o Linstor é um orquestrador que fornece uma camada de abstração que automatiza a criação de volumes no LVM ou ZFS e os replica usando DRBD9.
Quebrando estereótipos
Mas espere, DRBD? "Por que automatizá-lo e como ele pode funcionar?"
Lembre-se do passado, quando o DRBD8 era popular por toda parte. Seu uso padrão implicava a criação de um grande dispositivo de bloco e o corte em muitos pedaços pequenos, usando o mesmo LVM. Um tipo de mdadm RAID-1, mas com replicação na rede.
Essa abordagem não apresenta desvantagens e, portanto, com o advento do DRBD9, os princípios da construção de armazenamento mudaram, agora um dispositivo DRBD separado é criado para cada máquina virtual.
A abordagem com dispositivos de bloco independentes permite que você utilize melhor o espaço no cluster e também adiciona vários recursos adicionais. Por exemplo, para cada dispositivo, você pode determinar o número de réplicas, sua localização e configurações individuais. Eles são fáceis de criar / excluir, tirar instantâneos, redimensionar, ativar a criptografia e muito mais. Vale ressaltar que o DRBD9 também suporta quorum, o que evita situações de cérebro dividido.
Recursos e back-end
Criando um novo dispositivo de bloco, o Linstor coloca o número necessário de réplicas em diferentes nós no cluster. Chamaremos cada réplica como um recurso DRBD.
Os recursos são de dois tipos:
- Recurso de dados - é um dispositivo DRBD localizado em um nó em um pool LVM ou ZFS.
No momento, há suporte para vários back-ends e seu número está aumentando constantemente. Há suporte para LVM, ThinLVM e ZFS. Os dois últimos permitem criar e usar snapshots. - Diskless-resource - é um dispositivo DRBD localizado em um nó sem back-end, mas permitindo tratá-lo como um dispositivo de bloco normal, todas as operações de leitura / gravação serão redirecionadas para recursos de dados. O equivalente mais próximo de recursos sem disco é o iSCSI LUN.
Cada recurso DRBD pode ter até 8 réplicas e apenas uma delas pode estar ativa por padrão - Primária , todo o resto será Secundário e seu uso será impossível até que exista pelo menos uma Primária, ou seja, elas simplesmente serão replicadas dados entre você.
Ao montar um dispositivo DRBD no sistema, ele automaticamente se torna Primário , portanto, mesmo um recurso Sem Disco, na terminologia DRBD, pode ser Primário.
Então, por que precisamos do Linstor?
Confiando todas as tarefas intensivas em núcleo ao kernel, o Linstor é essencialmente um aplicativo Java comum que facilita a automação da criação de recursos DRBD.
Além disso, cada recurso criado por ele será um cluster DRBD independente que funciona de forma independente, independentemente do estado do plano de controle e de outros recursos DRBD.
O Linstor consiste em apenas dois componentes:
- Linstor-controller - O controlador principal que fornece uma API para criar e gerenciar recursos. Ele também se comunica com os satélites, verificando o espaço livre neles, e envia tarefas para criar e excluir novos recursos. Ele roda em uma única instância e usa um banco de dados, que pode ser interno (H2) ou externo (PostgreSQL, MySQL, MariaDB)
- Linstor-satellite - Instalado em todos os nós de armazenamento e fornece ao controlador informações sobre espaço livre, além de executar tarefas recebidas do controlador para criar e excluir novos volumes e dispositivos DRBD sobre eles.
Linstor opera com os seguintes conceitos-chave:
- O nó é um servidor físico no qual os recursos DRBD serão criados e usados.
- Pool de armazenamento - pool LVM ou ZFS criado em um nó no qual os recursos DRBD serão colocados. Um pool sem disco também é possível - este é um pool no qual apenas os recursos sem disco serão hospedados.
- Definição de Recurso - Uma definição de recurso é essencialmente um protótipo que descreve o nome e todas as suas propriedades.
- Definição de volume - Definição de volume . Cada recurso pode consistir em vários volumes, cada volume deve ter um tamanho.
- Recurso - uma instância criada de um dispositivo de bloco, cada recurso deve estar localizado em um nó específico e em algum pool de armazenamento.
Instale o Linstor
Eu recomendo usar o Ubuntu como um sistema, como Existe um PPA pronto para isso:
add-apt-repository ppa:linbit/linbit-drbd9-stack apt-get update
Ou Debian, onde o Linstor pode ser instalado a partir do repositório oficial do Proxmox:
wget -O- https://packages.linbit.com/package-signing-pubkey.asc | apt-key add - PVERS=5 && echo "deb http://packages.linbit.com/proxmox/ proxmox-$PVERS drbd-9.0" > \ /etc/apt/sources.list.d/linbit.list apt-get update
Controlador
Tudo é simples aqui:
apt-get install linstor-controller linstor-client systemctl enable linstor-controller systemctl start linstor-controller
Nós de armazenamento
Atualmente, o módulo do kernel DRBD8 na árvore é fornecido no kernel Linux, infelizmente ele não nos convém e precisamos instalar o DRBD9 :
apt-get install drbd-dkms
Como mostra a prática, a maioria das dificuldades surge precisamente porque o módulo DRBD8 é carregado no sistema, e não o DRBD9. Felizmente, é fácil verificar isso fazendo:
modprobe drbd cat /proc/drbd
Se você vir a versão: 9 - tudo está bem, se a versão: 8 - algo deu errado e você precisará executar etapas adicionais para descobrir os motivos.
Agora instale o linstor-satellite e o drbd-utils :
apt-get install linstor-satellite drbd-utils systemctl enable linstor-satellite systemctl start linstor-satellite
Criação de Cluster
Conjuntos e nós de armazenamento
Tomaremos o ThinLVM como back - end , como é o mais simples e suporta instantâneos.
Instale o lvm2 se você ainda não o fez e vamos criar um pool ThinLVM em todos os nossos nós de armazenamento:
sudo vgcreate drbdpool /dev/sdb sudo lvcreate -L 800G -T drbdpool/thinpool
Todas as ações adicionais podem ser executadas diretamente no controlador:
Adicione nossos nós:
linstor node create node1 127.0.0.11 linstor node create node2 127.0.0.12 linstor node create node3 127.0.0.13
Crie pools de armazenamento:
linstor storage-pool create lvmthin node1 data drbdpool/thinpool linstor storage-pool create lvmthin node2 data drbdpool/thinpool linstor storage-pool create lvmthin node3 data drbdpool/thinpool
Agora verifique os pools criados:
linstor storage-pool list
Se tudo for feito corretamente, devemos ver algo como:
+ ------------------------------------------------- -------------------------------------------------- ---- +
| StoragePool | Nó Motorista PoolName | FreeCapacity | TotalCapacity | SuportaSnapshots |
| ------------------------------------------------- -------------------------------------------------- ---- |
| dados node1 | LVM_THIN drbdpool / thinpool | 64 GiB | 64 GiB | verdadeiro
| dados node2 | LVM_THIN drbdpool / thinpool | 64 GiB | 64 GiB | verdadeiro
| dados node3 | LVM_THIN drbdpool / thinpool | 64 GiB | 64 GiB | verdadeiro
+ ------------------------------------------------- -------------------------------------------------- ---- +
Recursos DRBD
Agora vamos tentar criar nosso novo recurso DRBD:
linstor resource-definition create myres linstor volume-definition create myres 1G linstor resource create myres --auto-place 2
Vamos verificar os recursos criados:
linstor volume list
+ ------------------------------------------------- -------------------------------------------------- --- +
| Nó Recurso StoragePool | VolumeNr | MinorNr DeviceName | Alocado InUse | Estado
| ------------------------------------------------- -------------------------------------------------- --- |
| node1 | myres | dados 0 1084 / dev / drbd1084 | 52 KiB | Não utilizado | UpToDate |
| node2 | myres | dados 0 1084 / dev / drbd1084 | 52 KiB | Não utilizado | UpToDate |
+ ------------------------------------------------- -------------------------------------------------- --- +
Ótimo! - vemos que o recurso foi criado nos dois primeiros nós, também podemos tentar criar um recurso sem disco no terceiro:
linstor resource create --diskless node3 myres
Nos nós, você sempre encontrará este dispositivo como /dev/drbd1084
ou /dev/drbd/by-res/myres/0
É assim que o Linstor funciona. Você pode obter mais informações na documentação oficial .
Agora vou falar sobre como integrá-lo ao OpenNebula
Configurar o OpenNebula
Não vou aprofundar o processo de criação do OpenNebula, pois todas as etapas são descritas em detalhes na documentação oficial , a qual eu recomendo que você recorra, falarei apenas sobre a integração do OpenNebula com o Linstor.
linstor_un
Para resolver esse problema, escrevi meu próprio driver - linstor_un , no momento, está disponível como um plug-in e deve ser instalado separadamente.
Toda a instalação é realizada nos nós OpenNebula-frontend e não requer ações adicionais nos nós de computação.
Primeiro de tudo, precisamos ter certeza de que temos jq e linstor-client :
apt-get install jq linstor-client
O comando linstor node list
deve listar os nós. Todos os nós de computação do OpenNebula devem ser adicionados ao cluster Linstor.
Faça o download e instale o plugin:
curl -L https://github.com/OpenNebula/addon-linstor_un/archive/master.tar.gz | tar -xzvf - -C /tmp mv /tmp/addon-linstor_un-master/vmm/kvm/* /var/lib/one/remotes/vmm/kvm/ mkdir -p /var/lib/one/remotes/etc/datastore/linstor_un mv /tmp/addon-linstor_un-master/datastore/linstor_un/linstor_un.conf /var/lib/one/remotes/etc/datastore/linstor_un/linstor_un.conf mv /tmp/addon-linstor_un-master/datastore/linstor_un /var/lib/one/remotes/datastore/linstor_un mv /tmp/addon-linstor_un-master/tm/linstor_un /var/lib/one/remotes/tm/linstor_un rm -rf /tmp/addon-linstor_un-master
Agora precisamos adicioná-lo à configuração do OpenNebula, para isso, executamos as etapas simples descritas aqui .
Em seguida, reinicie o OpenNebula:
systemctl restart opennebula
E adicione nosso sistema de armazenamento de dados:
cat > system-ds.conf <<EOT NAME="linstor-system" TYPE="SYSTEM_DS" STORAGE_POOL="data" AUTO_PLACE="2" CLONE_MODE="snapshot" CHECKPOINT_AUTO_PLACE="1" BRIDGE_LIST="node1 node2 node3" TM_MAD="linstor_un" EOT onedatastore create system-ds.conf
E armazenamento de imagens:
cat > images-ds.conf <<EOT NAME="linstor-images" TYPE="IMAGE_DS" STORAGE_POOL="data" AUTO_PLACE="2" BRIDGE_LIST="node1 node2 node3" DISK_TYPE="BLOCK" DS_MAD="linstor_un" TM_MAD="linstor_un" EOT onedatastore create images-ds.conf
- O parâmetro
AUTO_PLACE
exibe o número de réplicas de dados que serão criadas para cada nova imagem no OpenNebula. - O parâmetro
CLONE_MODE
indica como as imagens serão clonadas ao criar novas máquinas virtuais, o snapshot
- criará um instantâneo da imagem e implantará uma máquina virtual a partir do instantâneo, copy
- fará uma cópia completa da imagem para cada máquina virtual. BRIDGE_LIST
recomenda especificar todos os nós que serão usados para executar operações de clonagem de imagem.
Uma lista completa dos parâmetros suportados é fornecida no projeto README .
Com essa configuração concluída, agora você pode baixar alguns dispositivos do OpenNebula Marketplace oficial e criar máquinas virtuais a partir dele.
Link para o projeto