MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

Déploiement d'un Nextcloud hautement disponible avec MySQL Galera Cluster et GlusterFS

Nextcloud est une application open source de synchronisation et de partage de fichiers qui offre un stockage de fichiers cloud gratuit, sécurisé et facilement accessible, ainsi qu'un certain nombre d'outils qui étendent son ensemble de fonctionnalités. Il est très similaire aux populaires Dropbox, iCloud et Google Drive, mais contrairement à Dropbox, Nextcloud n'offre pas d'hébergement de stockage de fichiers hors site.

Dans cet article de blog, nous allons déployer une configuration à haute disponibilité pour notre infrastructure privée "Dropbox" utilisant Nextcloud, GlusterFS, Percona XtraDB Cluster (MySQL Galera Cluster), ProxySQL avec ClusterControl comme outil d'automatisation pour gérer et surveiller la base de données et les niveaux d'équilibrage de charge.

Remarque :Vous pouvez également utiliser MariaDB Cluster, qui utilise la même bibliothèque de réplication sous-jacente que dans Percona XtraDB Cluster. Du point de vue de l'équilibreur de charge, ProxySQL se comporte de la même manière que MaxScale en ce sens qu'il peut comprendre le trafic SQL et dispose d'un contrôle précis sur la manière dont le trafic est acheminé.

Architecture de base de données pour Nexcloud

Dans cet article de blog, nous avons utilisé un total de 6 nœuds.

  • 2 serveurs proxy 
  • 3 bases de données + serveurs d'applications
  • 1 x serveur contrôleur (ClusterControl)

Le schéma suivant illustre notre configuration finale :

Pour Percona XtraDB Cluster, un minimum de 3 nœuds est requis pour un solide réplication multi-maîtres. Les applications Nextcloud sont co-localisées dans les serveurs de base de données, donc GlusterFS doit également être configuré sur ces hôtes.

Le niveau d'équilibrage de charge se compose de 2 nœuds à des fins de redondance. Nous utiliserons ClusterControl pour déployer le niveau base de données et les niveaux équilibreur de charge. Tous les serveurs fonctionnent sur CentOS 7 avec la définition /etc/hosts suivante sur chaque nœud :

192.168.0.21 nextcloud1 db1

192.168.0.22 nextcloud2 db2

192.168.0.23 nextcloud3 db3

192.168.0.10 vip db

192.168.0.11 proxy1 lb1 proxysql1

192.168.0.12 proxy2 lb2 proxysql2

Notez que GlusterFS et MySQL sont des processus très intensifs. Si vous suivez cette configuration (GlusterFS et MySQL résident sur un seul serveur), assurez-vous d'avoir des spécifications matérielles correctes pour les serveurs.

Déploiement de la base de données Nextcloud

Nous commencerons par le déploiement de la base de données pour notre cluster Percona XtraDB à trois nœuds à l'aide de ClusterControl. Installez ClusterControl, puis configurez SSH sans mot de passe sur tous les nœuds qui seront gérés par ClusterControl (3 PXC + 2 proxys). Sur le nœud ClusterControl, faites :

$ whoami

root

$ ssh-copy-id 192.168.0.11

$ ssh-copy-id 192.168.0.12

$ ssh-copy-id 192.168.0.21

$ ssh-copy-id 192.168.0.22

$ ssh-copy-id 192.168.0.23

**Saisissez le mot de passe root pour l'hôte respectif lorsque vous y êtes invité.

Ouvrez un navigateur Web et accédez à https://{ClusterControl-IP-address}/clustercontrol et créez un super utilisateur. Allez ensuite dans Déployer -> MySQL Galera. Suivez l'assistant de déploiement en conséquence. À la deuxième étape "Définir les serveurs MySQL", choisissez Percona XtraDB 5.7 et spécifiez l'adresse IP pour chaque nœud de base de données. Assurez-vous d'obtenir une coche verte après avoir saisi les détails du nœud de la base de données, comme indiqué ci-dessous :

