sql >> Database >  >> RDS >> MariaDB

Een zeer beschikbare Nextcloud implementeren met MySQL Galera Cluster en GlusterFS

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.


  1. NLS_CHARSET_ID() Functie in Oracle

  2. Hoe SUBSTRING_INDEX() werkt in MariaDB

  3. Gelijkwaardigheid van SQL-query's bewijzen

  4. 4 manieren om de taakgeschiedenis van SQL Server op te halen