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.