Cliquez sur "Déployer" pour démarrer le déploiement. Le cluster de bases de données sera prêt dans 15 à 20 minutes. Vous pouvez suivre la progression du déploiement dans Activité -> Travaux -> Créer un cluster -> Détails complets du travail. Le cluster sera répertorié sous le tableau de bord du cluster de bases de données une fois déployé.

Nous pouvons maintenant procéder au déploiement de l'équilibreur de charge de la base de données.

Déploiement de l'équilibreur de charge de la base de données Nextcloud

Il est recommandé d'exécuter Nextcloud sur une configuration à écrivain unique, où les écritures seront traitées par un maître à la fois, et les lectures peuvent être distribuées à d'autres nœuds. Nous pouvons utiliser ProxySQL 2.0 pour réaliser cette configuration car il peut acheminer les requêtes d'écriture vers un seul maître.

Pour déployer un ProxySQL, cliquez sur Actions de cluster> Ajouter un équilibreur de charge> ProxySQL> Déployer ProxySQL. Entrez les informations requises comme souligné par les flèches rouges :

Remplissez tous les détails nécessaires comme indiqué par les flèches ci-dessus. L'adresse du serveur est le serveur lb1, 192.168.0.11. Plus bas, nous spécifions le mot de passe de l'administrateur ProxySQL et des utilisateurs de surveillance. Incluez ensuite tous les serveurs MySQL dans l'ensemble d'équilibrage de charge, puis choisissez "Non" dans la section Transactions implicites. Cliquez sur "Déployer ProxySQL" pour démarrer le déploiement.

Répétez les mêmes étapes que ci-dessus pour l'équilibreur de charge secondaire, lb2 (mais remplacez "l'adresse du serveur" par l'adresse IP de lb2). Sinon, nous n'aurions aucune redondance dans cette couche.

