sql >> Databasteknik >  >> RDS >> MariaDB

Distribuera ett mycket tillgängligt Nextcloud med MySQL Galera Cluster och GlusterFS

Nextcloud är ett program för filsynkronisering och delning med öppen källkod som erbjuder gratis, säker och lättillgänglig molnfillagring, samt ett antal verktyg som utökar dess funktionsuppsättning. Det är väldigt likt populära Dropbox, iCloud och Google Drive men till skillnad från Dropbox erbjuder Nextcloud inte fillagringsvärd utanför lokalen.

I det här blogginlägget kommer vi att distribuera en högtillgänglig installation för vår privata "Dropbox"-infrastruktur med hjälp av Nextcloud, GlusterFS, Percona XtraDB Cluster (MySQL Galera Cluster), ProxySQL med ClusterControl som automatiseringsverktyg för att hantera och övervaka databasen och lastbalanseringar.

Obs:Du kan också använda MariaDB Cluster, som använder samma underliggande replikeringsbibliotek som i Percona XtraDB Cluster. Ur ett lastbalanseringsperspektiv beter sig ProxySQL på samma sätt som MaxScale genom att den kan förstå SQL-trafiken och har finkornig kontroll över hur trafiken dirigeras.

Databasarkitektur för Nexcloud

I det här blogginlägget använde vi totalt 6 noder.

  • 2 x proxyservrar 
  • 3 x databas + applikationsservrar
  • 1 x styrserver (ClusterControl)

Följande diagram illustrerar vår slutliga installation:

För Percona XtraDB Cluster krävs minst 3 noder för en solid multi-master replikering. Nextcloud-applikationer är samlokaliserade inom databasservrarna, så GlusterFS måste också konfigureras på dessa värdar.

Lastbalanseringsnivån består av 2 noder för redundansändamål. Vi kommer att använda ClusterControl för att distribuera databasnivån och lastbalanseringsnivåerna. Alla servrar körs på CentOS 7 med följande /etc/hosts-definition på varje nod:

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

Observera att GlusterFS och MySQL är mycket intensiva processer. Om du följer denna inställning (GlusterFS och MySQL finns på en enda server), se till att du har anständiga hårdvaruspecifikationer för servrarna.

Nextcloud Database Deployment

Vi kommer att börja med databasdistribution för vårt tre-nods Percona XtraDB Cluster med ClusterControl. Installera ClusterControl och ställ sedan in lösenordslös SSH till alla noder som kommer att hanteras av ClusterControl (3 PXC + 2 proxyservrar). På ClusterControl-noden gör du:

$ 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

**Ange root-lösenordet för respektive värd när du uppmanas.

Öppna en webbläsare och gå till https://{ClusterControl-IP-address}/clustercontrol och skapa en superanvändare. Gå sedan till Deploy -> MySQL Galera. Följ distributionsguiden i enlighet med detta. I det andra steget "Definiera MySQL-servrar", välj Percona XtraDB 5.7 och ange IP-adressen för varje databasnod. Se till att du får en grön bock efter att ha angett databasnodens detaljer, som visas nedan:

Klicka på "Deploy" för att starta distributionen. Databasklustret kommer att vara klart om 15~20 minuter. Du kan följa distributionsförloppet på Aktivitet -> Jobb -> Skapa kluster -> Fullständig jobbinformation. Klustret kommer att listas under Databas Cluster dashboard när det har distribuerats.

Vi kan nu gå vidare till distribution av databasbelastningsbalanserare.

Implementering av Nextcloud Database Load Balancer

Nextcloud rekommenderas att köras på en enskribent-inställning, där skrivningar kommer att bearbetas av en master åt gången och läsningarna kan distribueras till andra noder. Vi kan använda ProxySQL 2.0 för att uppnå denna konfiguration eftersom den kan dirigera skrivfrågorna till en enda master.

För att distribuera en ProxySQL, klicka på Cluster Actions> Add Load Balancer> ProxySQL> Deploy ProxySQL. Ange den information som krävs enligt de röda pilarna:

Fyll i alla nödvändiga detaljer som markerats med pilarna ovan. Serveradressen är lb1-servern, 192.168.0.11. Längre ner anger vi ProxySQL-admin och övervakningsanvändares lösenord. Inkludera sedan alla MySQL-servrar i lastbalanseringsuppsättningen och välj sedan "Nej" i avsnittet Implicita transaktioner. Klicka på "Deploy ProxySQL" för att starta distributionen.

Upprepa samma steg som ovan för den sekundära lastbalanseraren, lb2 (men ändra "Serveradress" till lb2:s IP-adress). Annars skulle vi inte ha någon redundans i det här lagret.

Våra ProxySQL-noder är nu installerade och konfigurerade med två värdgrupper för Galera Cluster. En för singelmastergruppen (värdgrupp 10), där alla anslutningar kommer att vidarebefordras till en Galera-nod (detta är användbart för att förhindra flermasters dödläge) och multimastergruppen (värdgrupp 20) för alla skrivskyddade arbetsbelastningar som kommer att balanseras mot alla backend MySQL-servrar.

Därefter måste vi distribuera en virtuell IP-adress för att tillhandahålla en enda slutpunkt för våra ProxySQL-noder så att din applikation inte behöver definiera två olika ProxySQL-värdar. Detta kommer också att tillhandahålla automatiska failover-funktioner eftersom virtuell IP-adress kommer att tas över av backup ProxySQL-noden ifall något går fel till den primära ProxySQL-noden.

Gå till ClusterControl -> Hantera -> Lastbalanserare -> Keepalived -> Deploy Keepalived. Välj "ProxySQL" som belastningsbalanseringstyp och välj två distinkta ProxySQL-servrar från rullgardinsmenyn. Ange sedan den virtuella IP-adressen samt nätverksgränssnittet som den ska lyssna på, som visas i följande exempel:

När distributionen är klar bör du se följande detaljer i klustrets sammanfattningsfält:

Slutligen, skapa en ny databas för vår applikation genom att gå till ClusterControl -> Hantera -> Schema och användare -> Skapa databas och ange "nextcloud". ClusterControl kommer att skapa denna databas på varje Galera-nod. Vår lastbalanseringsnivå är nu klar.

GlusterFS-distribution för Nextcloud

Följande steg bör utföras på nextcloud1, nextcloud2, nextcloud3 om inget annat anges.

Steg ett

Det rekommenderas att ha en separat denna för GlusterFS-lagring, så vi kommer att lägga till ytterligare disk under /dev/sdb och skapa en ny partition:

$ fdisk /dev/sdb

Följ guiden för att skapa fdisk-partitioner genom att trycka på följande tangent:

n > p > Enter > Enter > Enter > w

Steg två

Verifiera om /dev/sdb1 har skapats:

$ 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

Steg tre

Formatera partitionen med XFS:

$ mkfs.xfs /dev/sdb1

Steg fyra

Montera partitionen som /storage/brick:

$ mkdir /glusterfs

$ mount /dev/sdb1 /glusterfs

Kontrollera att alla noder har följande layout:

$ 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

Steg fem

Skapa en underkatalog som heter brick under /glusterfs:

$ mkdir /glusterfs/brick

Steg sex

För programredundans kan vi använda GlusterFS för filreplikering mellan värdarna. Installera först GlusterFS repository för CentOS:

$ yum install centos-release-gluster -y

$ yum install epel-release -y

Steg sju

Installera GlusterFS-server

$ yum install glusterfs-server -y

Steg åtta

Aktivera och starta glusterdemon:

$ systemctl enable glusterd

$ systemctl start glusterd

Steg nio

På nextcloud1, undersök de andra noderna:

(nextcloud1)$ gluster peer probe 192.168.0.22

(nextcloud1)$ gluster peer probe 192.168.0.23

Du kan verifiera peer-statusen med följande kommando:

(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)

Steg tio

På nextcloud1, skapa en replikerad volym på sonderade noder:

(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

Steg elva

Starta den replikerade volymen på nextcloud1:

(nextcloud1)$ gluster volume start rep-volume

volume start: rep-volume: success

Kontrollera att den replikerade volymen och processerna är online:

$ 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

Steg tolv

Montera den replikerade volymen på /var/www/html. Skapa katalogen:

$ mkdir -p /var/www/html

Steg tretton

13) Lägg till följande rad i /etc/fstab för att tillåta automatisk montering:

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

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

Steg fjorton

Montera GlusterFS till /var/www/html:

$ mount -a

Och verifiera med:

$ 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)

Den replikerade volymen är nu klar och monterad i varje nod. Vi kan nu fortsätta att distribuera programmet.

Nextcloud Application Deployment

Följande steg bör utföras på nextcloud1, nextcloud2 och nextcloud3 om inget annat anges.

Nextcloud kräver PHP 7.2 och senare och för CentOS-distribution måste vi aktivera ett antal förråd som EPEL och Remi för att förenkla installationsprocessen.

Steg ett

Om SELinux är aktiverat, inaktivera det först:

$ setenforce 0

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

Du kan också köra Nextcloud med SELinux aktiverat genom att följa den här guiden.

Steg två

Installera Nextcloud-krav och aktivera Remi repository för 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

Steg tre

Installera Nextcloud-beroenden, mestadels Apache- och PHP 7.2-relaterade paket:

$ 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

Steg fyra

Aktivera Apache och starta den:

$ systemctl enable httpd.service

$ systemctl start httpd.service

Steg fem

Gör en symbolisk länk för PHP för att använda PHP 7.2 binär:

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

Steg sex

På nextcloud1, ladda ner Nextcloud Server härifrån och extrahera den:

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

$ unzip nextcloud*

Steg sju

På nextcloud1, kopiera katalogen till /var/www/html och tilldela korrekt ägande:

$ cp -Rf nextcloud /var/www/html

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

**Observera att kopieringsprocessen till /var/www/html kommer att ta lite tid på grund av GlusterFS volymreplikering.

Steg åtta

Innan vi fortsätter att öppna installationsguiden måste vi inaktivera variabeln pxc_strict_mode till något annat än "ENFORCING" (standardvärdet). Detta beror på det faktum att Nextcloud-databasimport kommer att ha ett antal tabeller utan primärnyckel definierad som inte rekommenderas att köras på Galera Cluster. Detta förklaras ytterligare detaljer under Tuning-avsnittet längre ner.

För att ändra konfigurationen med ClusterControl, gå helt enkelt till Hantera -> Konfigurationer -> Ändra/Ange parametrar:

Välj alla databasinstanser från listan och ange:

  • Grupp:MYSQLD
  • Parameter:pxc_strict_mode
  • Nytt värde:TILLÅTANDE

ClusterControl kommer att utföra de nödvändiga ändringarna på varje databasnod automatiskt. Om värdet kan ändras under körning kommer det att träda i kraft omedelbart. ClusterControl konfigurerar också värdet inuti MySQL-konfigurationsfilen för beständighet. Du bör se följande resultat:

Steg nio

Nu är vi redo att konfigurera vår Nextcloud-installation. Öppna webbläsaren och gå till nextcloud1s HTTP-server på http://192.168.0.21/nextcloud/ och du kommer att presenteras med följande konfigurationsguide:

Konfigurera avsnittet "Lagring och databas" med följande värde:

  • Datamapp:/var/www/html/nextcloud/data
  • Konfigurera databasen:MySQL/MariaDB
  • Användarnamn:nextcloud
  • Lösenord:(lösenordet för användaren nextcloud)
  • Databas:nextcloud
  • Värd:192.168.0.10:6603 (den virtuella IP-adressen med ProxySQL-port)

Klicka på "Slutför installationen" för att starta konfigurationsprocessen. Vänta tills det är klart och du kommer att omdirigeras till Nextclouds instrumentpanel för användaren "admin". Installationen är nu klar. Nästa avsnitt ger några inställningstips för att köra effektivt med Galera Cluster.

Nextcloud Databas Tuning

Primärnyckel

