Utilisation de Galera lors d’un projet étudiant pour assurer un service de base de données redondant.

Morbi vitae purus dictum, ultrices tellus in, gravida lectus.

AUTEUR

Alexis Huellou

CATEGORIE

BDD

POSTE LE

07/11/2023

Pour déployer le cluster Galera lors d’un projet étudiant, j’ai utilisé Ansible et je l’ai également couplé à 2 Load-Balancer permettant d’accéder à une base de données via une VIP et assurer une redondance.

Création du playbook ansible : 

---
- name: Deploy Galera on Ubuntu 22.04
  hosts: all
  become: yes
  tasks:
    - name: Install dirmngr and software-properties-common
      apt:
        name: [dirmngr, software-properties-common]
        state: present

    - name: Add the MariaDB GPG key
      shell: "apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8"

    - name: Update APT cache
      apt:
        update_cache: yes

    - name: Install mariadb-server
      apt:
        name: mariadb-server
        state: present

    - name: Set MariaDB root password
      shell: "mysql -uroot -p'PASSWORD' -e 'SET PASSWORD = PASSWORD(\"PASSWORD");'"

    - name: Install rsync
      apt:
        name: rsync
        state: present

    - name: Create or update galera.cnf
      template:
        src: galera.cnf.j2
        dest: /etc/mysql/conf.d/galera.cnf
        owner: root
        group: root
        mode: 0644
      vars:
        wsrep_node_address: "{{ ansible_host }}"
        wsrep_node_name: "{{ inventory_hostname }}"

- name: Setup first Galera host
  hosts: first_host
  become: yes
  tasks:
    - name: Stop MariaDB service
      systemd:
        name: mariadb
        state: stopped

    - name: Initialize Galera cluster
      command: galera_new_cluster

- name: Setup other Galera hosts
  hosts: other_hosts
  become: yes
  tasks:
    - name: Restart MariaDB service
      systemd:
        name: mariadb
        state: restarted

Création du fichier de template Jinja2 : 

[mysqld]
binlog_format=ROW
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so

# Galera Cluster Configuration
wsrep_cluster_name="igepargalera01p"
wsrep_cluster_address="gcomm://172.31.8.71,172.31.8.72,172.31.8.73"

# Galera Synchronization Configuration
wsrep_sst_method=rsync

# Galera Node Configuration
wsrep_node_address="{{ wsrep_node_address }}"
wsrep_node_name="{{ wsrep_node_name }}"

Ce fichier permet d’avoir la même configuration sur les 3 hôtes de base de données selon les variables du playbook. En utilisant notre propre template, nous évitons les risques de configuration erronées et avons un fichier propre et uniforme entre tous les noeuds.

Fichier d’inventaire :

[first_host]
igepardb01p ansible_host=172.31.8.71 ansible_user=indio

[other_hosts]
igepardb02p ansible_host=172.31.8.72 ansible_user=indio
igepardb03p ansible_host=172.31.8.73 ansible_user=indio

De ce fait, nous pouvons executer notre playbook et laisser la configuration du cluster Galera se faire seul.

ansible-playbook -i inventory.ini deploy-galera.yml --ask-become-pass