Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Card #11 #3

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions assets/garage/compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
services:
garage:
image: dxflrs/garage:v1.0.0
network_mode: "host"
restart: unless-stopped
volumes:
- ./garage.toml:/etc/garage.toml
- /var/lib/garage/meta:/var/lib/garage/meta
- /var/lib/garage/data:/var/lib/garage/data
23 changes: 23 additions & 0 deletions assets/garage/garage.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"
db_engine = "lmdb"
metadata_auto_snapshot_interval = "6h"

replication_factor = 3

compression_level = 2

rpc_bind_addr = "[::]:3901"
rpc_public_addr = "<IP-DO-SERVIDOR->:3901"
rpc_secret = "SECRET(DEVE SER O MESMO EM TODOS OS SERVIDORES)"


[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:3900"
root_domain = ".s3.garage"

[s3_web]
bind_addr = "[::]:3902"
root_domain = ".web.garage"
index = "index.html"
11 changes: 11 additions & 0 deletions assets/garage/garage/tasks/defaults/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
garage_config_dir: /etc/garage
garage_image: dxflrs/garage:v1.0.0
garage_rpc_port: 3901
garage_s3_port: 3900
garage_web_port: 3902
garage_rpc_secret: "changeme" # Deve ser alterado por um valor de 32 bits. Podes usar gerar um com o seguinte comando: openssl rand -hex 32
garage_public_ip: "{{ ansible_default_ipv4.address }}"
garage_replication_factor: 3
garage_compression_level: 2
garage_metadata_snapshot_interval: "6h"
garage_db_engine: "lmdb"
28 changes: 28 additions & 0 deletions assets/garage/garage/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
- name: Criando os diretórios
ansible.builtin.file:
path: "{{ item }}"
state: directory
mode: '0755'
loop:
- /var/lib/garage/meta
- /var/lib/garage/data
- "{{ garage_config_dir }}"

- name: Copiando a configuração do garage
ansible.builtin.template:
src: garage.toml.j2
dest: "{{ garage_config_dir }}/garage.toml"
mode: '0644'

- name: Copiando arquivo docker compose
ansible.builtin.template:
src: compose.yml.j2
dest: "{{ garage_config_dir }}/compose.yml"
mode: '0644'

- name: Iniciando serviço garage
community.docker.docker_compose_v2:
project_src: "{{ garage_config_dir }}"
pull: yes
state: present
9 changes: 9 additions & 0 deletions assets/garage/templates/compose.yml.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
services:
garage:
image: {{ garage_image }}
network_mode: "host"
restart: unless-stopped
volumes:
- ./garage.toml:/etc/garage.toml
- /var/lib/garage/meta:/var/lib/garage/meta
- /var/lib/garage/data:/var/lib/garage/data
22 changes: 22 additions & 0 deletions assets/garage/templates/garage.toml.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
metadata_dir = "/var/lib/garage/meta"
data_dir = "/var/lib/garage/data"
db_engine = "{{ garage_db_engine }}"
metadata_auto_snapshot_interval = "{{ garage_metadata_snapshot_interval }}"

replication_factor = {{ garage_replication_factor }}

compression_level = {{ garage_compression_level }}

rpc_bind_addr = "[::]:{{ garage_rpc_port }}"
rpc_public_addr = "{{ garage_public_ip }}:{{ garage_rpc_port }}"
rpc_secret = "{{ garage_rpc_secret }}"

[s3_api]
s3_region = "garage"
api_bind_addr = "[::]:{{ garage_s3_port }}"
root_domain = ".s3.garage"

[s3_web]
bind_addr = "[::]:{{ garage_web_port }}"
root_domain = ".web.garage"
index = "index.html"
171 changes: 171 additions & 0 deletions docs/arquivos-sync.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
# Sincronização de arquivos
- Uma ferramenta para sincronização dos arquivos deve ser adotada, de maneira a replicar os dados de um servidor para os demais participantes.
- Essa ferramenta deve: a) Detectar mudanças instantaneamente; b) Minimizar overhead de rede; c) Oferece ecanismos eficientes de transferência; d) Suportam delta-transfer (só enviam as partes modificadas); Entre outras.

