sql >> Databáze >  >> RDS >> MariaDB

Nasazení vysoce dostupného Nextcloudu s MySQL Galera Cluster a GlusterFS

Nextcloud je open source aplikace pro synchronizaci a sdílení souborů, která nabízí bezplatné, bezpečné a snadno dostupné cloudové úložiště souborů a také řadu nástrojů, které rozšiřují její sadu funkcí. Je velmi podobný populárnímu Dropboxu, iCloudu a Disku Google, ale na rozdíl od Dropboxu Nextcloud nenabízí hostování úložiště souborů mimo provozovnu.

V tomto příspěvku na blogu nasadíme vysoce dostupné nastavení pro naši soukromou infrastrukturu „Dropbox“ využívající Nextcloud, GlusterFS, Percona XtraDB Cluster (MySQL Galera Cluster), ProxySQL s ClusterControl jako automatizační nástroj pro správu a monitorování databází a vrstev vyrovnávače zátěže.

Poznámka:Můžete také použít MariaDB Cluster, který používá stejnou základní replikační knihovnu jako v Percona XtraDB Cluster. Z pohledu nástroje pro vyrovnávání zátěže se ProxySQL chová podobně jako MaxScale v tom, že rozumí provozu SQL a má podrobnou kontrolu nad tím, jak je provoz směrován.

Architektura databáze pro Nexcloud

V tomto příspěvku na blogu jsme použili celkem 6 uzlů.

  • 2 x proxy server
  • 3x databázový + aplikační server
  • 1 x server řadiče (ClusterControl)

Následující diagram ilustruje naše konečné nastavení:

Pro Percona XtraDB Cluster jsou pro těleso vyžadovány minimálně 3 uzly multi-master replikace. Aplikace Nextcloud jsou umístěny společně v rámci databázových serverů, takže GlusterFS musí být konfigurován i na těchto hostitelích.

Vrstva vyrovnávání zátěže se skládá ze 2 uzlů pro účely redundance. Použijeme ClusterControl k nasazení vrstvy databáze a vrstev nástroje pro vyrovnávání zatížení. Všechny servery běží na CentOS 7 s následující definicí /etc/hosts na každém uzlu:

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

Všimněte si, že GlusterFS a MySQL jsou vysoce intenzivní procesy. Pokud dodržujete toto nastavení (GlusterFS a MySQL sídlí na jediném serveru), ujistěte se, že máte pro servery slušné hardwarové specifikace.

Nasazení databáze Nextcloud

Začneme nasazením databáze pro náš tříuzlový Percona XtraDB Cluster pomocí ClusterControl. Nainstalujte ClusterControl a poté nastavte SSH bez hesla do všech uzlů, které budou spravovány pomocí ClusterControl (3 PXC + 2 proxy). V uzlu ClusterControl proveďte:

$ 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

**Po zobrazení výzvy zadejte heslo uživatele root pro příslušného hostitele.

Otevřete webový prohlížeč a přejděte na https://{ClusterControl-IP-address}/clustercontrol a vytvořte superuživatele. Poté přejděte na Deploy -> MySQL Galera. Postupujte podle pokynů průvodce nasazením. Ve druhé fázi 'Define MySQL Servers' vyberte Percona XtraDB 5.7 a zadejte IP adresu pro každý databázový uzel. Ujistěte se, že máte zelené zaškrtnutí po zadání podrobností databázového uzlu, jak je znázorněno níže:

Kliknutím na "Deploy" zahájíte nasazení. Databázový cluster bude připraven za 15~20 minut. Průběh nasazení můžete sledovat v části Aktivita -> Úlohy -> Vytvořit klastr -> Úplné podrobnosti o úloze. Cluster bude po nasazení uveden pod řídicím panelem Database Cluster.

Nyní můžeme přistoupit k nasazení nástroje pro vyrovnávání zatížení databáze.

Nasazení nástroje pro vyrovnávání zatížení databáze Nextcloud

Nextcloud se doporučuje spouštět v nastavení s jedním zapisovacím zařízením, kde budou zápisy zpracovávány vždy jedním masterem a čtení lze distribuovat do dalších uzlů. K dosažení této konfigurace můžeme použít ProxySQL 2.0, protože může směrovat dotazy k zápisu na jeden hlavní server.

Chcete-li nasadit ProxySQL, klikněte na Cluster Actions> Add Load Balancer> ProxySQL> Deploy ProxySQL. Zadejte požadované informace zvýrazněné červenými šipkami:

Vyplňte všechny potřebné údaje, jak je zvýrazněno šipkami výše. Adresa serveru je server lb1, 192.168.0.11. Dále uvádíme správce ProxySQL a heslo pro monitorování uživatelů. Poté zahrňte všechny servery MySQL do sady pro vyrovnávání zátěže a poté v části Implicitní transakce zvolte „Ne“. Klikněte na "Deploy ProxySQL" pro spuštění nasazení.

Opakujte stejné kroky jako výše pro sekundární nástroj pro vyrovnávání zátěže, lb2 (ale změňte "Adresu serveru" na IP adresu lb2). Jinak bychom v této vrstvě neměli žádnou redundanci.

Naše uzly ProxySQL jsou nyní nainstalovány a nakonfigurovány se dvěma hostitelskými skupinami pro Galera Cluster. Jedna pro single-master skupinu (hostgroup 10), kde budou všechna připojení přesměrována do jednoho uzlu Galera (toto je užitečné, aby se zabránilo uváznutí více-master), a multi-master skupina (hostgroup 20) pro všechny pracovní zátěže pouze pro čtení, které bude vyvážený pro všechny backendové servery MySQL.

Dále musíme nasadit virtuální IP adresu, abychom poskytli jeden koncový bod pro naše uzly ProxySQL, takže vaše aplikace nebude muset definovat dva různé hostitele ProxySQL. To také poskytne funkce automatického převzetí služeb při selhání, protože virtuální IP adresa bude převzata záložním uzlem ProxySQL v případě, že se něco pokazí na primárním uzlu ProxySQL.

Přejděte do ClusterControl -> Spravovat -> Load Balancers -> Keepalived -> Deploy Keepalived. Vyberte "ProxySQL" jako typ nástroje pro vyrovnávání zatížení a z rozbalovací nabídky vyberte dva různé servery ProxySQL. Poté zadejte virtuální IP adresu a také síťové rozhraní, kterému bude naslouchat, jak ukazuje následující příklad:

Po dokončení nasazení byste měli na liště souhrnu clusteru vidět následující podrobnosti:

Nakonec vytvořte novou databázi pro naši aplikaci tak, že přejdete do ClusterControl -> Spravovat -> Schémata a uživatelé -> Vytvořit databázi a zadejte "nextcloud". ClusterControl vytvoří tuto databázi na každém uzlu Galera. Naše úroveň vyrovnávání zatížení je nyní dokončena.

Nasazení GlusterFS pro Nextcloud

Následující kroky by měly být provedeny na nextcloud1, nextcloud2, nextcloud3, pokud není uvedeno jinak.

Krok jedna

Pro úložiště GlusterFS se doporučuje mít toto samostatné, takže přidáme další disk pod /dev/sdb a vytvoříme nový oddíl:

$ fdisk /dev/sdb

Postupujte podle průvodce vytvořením oddílu fdisk stisknutím následující klávesy:

n > p > Enter > Enter > Enter > w

Krok dva

Ověřte, zda byl vytvořen /dev/sdb1:

$ 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

Krok tři

Formátování oddílu pomocí XFS:

$ mkfs.xfs /dev/sdb1

Krok čtyři

Připojte oddíl jako /storage/brick:

$ mkdir /glusterfs

$ mount /dev/sdb1 /glusterfs

Ověřte, že všechny uzly mají následující rozložení:

$ 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

Pátý krok

Vytvořte podadresář s názvem brick pod /glusterfs:

$ mkdir /glusterfs/brick

Krok šest

Pro redundanci aplikací můžeme použít GlusterFS pro replikaci souborů mezi hostiteli. Nejprve nainstalujte úložiště GlusterFS pro CentOS:

$ yum install centos-release-gluster -y

$ yum install epel-release -y

Krok sedm

Instalovat server GlusterFS

$ yum install glusterfs-server -y

Krok 8

Povolte a spusťte démona clusteru:

$ systemctl enable glusterd

$ systemctl start glusterd

Krok devět

Na nextcloud1 otestujte ostatní uzly:

(nextcloud1)$ gluster peer probe 192.168.0.22

(nextcloud1)$ gluster peer probe 192.168.0.23

Stav partnera můžete ověřit pomocí následujícího příkazu:

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

Krok 10

Na nextcloud1 vytvořte replikovaný svazek na testovaných uzlech:

(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

Krok 11

Spusťte replikovaný svazek na nextcloud1:

(nextcloud1)$ gluster volume start rep-volume

volume start: rep-volume: success

Ověřte, zda jsou replikovaný svazek a procesy 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

Krok 12

Připojte replikovaný svazek na /var/www/html. Vytvořte adresář:

$ mkdir -p /var/www/html

Krok 13

13) Chcete-li povolit automatické připojení, přidejte do /etc/fstab následující řádek:

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

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

Krok čtrnáct

Připojte GlusterFS na /var/www/html:

$ mount -a

A ověřte pomocí:

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

Replikovaný svazek je nyní připraven a připojen v každém uzlu. Nyní můžeme přistoupit k nasazení aplikace.

Nasazení aplikací Nextcloud

Následující kroky by měly být provedeny na nextcloud1, nextcloud2 a nextcloud3, pokud není uvedeno jinak.

Nextcloud vyžaduje PHP 7.2 a novější a pro distribuci CentOS musíme povolit řadu úložišť, jako je EPEL a Remi, abychom zjednodušili proces instalace.

Krok jedna

Pokud je povolen SELinux, nejprve jej deaktivujte:

$ setenforce 0

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

Můžete také spustit Nextcloud s povoleným SELinux podle tohoto průvodce.

Krok dva

Nainstalujte požadavky Nextcloud a povolte úložiště Remi pro 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

Krok tři

Instalujte závislosti Nextcloud, většinou Apache a balíčky související s 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

Krok čtyři

Povolte Apache a spusťte jej:

$ systemctl enable httpd.service

$ systemctl start httpd.service

Pátý krok

Vytvořte pro PHP symbolický odkaz pro použití PHP 7.2 binární:

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

Krok šest

Na nextcloud1 si odtud stáhněte Nextcloud Server a rozbalte jej:

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

$ unzip nextcloud*

Krok sedm

Na nextcloud1 zkopírujte adresář do /var/www/html a přiřaďte správné vlastnictví:

$ cp -Rf nextcloud /var/www/html

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

**Upozorňujeme, že proces kopírování do /var/www/html bude nějakou dobu trvat kvůli replikaci svazku GlusterFS.

Krok 8

Než přistoupíme k otevření průvodce instalací, musíme deaktivovat proměnnou pxc_strict_mode na jinou hodnotu než "ENFORCING" (výchozí hodnota). Důvodem je skutečnost, že import databáze Nextcloud bude mít řadu tabulek bez definovaného primárního klíče, což se nedoporučuje spouštět na Galera Cluster. Toto je vysvětleno podrobněji v části Ladění níže.

Chcete-li změnit konfiguraci pomocí ClusterControl, jednoduše přejděte na Spravovat -> Konfigurace -> Změnit/nastavit parametry:

Vyberte všechny instance databáze ze seznamu a zadejte:

  • Skupina:MYSQLD
  • Parametr:pxc_strict_mode
  • Nová hodnota:PERMISSIVE

ClusterControl provede potřebné změny na každém databázovém uzlu automaticky. Pokud lze hodnotu změnit za běhu, projeví se okamžitě. ClusterControl také konfiguruje hodnotu v konfiguračním souboru MySQL pro stálost. Měli byste vidět následující výsledek:

Krok devět

Nyní jsme připraveni nakonfigurovat naši instalaci Nextcloud. Otevřete prohlížeč a přejděte na HTTP server nextcloud1 na adrese http://192.168.0.21/nextcloud/ a zobrazí se vám následující průvodce konfigurací:

Nakonfigurujte sekci "Úložiště a databáze" s následující hodnotou:

  • Složka dat:/var/www/html/nextcloud/data
  • Nakonfigurujte databázi:MySQL/MariaDB
  • Uživatelské jméno:nextcloud
  • Heslo:(heslo pro uživatele nextcloud)
  • Databáze:nextcloud
  • Hostitel:192.168.0.10:6603 (virtuální IP adresa s portem ProxySQL)

Kliknutím na „Dokončit nastavení“ zahájíte proces konfigurace. Počkejte na dokončení a budete přesměrováni na řídicí panel Nextcloud pro uživatele „admin“. Instalace je nyní dokončena. Další část obsahuje několik tipů pro ladění, jak efektivně pracovat s Galera Cluster.

Ladění databáze Nextcloud

Primární klíč

