Nextcloud is een open source applicatie voor het synchroniseren en delen van bestanden die gratis, veilige en gemakkelijk toegankelijke bestandsopslag in de cloud biedt, evenals een aantal tools die de functieset uitbreiden. Het lijkt erg op de populaire Dropbox, iCloud en Google Drive, maar in tegenstelling tot Dropbox biedt Nextcloud geen externe hosting voor bestandsopslag.
In deze blogpost gaan we een high-available setup implementeren voor onze privé "Dropbox"-infrastructuur met behulp van Nextcloud, GlusterFS, Percona XtraDB Cluster (MySQL Galera Cluster), ProxySQL met ClusterControl als de automatiseringstool voor het beheren en bewaken van de database- en load balancer-lagen.
Opmerking:u kunt ook MariaDB Cluster gebruiken, die dezelfde onderliggende replicatiebibliotheek gebruikt als in Percona XtraDB Cluster. Vanuit een load balancer-perspectief gedraagt ProxySQL zich op dezelfde manier als MaxScale omdat het het SQL-verkeer kan begrijpen en fijnmazige controle heeft over hoe het verkeer wordt gerouteerd.
Database-architectuur voor Nexcloud
In deze blogpost hebben we in totaal 6 nodes gebruikt.
- 2 x proxyservers
- 3 x database + applicatieservers
- 1 x controllerserver (ClusterControl)
Het volgende diagram illustreert onze uiteindelijke opstelling:
Voor Percona XtraDB Cluster zijn minimaal 3 knooppunten vereist voor een solide multi-master replicatie. Nextcloud-applicaties bevinden zich op dezelfde locatie binnen de databaseservers, dus GlusterFS moet ook op die hosts worden geconfigureerd.
Load balancer-laag bestaat uit 2 knooppunten voor redundantiedoeleinden. We zullen ClusterControl gebruiken om de databaselaag en de load balancer-lagen te implementeren. Alle servers draaien op CentOS 7 met de volgende /etc/hosts-definitie op elk knooppunt:
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
Merk op dat GlusterFS en MySQL zeer intensieve processen zijn. Als je deze opstelling volgt (GlusterFS en MySQL bevinden zich op een enkele server), zorg er dan voor dat je fatsoenlijke hardwarespecificaties hebt voor de servers.
Deployment Nextcloud-database
We beginnen met database-implementatie voor onze Percona XtraDB-cluster met drie knooppunten met behulp van ClusterControl. Installeer ClusterControl en stel vervolgens wachtwoordloze SSH in op alle knooppunten die door ClusterControl worden beheerd (3 PXC + 2 proxy's). Doe op het ClusterControl-knooppunt:
$ 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
**Voer het root-wachtwoord in voor de respectievelijke host wanneer daarom wordt gevraagd.
Open een webbrowser en ga naar https://{ClusterControl-IP-address}/clustercontrol en maak een supergebruiker aan. Ga dan naar Deploy -> MySQL Galera. Volg de implementatiewizard dienovereenkomstig. In de tweede stap 'Define MySQL Servers' kiest u Percona XtraDB 5.7 en specificeert u het IP-adres voor elk databaseknooppunt. Zorg ervoor dat u een groen vinkje krijgt na het invoeren van de gegevens van de databaseknooppunten, zoals hieronder weergegeven:
Klik op "Deploy" om de implementatie te starten. Het databasecluster is binnen 15-20 minuten gereed. U kunt de voortgang van de implementatie volgen via Activiteit -> Taken -> Cluster maken -> Volledige taakdetails. Het cluster wordt weergegeven onder Database Cluster-dashboard zodra het is geïmplementeerd.
We kunnen nu doorgaan met de implementatie van de load balancer van de database.
Deployment Nextcloud Database Load Balancer
Nextcloud wordt aanbevolen om te draaien op een setup met één schrijver, waarbij schrijfbewerkingen door één master tegelijk worden verwerkt en de leesbewerkingen naar andere knooppunten kunnen worden gedistribueerd. We kunnen ProxySQL 2.0 gebruiken om deze configuratie te bereiken, omdat het de schrijfquery's naar een enkele master kan routeren.
Om een ProxySQL te implementeren, klikt u op Clusteracties> Load Balancer toevoegen> ProxySQL> ProxySQL implementeren. Voer de vereiste informatie in zoals gemarkeerd door de rode pijlen:
Vul alle benodigde details in zoals aangegeven door de pijlen hierboven. Het serveradres is de lb1-server, 192.168.0.11. Verderop specificeren we het ProxySQL-beheerderswachtwoord en het wachtwoord van de bewakingsgebruikers. Voeg vervolgens alle MySQL-servers toe aan de load balancing-set en kies vervolgens "Nee" in het gedeelte Impliciete transacties. Klik op "ProxySQL implementeren" om de implementatie te starten.
Herhaal dezelfde stappen als hierboven voor de secundaire load balancer, lb2 (maar verander het "Serveradres" in het IP-adres van lb2). Anders zouden we geen redundantie hebben in deze laag.
Onze ProxySQL-nodes zijn nu geïnstalleerd en geconfigureerd met twee hostgroepen voor Galera Cluster. Een voor de single-master groep (hostgroep 10), waar alle verbindingen worden doorgestuurd naar één Galera node (dit is handig om multi-master deadlocks te voorkomen) en de multi-master groep (hostgroep 20) voor alle read-only workloads die wordt gebalanceerd naar alle backend MySQL-servers.
Vervolgens moeten we een virtueel IP-adres implementeren om een enkel eindpunt te bieden voor onze ProxySQL-knooppunten, zodat uw toepassing niet twee verschillende ProxySQL-hosts hoeft te definiëren. Dit biedt ook automatische failover-mogelijkheden omdat het virtuele IP-adres wordt overgenomen door het back-up ProxySQL-knooppunt voor het geval er iets misgaat met het primaire ProxySQL-knooppunt.
Ga naar ClusterControl -> Beheren -> Load Balancers -> Keepalive -> Keepalive implementeren. Kies "ProxySQL" als het type load balancer en kies twee verschillende ProxySQL-servers uit de vervolgkeuzelijst. Specificeer vervolgens het virtuele IP-adres en de netwerkinterface waarnaar het zal luisteren, zoals weergegeven in het volgende voorbeeld:
Zodra de implementatie is voltooid, ziet u de volgende details op de overzichtsbalk van het cluster:
Maak ten slotte een nieuwe database voor onze applicatie door naar ClusterControl -> Beheren -> Schema's en gebruikers -> Database maken te gaan en "nextcloud" op te geven. ClusterControl maakt deze database aan op elke Galera-node. Onze load balancer-laag is nu voltooid.
GlusterFS-implementatie voor Nextcloud
De volgende stappen moeten worden uitgevoerd op nextcloud1, nextcloud2, nextcloud3, tenzij anders aangegeven.
Stap één
Het wordt aanbevolen om een aparte schijf te hebben voor GlusterFS-opslag, dus we gaan een extra schijf toevoegen onder /dev/sdb en een nieuwe partitie maken:
$ fdisk /dev/sdb
Volg de wizard voor het maken van fdisk-partities door op de volgende toets te drukken:
n > p > Enter > Enter > Enter > w
Stap twee
Controleer of /dev/sdb1 is aangemaakt:
$ 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
Stap drie
Formaat de partitie met XFS:
$ mkfs.xfs /dev/sdb1
Stap vier
Koppel de partitie als /storage/brick:
$ mkdir /glusterfs
$ mount /dev/sdb1 /glusterfs
Controleer of alle knooppunten de volgende lay-out hebben:
$ 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
Stap vijf
Maak een submap met de naam brick onder /glusterfs:
$ mkdir /glusterfs/brick
Stap zes
Voor toepassingsredundantie kunnen we GlusterFS gebruiken voor bestandsreplicatie tussen de hosts. Installeer eerst de GlusterFS-repository voor CentOS:
$ yum install centos-release-gluster -y
$ yum install epel-release -y
Stap zeven
GlusterFS-server installeren
$ yum install glusterfs-server -y
Stap acht
Gluster-daemon inschakelen en starten:
$ systemctl enable glusterd
$ systemctl start glusterd
Stap negen
Op nextcloud1 onderzoekt u de andere knooppunten:
(nextcloud1)$ gluster peer probe 192.168.0.22
(nextcloud1)$ gluster peer probe 192.168.0.23
U kunt de peerstatus controleren met het volgende commando:
(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)
Stap tien
Maak op nextcloud1 een gerepliceerd volume op onderzochte knooppunten:
(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
Stap elf
Start het gerepliceerde volume op nextcloud1:
(nextcloud1)$ gluster volume start rep-volume
volume start: rep-volume: success
Controleer of het gerepliceerde volume en de processen online zijn:
$ 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
Stap Twaalf
Koppel het gerepliceerde volume op /var/www/html. Maak de map aan:
$ mkdir -p /var/www/html
Stap dertien
13) Voeg de volgende regel toe aan /etc/fstab om automatisch koppelen toe te staan:
/dev/sdb1 /glusterfs xfs defaults,defaults 0 0
localhost:/rep-volume /var/www/html glusterfs defaults,_netdev 0 0
Stap veertien
Monteer de GlusterFS op /var/www/html:
$ mount -a
En verifieer met:
$ 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)
Het gerepliceerde volume is nu gereed en gekoppeld aan elk knooppunt. We kunnen nu doorgaan met het implementeren van de applicatie.
Deployment van Nextcloud-app
De volgende stappen moeten worden uitgevoerd op nextcloud1, nextcloud2 en nextcloud3, tenzij anders aangegeven.
Nextcloud vereist PHP 7.2 en hoger en voor CentOS-distributie moeten we een aantal repositories zoals EPEL en Remi inschakelen om het installatieproces te vereenvoudigen.
Stap één
Als SELinux is ingeschakeld, schakel het dan eerst uit:
$ setenforce 0
$ sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config
Je kunt Nextcloud ook draaien met SELinux ingeschakeld door deze handleiding te volgen.
Stap twee
Installeer Nextcloud-vereisten en schakel Remi-repository in voor 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
Stap drie
Installeer Nextcloud-afhankelijkheden, voornamelijk Apache- en PHP 7.2-gerelateerde pakketten:
$ 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
Stap vier
Apache inschakelen en opstarten:
$ systemctl enable httpd.service
$ systemctl start httpd.service
Stap vijf
Maak een symbolische link voor PHP om PHP 7.2 binair te gebruiken:
$ ln -sf /bin/php72 /bin/php
Stap zes
Download Nextcloud Server vanaf nextcloud1 hier en pak het uit:
$ wget https://download.nextcloud.com/server/releases/nextcloud-17.0.0.zip
$ unzip nextcloud*
Stap zeven
Kopieer op nextcloud1 de map naar /var/www/html en wijs het juiste eigendom toe:
$ cp -Rf nextcloud /var/www/html
$ chown -Rf apache:apache /var/www/html
**Merk op dat het kopieerproces naar /var/www/html enige tijd in beslag zal nemen vanwege GlusterFS-volumereplicatie.
Stap acht
Voordat we doorgaan met het openen van de installatiewizard, moeten we de variabele pxc_strict_mode uitschakelen op iets anders dan "ENFORCING" (de standaardwaarde). Dit is te wijten aan het feit dat het importeren van de Nextcloud-database een aantal tabellen heeft zonder gedefinieerde primaire sleutel, wat niet wordt aanbevolen om op Galera Cluster te draaien. Dit wordt verder uitgelegd in het gedeelte Afstemmen verderop.
Om de configuratie met ClusterControl te wijzigen, gaat u naar Beheren -> Configuraties -> Parameters wijzigen/instellen:
Kies alle database-instanties uit de lijst en voer het volgende in:
- Groep:MYSQLD
- Parameter:pxc_strict_mode
- Nieuwe waarde:TOELATEND
ClusterControl voert automatisch de nodige wijzigingen door op elk databaseknooppunt. Als de waarde tijdens runtime kan worden gewijzigd, wordt deze onmiddellijk van kracht. ClusterControl configureert ook de waarde in het MySQL-configuratiebestand voor persistentie. U zou het volgende resultaat moeten zien:
Stap negen
Nu zijn we klaar om onze Nextcloud-installatie te configureren. Open de browser en ga naar de HTTP-server van nextcloud1 op http://192.168.0.21/nextcloud/ en u krijgt de volgende configuratiewizard te zien:
Configureer de sectie "Opslag en database" met de volgende waarde:
- Gegevensmap:/var/www/html/nextcloud/data
- Configureer de database:MySQL/MariaDB
- Gebruikersnaam:nextcloud
- Wachtwoord:(het wachtwoord voor gebruiker nextcloud)
- Database:nextcloud
- Host:192.168.0.10:6603 (het virtuele IP-adres met ProxySQL-poort)
Klik op "Installatie voltooien" om het configuratieproces te starten. Wacht tot het klaar is en je wordt doorgestuurd naar het Nextcloud-dashboard voor gebruiker "admin". De installatie is nu voltooid. Het volgende gedeelte bevat enkele afstemmingstips om efficiënt te werken met Galera Cluster.
Nextcloud-database afstemmen
Primaire sleutel
Het hebben van een primaire sleutel op elke tafel is essentieel voor de replicatie van de schrijfsets van Galera Cluster. Voor een relatief grote tabel zonder primaire sleutel, zou een grote update- of verwijdertransactie uw cluster voor een zeer lange tijd volledig blokkeren. Om eigenaardigheden en randgevallen te voorkomen, moet u ervoor zorgen dat alle tabellen InnoDB-opslagengine gebruiken met een expliciete primaire sleutel (unieke sleutel telt niet).
De standaardinstallatie van Nextcloud zal een aantal tabellen maken onder de gespecificeerde database en sommige voldoen niet aan deze regel. Om te controleren of de tabellen compatibel zijn met Galera, kunnen we het volgende statement uitvoeren:
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 | | |
+---------------------------------------+--------+------+-------+--------+
De bovenstaande uitvoer laat zien dat er 7 tabellen zijn waarvoor geen primaire sleutel is gedefinieerd. Om het bovenstaande op te lossen, voegt u eenvoudig een primaire sleutel toe met de kolom voor automatisch verhogen. Voer de volgende opdrachten uit op een van de databaseservers, bijvoorbeeld 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;
Zodra de bovenstaande wijzigingen zijn toegepast, kunnen we de pxc_strict_mode terug configureren naar de aanbevolen waarde, "ENFORCING". Herhaal stap #8 onder het gedeelte "Applicatie-implementatie" met de bijbehorende waarde.
LEES TOEGEWIJD isolatieniveau
Het aanbevolen transactie-isolatieniveau zoals geadviseerd door Nextcloud is het gebruik van READ-COMMITTED, terwijl Galera Cluster standaard een strikter REPEATABLE-READ isolatieniveau heeft. Het gebruik van READ-COMMITTED kan gegevensverlies voorkomen in scenario's met hoge belasting (bijvoorbeeld door de synchronisatieclient te gebruiken met veel clients/gebruikers en veel parallelle bewerkingen).
Als u het transactieniveau wilt wijzigen, gaat u naar ClusterControl -> Beheren -> Configuraties -> Parameter wijzigen/instellen en specificeert u het volgende:
Klik op "Doorgaan" en ClusterControl zal de configuratiewijzigingen onmiddellijk toepassen. Het opnieuw opstarten van de database is niet vereist.
Multi-Instance Nextcloud
Sinds we de installatie op nextcloud1 hebben uitgevoerd bij het openen van de URL, wordt dit IP-adres automatisch toegevoegd aan de 'trusted_domains'-variabele in Nextcloud. Wanneer u probeert toegang te krijgen tot andere servers, bijvoorbeeld de secundaire server, http://192.168.0.22/nextcloud, ziet u een foutmelding dat deze host niet is geautoriseerd en moet worden toegevoegd aan de variabele trust_domain.
Voeg daarom alle IP-adressen van de hosts toe onder de array "trusted_domain" in /var/www/html/nextcloud/config/config.php, zoals hieronder:
'trusted_domains' =>
array (
0 => '192.168.0.21',
1 => '192.168.0.22',
2 => '192.168.0.23'
),
Met de bovenstaande configuratie hebben gebruikers toegang tot alle drie de applicatieservers via de volgende URL's:
- http://192.168.0.21/nextcloud (nextcloud1)
- http://192.168.0.22/nextcloud (nextcloud2)
- http://192.168.0.23/nextcloud (nextcloud3)
Opmerking:je kunt een load balancer-laag toevoegen aan deze drie Nextcloud-instanties om hoge beschikbaarheid voor de applicatielaag te bereiken door HTTP-reverse-proxy's te gebruiken die op de markt beschikbaar zijn, zoals HAProxy of nginx. Dat valt buiten het bestek van deze blogpost.
Redis gebruiken voor bestandsvergrendeling
Het Transactional File Locking-mechanisme van Nextcloud vergrendelt bestanden om beschadiging van bestanden tijdens normaal gebruik te voorkomen. Het wordt aanbevolen om Redis te installeren om te zorgen voor vergrendeling van transactiebestanden (dit is standaard ingeschakeld), waardoor het databasecluster deze zware taak niet meer kan uitvoeren.
Om Redis te installeren:
$ yum install -y redis
$ systemctl enable redis.service
$ systemctl start redis.service
Voeg de volgende regels toe in /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,
),
Voor meer details, bekijk deze documentatie, Transactionele bestandsvergrendeling.
Conclusie
Nextcloud kan worden geconfigureerd als een schaalbare en zeer beschikbare service voor het hosten van bestanden om te voldoen aan uw eisen voor het delen van privébestanden. In deze blog hebben we laten zien hoe je redundantie kunt brengen in de Nextcloud-, bestandssysteem- en databaselagen.