- O que levar em conta ao escolher uma tecnologia de sincronização:
- Taxa de transferência
- IOPS
- Escalabilidade
- Resiliência
- Tempo de Recuperação e Plano de recuperação em desastres
- Estratégias de replicação
- Overhead
- Replicação Geográfica

## Ferramentas disponíveis
- Algumas ferramentas para sincronizar dados:

- [GlusterFS](https://www.gluster.org/)
- [RBD: https](https://linbit.com/drbd/)
- [Unison](https://github.com/bcpierce00/unison)
- [Lsyncd](https://lsyncd.github.io/lsyncd/)


- É possível configurar o Nextcloud para utilizar armazenamento em objeto como seu [primeiro armazenamento](https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/primary_storage.html#configuring-object-storage-as-primary-storage
), dispensando o uso de uma pasta localmente.
- Também é possível configurar [múltiplos buckets](https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/primary_storage.html#multibucket-object-store) a serem utilizado.

- A fazer: configurar duas ou mais instâncias para utilizar múltiplos buckets.
- Opções object storage:
- [Seaweedfs](https://github.com/seaweedfs/seaweedfs?tab=readme-ov-file#introduction)
- [Garage S3](https://garagehq.deuxfleurs.fr/)
- [MooseFS](https://github.com/moosefs/moosefs)


- Abaixo, uma tabela comparativa produzida por [Grey Skipwith, 2023](https://aaltodoc.aalto.fi/server/api/core/bitstreams/4b0dd60c-cba2-4c01-9972-3dafd81708a4/content)

| | Ceph | GlusterFS | HDFS |
|---|---|---|---|
| Arquitetura | Distribuída | Descentralizada | Centralizada |
| Gerenciamento de Metadados | Múltiplos MDSs | Sem MDS | Um MDS |
| Método de Armazenamento Subjacente | Baseado em Objeto | Baseado em Arquivo | Baseado em Bloco |
| Modelo de Escalabilidade | Horizontal | Horizontal | Horizontal |
| Caso de Uso Principal | Armazenamento Unificado | Sistema de Arquivos | Armazenamento de Big Data |
| Interface de Armazenamento | Arquivo, Bloco, Objeto | Arquivo | Arquivo |



### Garage S3
- "Garage é um armazenamento de dados geodistribuído leve que implementa o protocolo de armazenamento de objetos Amazon S3. Ele permite que aplicativos armazenem grandes blobs, como fotos, vídeos, imagens, documentos, etc., em uma configuração redundante de vários nós. O S3 é versátil o suficiente para também ser usado para publicar um site estático"
- Características do GarageS3:
a) Habilitado para Internet: feito para vários sites (por exemplo, datacenters, escritórios, residências, etc.) interconectados por meio de conexões regulares de Internet.
b) Autocontido e leve: funciona em qualquer lugar e se integra bem em ambientes existentes para atingir infraestruturas hiperconvergentes.
c) Altamente resiliente: altamente resiliente a falhas de rede, latência de rede, falhas de disco, falhas de administrador de sistema.
d) Simples: simples de entender, simples de operar, simples de depurar.
e) Desempenhos extremos: altos desempenhos restringem muito o design e a infraestrutura; buscamos desempenhos apenas por meio do minimalismo.
f) Extensividade de recursos: não planejamos adicionar recursos adicionais em comparação aos fornecidos pela API S3.
g) Otimizações de armazenamento: codificação de apagamento ou qualquer outra técnica de codificação aumentam a dificuldade de colocar dados e sincronizar; nos limitamos à duplicação.
h) Compatibilidade POSIX/Sistema de arquivos: não pretendemos ser compatíveis com POSIX ou emular qualquer tipo de sistema de arquivos. De fato, em um ambiente distribuído, tais sincronizações são traduzidas em mensagens de rede que impõem restrições severas à implantação.

- Ponto negativo: não faz a checagem de integridade dos dados.

#### Configuração
1 - Copiar a

- Após fazer a instalação, configurar o cluster e adicionar uma chave de acesso ao bucket criado, configure os registros DNS.
- Por exemplo:
- Entrada 1: 20.180.0.10 -> garage.dominio.com.br.
- Entrada 2: 20.180.0.30 -> garage.dominio.com.br.
- Entrada 3: 20.180.0.60 -> garage.dominio.com.br.


### GlusterFS

- Os servidores usados ​​para criar o pool de armazenamento devem ser resolvíveis pelo nome do host.
- O daemon glusterd deve estar em execução em todos os servidores de armazenamento que você deseja adicionar ao pool de armazenamento. V
- O firewall nos servidores deve ser configurado para permitir acesso à porta 24007.

- No seu serviço de DNS, adicione as entradas para os servidores.

- No meu caso cenário:
```
server1.librecode.coop - 189.39.218.225
server2.librecode.coop - 177.92.115.140
server3.librecode.coop - 38.242.194.240
```

- Idealmente o diretório contendo os arquivos que serão sincronizados devem ficar em outro disco, separado do sistema operacional.

apt update
apt install glusterfs-server
systemctl start glusterd
systemctl enable glusterd

- No servidor 1:
gluster peer probe servidor2
gluster peer probe servidor3


- No servidor 2, com o comando `gluster peer status`:

```
# gluster peer status
Number of Peers: 2

Hostname: server1.librecode.coop
Uuid: fa9c3f27-0b60-4718-93bd-b54b79e84e66
State: Peer in Cluster (Connected)
Other names:
server1.librecode.coop

Hostname: server3.librecode.coop
Uuid: 3418bdcc-8f9d-4082-993b-121656fcea14
State: Peer in Cluster (Connected)

```
- No servidor 2:
gluster peer probe servidor1
gluster peer probe servidor3

- Em todos servidores, crie um volume a ser compartilhado:
`mkdir -p /data/brick1/gv0`


-
```
gluster volume create gv0 replica 3 server1.librecode.coop:/data/brick1/gv0 server2.librecode.coop:/data/brick1/gv0 server3.librecode.coop:/data/brick1/gv0 force
```
- Inicialize o volume
```
gluster volume start gv0
```

- Agora vamos precisar montar esse volume no servidor, seguindo essa sintaxe `mount.glusterfs <IP ou hostname>:<nome_do_volume> <ponto_de_montagem>`
- O IP ou hostname pode ser de qualquer servidor que esteja presente no cluster.

- No servidor1:
```
mkdir /mnt/gluster-test
mount.glusterfs server1.librecode.coop:/gv1 /mnt/gluster-test
```
- Vamos testar, criando arquivos no volume:
```
for i in `seq -w 1 100`; do cp -rp /var/log/dpkg.log /mnt/gluster-test/copy-test-$i; done
```

- Verificando se foram criados (essa pasta deve ser igual em todos servidores a partir de agora):
```
ls -lha /mnt/gluster-teste
```

#### Montando volumes automacamente
- Adicione ao /etc/fstab `HOSTNAME-OU-ENDEREÇOIP:/NOME-DO-VOLUME PONTO-DE-MONTAGEM glusterfs defaults,_netdev 0 0`:

```
server1.librecode.coop:/data/brick1/gv0 /mnt/gluster-test/ glusterfs defaults,_netdev 0 0
server2.librecode.coop:/data/brick1/gv0 /mnt/gluster-test/ glusterfs defaults,_netdev 0 0
server3.librecode.coop:/data/brick1/gv0 /mnt/gluster-test/ glusterfs defaults,_netdev 0 0
```


```
```
```
```
```
```
```
```
```
```
```