Nos nœuds ProxySQL sont maintenant installés et configurés avec deux groupes d'hôtes pour Galera Cluster. Un pour le groupe à maître unique (groupe d'hôtes 10), où toutes les connexions seront transmises à un nœud Galera (ceci est utile pour éviter les blocages multi-maîtres) et le groupe à plusieurs maîtres (groupe d'hôtes 20) pour toutes les charges de travail en lecture seule qui sera équilibré sur tous les serveurs MySQL principaux.

Ensuite, nous devons déployer une adresse IP virtuelle pour fournir un point de terminaison unique pour nos nœuds ProxySQL afin que votre application n'ait pas besoin de définir deux hôtes ProxySQL différents. Cela fournira également des capacités de basculement automatique car l'adresse IP virtuelle sera reprise par le nœud ProxySQL de sauvegarde en cas de problème avec le nœud ProxySQL principal.

Accédez à ClusterControl -> Gérer -> Load Balancers -> Keepalived -> Deploy Keepalived. Choisissez "ProxySQL" comme type d'équilibreur de charge et choisissez deux serveurs ProxySQL distincts dans la liste déroulante. Spécifiez ensuite l'adresse IP virtuelle ainsi que l'interface réseau qu'il écoutera, comme illustré dans l'exemple suivant :

Une fois le déploiement terminé, vous devriez voir les détails suivants dans la barre de résumé du cluster :

Enfin, créez une nouvelle base de données pour notre application en allant dans ClusterControl -> Gérer -> Schémas et utilisateurs -> Créer une base de données et spécifiez "nextcloud". ClusterControl créera cette base de données sur chaque nœud Galera. Notre niveau d'équilibreur de charge est maintenant terminé.

Déploiement de GlusterFS pour Nextcloud

Les étapes suivantes doivent être effectuées sur nextcloud1, nextcloud2, nextcloud3, sauf indication contraire.

Première étape

Il est recommandé d'avoir un ceci séparé pour le stockage GlusterFS, nous allons donc ajouter un disque supplémentaire sous /dev/sdb et créer une nouvelle partition :

$ fdisk /dev/sdb

Suivez l'assistant de création de partition fdisk en appuyant sur la touche suivante :

n > p > Enter > Enter > Enter > w

Étape 2

Vérifiez si /dev/sdb1 a été créé :

$ fdisk -l /dev/sdb1

Disk /dev/sdb1: 8588 MB, 8588886016 bytes, 16775168 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Étape 3

Formatez la partition avec XFS :

$ mkfs.xfs /dev/sdb1

Étape 4

Montez la partition en tant que /storage/brick :

$ mkdir /glusterfs

$ mount /dev/sdb1 /glusterfs

Vérifiez que tous les nœuds ont la disposition suivante :

$ lsblk

NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

sda      8:0 0 40G  0 disk

└─sda1   8:1 0 40G  0 part /

sdb      8:16 0   8G 0 disk

└─sdb1   8:17 0   8G 0 part /glusterfs

Étape 5

Créez un sous-répertoire appelé brick sous /glusterfs :

$ mkdir /glusterfs/brick

Étape 6

Pour la redondance des applications, nous pouvons utiliser GlusterFS pour la réplication de fichiers entre les hôtes. Tout d'abord, installez le référentiel GlusterFS pour CentOS :

$ yum install centos-release-gluster -y

$ yum install epel-release -y

Étape 7

Installer le serveur GlusterFS

$ yum install glusterfs-server -y

Étape huit

Activer et démarrer le démon gluster :

$ systemctl enable glusterd

$ systemctl start glusterd

Étape 9

Sur nextcloud1, testez les autres nœuds :

(nextcloud1)$ gluster peer probe 192.168.0.22

(nextcloud1)$ gluster peer probe 192.168.0.23

Vous pouvez vérifier le statut du pair avec la commande suivante :

(nextcloud1)$ gluster peer status

Number of Peers: 2



Hostname: 192.168.0.22

Uuid: f9d2928a-6b64-455a-9e0e-654a1ebbc320

State: Peer in Cluster (Connected)



Hostname: 192.168.0.23

Uuid: 100b7778-459d-4c48-9ea8-bb8fe33d9493

State: Peer in Cluster (Connected)

Étape 10

Sur nextcloud1, créez un volume répliqué sur les nœuds testés :

(nextcloud1)$ gluster volume create rep-volume replica 3 192.168.0.21:/glusterfs/brick 192.168.0.22:/glusterfs/brick 192.168.0.23:/glusterfs/brick

volume create: rep-volume: success: please start the volume to access data

Étape 11

Démarrez le volume répliqué sur nextcloud1 :

(nextcloud1)$ gluster volume start rep-volume

volume start: rep-volume: success

Vérifiez que le volume et les processus répliqués sont en ligne :

$ gluster volume status

Status of volume: rep-volume

Gluster process                             TCP Port RDMA Port Online Pid

------------------------------------------------------------------------------

Brick 192.168.0.21:/glusterfs/brick         49152 0 Y 32570

Brick 192.168.0.22:/glusterfs/brick         49152 0 Y 27175

Brick 192.168.0.23:/glusterfs/brick         49152 0 Y 25799

Self-heal Daemon on localhost               N/A N/A Y 32591

Self-heal Daemon on 192.168.0.22            N/A N/A Y 27196

Self-heal Daemon on 192.168.0.23            N/A N/A Y 25820



Task Status of Volume rep-volume

------------------------------------------------------------------------------

There are no active volume tasks

Étape 12

Montez le volume répliqué sur /var/www/html. Créez le répertoire :

$ mkdir -p /var/www/html

Étape treize

13) Ajoutez la ligne suivante dans /etc/fstab pour autoriser le montage automatique :

/dev/sdb1 /glusterfs xfs defaults,defaults 0 0

localhost:/rep-volume /var/www/html   glusterfs defaults,_netdev 0 0

Étape quatorze

Montez le GlusterFS sur /var/www/html :

$ mount -a

Et vérifiez avec :

$ mount | grep gluster

