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.