Mít primární klíč na každé tabulce je zásadní pro replikaci zapisovací sady Galera Cluster. U relativně velké tabulky bez primárního klíče by velká transakce aktualizace nebo odstranění zcela zablokovala váš cluster na velmi dlouhou dobu. Abyste se vyhnuli jakýmkoliv výstřednostem a okrajovým případům, jednoduše se ujistěte, že všechny tabulky používají úložiště InnoDB s explicitním primárním klíčem (jedinečný klíč se nepočítá).

Výchozí instalace Nextcloud vytvoří hromadu tabulek pod zadanou databází a některé z nich nesplňují toto pravidlo. Chcete-li zkontrolovat, zda jsou tabulky kompatibilní s Galera, můžeme spustit následující příkaz:

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

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

Výše uvedený výstup ukazuje, že existuje 7 tabulek, které nemají definovaný primární klíč. Chcete-li výše uvedené opravit, jednoduše přidejte primární klíč se sloupcem automatického přírůstku. Spusťte následující příkazy na jednom z databázových serverů, například 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;

Jakmile byly použity výše uvedené úpravy, můžeme znovu nakonfigurovat pxc_strict_mode na doporučenou hodnotu „ENFORCING“. Opakujte krok č. 8 v části "Deployment aplikace" s odpovídající hodnotou.

Úroveň izolace POTVRZENÁ ČTEM

Doporučená úroveň izolace transakcí podle doporučení Nextcloud je použít READ-COMMITTED, zatímco Galera Cluster je výchozí na přísnější úroveň izolace REPEATABLE-READ. Použití READ-COMMITTED může zabránit ztrátě dat ve scénářích vysokého zatížení (např. použitím synchronizačního klienta s mnoha klienty/uživateli a mnoha paralelními operacemi).

Chcete-li upravit úroveň transakce, přejděte do ClusterControl -> Spravovat -> Konfigurace -> Změnit/nastavit parametr a zadejte následující:

Klikněte na „Pokračovat“ a ClusterControl okamžitě použije změny konfigurace. Není vyžadován žádný restart databáze.

Multi-instance Nextcloud

Protože jsme při přístupu k URL provedli instalaci na nextcloud1, je tato IP adresa automaticky přidána do proměnné 'trusted_domains' v Nextcloudu. Když se pokusíte o přístup k jiným serverům, například sekundárnímu serveru http://192.168.0.22/nextcloud, zobrazí se chyba, že tento hostitel není autorizován a musí být přidán do proměnné trusted_domain.

Proto přidejte všechny IP adresy hostitelů do pole "trusted_domain" uvnitř /var/www/html/nextcloud/config/config.php, jako příklad níže:

  'trusted_domains' =>

  array (

    0 => '192.168.0.21',

    1 => '192.168.0.22',

    2 => '192.168.0.23'

  ),

Výše uvedená konfigurace umožňuje uživatelům přístup ke všem třem aplikačním serverům prostřednictvím následujících adres URL:

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

Poznámka:K těmto třem instancím Nextcloud můžete přidat vrstvu vyrovnávání zatížení, abyste dosáhli vysoké dostupnosti pro aplikační vrstvu pomocí HTTP reverzních proxy dostupných na trhu, jako je HAProxy nebo nginx. To je mimo rozsah tohoto blogového příspěvku.

Použití Redis pro zamykání souborů

Mechanismus zamykání transakčních souborů společnosti Nextcloud uzamkne soubory, aby se zabránilo poškození souborů během normálního provozu. Doporučuje se nainstalovat Redis, aby se postaral o zamykání transakčních souborů (toto je ve výchozím nastavení povoleno), což odbrzdí databázový cluster od zpracování této náročné úlohy.

Chcete-li nainstalovat Redis, jednoduše:

$ yum install -y redis

$ systemctl enable redis.service

$ systemctl start redis.service

Připojte následující řádky do /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,

   ),

Další podrobnosti najdete v této dokumentaci, Uzamčení transakčního souboru.

Závěr

Nextcloud lze nakonfigurovat jako škálovatelnou a vysoce dostupnou službu hostování souborů, která uspokojí vaše soukromé požadavky na sdílení souborů. V tomto blogu jsme ukázali, jak můžete přinést redundanci ve vrstvách Nextcloud, souborového systému a databáze.


  1. Jak odstranit řádek mysql po uplynutí času?

  2. Instalace MariaDB 10.1 v Debian Jessie a spouštění různých dotazů MariaDB

  3. TSQL – Přidat sloupec do všech tabulek v databázi [Příklad kurzoru]

  4. Databáze SQL Server Statistiky využití CPU