/dev/sdb1 on /glusterfs type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

localhost:/rep-volume on /var/www/html type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)

Le volume répliqué est maintenant prêt et monté dans chaque nœud. Nous pouvons maintenant procéder au déploiement de l'application.

Déploiement d'applications Nextcloud

Les étapes suivantes doivent être effectuées sur nextcloud1, nextcloud2 et nextcloud3, sauf indication contraire.

Nextcloud nécessite PHP 7.2 et versions ultérieures et pour la distribution CentOS, nous devons activer un certain nombre de référentiels comme EPEL et Remi pour simplifier le processus d'installation.

Première étape

Si SELinux est activé, désactivez-le d'abord :

$ setenforce 0

$ sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config

Vous pouvez également exécuter Nextcloud avec SELinux activé en suivant ce guide.

Étape 2

Installez les exigences Nextcloud et activez le référentiel Remi pour PHP 7.2 :

$ yum install -y epel-release yum-utils unzip curl wget bash-completion policycoreutils-python mlocate bzip2

$ yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm

$ yum-config-manager --enable remi-php72

Étape 3

Installez les dépendances Nextcloud, principalement les packages liés à Apache et PHP 7.2 :

$ yum install -y httpd php72-php php72-php-gd php72-php-intl php72-php-mbstring php72-php-mysqlnd php72-php-opcache php72-php-pecl-redis php72-php-pecl-apcu php72-php-pecl-imagick php72-php-xml php72-php-pecl-zip

Étape 4

Activez Apache et démarrez-le :

$ systemctl enable httpd.service

$ systemctl start httpd.service

Étape 5

Créez un lien symbolique pour que PHP utilise le binaire PHP 7.2 :

$ ln -sf /bin/php72 /bin/php

Étape 6

Sur nextcloud1, téléchargez Nextcloud Server à partir d'ici et extrayez-le :

$ wget https://download.nextcloud.com/server/releases/nextcloud-17.0.0.zip

$ unzip nextcloud*

Étape 7

Sur nextcloud1, copiez le répertoire dans /var/www/html et attribuez le propriétaire correct :

$ cp -Rf nextcloud /var/www/html

$ chown -Rf apache:apache /var/www/html

**Notez que le processus de copie dans /var/www/html va prendre un certain temps en raison de la réplication de volume GlusterFS.

Étape huit

Avant de procéder à l'ouverture de l'assistant d'installation, nous devons désactiver la variable pxc_strict_mode autre que "ENFORCING" (la valeur par défaut). Cela est dû au fait que l'importation de la base de données Nextcloud aura un certain nombre de tables sans clé primaire définie, ce qui n'est pas recommandé pour s'exécuter sur Galera Cluster. Ceci est expliqué plus en détail dans la section Réglage plus bas.

Pour modifier la configuration avec ClusterControl, allez simplement dans Gérer -> Configurations -> Modifier/Définir les paramètres :

Choisissez toutes les instances de base de données dans la liste et saisissez :

  • Groupe :MYSQLD
  • Paramètre :pxc_strict_mode
  • Nouvelle valeur :PERMISSIVE

ClusterControl effectuera automatiquement les modifications nécessaires sur chaque nœud de base de données. Si la valeur peut être modifiée pendant l'exécution, elle sera effective immédiatement. ClusterControl configure également la valeur dans le fichier de configuration MySQL pour la persistance. Vous devriez voir le résultat suivant :

Étape 9

Nous sommes maintenant prêts à configurer notre installation Nextcloud. Ouvrez le navigateur et accédez au serveur HTTP de nextcloud1 à l'adresse http://192.168.0.21/nextcloud/ et l'assistant de configuration suivant vous sera présenté :

