# Galera Cluster: configurar um cluster MariaDB no Ubuntu 20.04

Configurar um cluster **MariaDB com Galera Cluster** melhora a confiabilidade e facilita o escalonamento do seu banco de dados. A seguir, mostramos como instalar um Galera Cluster no Ubuntu 20.04.

## Galera Cluster MariaDB: pré-requisitos

Para instalar um Galera Cluster no MariaDB no **Ubuntu 20.04**, você deve cumprir os seguintes requisitos:

- **Vários servidores**: precisa de pelo menos três servidores ou máquinas virtuais para criar um cluster. Todos os servidores devem estar na mesma rede.
- **Permissões de root**: você precisa ter acesso root ou, pelo menos, permissões de administrador nos servidores.

## Guia passo a passo: configurar um Galera Cluster MariaDB no Ubuntu 20.04

Um Galera Cluster do MariaDB é uma **solução** prática **de base de dados** que melhora a disponibilidade, a integridade dos dados e a escalabilidade para aplicações exigentes. Acompanhamos você no processo de configuração de um Galera Cluster do MariaDB no Ubuntu 20.04. Antes de começar, certifique-se de que tem pelo menos três servidores ou máquinas virtuais disponíveis para configurar o cluster.

### Passo 1: atualize os pacotes

É essencial que primeiro atualize o seu sistema Ubuntu para a versão mais recente, para garantir que possui **os pacotes e as atualizações de segurança mais recentes**.

Abra um terminal e execute o seguinte comando para atualizar as fontes dos pacotes:

```shell
sudo apt update
```

Instale todas as atualizações disponíveis:

```shell
sudo apt upgrade -y
```

Também é recomendável eliminar **pacotes obsoletos ou não utilizados** para limpar os servidores:

```shell
sudo apt autoremove -y
```

### Passo 2: instale o MariaDB nos servidores

Agora instale o MariaDB em cada um dos seus servidores. A partir da **versão 10.1**, os pacotes Galera estão incluídos nos servidores MariaDB.

```shell
sudo apt install mariadb-server
```

Após a instalação, inicie o serviço MariaDB:

```shell
sudo systemctl start mariadb
```

Execute o seguinte comando para que o MariaDB seja ativado automaticamente sempre que o sistema for reiniciado:

```shell
sudo systemctl enable mariadb
```

Verifique se o MariaDB está a ser executado:

```shell
sudo systemctl status mariadb
```

Faça alguns ajustes básicos de segurança e configure a base de dados. Para isso, inicie o **assistente de configuração**:

```shell
sudo mysql_secure_installation
```

O assistente irá guiá-lo através dos passos necessários, como definir uma palavra-passe root, eliminar utilizadores anónimos ou eliminar a base de dados de teste.

```shell
Enter current password for root (enter for none): 
Switch to unix_socket authentication [Y/n] n
Change the root password? [Y/n] Y
New password:
Re-enter new password:
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
```

