One place for hosting & domains

      Armazenamento

      Como criar uma pool de armazenamento com redundância usando o GlusterFS no Ubuntu 20.04


      Existe uma versão anterior deste tutorial, escrita por Justin Ellingwood.

      Introdução

      Ao armazenar dados críticos, ter um ponto único de falha é bastante arriscado. Embora muitos bancos de dados e outros softwares permitam que você distribua dados no contexto de um único aplicativo, outros sistemas podem operar no nível de sistema de arquivos para garantir que os dados sejam copiados para outro local sempre que eles são escritos para o disco.

      O GlusterFS é um sistema de arquivos de armazenamento conectado à rede que lhe permite agrupar recursos de armazenamento de várias máquinas. Desta forma, isso permite que você trate vários dispositivos de armazenamento que são distribuídos entre vários computadores como uma unidade única e mais poderosa. O GlusterFS também lhe dá a liberdade de criar diferentes tipos de configurações de armazenamento, muitas das quais são similares em funcionamento aos níveis RAID. Por exemplo, você pode distribuir os dados em diferentes nós no cluster, ou implementar redundância para uma melhor disponibilidade de dados.

      Objetivos

      Neste guia, você irá criar uma matriz de armazenamento em clusters redundante, também conhecida como um sistema de arquivos distribuído ou, como ela está referida na documentação do GlusterFS, uma Trusted Storage Pool (pool de armazenamento confiável). Isso irá proporcionar funcionalidades semelhantes a uma configuração RAID espelhada pela rede: cada servidor independente irá conter sua própria cópia dos dados, permitindo que suas aplicações acessem qualquer cópia, ajudando assim a distribuir sua carga de leitura.

      Esse cluster do GlusterFS redundante consistirá em dois servidores do Ubuntu 20.04. Isso irá agir de maneira semelhante a um servidor NAS com RAID espelhado. Então, você irá acessar o cluster a partir de um terceiro servidor Ubuntu 20.04 configurado para funcionar como um cliente do GlusterFS.

      Quando você adiciona dados a um volume do GlusterFS, esses dados são sincronizados para todas as máquinas na pool de armazenamento onde o volume está hospedado. Este tráfego entre nós não é criptografado por padrão, o que significa que há um risco dele ser interceptado por agentes maliciosos.

      Por isso, se você vai usar o GlusterFS na produção, é recomendado que você execute-o em uma rede isolada. Por exemplo, você pode configurá-lo para executar em uma *Virtual Private Cloud *(VPC) ou com um VPN em funcionamento entre cada um dos nós.

      Se você planeja implantar o GlusterFS na DigitalOcean, você pode configurá-lo em uma rede isolada adicionando sua infraestrutura de servidor a uma Virtual Private Network da Digital Ocean. Para obter detalhes sobre como configurar isso, consulte nossa documentação de produtos VPC.

      Pré-requisitos

      Para seguir este tutorial, você precisará de três servidores executando o Ubuntu 20.04. Cada servidor deve ter um usuário não-root com privilégios administrativos e um firewall configurado com o UFW. Para configurar isso, siga nosso guia de configuração inicial de servidor para o Ubuntu 20.04.

      Note: Como mencionado na seção de Objetivos, este tutorial irá guiá-lo para configurar dois dos seus servidores Ubuntu para que atuem como servidores em sua pool de armazenamento e o servidor restante para agir como um cliente que você usará para acessar esses nós.

      Para maior clareza, este tutorial irá se referir a essas máquinas com os seguintes nomes de host:

      HostnamePapel na pool de armazenamento
      gluster0Servidor
      gluster1Servidor
      gluster2Cliente

      Os comandos que devem ser executados em gluster0 ou gluster1 terão fundo em azul e vermelho, respectivamente:

      Os comandos que só devem ser executados no cliente (gluster2) terão um fundo verde:

      Os comandos que podem ou devem ser executados em mais de uma máquina terão um fundo cinza:

      Passo 1 — Configurando a resolução de DNS em cada máquina

      Configurar algum tipo de resolução de nome de host entre cada computador pode ajudar na gestão da sua pool de armazenamento do Gluster. Desta forma, sempre que precisar fazer referência a uma de suas máquinas em um comando gluster mais tarde neste tutorial, faça isso com um nome de domínio de fácil memorização ou um apelido em vez dos respectivos endereços IP.

      Se você não tiver um nome de domínio sobrando ou se você quiser configurar algo rapidamente, você pode editar o arquivo /etc/hosts em cada computador como alternativa. Este é um arquivo especial em máquinas Linux, onde é possível configurar o sistema de forma estática para atribuir todos os nomes de host contidos no arquivo para endereços IP estáticos.

      Note: Se você quiser configurar seus servidores para se autenticarem com um domínio que você possua, será necessário primeiro obter um nome de domínio de registrador de domínios — como o Namecheap ou o Enom — e configurar os registros de DNS apropriados.

      Depois de configurar um registro A para cada servidor, você pode seguir em frente para o Passo 2. Conforme for seguindo este guia, certifique-se de substituir o glusterN.example.com e o glusterN pelo nome de domínio que direciona para o servidor respectivo referenciado no comando de exemplo.

      Se você obteve sua infraestrutura da DigitalOcean, é possível adicionar seu nome de domínio à DigitalOcean e, em seguida, configurar um registro A único para cada um de seus servidores.

      Usando seu editor de texto preferido, abra este arquivo com privilégios de root em cada uma das suas máquinas. Aqui, usaremos o nano:

      Por padrão, o arquivo vai ficar parecido com isto aqui,com os comentários removidos:

      /etc/hosts

      127.0.1.1 hostname hostname
      127.0.0.1 localhost
      
      ::1 ip6-localhost ip6-loopback
      fe00::0 ip6-localnet
      ff00::0 ip6-mcastprefix
      ff02::1 ip6-allnodes
      ff02::2 ip6-allrouters
      ff02::3 ip6-allhosts
      

      Em um dos seus servidores Ubuntu, adicione o endereço IP de cada servidor seguido dos nomes que você deseja utilizar para fazer referência a eles em comandos abaixo da definição local de host.

      No exemplo a seguir, cada servidor recebe um nome de host longo que segue o padrão de glusterN.example.com e um menor que segue o padrão de glusterN. Você pode alterar as partes glusterN.example.com e glusterN de cada linha para qualquer nome — ou nomes separados por espaços únicos — que você quiser usar para acessar cada servidor. Observe, porém, que este tutorial irá usar estes exemplos a todo momento:

      Nota: Se seus servidores fazem parte de uma pool de infraestrutura Virtual Private Cloud, você deve usar o endereço IP privado de cada servidor no arquivo /etc/hosts em vez de seus IP públicos.

      /etc/hosts

      . . .
      127.0.0.1       localhost
      first_ip_address gluster0.example.com gluster0
      second_ip_address gluster1.example.com gluster1
      third_ip_address gluster2.example.com gluster2
      
      . . .
      

      Quando você terminar de adicionar estas novas linhas ao arquivo /etc/hosts de uma máquina, copie e adicione-as aos arquivos /etc/hosts em suas outras máquinas. Cada arquivo /etc/hosts deve conter as mesmas linhas, ligando os endereços IP dos seus servidores aos nomes que você selecionou.

      Salve e feche cada arquivo quando você terminar. Se usou o nano, faça isso pressionando as teclas CTRL+X, Y e depois ENTER.

      Agora que você configurou a resolução de nomes de host entre cada um dos seus servidores, será mais fácil executar comandos mais tarde enquanto configura uma pool de armazenamento e um volume. Em seguida, você vai percorrer outro passo que deve ser concluído em cada um dos seus servidores. Isto é, você irá adicionar o arquivo de pacotes pessoais (PPA) oficial do projeto Gluster a cada um dos seus três servidores Ubuntu para garantir que você possa instalar a versão mais recente do GlusterFS.

      Passo 2 — Configurando as fontes de software em cada máquina

      Embora os repositórios APT padrão do Ubuntu 20.04 contém os pacotes do GlusterFS, no momento em que este tutorial está sendo escrito, eles não são as versões mais recentes. Uma maneira de instalar a última versão estável do GlusterFS (versão 7.6 no momento em que este tutorial está sendo escrito) é adicionando o PPA oficial do projeto Gluster a cada um dos seus três servidores Ubuntu.

      Adicione o PPA para os pacotes do GlusterFS executando o seguinte comando em cada servidor:

      • sudo add-apt-repository ppa:gluster/glusterfs-7

      Pressione ENTER quando solicitado para confirmar se você realmente deseja adicionar o PPA.

      Depois de adicionar o PPA, atualize o índice de pacotes local de cada servidor. Isso fará com que cada servidor reconheça os novos pacotes disponíveis:

      Depois de adicionar o PPA oficial do projeto Gluster a cada servidor e atualizar o índice de pacotes local, você está pronto para instalar os pacotes do GlusterFS necessários. No entanto, como duas de suas três máquinas irão atuar como servidores Gluster e a outra irá agir como cliente, há dois procedimentos de instalação e configuração separados. Primeiro, você irá instalar e configurar os componentes do servidor.

      Passo 3 — Instalando componentes do servidor e criando uma pool de armazenamento confiável

      Uma pool de armazenamento é qualquer quantidade de capacidade de armazenamento agregada a partir de mais de uma fonte de armazenamento. Neste passo, você irá configurar dois dos seus servidores — o gluster0 e o gluster1 — como os componentes do cluster.

      Em ambos o gluster0 e o gluster1, instale o pacote de servidor do GlusterFS digitando:

      • sudo apt install glusterfs-server

      Quando solicitado, pressione Y e então ENTER para confirmar a instalação.

      O processo de instalação configura automaticamente o GlusterFS para ser executado como um serviço do systemd. No entanto, ele não inicializa automaticamente o serviço ou o habilita para ser executado na inicialização do sistema.

      Para iniciar o glusterd, o serviço do GlusterFS, execute o seguinte comando systemctl start em ambos o gluster0 e gluster1:

      • sudo systemctl start glusterd.service

      Então, execute o seguinte comando em ambos os servidores. Isso permitirá que o serviço seja iniciado sempre que o servidor for inicializado:

      • sudo systemctl enable glusterd.service

      Depois disso, você pode verificar o status do serviço em ambos os servidores:

      • sudo systemctl status glusterd.service

      Se o serviço estiver em operação, você receberá um resultado parecido com este:

      Output

      ● glusterd.service - GlusterFS, a clustered file-system server Loaded: loaded (/lib/systemd/system/glusterd.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2020-06-02 21:32:21 UTC; 32s ago Docs: man:glusterd(8) Main PID: 14742 (glusterd) Tasks: 9 (limit: 2362) CGroup: /system.slice/glusterd.service └─14742 /usr/sbin/glusterd -p /var/run/glusterd.pid --log-level INFO

      Supondo que você tenha seguido o guia de configuração inicial do servidor pré-requisito, você terá configurado um firewall com o UFW em cada uma das suas máquinas. Por isso, é necessário abrir o firewall em cada nó antes de estabelecer comunicações entre eles e criar uma pool de armazenamento.

      O daemon do Gluster usa a porta 24007, então será necessário permitir que cada nó tenha acesso a essa porta através do firewall de cada um dos nós em sua pool de armazenamento. Para fazer isso, execute o seguinte comando no gluster0. Lembre-se de alterar gluster1_ip_address para o endereço IP do gluster1:

      • sudo ufw allow from gluster1_ip_address to any port 24007

      E execute o seguinte comando no gluster1. Novamente, certifique-se de alterar gluster0_ip_address para o endereço IP do gluster0:

      • sudo ufw allow from gluster0_ip_address to any port 24007

      Também será necessário permitir que sua máquina cliente (gluster2) tenha acesso a esta porta. Caso contrário, você encontrará problemas mais tarde quando for tentar montar o volume. Execute o seguinte comando tanto no gluster0 quanto no gluster1 para abrir esta porta para a sua máquina cliente:

      • sudo ufw allow from gluster2_ip_address to any port 24007

      Então, para garantir que nenhuma outra máquina seja capaz de acessar a porta do Gluster em ambos os servidores, adicione a seguinte regra ampla deny ao gluster0 e ao gluster1:

      Agora, você está pronto para estabelecer uma comunicação entre o gluster0 e o gluster1. Para fazer isso, você precisará executar o comando gluster peer probe em um dos seus nós. Não importa qual nó você use, mas o seguinte exemplo mostra o comando sendo executado no gluster0:

      • sudo gluster peer probe gluster1

      Essencialmente, este comando diz ao gluster0 para confiar no gluster1 e registrá-lo como parte de sua pool de armazenamento. Se a investigação for bem-sucedida, ela irá retornar o seguinte resultado:

      Output

      peer probe: success

      Você pode verificar se os nós estão se comunicando a qualquer momento, executando o comando gluster peer status em cada um dos dois. Neste exemplo, ele está sendo executado no gluster1:

      Se você executar este comando do gluster1, ele irá mostrar um resultado desta forma:

      Output

      Number of Peers: 1 Hostname: gluster0.example.com Uuid: a3fae496-c4eb-4b20-9ed2-7840230407be State: Peer in Cluster (Connected)

      Neste momento, seus dois servidores estão se comunicando e prontos para criar volumes de armazenamento um com o outro.

      Passo 4 — Criando um volume de armazenamento

      Lembre-se que o objetivo principal deste tutorial é criar uma pool de armazenamento redundante. Para este fim, você irá configurar um volume com funcionalidade de réplica. Ele permitirá que você mantenha várias cópias dos seus dados e impedirá que seu cluster tenha um ponto único de falha.

      Para criar um volume, você irá usar o comando gluster volume create com esta sintaxe geral:

      sudo gluster volume create volume_name replica number_of_servers domain1.com:/path/to/data/directory domain2.com:/path/to/data/directory force
      

      Veja o que os argumentos e opções do comando gluster volume create significam:

      • volume_name: Este é o nome que você irá usar para se referir ao volume depois de ele ser criado. O comando de exemplo a seguir cria um volume chamado volume1.
      • replica number_of_servers: Após o nome do volume, você pode definir que tipo de volume você deseja criar. Lembre-se que o objetivo deste tutorial é criar uma pool de armazenamento redundante, então vamos usar o tipo de volume replica. Isso requer um argumento que indique para quantos servidores os dados do volume serão replicados (2, no caso deste tutorial).
      • domain1.com:/… e domain2.com:/…: Eles definem a localização das máquinas e do diretório do bricks — o termo do GlusterFS para sua unidade básica de armazenamento, que inclui todos os diretórios em todas as máquinas que sirvam como parte ou uma cópia de um volume maior — que formarão o volume1. O exemplo a seguir irá criar um diretório chamado gluster-storage no diretório root de ambos os servidores.
      • force: Essa opção irá sobrescrever quaisquer avisos ou opções que de outra forma apareceriam e interromperiam a criação do volume.

      Seguindo as convenções estabelecidas anteriormente neste tutorial, você pode executar este comando para criar um volume. Observe que pode executá-lo tanto a partir do gluster0 quanto do gluster1:

      • sudo gluster volume create volume1 replica 2 gluster0.example.com:/gluster-storage gluster1.example.com:/gluster-storage force

      Se o volume for criado com sucesso, você receberá o seguinte resultado:

      Output

      volume create: volume1: success: please start the volume to access data

      Neste momento, seu volume foi criado, mas ele ainda não está ativo. Você pode iniciar o volume e torná-lo disponível para uso executando o seguinte comando novamente a partir de um dos seus servidores do Gluster:

      • sudo gluster volume start volume1

      Você receberá este resultado se o volume for iniciado corretamente:

      Output

      volume start: volume1: success

      Em seguida, verifique se o volume está online. Execute o seguinte comando a partir de um dos seus nós:

      • sudo gluster volume status

      Isso irá retornar um resultado semelhante a este:

      Output

      Status of volume: volume1 Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick gluster0.example.com:/gluster-storage 49152 0 Y 18801 Brick gluster1.example.com:/gluster-storage 49152 0 Y 19028 Self-heal Daemon on localhost N/A N/A Y 19049 Self-heal Daemon on gluster0.example.com N/A N/A Y 18822 Task Status of Volume volume1 ------------------------------------------------------------------------------ There are no active volume tasks

      Com base neste resultado, os bricks em ambos os servidores estão online.

      Como um passo final para configurar seu volume, você precisará abrir o firewall em ambos os servidores para que sua máquina cliente seja capaz de se conectar e montar o volume. De acordo com o resultado amostral do comando anterior, o volume1 está em execução na porta 49152 em ambas as máquinas. Esta é a porta padrão do GlusterFS para seu volume inicial, e o próximo volume que você criar irá usar a porta 49153, então 49154 e assim por diante.

      Execute o seguinte comando em ambos o gluster0 e o gluster1 para permitir que o gluster2 tenha acesso a esta porta através dos seus respectivos firewalls:

      • sudo ufw allow from gluster2_ip_address to any port 49152

      Então, para uma camada adicional de segurança, adicione outra regra ampla deny para a porta do volume tanto no gluster0 quanto no gluster1. Isso irá garantir que nenhuma máquina que não seja o seu cliente possa acessar o volume em ambos os servidores:

      Agora que seu volume está em operação, você pode configurar sua máquina cliente e começar a usá-la remotamente.

      Passo 5 — Instalando e configurando componentes do cliente

      Seu volume agora está configurado e disponível para uso pela sua máquina cliente. Apesar disso, antes de começar, você precisa instalar o pacote glusterfs-client a partir do PPA que você configurou no Passo 1 na sua máquina cliente. As dependências deste pacote incluem algumas das bibliotecas comuns e módulos de tradutor do GlusterFS, além das ferramentas FUSE necessárias para que ele funcione.

      Execute o seguinte comando no gluster2:

      • sudo apt install glusterfs-client

      Você irá montar seu volume de armazenamento remoto em seu computador cliente em breve. Antes que possa fazer isso, no entanto, você precisa criar um ponto de montagem. Tradicionalmente, ele está localizado no diretório /mnt, mas qualquer lugar que seja conveniente pode ser usado.

      Para simplificar, crie um diretório chamado /storage-pool em sua máquina cliente para servir como o ponto de montagem. Este nome de diretório começa com uma barra (/) que o coloca no diretório root. Sendo assim, você precisará criá-lo com privilégios sudo:

      Agora, você pode montar o volume remoto. Antes disso, porém, dê uma olhada na sintaxe do comando mount que você irá usar para isso.

      sudo mount -t glusterfs domain1.com:volume_name /path/to/mount/point
      

      O mount é um utilitário encontrado em muitos sistemas operacionais semelhantes ao Unix. Ele é usado para montar sistemas de arquivos — qualquer coisa desde dispositivos de armazenamento externo, como cartões SD ou pendrives, até armazenamento ligado à rede como no caso deste tutorial — em diretórios no sistema de arquivos existente da máquina. A sintaxe do comando mount que você irá usar inclui a opção -t, que requer três argumentos: o tipo do sistema de arquivos a ser montado, o dispositivo onde o sistema de arquivos a ser montado pode ser encontrado, e o diretório no cliente onde você irá montar o volume.

      Observe que neste exemplo de sintaxe, o argumento do dispositivo aponta para um nome de host seguido por dois pontos e depois o nome do volume. O GlusterFS abstrai os diretórios de armazenamento reais em cada host, o que significa que este comando não procura montar o diretório /gluster-storage, mas sim o volume volume1.

      Também observe que você só precisa especificar um membro do cluster de armazenamento. Isso pode ser qualquer um dos nós, pois o serviço do GlusterFS os trata como uma máquina.

      Execute o seguinte comando em sua máquina cliente (gluster2) para montar o volume no diretório /storage-pool que você criou:

      • sudo mount -t glusterfs gluster0.example.com:/volume1 /storage-pool

      Depois disso, execute o comando df. Isso irá exibir a quantidade de espaço em disco disponível para sistemas de arquivos aos quais o usuário que o invocou tem acesso:

      Este comando irá mostrar que o volume do GlusterFS está montado na localização correta:

      Output

      Filesystem 1K-blocks Used Available Use% Mounted on . . . gluster0.example.com:/volume1 50633164 1938032 48695132 4% /storage-pool

      Agora, teste se todos os dados que você escreve no volume no seu cliente são replicados para os nós do servidor como esperado.

      Passo 6 — Testando recursos de redundância

      Agora que você configurou seu cliente para usar sua pool de armazenamento e volume, você pode testar sua funcionalidade.

      Em sua máquina cliente (gluster2), navegue até o ponto de montagem que você definiu no passo anterior:

      Em seguida, crie alguns arquivos de teste. O comando a seguir cria dez arquivos vazios separados em sua pool de armazenamento:

      • sudo touch file_{0..9}.test

      Se você examinar os diretórios de armazenamento definidos anteriormente em cada host de armazenamento, você irá descobrir que todos os arquivos estão presentes em cada sistema.

      No gluster0:

      Output

      file_0.test file_2.test file_4.test file_6.test file_8.test file_1.test file_3.test file_5.test file_7.test file_9.test

      Da mesma forma, no gluster1:

      Output

      file_0.test file_2.test file_4.test file_6.test file_8.test file_1.test file_3.test file_5.test file_7.test file_9.test

      Como estes resultados mostram, os arquivos de teste que você adicionou ao cliente também foram escritos em ambos os seus nós.

      Se um dos nós em seu cluster de armazenamento estiver desligado em algum momento, eles podem perder a sincronia com o pool de armazenamento, caso haja alterações feitas no sistema de arquivos. Fazer uma operação de leitura no ponto de montagem do cliente depois que o nó voltar a ficar online irá alertar o nó para obter qualquer arquivo em falta:

      Agora que verificou que seu volume de armazenamento está montado corretamente e pode replicar dados para ambas as máquinas no cluster, você pode bloquear o acesso à pool de armazenamento.

      Passo 7 — Restringindo recursos de redundância

      Neste momento, qualquer computador pode se conectar ao seu volume de armazenamento sem nenhuma restrição. Você pode mudar isso alterando a opção auth.allow que define os endereços IP de quais clientes têm acesso ao volume.

      Se estiver usando a configuração do /etc/hosts, os nomes que você configurou para cada servidor não serão encaminhados corretamente. Você deve usar um endereço IP estático disso.ao invés disso. Por outro lado, se você estiver usando registros DNS, o nome de domínio que você configurou irá funcionar aqui.

      Em um dos seus nós de armazenamento (gluster0 ou gluster1), execute o seguinte comando:

      • sudo gluster volume set volume1 auth.allow gluster2_ip_address

      Se o comando terminar com sucesso, ele irá retornar este resultado:

      Output

      volume set: success

      Se precisar remover a restrição a qualquer momento, você pode digitar:

      • sudo gluster volume set volume1 auth.allow *

      Isso permitirá as conexões de qualquer máquina novamente. Isso é inseguro, mas pode ser útil para depurar problemas.

      Se você tiver vários clientes, pode especificar os endereços IP ou nomes de domínio deles ao mesmo tempo (dependendo se estiver usando a resolução /etc/hosts ou a resolução de nomes de host DNS), separados por vírgulas:

      • sudo gluster volume set volume1 auth.allow gluster_client1_ip,gluster_client2_ip

      Seu pool de armazenamento agora está configurado, seguro e pronto para uso. Em seguida, você irá aprender alguns comandos que lhe ajudarão a obter informações sobre o status da sua pool de armazenamento.

      Quando começar a alterar algumas das configurações para seu armazenamento do GlusterFS, você pode se confundir com as opções disponíveis, quais volumes estão ativos e quais nós estão associados a cada volume.

      Há vários comandos diferentes que estão disponíveis em seus nós para recuperar esses dados e interagir com sua pool de armazenamento.

      Se você quiser informações sobre cada um dos seus volumes, execute o comando gluster volume info:

      Output

      Volume Name: volume1 Type: Replicate Volume ID: a1e03075-a223-43ab-a0f6-612585940b0c Status: Started Snapshot Count: 0 Number of Bricks: 1 x 2 = 2 Transport-type: tcp Bricks: Brick1: gluster0.example.com:/gluster-storage Brick2: gluster1.example.com:/gluster-storage Options Reconfigured: auth.allow: gluster2_ip_address transport.address-family: inet storage.fips-mode-rchecksum: on nfs.disable: on performance.client-io-threads: off

      Da mesma forma, para obter informações sobre quaisquer pares aos quais este nó esteja conectado, você pode digitar:

      Number of Peers: 1
      
      Hostname: gluster0.example.com
      Uuid: cb00a2fc-2384-41ac-b2a8-e7a1793bb5a9
      State: Peer in Cluster (Connected)
      

      Se quiser informações detalhadas sobre como cada nó está desempenhando, faça um perfil de volume digitando:

      • sudo gluster volume profile volume_name start

      Quando este comando for concluído, obtenha as informações que foram reunidas digitando:

      • sudo gluster volume profile volume_name info

      Output

      Brick: gluster0.example.com:/gluster-storage -------------------------------------------- Cumulative Stats: %-latency Avg-latency Min-Latency Max-Latency No. of calls Fop --------- ----------- ----------- ----------- ------------ ---- 0.00 0.00 us 0.00 us 0.00 us 30 FORGET 0.00 0.00 us 0.00 us 0.00 us 36 RELEASE 0.00 0.00 us 0.00 us 0.00 us 38 RELEASEDIR Duration: 5445 seconds Data Read: 0 bytes Data Written: 0 bytes Interval 0 Stats: %-latency Avg-latency Min-Latency Max-Latency No. of calls Fop --------- ----------- ----------- ----------- ------------ ---- 0.00 0.00 us 0.00 us 0.00 us 30 FORGET 0.00 0.00 us 0.00 us 0.00 us 36 RELEASE 0.00 0.00 us 0.00 us 0.00 us 38 RELEASEDIR Duration: 5445 seconds Data Read: 0 bytes Data Written: 0 bytes . . .

      Como mostrado anteriormente, para uma lista de todos os componentes associados ao GlusterFS em execução em cada um dos seus nós, execute o comando gluster volume status:

      • sudo gluster volume status

      Output

      Status of volume: volume1 Gluster process TCP Port RDMA Port Online Pid ------------------------------------------------------------------------------ Brick gluster0.example.com:/gluster-storage 49152 0 Y 19003 Brick gluster1.example.com:/gluster-storage 49152 0 Y 19040 Self-heal Daemon on localhost N/A N/A Y 19061 Self-heal Daemon on gluster0.example.com N/A N/A Y 19836 Task Status of Volume volume1 ------------------------------------------------------------------------------ There are no active volume tasks

      Se você estiver administrando seus volumes de armazenamento do GlusterFS, pode ser uma boa ideia adentrar-se no console do GlusterFS. Isso permitirá que você interaja com seu ambiente do GlusterFS sem precisar digitar sudo gluster antes de tudo:

      Isso lhe dará um prompt onde você pode digitar seus comandos. O help é um bom recurso para se orientar:

      Output

      peer help - display help for peer commands volume help - display help for volume commands volume bitrot help - display help for volume bitrot commands volume quota help - display help for volume quota commands snapshot help - display help for snapshot commands global help - list global commands

      Quando você terminar, execute exit para sair do console do Gluster:

      Com isso, você está pronto para começar a integrar o GlusterFS com seu próximo aplicativo.

      Conclusão

      Após completar este tutorial, você tem agora um sistema de armazenamento redundante que lhe permitirá escrever em dois servidores separados simultaneamente. Isso pode ser útil para uma série de aplicativos e pode garantir que seus dados estejam disponíveis mesmo quando um servidor cair.



      Source link

      Como Configurar um Servidor de Armazenamento de Objeto Usando o Minio no Ubuntu 18.04


      O autor escolheu o Open Internet/Free Speech Fund para receber uma doação como parte do programa Write for DOnations.

      Introdução

      De soluções de backup baseadas na nuvem até a alta disponibilidade redes de entrega de conteúdo (CDNs), a capacidade de armazenar blobs não estruturados de dados de objetos e torná-los acessíveis por meio de APIs HTTP, conhecidas como armazenamento de objeto ou object storage, tornou-se parte integrante do cenário da tecnologia moderna.

      O Minio é um popular servidor de armazenamento de objetos open-source compatível com o Serviço de armazenamento em nuvem Amazon S3. As aplicações que foram configuradas para conversar com o Amazon S3 também podem ser configuradas para conversar com o Minio, permitindo que o Minio seja uma alternativa viável ao S3 se você quiser ter mais controle sobre o servidor de armazenamento de objetos. O serviço armazena dados não estruturados como fotos, vídeos, arquivos de log, backups e imagens de container/VM, e pode até mesmo fornecer um servidor de armazenamento de objeto único que agrupa várias unidades espalhadas por muitos servidores.

      O Minio é escrito em Go, vem com um cliente de linha de comando mais uma interface web, e suporta serviço de enfileiramento simples para alvos com o protocolo Advanced Message Queuing (AMQP), Elasticsearch, Redis, NATS. Por todos esses motivos, aprender a configurar um servidor de armazenamento de objetos Minio pode adicionar uma ampla variedade de flexibilidade e utilidade ao seu projeto.

      Neste tutorial, você irá:

      • Instalar o servidor Minio no seu servidor Ubuntu 18.04 e configurá-lo como um serviço systemd.

      • Configurar um certificado SSL/TLS usando o Let’s Encrypt para proteger a comunicação entre o servidor e o cliente.

      • Acessar a interface web do Minio via HTTPS para usar e administrar o servidor.

      Pré-requisitos

      Para concluir este tutorial, você precisará de:

      • Um servidor Ubuntu 18.04 configurado seguindo nosso tutorial de Configuração Inicial de servidor com Ubuntu 18.04, incluindo um usuário sudo não-root e um firewall.

      • Um nome de domínio totalmente qualificado. Você pode comprar um em Namecheap ou obter um gratuitamente em Freenom. Neste tutorial, seu domínio será representado como seu_domínio.

      • Os seguintes registros DNS configurados para o seu servidor Minio. Você pode seguir nossa documentação sobre registros DNS para obter detalhes sobre como adicioná-los a um Droplet da DigitalOcean.

        • Um registro A com o nome do servidor (exemplo: minio-server.seu_domínio) apontando para o endereço IPv4 do servidor de objetos.
        • (Opcional) Se você deseja que seu servidor seja acessível via IPv6, será necessário um registro AAAA com o nome do seu servidor apontando para o endereço IPv6 do servidor de objetos.

      Passo 1 — Instalando e Configurando o Servidor Minio

      Você pode instalar o servidor Minio compilando o código fonte ou através de um arquivo binário. Para instalá-lo a partir da fonte, você precisa ter pelo menos o Go 1.12 instalado em seu sistema.

      Neste passo, você instalará o servidor através do binário pré-compilado e configurará o servidor Minio posteriormente.

      Primeiro, efetue login no seu servidor, substituindo sammy pelo seu nome de usuário e ip_do_seu_servidor pelo endereço IP do seu servidor Ubuntu 18.04:

      • ssh sammy@ip_do_seu_servidor

      Se você não atualizou o banco de dados de pacotes recentemente, atualize-o agora:

      Em seguida, baixe o arquivo binário do servidor Minio do site oficial:

      • wget https://dl.min.io/server/minio/release/linux-amd64/minio

      Você receberá uma saída semelhante à seguinte:

      Output

      --2019-08-27 15:08:49-- https://dl.min.io/server/minio/release/linux-amd64/minio Resolving dl.min.io (dl.min.io)... 178.128.69.202 Connecting to dl.min.io (dl.min.io)|178.128.69.202|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 44511616 (42M) [application/octet-stream] Saving to: ‘minio’ minio 100%[===================>] 42.45M 21.9MB/s in 1.9s 2019-08-27 15:08:51 (21.9 MB/s) - ‘minio’ saved [44511616/44511616]

      Depois que o download terminar, um arquivo chamado minio estará no seu diretório de trabalho. Use o seguinte comando para torná-lo executável:

      Agora, mova o arquivo para o diretório /usr/local/bin, onde o script de inicialização systemd do Minio espera encontrá-lo:

      • sudo mv minio /usr/local/bin

      Isso nos permitirá escrever um arquivo de unidade de serviço posteriormente neste tutorial para executar automaticamente o Minio na inicialização.

      Por motivos de segurança, é melhor evitar a execução do servidor Minio como root. Isso limitará os danos que podem ser causados ao seu sistema se ele for comprometido. Como o script systemd que você usará no Passo 2 procura uma conta de usuário e um grupo chamado minio-user, crie um novo usuário com este nome:

      • sudo useradd -r minio-user -s /sbin/nologin

      Neste comando, você usou a flag -s para definir /sbin/nologin como o shell para minio-user. Este é um shell que não permite o login do usuário, o que não é necessário para o minio-user.

      Em seguida, altere a propriedade do binário do Minio para minio-user:

      • sudo chown minio-user:minio-user /usr/local/bin/minio

      Em seguida, você criará um diretório onde o Minio armazenará arquivos. Este será o local de armazenamento para os buckets que você usará posteriormente para organizar os objetos que você armazena no servidor Minio. Este tutorial nomeará o diretório como minio:

      • sudo mkdir /usr/local/share/minio

      Dê a propriedade desse diretório para o minio-user:

      • sudo chown minio-user:minio-user /usr/local/share/minio

      A maioria dos arquivos de configuração do servidor é armazenada no diretório /etc, então crie seu arquivo de configuração do Minio lá:

      Dê a propriedade desse diretório para o minio-user também:

      • sudo chown minio-user:minio-user /etc/minio

      Use o Nano ou seu editor de texto favorito para criar o arquivo de ambiente necessário para modificar a configuração padrão:

      • sudo nano /etc/default/minio

      Depois que o arquivo estiver aberto, adicione as seguintes linhas para definir algumas variáveis de ambiente importantes no seu arquivo de ambiente:

      /etc/default/minio

      MINIO_ACCESS_KEY="minio"
      MINIO_VOLUMES="/usr/local/share/minio/"
      MINIO_OPTS="-C /etc/minio --address ip_do_seu_servidor:9000"
      MINIO_SECRET_KEY="miniostorage"
      

      Vamos dar uma olhada nessas variáveis e nos valores que você define:

      • MINIO_ACCESS_KEY: Isso define a access key que você usará para acessar a interface web de usuário do Minio.
      • MINIO_SECRET_KEY: Isso define a chave privada que você usará para completar suas credenciais de login na interface do Minio. Este tutorial configurou o valor para miniostorage, mas recomendamos que você escolha uma senha diferente e mais complexa para proteger seu servidor.
      • MINIO_VOLUMES: Isso identifica o diretório de armazenamento que você criou para seus buckets.
      • MINIO_OPTS: Isso muda onde e como o servidor serve os dados. A flag -C aponta o Minio para o diretório de configuração que ele deve usar, enquanto a flag --address informa ao Minio o endereço IP e a porta na qual se conectar. Se o endereço IP não for especificado, o Minio será vinculado a todos os endereços configurados no servidor, incluindo localhost e quaisquer endereços IP relacionados ao Docker, portanto, é recomendável especificar diretamente o endereço IP aqui. A porta padrão 9000 pode ser alterada se você desejar.

      Por fim, salve e feche o arquivo de ambiente quando terminar de fazer as alterações.

      Agora você instalou o Minio e definiu algumas variáveis de ambiente importantes. Em seguida, você configurará o servidor para ser executado como um serviço do sistema.

      Passo 2 — Instalando o Script de Inicialização Systemd do Minio

      Neste passo, você configurará o servidor Minio para ser gerenciado como um serviço systemd.

      Primeiro, faça o download do arquivo descritor de serviço oficial do Minio usando o seguinte comando.

      • curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service

      Você receberá uma saída semelhante à seguinte:

      Output

      % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 835 100 835 0 0 6139 0 --:--:-- --:--:-- --:--:-- 6139

      Após o término do download, um arquivo chamado minio.service estará no seu diretório de trabalho.

      Para auditar o conteúdo do arquivo minio.service antes de aplicá-lo, abra-o em um editor de texto para visualizar seu conteúdo:

      Isso mostrará o seguinte:

      /etc/systemd/system/minio.service

      [Unit]
      Description=MinIO
      Documentation=https://docs.min.io
      Wants=network-online.target
      After=network-online.target
      AssertFileIsExecutable=/usr/local/bin/minio
      
      [Service]
      WorkingDirectory=/usr/local/
      
      User=minio-user
      Group=minio-user
      
      EnvironmentFile=/etc/default/minio
      ExecStartPre=/bin/bash -c "if [ -z "${MINIO_VOLUMES}" ]; then echo "Variable MINIO_VOLUMES not set in /etc/default/minio"; exit 1; fi"
      
      ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
      
      # Let systemd restart this service always
      Restart=always
      
      # Specifies the maximum file descriptor number that can be opened by this process
      LimitNOFILE=65536
      
      # Disable timeout logic and wait until process is stopped
      TimeoutStopSec=infinity
      SendSIGKILL=no
      
      [Install]
      WantedBy=multi-user.target
      
      # Built for ${project.name}-${project.version} (${project.name})
      

      Este arquivo de unidade de serviço inicia o servidor Minio usando o usuário minio-user que você criou anteriormente. Ele também implementa as variáveis de ambiente definidas no último passo e faz o servidor executar automaticamente na inicialização. Para mais informações sobre arquivos de unidades do systemd, consulte nosso guia Understanding Systemd Units and Unit Files.

      Depois de examinar o conteúdo do script, feche o seu editor de texto.

      O Systemd requer que os arquivos de unidade sejam armazenados no diretório de configuração systemd, então mova o minio.service para lá:

      • sudo mv minio.service /etc/systemd/system

      Em seguida, execute o seguinte comando para recarregar todas as unidades systemd:

      • sudo systemctl daemon-reload

      Por fim, habilite o Minio para iniciar na inicialização:

      • sudo systemctl enable minio

      Isso dará a seguinte saída:

      Output

      Created symlink from /etc/systemd/system/multi-user.target.wants/minio.service to /etc/systemd/system/minio.service.

      Agora que o script systemd está instalado e configurado, é hora de iniciar o servidor.

      Passo 3 — Iniciando o Servidor Minio

      Neste passo, você iniciará o servidor e modificará o firewall para permitir o acesso através da interface web.

      Primeiro, inicie o servidor Minio:

      • sudo systemctl start minio

      Em seguida, verifique o status do Minio, o endereço IP ao qual está vinculado, seu uso de memória e muito mais executando este comando:

      • sudo systemctl status minio

      Você obterá a seguinte saída:

      Output

      ● minio.service - MinIO Loaded: loaded (/etc/systemd/system/minio.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2019-12-09 21:54:02 UTC; 46s ago Docs: https://docs.min.io Process: 3405 ExecStartPre=/bin/bash -c if [ -z "${MINIO_VOLUMES}" ]; then echo "Variable MINIO_VOLUMES not set in /etc/default/minio"; exit 1; fi (code=exited, status=0/SUCCES Main PID: 3407 (minio) Tasks: 7 (limit: 1152) CGroup: /system.slice/minio.service └─3407 /usr/local/bin/minio server -C /etc/minio --address your_server_IP:9000 /usr/local/share/minio/ Dec 09 21:54:02 cart-Minion-Object-1804-1 systemd[1]: Started MinIO. Dec 09 21:54:03 cart-Minion-Object-1804-1 minio[3407]: Endpoint: http://your_server_IP:9000 Dec 09 21:54:03 cart-Minion-Object-1804-1 minio[3407]: Browser Access: Dec 09 21:54:03 cart-Minion-Object-1804-1 minio[3407]: http://your_server_IP:9000 ...

      Em seguida, habilite o acesso através do firewall ao servidor Minio na porta configurada. Neste tutorial, essa é a porta 9000.

      Primeiro adicione a regra:

      Em seguida, ative o firewall:

      Você receberá o seguinte prompt:

      Output

      Command may disrupt existing ssh connections. Proceed with operation (y|n)?

      Pressione y e ENTER para confirmar. Você obterá a seguinte saída:

      Output

      Firewall is active and enabled on system startup

      O Minio agora está pronto para aceitar tráfego, mas antes de se conectar ao servidor, você protegerá a comunicação instalando um certificado SSL/TLS.

      Neste passo, você protegerá o acesso ao seu servidor Minio usando uma chave privada e um certificado público que foram obtidos de uma autoridade de certificação (CA), neste caso Let’s Encrypt. Para obter um certificado SSL gratuito, você usará o Certbot.

      Primeiro, permita o acesso HTTP e HTTPS através do seu firewall. Para fazer isso, abra a porta 80, que é a porta para HTTP:

      Em seguida, abra a porta 443 para HTTPS:

      Depois de adicionar essas regras, verifique o status do seu firewall com o seguinte comando:

      Você receberá uma saída semelhante à seguinte:

      Output

      Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22/tcp (OpenSSH) ALLOW IN Anywhere 9000 ALLOW IN Anywhere 443 ALLOW IN Anywhere 80 ALLOW IN Anywhere 22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6) 9000 (v6) ALLOW IN Anywhere (v6) 443 (v6) ALLOW IN Anywhere (v6) 80 (v6) ALLOW IN Anywhere (v6)

      Isso confirma que as portas 80 e 443 estão abertas, garantindo que o servidor aceite solicitações da Internet.

      Em seguida, você instalará o Certbot. Como o Certbot mantém um repositório PPA separado, você primeiro precisará adicioná-lo à sua lista de repositórios antes de instalar o Certbot, como mostrado:

      Para se preparar para adicionar o repositório PPA, primeiro instale software-properties-common, um pacote para o gerenciamento de PPAs:

      • sudo apt install software-properties-common

      Este pacote fornece alguns scripts úteis para adicionar e remover PPAs em vez de fazê-lo manualmente.

      Agora adicione o repositório Universe:

      • sudo add-apt-repository universe

      Este repositório contém software livre e de código aberto mantido pela comunidade Ubuntu, mas não é oficialmente mantido pela Canonical, os desenvolvedores do Ubuntu. É aqui que encontraremos o repositório do Certbot.

      Em seguida, adicione o repositório do Certbot:

      • sudo add-apt-repository ppa:certbot/certbot

      Você receberá a seguinte saída:

      Output

      This is the PPA for packages prepared by Debian Let's Encrypt Team and backported for Ubuntu(s). More info: https://launchpad.net/~certbot/+archive/ubuntu/certbot Press [ENTER] to continue or ctrl-c to cancel adding it

      Pressione ENTER para aceitar.

      Atualize a lista de pacotes:

      Finalmente, instale o certbot:

      Em seguida, você usará o certbot para gerar um novo certificado SSL.

      Como o Ubuntu 18.04 ainda não suporta a instalação automática, você usará o comando certonly e --standalone para obter o certificado:

      • sudo certbot certonly --standalone -d minio-server.seu_domínio

      --standalone significa que este certificado é para um servidor web interno independente. Para mais informações sobre isso, consulte nosso tutorial How To Use Certbot Standalone Mode to Retrieve Let’s Encrypt SSL Certificates on Ubuntu 18.04.

      Você receberá a seguinte saída:

      Output

      Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator standalone, Installer None Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):

      Adicione seu email e pressione ENTER.

      O Certbot solicitará que você se registre no Let’s Encrypt:

      Output

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (A)gree/(C)ancel:

      Digite A e pressione ENTER para concordar.

      Em seguida, você será perguntado se deseja compartilhar seu e-mail com a Electronic Frontier Foundation:

      Output

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o:

      Depois de responder Y ou N, suas chaves públicas e privadas serão geradas e salvas no diretório /etc/letsencrypt/live/minio-server.seu_domínio.

      Em seguida, copie esses dois arquivos (privkey.pem e fullchain.pem) para o diretório certs na pasta de configuração do servidor Minio, que é /etc/minio para este tutorial. Use o seguinte para copiar privkey.pem e renomear o arquivo private.key:

      • sudo cp /etc/letsencrypt/live/minio-server.seu_domínio/privkey.pem /etc/minio/certs/private.key

      Em seguida, faça o mesmo para fullchain.pem, nomeando o resultado como public.crt:

      • sudo cp /etc/letsencrypt/live/minio-server.seu_domínio/fullchain.pem /etc/minio/certs/public.crt

      Agora, altere a propriedade dos arquivos para minio-user. Primeiro, faça isso para private.key:

      • sudo chown minio-user:minio-user /etc/minio/certs/private.key

      Em seguida, public.crt:

      • sudo chown minio-user:minio-user /etc/minio/certs/public.crt

      Reinicie o servidor Minio, para que ele fique ciente do certificado e comece a usar HTTPS:

      • sudo systemctl restart minio

      Os certificados Let’s Encrypt são válidos apenas por noventa dias. Isso é para incentivar os usuários a automatizar seu processo de renovação de certificado. O pacote Certbot que você instalou adiciona automaticamente um script novo ao /etc/cron.d. Esse script é executado duas vezes por dia e renova automaticamente qualquer certificado que esteja dentro de trinta dias da expiração.

      Com isso, a conexão do Minio agora está segura e o certificado SSL/TLS será renovado automaticamente para você. No próximo passo, você se conectará ao Minio através do navegador para usar o servidor.

      Passo 5 — Conexão Segura à Interface Web do Minio Usando HTTPS

      Neste passo, você se conectará com segurança à interface web do Minio via HTTPS e, em seguida, criará buckets e fará o upload de objetos para eles.

      Acesse a interface web apontando o navegador para https://minio-server.seu_domínio:9000.

      Você verá a tela de login do servidor Minio:

      Minio login screen

      Agora, faça login na interface principal inserindo suas credenciais. Para Access Key, digite a MINIO_ACCESS_KEY que você definiu no arquivo de ambiente /etc/default/minio no Passo 1. Para Secret Key, digite a MINIO_SECRET_KEY que você definiu nesse mesmo arquivo. Depois de inserir as credenciais, clique no botão redondo com a seta, diretamente abaixo dos campos de entrada.

      Você será apresentado à interface de usuário do Minio. Para criar um novo bucket no qual você pode armazenar objetos, clique no botão vermelho claro + no canto inferior direito da interface principal para exibir dois botões amarelos adicionais.

      Minio's main interface

      Clique no botão amarelo do meio e digite um nome para o seu novo bucket no prompt, pressionando a tecla ENTER para salvar sua resposta. Seu novo bucket está pronto para ser usado para armazenamento.

      Nota: Ao nomear seu bucket no Minio, verifique se o seu nome contém apenas letras minúsculas, números ou hífens. O Minio limita as convenções de nomenclatura de buckets para ser compatível com os padrões do AWS S3.

      Quando você quiser adicionar objetos ao seu bucket, clique no mesmo botão vermelho claro de antes e clique no botão amarelo superior para abrir um prompt de upload de arquivo.

      Neste ponto, você trabalhou em toda a interface web básica para criar buckets e fazer upload de objetos.

      Conclusão

      Agora você tem seu próprio servidor Minio de armazenamento de objetos ao qual pode se conectar com segurança a partir da interface web usando um certificado Let’s Encrypt SSL/TLS. Opcionalmente, você pode querer olhar para o Minio desktop clients para FreeBSD, Linux, Mac, e Windows como uma maneira alternativa de usar e administrar seu servidor de armazenamento de objetos.

      Além disso, se você quiser aumentar a capacidade de armazenamento da sua instalação do Minio para além do tamanho do disco do servidor, use o Serviço de armazenamento em bloco da DigitalOcean para anexar um volume ao seu servidor, estendendo a capacidade de armazenamento em até 80 TB.

      Mais informações sobre o Minio estão disponíveis no site de documentação do projeto. Se você quiser saber mais sobre armazenamento de objetos, navegue em Tutoriais sobre armazenamento de objetos.



      Source link

      Serviços de Armazenamento de Objetos versus Armazenamento em Blocos


      Introdução

      O armazenamento de dados flexível e escalável é um requisito básico para a maioria dos aplicativos e serviços que estão sendo desenvolvidos com técnicas e ferramentas modernas. Seja armazenando grandes ou pequenas quantidades de imagens, vídeos ou pequenos blocos de texto, os desenvolvedores de aplicativos precisam de uma solução para o armazenamento e a recuperação do conteúdo gerado por usuários, logs, backups e assim por diante.

      Com os deployments complexos atuais, containers, e infraestrutura efêmera, os dias de simplesmente salvar arquivos no disco em um único servidor acabaram. Provedores de nuvem desenvolveram serviços para preencher as necessidades de armazenamento dos deployments de aplicações modernas, e eles se encaixam principalmente em duas categorias: armazenamento de objetos e armazenamento em blocos.

      Vamos dar uma olhada em ambos e discutir as vantagens, desvantagens e casos de uso para cada um.

      O que é o Armazenamento em Blocos

      Os serviços de armazenamento em blocos ou block storage são relativamente simples e familiares. Eles fornecem um dispositivo de armazenamento em blocos tradicional — como um disco rígido — através da rede. Os provedores de nuvem geralmente têm produtos que podem provisionar um dispositivo de armazenamento em blocos de qualquer tamanho e anexá-lo à sua máquina virtual.

      A partir disso, você poderia tratá-lo como um disco normal. Você pode formatá-lo com um sistema de arquivos e armazenar arquivos nele, combinar vários dispositivos em um RAID, ou configurar um banco de dados para gravar diretamente no dispositivo de blocos, evitando completamente a sobrecarga do sistema de arquivos. Além disso, os dispositivos de armazenamento em blocos conectados à rede geralmente têm algumas vantagens exclusivas em relação aos discos rígidos normais:

      • Você pode tirar snapshots ou instantâneos ao vivo de todo o dispositivo para fins de backup
      • Dispositivos de armazenamento em blocos podem ser redimensionados para acomodar as necessidades de crescimento
      • Você pode facilmente desanexar e mover dispositivos de armazenamento em blocos entre as máquinas

      Esta é uma configuração muito flexível que pode ser útil para a maioria dos aplicativos de qualquer tipo. Vamos resumir algumas vantagens e desvantagens da tecnologia.

      Algumas vantagens do armazenamento em blocos são:

      • O Armazenamento em blocos é um paradigma familiar. Pessoas e softwares entendem e suportam arquivos e sistemas de arquivos quase que universalmente
      • Dispositivos de blocos são bem suportados. Toda linguagem de programação pode ler e gravar arquivos facilmente
      • Permissões de sistema de arquivos e controles de acesso são familiares e bem entendidos
      • Os dispositivos de armazenamento em bloco fornecem I/O de baixa latência, sendo então, adequados para uso por bancos de dados.

      As desvantagens do armazenamento em blocos são:

      • O armazenamento em blocos está ligado a um servidor de cada vez
      • Blocos e sistemas de arquivos tem metadados limitados sobre os blobs de informações que eles estão armazenando (data da criação, proprietário, tamanho). Qualquer informação adicional sobre o que você está armazenando tem que ser tratada no nível da aplicação e do banco de dados, o que é uma complexidade adicional para um desenvolvedor se preocupar
      • Você precisa pagar por todo o espaço de armazenamento em blocos que você alocou, mesmo que você não o esteja usando
      • Você só pode acessar o armazenamento em blocos através de um servidor em execução
      • O armazenamento em blocos precisa de mais trabalho e configuração manual se comparado ao armazenamento de objetos (escolha de sistemas de arquivos, permissões, versionamento, backups, etc).

      Devido às suas características de I/O rápida, os serviços de armazenamento em blocos são adequados para armazenar dados em bancos de dados tradicionais. Além disso, muitos aplicativos legados que exigem armazenamento normal do sistema de arquivos precisarão usar um dispositivo de armazenamento em blocos.

      Se o seu provedor de nuvem não oferece um serviço de armazenamento em blocos, você pode executar o seu próprio serviço usando OpenStack Cinder, Ceph, ou o serviço iSCSI integrado disponível em muitos dispositivos NAS.

      O que é o Armazenamento de Objetos

      No mundo moderno da computação em nuvem, o armazenamento de objetos ou object storage é o armazenamento e a recuperação de blobs (grandes objetos binários) não estruturados de dados e metadados utilizando uma API HTTP. Em vez da quebra dos arquivos em blocos para armazená-los em disco usando um sistema de arquivos, lidamos com objetos inteiros armazenados na rede. Esses objetos podem ser um arquivo de imagem, logs, arquivos HTML ou qualquer bloco de bytes auto contido. Eles são não estruturados porque não há um esquema ou formato específico que eles precisem seguir.

      O Armazenamento de Objetos decolou porque simplificou muito a experiência do desenvolvedor. Como a API consiste de solicitações HTTP padrão, bibliotecas são rapidamente desenvolvidas para a maioria das linguagens de programação. O salvamento de um blob de dados tornou-se tão fácil quanto uma solicitação HTTP PUT ao object store. A recuperação de arquivo e metadados é uma solicitação GET normal. Além disso, a maioria dos serviços de armazenamento de objetos também pode servir os arquivos publicamente para seus usuários, eliminando a necessidade de manter um servidor web para hospedar recursos estáticos.

      Além do mais, os serviços de armazenamento de objetos cobram apenas pelo espaço de armazenamento que você usa (alguns também cobram por solicitação HTTP e por largura de banda de transferência). Isso é um benefício para pequenos desenvolvedores, que podem obter armazenamento de classe mundial e hospedagem de recursos a custos que aumentam com o uso.

      Entretanto, o armazenamento de objetos não é a solução ideal para todas as situações. Vamos olhar um resumo dos benefícios e desvantagens.

      Algumas vantagens do armazenamento de objetos são:

      • Uma API HTTP simples, com clientes disponíveis para todos os principais sistemas operacionais e linguagens de programação
      • Uma estrutura de custos na qual que você paga apenas pelo que usa
      • Um serviço interno de publicação de recursos significando um servidor a menos que você precisa gerenciar
      • Alguns provedores armazenamento de objetos oferecem integração com CDN, que armazena seus recursos em cache em todo o mundo para fazer downloads e carregamentos de página mais rápidos para seus usuários
      • O versionamento opcional significa que você pode recuperar versões antigas de objetos para se proteger da sobrescrita acidental de dados
      • Os serviços de armazenamento de objetos podem escalar facilmente de necessidades modestas para casos de uso realmente intensos, sem que o desenvolvedor tenha que lançar mais recursos ou rearquitetar a aplicação para lidar com a carga
      • Usar um serviço de armazenamento de objetos significa que você não precisa manter discos rígidos e matrizes RAID, pois isso é feito pelo provedor de serviços.
      • A capacidade de armazenar trechos de metadados junto com seu blob de dados pode simplificar ainda mais a arquitetura do seu aplicativo

      Algumas desvantagens do armazenamento de objetos são:

      • Você não pode utilizar serviços de armazenamento de objetos para manter um banco de dados tradicional, devido à alta latência desses serviços
      • O armazenamento de objetos não permite que você altere apenas um fragmento de dados, você deve ler e escrever um objeto inteiro de uma só vez. Por exemplo, em um sistema de arquivos, você pode facilmente adicionar uma única linha ao final de um arquivo de log. Em um sistema de armazenamento de objetos, você precisaria recuperar o objeto, adicionar a nova linha e gravar todo o objeto de volta. Isso torna o armazenamento de objetos menos ideal para dados que mudam com muita frequência
      • Sistemas operacionais não podem montar facilmente um armazenamento de objetos como um disco normal. Existem alguns clientes e adaptadores para ajudar nisso, mas em geral, usar e navegar em um armazenamento de objetos não é tão simples quanto folhear diretórios em um navegador de arquivos

      Devido a essas propriedades, o armazenamento de objetos é útil para hospedar recursos estáticos, salvamento de conteúdo criado por usuários tais como imagens e filmes, armazenamento de arquivos de backup, armazenamento de logs, por exemplo.

      Existem algumas soluções de armazenamento de objetos que você pode hospedar, embora você tenha que abrir mão de alguns dos benefícios de uma solução hospedada (como não ter que se preocupar com discos rígidos e problemas de dimensionamento). Você pode experimentar o Minio, um popular servidor de armazenamento de objetos escrito na linguagem Go, o Ceph, ou o OpenStack Swift.

      Conclusão

      A escolha de uma solução de armazenamento pode ser uma decisão complexa para desenvolvedores. Neste artigo discutimos as vantagens e desvantagens tanto dos serviços de armazenamento em blocos quanto dos serviços de armazenamento de objetos. É provável que qualquer aplicativo suficientemente complexo precisará dos dois tipos de armazenamento para atender a todas as suas necessidades.



      Source link