Configurez la section "Stockage et base de données" avec la valeur suivante :

  • Dossier de données :/var/www/html/nextcloud/data
  • Configurer la base de données :MySQL/MariaDB
  • Nom d'utilisateur :nextcloud
  • Mot de passe :(le mot de passe de l'utilisateur nextcloud)
  • Base de données :nextcloud
  • Hôte :192.168.0.10:6603 (l'adresse IP virtuelle avec le port ProxySQL)

Cliquez sur "Terminer la configuration" pour démarrer le processus de configuration. Attendez qu'il se termine et vous serez redirigé vers le tableau de bord Nextcloud pour l'utilisateur "admin". L'installation est maintenant terminée. La section suivante fournit quelques conseils de réglage pour fonctionner efficacement avec Galera Cluster.

Réglage de la base de données Nextcloud

Clé primaire

Avoir une clé primaire sur chaque table est vital pour la réplication du jeu d'écriture Galera Cluster. Pour une table relativement grande sans clé primaire, une grande transaction de mise à jour ou de suppression bloquerait complètement votre cluster pendant très longtemps. Pour éviter les bizarreries et les cas extrêmes, assurez-vous simplement que toutes les tables utilisent le moteur de stockage InnoDB avec une clé primaire explicite (la clé unique ne compte pas).

L'installation par défaut de Nextcloud créera un tas de tables sous la base de données spécifiée et certaines d'entre elles ne respectent pas cette règle. Pour vérifier si les tables sont compatibles avec Galera, nous pouvons exécuter l'instruction suivante :

mysql> SELECT DISTINCT CONCAT(t.table_schema,'.',t.table_name) as tbl, t.engine, IF(ISNULL(c.constraint_name),'NOPK','') AS nopk, IF(s.index_type = 'FULLTEXT','FULLTEXT','') as ftidx, IF(s.index_type = 'SPATIAL','SPATIAL','') as gisidx FROM information_schema.tables AS t LEFT JOIN information_schema.key_column_usage AS c ON (t.table_schema = c.constraint_schema AND t.table_name = c.table_name AND c.constraint_name = 'PRIMARY') LEFT JOIN information_schema.statistics AS s ON (t.table_schema = s.table_schema AND t.table_name = s.table_name AND s.index_type IN ('FULLTEXT','SPATIAL'))   WHERE t.table_schema NOT IN ('information_schema','performance_schema','mysql') AND t.table_type = 'BASE TABLE' AND (t.engine <> 'InnoDB' OR c.constraint_name IS NULL OR s.index_type IN ('FULLTEXT','SPATIAL')) ORDER BY t.table_schema,t.table_name;

+---------------------------------------+--------+------+-------+--------+

| tbl                                   | engine | nopk | ftidx | gisidx |

+---------------------------------------+--------+------+-------+--------+

| nextcloud.oc_collres_accesscache      | InnoDB | NOPK | | |

| nextcloud.oc_collres_resources        | InnoDB | NOPK | | |

| nextcloud.oc_comments_read_markers    | InnoDB | NOPK | | |

| nextcloud.oc_federated_reshares       | InnoDB | NOPK | | |

| nextcloud.oc_filecache_extended       | InnoDB | NOPK | | |

| nextcloud.oc_notifications_pushtokens | InnoDB | NOPK |       | |

| nextcloud.oc_systemtag_object_mapping | InnoDB | NOPK |       | |

+---------------------------------------+--------+------+-------+--------+

La sortie ci-dessus montre qu'il y a 7 tables qui n'ont pas de clé primaire définie. Pour résoudre ce qui précède, ajoutez simplement une clé primaire avec une colonne d'auto-incrémentation. Exécutez les commandes suivantes sur l'un des serveurs de base de données, par exemple nexcloud1 :

(nextcloud1)$ mysql -uroot -p

mysql> ALTER TABLE nextcloud.oc_collres_accesscache ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

mysql> ALTER TABLE nextcloud.oc_collres_resources ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

mysql> ALTER TABLE nextcloud.oc_comments_read_markers ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

mysql> ALTER TABLE nextcloud.oc_federated_reshares ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

mysql> ALTER TABLE nextcloud.oc_filecache_extended ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

mysql> ALTER TABLE nextcloud.oc_notifications_pushtokens ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

mysql> ALTER TABLE nextcloud.oc_systemtag_object_mapping ADD COLUMN `id` INT PRIMARY KEY AUTO_INCREMENT;

Une fois les modifications ci-dessus appliquées, nous pouvons reconfigurer le pxc_strict_mode à la valeur recommandée, "ENFORCING". Répétez l'étape 8 de la section "Déploiement d'applications" avec la valeur correspondante.

Niveau d'isolement READ-COMMITTED

Le niveau d'isolation de transaction recommandé par Nextcloud est d'utiliser READ-COMMITTED, tandis que Galera Cluster est par défaut sur un niveau d'isolation REPEATABLE-READ plus strict. L'utilisation de READ-COMMITTED peut éviter la perte de données dans des scénarios de charge élevée (par exemple, en utilisant le client de synchronisation avec de nombreux clients/utilisateurs et de nombreuses opérations parallèles).

Pour modifier le niveau de transaction, allez dans ClusterControl -> Gérer -> Configurations -> Modifier/Définir le paramètre et spécifiez ce qui suit :

Cliquez sur "Continuer" et ClusterControl appliquera immédiatement les modifications de configuration. Aucun redémarrage de la base de données n'est requis.

Nextcloud multi-instances

Depuis que nous avons effectué l'installation sur nextcloud1 lors de l'accès à l'URL, cette adresse IP est automatiquement ajoutée dans la variable 'trusted_domains' à l'intérieur de Nextcloud. Lorsque vous essayez d'accéder à d'autres serveurs, par exemple le serveur secondaire, http://192.168.0.22/nextcloud, vous voyez une erreur indiquant que cet hôte n'est pas autorisé et doit être ajouté dans la variable trusted_domain.

Par conséquent, ajoutez toutes les adresses IP des hôtes sous le tableau "trusted_domain" dans /var/www/html/nextcloud/config/config.php, comme exemple ci-dessous :

  'trusted_domains' =>

  array (

    0 => '192.168.0.21',

    1 => '192.168.0.22',

    2 => '192.168.0.23'

  ),

La configuration ci-dessus permet aux utilisateurs d'accéder aux trois serveurs d'applications via les URL suivantes :

  • http://192.168.0.21/nextcloud (nextcloud1)
  • http://192.168.0.22/nextcloud (nextcloud2)
  • http://192.168.0.23/nextcloud (nextcloud3)

Remarque :Vous pouvez ajouter un niveau d'équilibrage de charge au-dessus de ces trois instances Nextcloud pour obtenir une haute disponibilité pour le niveau application en utilisant des proxys inverses HTTP disponibles sur le marché comme HAProxy ou nginx. Cela sort du cadre de cet article de blog.

Utiliser Redis pour le verrouillage de fichiers

Le mécanisme de verrouillage transactionnel des fichiers de Nextcloud verrouille les fichiers pour éviter la corruption des fichiers pendant le fonctionnement normal. Il est recommandé d'installer Redis pour prendre en charge le verrouillage transactionnel des fichiers (ceci est activé par défaut) qui déchargera le cluster de base de données de la gestion de ce travail lourd.

Pour installer Redis, simplement :

$ yum install -y redis

$ systemctl enable redis.service

$ systemctl start redis.service

Ajoutez les lignes suivantes dans /var/www/html/nextcloud/config/config.php :

  'filelocking.enabled' => true,

  'memcache.locking' => '\OC\Memcache\Redis',

  'redis' => array(

     'host' => '192.168.0.21',

     'port' => 6379,

     'timeout' => 0.0,

   ),

Pour plus de détails, consultez cette documentation, Verrouillage transactionnel des fichiers.

Conclusion

Nextcloud peut être configuré pour être un service d'hébergement de fichiers évolutif et hautement disponible pour répondre à vos demandes de partage de fichiers privés. Dans ce blog, nous avons montré comment apporter de la redondance dans les couches Nextcloud, du système de fichiers et de la base de données.