O script solicita primeiro a **senha root** atual. Se for a primeira vez que [instala o MariaDB no Ubuntu 20.04](https://www.ionos.com/pt-pt/digitalguide/hospedagem/questoes-tecnicas/instalacao-do-mariadb-no-ubuntu-2004/), basta pressionar a tecla Enter e introduzir uma nova senha.

### Passo 3: configure os nós do Galera Cluster no MariaDB

Crie um ficheiro `cnf` no diretório `/etc/mysql/conf.d` de cada nó para definir a configuração específica do Galera.

```shell
nano /etc/mysql/conf.d/galera.cnf
```

O ficheiro contém a configuração geral da base de dados, como o formato do protocolo binário e o **motor de armazenamento predefinido**. Também contém configurações para o Galera Cluster, incluindo o nome do cluster e o endereço do cluster.

Introduza as seguintes linhas no primeiro nó:

```shell
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Configuración del proveedor de Galera
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Configuración del Galera Cluster
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://node_1-ip-address,node_2-ip-address,node_3-ip-address"
# Configuración de sincronización de Galera
wsrep_sst_method=rsync
# Configuración del nodo de Galera
wsrep_node_address="node_1-ip-address"
wsrep_node_name="node_1"
```

- **Configuração geral da base de dados**: inclui configurações como `binlog_format=ROW` para o formato de registo binário e `default-storage-engine=innodb` para o motor de armazenamento predefinido.
- **Configuração do fornecedor Galera**: configurações como `wsrep_on=ON` para ativar a replicação Galera e `wsrep_provider=/usr/lib/galera/libgalera_smm.so` para especificar o caminho para a biblioteca Galera.
- **Configuração do Galera Cluster**: inclui o nome do cluster (`wsrep_cluster_name`) e o endereço do cluster (`wsrep_cluster_address`), que contém os endereços IP ou os nomes dos hosts dos nós do cluster.
- **Configuração de sincronização do Galera**: configura o método para a transferência de instantâneos de estado (State Snapshot Transfer, SST), por exemplo, `wsrep_sst_method=rsync`.
- **Configuração do nó Galera**: define o endereço IP ou o nome do host do nó atual (`wsrep_node_address`) e o nome do nó (`wsrep_node_name`).

Depois de guardar o ficheiro, crie um para o segundo nó:

```shell
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Configuración del proveedor de Galera
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Configuración del Galera Cluster
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://node_1-ip-address,node_2-ip-address,node_3-ip-address"
# Configuración de sincronización de Galera
wsrep_sst_method=rsync
# Configuración del nodo de Galera
wsrep_node_address="node_2-ip-address"
wsrep_node_name="node_2"
```

Agora faça o mesmo com o último nó:

```shell
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Configuración del proveedor de Galera
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Configuración del Galera Cluster
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://node_1-ip-address,node_2-ip-address,node_3-ip-address"
# Configuración de sincronización de Galera
wsrep_sst_method=rsync
# Configuración del nodo de Galera
wsrep_node_address="node_3-ip-address"
wsrep_node_name="node_3"
```

### Passo 4: modifique a firewall nos servidores

Como os nós comunicam entre si através de determinadas portas, é necessário ajustar a **configuração do firewall**.

Abra as seguintes **portas** no seu firewall:

- **Porta 3306**: é a porta padrão do MariaDB. É utilizada para comunicar com a base de dados e realizar pedidos.
- **Portas do Galera**: além da porta padrão 3306, o Galera também utiliza outras portas para a comunicação interna entre os nós. As portas padrão do Galera são geralmente 4567, 4568 e 4444 para a transferência de instantâneos de estado (State Snapshot Transfer, SST).

Configure as regras do firewall no seu servidor Ubuntu com o seguinte comando:

```shell
sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp
```

### Passo 5: inicie o Galera Cluster no MariaDB

Pare o serviço MariaDB se já estiver em execução:

```shell
sudo systemctl stop mariadb
```

O comando seguinte inicia o **servidor MariaDB** e cria um novo Galera Cluster no primeiro nó:

```shell
sudo galera_new_cluster
```

Verifique o número de nós no cluster:

```shell
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
```

Deve obter o seguinte resultado:

```shell
+---------------------------+-------------+
| Variable_name        | Value       |
+--------------------------+--------------+
| wsrep_cluster_size | 1              |
+--------------------------+------------ -+
```

O primeiro nó foi iniciado corretamente.

Ative o segundo nó:

```shell
systemctl start mariadb
```

Verifique se o número de nós aumentou:

```shell
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
```

Na consola, verá o seguinte:

```shell
+---------------------------+-------------+
| Variable_name        | Value       |
+--------------------------+--------------+
| wsrep_cluster_size | 2               |
+--------------------------+--------------+
```

Agora começa o terceiro nó:

```shell
systemctl start mariadb
```

Verifique se o nó está a funcionar corretamente:

```shell
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
```

Agora deve haver três nós no cluster:

```shell
+---------------------------+-------------+
| Variable_name        | Value       |
+--------------------------+--------------+
| wsrep_cluster_size | 3              |
+--------------------------+------------ -+
```

### Passo 6: teste a replicação

Certifique-se de que consegue ligar-se a cada um dos nós do cluster. Utilize o **cliente MariaDB** para iniciar sessão como utilizador root ou como outro utilizador com permissões suficientes.

```shell
mysql -u root -p
```

Crie um novo banco de dados de teste (test\_db) num dos nós do cluster:

```sql
CREATE DATABASE test_db;
```

Inicie sessão nos outros nós e verifique se a base de dados de teste existe:

```sql
SHOW DATABASES;
```

A base de dados de teste deve aparecer na lista de bases de dados:

```sql
+-------------------------------+
| Database                        |
+-------------------------------+
| information_schema   |
| mysql                              |
| performance_schema |
| test_db                          | 
| sys                                  |
+------------------------------+
```

Adicione uma nova tabela de teste (test\_table) à base de dados de teste (test\_db):

```sql
USE test_db;
CREATE TABLE test_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50)
);
```

Introduza alguns dados de teste na coluna `name` da tabela de teste:

```sql
INSERT INTO test_table (name) VALUES ('Alicia'), ('Juan'), ('Carlos');
```

Verifique nos outros nós se a tabela de teste e os dados introduzidos foram replicados:

```sql
USE test_db;
SELECT * FROM test_table;
```

O resultado mostra a lista de pessoas com os seus nomes e ID:

```sql
+----+-----------+
| id | name    |
+----+-----------+
| 1  | Alicia     |
| 2  | Juan       |
| 3  | Carlos |
+----+----------+
```

Assim, pode modificar um registo de dados na tabela de teste:

```sql
UPDATE test_table SET name = 'David' WHERE name = 'Alicia';
```

Tente eliminar um registo de dados:

```sql
DELETE FROM test_table WHERE name = 'Juan';
```

Verifique nos outros nós se as modificações e eliminações foram replicadas:

```sql
SELECT * FROM test_table;
```

As alterações aparecem corretamente em cada nó:

```sql
+----+------------+
| id | name     |
+----+-----------+
| 1  | David    |
| 3  | Carlos  |
+----+-----------+
```


This is a markdown version of: [https://www.ionos.com/pt-pt/digitalguide/hospedagem/questoes-tecnicas/galera-cluster-mariadb-no-ubuntu-2004/](https://www.ionos.com/pt-pt/digitalguide/hospedagem/questoes-tecnicas/galera-cluster-mariadb-no-ubuntu-2004/) for AI/LLM consumption.