Att ha en primärnyckel på varje tabell är avgörande för Galera Cluster-skrivuppsättningsreplikering. För ett relativt stort bord utan primärnyckel skulle stor uppdatering eller raderingstransaktion helt blockera ditt kluster under mycket lång tid. För att undvika konstigheter och kantfall, se helt enkelt till att alla tabeller använder InnoDB-lagringsmotor med en explicit primärnyckel (unik nyckel räknas inte).

Standardinstallationen av Nextcloud kommer att skapa ett gäng tabeller under den angivna databasen och några av dem följer inte denna regel. För att kontrollera om tabellerna är kompatibla med Galera kan vi köra följande sats:

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 |       | |

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

Ovanstående utdata visar att det finns 7 tabeller som inte har en primärnyckel definierad. För att fixa ovanstående, lägg helt enkelt till en primärnyckel med kolumn för automatisk ökning. Kör följande kommandon på en av databasservrarna, till exempel 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;

När ovanstående ändringar har tillämpats kan vi återkonfigurera pxc_strict_mode till det rekommenderade värdet, "ENFORCING". Upprepa steg #8 under avsnittet "Application Deployment" med motsvarande värde.

LÄS-KOMMITTERAD isoleringsnivå

Den rekommenderade transaktionsisoleringsnivån som rekommenderas av Nextcloud är att använda READ-COMMITTED, medan Galera Cluster är standard på en strängare REPEATABLE-READ isoleringsnivå. Att använda READ-COMMITTED kan undvika dataförlust under scenarier med hög belastning (t.ex. genom att använda synkroniseringsklienten med många klienter/användare och många parallella operationer).

För att ändra transaktionsnivån, gå till ClusterControl -> Hantera -> Konfigurationer -> Ändra/Ange parameter och ange följande:

Klicka på "Fortsätt" så kommer ClusterControl att tillämpa konfigurationsändringarna omedelbart. Ingen omstart av databasen krävs.

Nextcloud med flera instanser

Eftersom vi utförde installationen på nextcloud1 när vi fick åtkomst till URL:en läggs denna IP-adress automatiskt till i variabeln 'trusted_domains' i Nextcloud. När du försökte komma åt andra servrar, till exempel den sekundära servern, http://192.168.0.22/nextcloud, skulle du se ett felmeddelande om att denna värd inte är auktoriserad och måste läggas till i variabeln trusted_domain.

Lägg därför till alla värdars IP-adresser under arrayen "trusted_domain" inuti /var/www/html/nextcloud/config/config.php, som exemplet nedan:

  'trusted_domains' =>

  array (

    0 => '192.168.0.21',

    1 => '192.168.0.22',

    2 => '192.168.0.23'

  ),

Konfigurationen ovan tillåter användare att komma åt alla tre applikationsservrarna via följande webbadresser:

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

Obs:Du kan lägga till en lastbalanseringsnivå ovanpå dessa tre Nextcloud-instanser för att uppnå hög tillgänglighet för applikationsnivån genom att använda HTTP omvända proxyservrar som finns på marknaden som HAProxy eller nginx. Det ligger utanför det här blogginläggets omfattning.

Använda Redis för fillåsning

Nextclouds Transactional File Locking-mekanism låser filer för att undvika filkorruption under normal drift. Det rekommenderas att installera Redis för att ta hand om transaktionsfillåsning (detta är aktiverat som standard) vilket kommer att avlasta databasklustret från att hantera detta tunga jobb.

För att installera Redis, helt enkelt:

$ yum install -y redis

$ systemctl enable redis.service

$ systemctl start redis.service

Lägg till följande rader i /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,

   ),

För mer information, kolla in den här dokumentationen, Transaktionsfillåsning.

Slutsats

Nextcloud kan konfigureras för att vara en skalbar och mycket tillgänglig filvärdtjänst för att tillgodose dina privata fildelningskrav. I den här bloggen visade vi hur du kan få redundans i Nextcloud, filsystem och databaslager.


  1. Programmatiskt hämta SQL Server lagrad procedur källa som är identisk med källan som returneras av SQL Server Management Studio gui?

  2. Anslutningshantering och strypning med ProxySQL

  3. Bevilja alla på ett specifikt schema i db till en grupproll i PostgreSQL

  4. Dynamisk övervakning av PostgreSQL-instanser med pg_top