Nextcloud е приложение за синхронизиране и споделяне на файлове с отворен код, което предлага безплатно, сигурно и лесно достъпно съхранение на файлове в облак, както и редица инструменти, които разширяват неговия набор от функции. Той е много подобен на популярните Dropbox, iCloud и Google Drive, но за разлика от Dropbox, Nextcloud не предлага хостинг за съхранение на файлове извън помещението.
В тази публикация в блога ще внедрим високодостъпна настройка за нашата частна "Dropbox" инфраструктура, използваща Nextcloud, GlusterFS, Percona XtraDB Cluster (MySQL Galera Cluster), ProxySQL с ClusterControl като инструмент за автоматизация за управление и наблюдение на базата данни и нивата на балансиране на натоварването.
Забележка:Можете също да използвате MariaDB Cluster, който използва същата основна библиотека за репликация като в Percona XtraDB Cluster. От гледна точка на балансиране на натоварването, ProxySQL се държи подобно на MaxScale, тъй като може да разбере SQL трафика и има фин контрол върху това как трафикът се маршрутизира.
Архитектура на база данни за Nexcloud
В тази публикация в блога използвахме общо 6 възела.
- 2 x прокси сървъра
- 3 x база данни + сървъри на приложения
- 1 x сървър за контролер (ClusterControl)
Следната диаграма илюстрира нашата окончателна настройка:
За Percona XtraDB Cluster са необходими минимум 3 възела за солидна мулти-главна репликация. Приложенията Nextcloud са разположени съвместно в сървърите на базата данни, така че GlusterFS трябва да бъде конфигуриран и на тези хостове.
Нивото на балансиране на натоварването се състои от 2 възела за съкращаване. Ще използваме ClusterControl за разгръщане на нивото на базата данни и нивата на балансиране на натоварването. Всички сървъри работят на CentOS 7 със следната дефиниция /etc/hosts на всеки възел:
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
Имайте предвид, че GlusterFS и MySQL са много интензивни процеси. Ако следвате тази настройка (GlusterFS и MySQL се намират в един сървър), уверете се, че имате прилични хардуерни спецификации за сървърите.
Разгръщане на база данни Nextcloud
Ще започнем с внедряването на база данни за нашия клъстер Percona XtraDB с три възли, използвайки ClusterControl. Инсталирайте ClusterControl и след това настройте SSH без парола за всички възли, които ще бъдат управлявани от ClusterControl (3 PXC + 2 прокси сървъра). На възела ClusterControl направете:
$ 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
**Въведете root паролата за съответния хост, когато бъдете подканени.
Отворете уеб браузър и отидете на https://{ClusterControl-IP-address}/clustercontrol и създайте супер потребител. След това отидете на Разгръщане -> MySQL Galera. Следвайте съответно съветника за внедряване. На втория етап 'Define MySQL Servers', изберете Percona XtraDB 5.7 и посочете IP адреса за всеки възел на базата данни. Уверете се, че получавате зелена отметка, след като въведете данните за възела на базата данни, както е показано по-долу:
Щракнете върху „Разгръщане“, за да започнете внедряването. Клъстерът на базата данни ще бъде готов след 15~20 минути. Можете да проследите напредъка на внедряването в Активност -> Работни места -> Създаване на клъстер -> Пълни подробности за работата. Клъстерът ще бъде посочен под таблото за управление на клъстера на базата данни, след като бъде разгърнат.
Вече можем да продължим към внедряването на балансиране на натоварването на базата данни.
Разгръщане на системата за балансиране на натоварването на базата данни на Nextcloud
Препоръчва се Nextcloud да се изпълнява при настройка с един запис, където записите ще се обработват от един главен обект в даден момент, а четенията могат да бъдат разпределени към други възли. Можем да използваме ProxySQL 2.0, за да постигнем тази конфигурация, тъй като може да насочи заявките за запис към един главен.
За да внедрите ProxySQL, щракнете върху Действия на клъстер> Добавяне на Load Balancer> ProxySQL> Разгръщане на ProxySQL. Въведете необходимата информация, както е маркирано с червените стрелки:
Попълнете всички необходими подробности, както е подчертано от стрелките по-горе. Адресът на сървъра е сървърът lb1, 192.168.0.11. По-нататък ние определяме паролата за администратор на ProxySQL и потребителска парола за наблюдение. След това включете всички MySQL сървъри в комплекта за балансиране на натоварването и след това изберете "Не" в секцията Неявни транзакции. Щракнете върху „Разгръщане на ProxySQL“, за да започнете внедряването.
Повторете същите стъпки, както по-горе за вторичния балансьор на натоварване, lb2 (но променете „адреса на сървъра“ на IP адреса на lb2). В противен случай нямаше да имаме излишък в този слой.
Нашите ProxySQL възли вече са инсталирани и конфигурирани с две хост групи за Galera Cluster. Един за групата с един главен (hostgroup 10), където всички връзки ще бъдат препратени към един възел на Galera (това е полезно за предотвратяване на блокиране на множество главни) и групата с множество главни (hostgroup 20) за всички работни натоварвания само за четене, които ще бъде балансиран към всички backend MySQL сървъри.
След това трябва да разположим виртуален IP адрес, за да осигурим една крайна точка за нашите ProxySQL възли, така че приложението ви няма да има нужда да дефинира два различни хоста на ProxySQL. Това също така ще осигури възможности за автоматично преминаване при отказ, тъй като виртуалният IP адрес ще бъде поет от резервния ProxySQL възел, в случай че нещо се обърка с основния ProxySQL възел.
Отидете на ClusterControl -> Manage -> Load Balancers -> Keepalived -> Deploy Keepalived. Изберете "ProxySQL" като тип балансиране на натоварването и изберете два различни сървъра ProxySQL от падащото меню. След това посочете виртуалния IP адрес, както и мрежовия интерфейс, който ще слуша, както е показано в следния пример:
След като внедряването приключи, трябва да видите следните подробности в лентата за обобщение на клъстера:
Накрая създайте нова база данни за нашето приложение, като отидете на ClusterControl -> Manage -> Schemas and Users -> Create Database и посочете "nextcloud". ClusterControl ще създаде тази база данни на всеки възел на Galera. Нашето ниво на балансиране на натоварването вече е завършено.
Разгръщане на GlusterFS за Nextcloud
Следните стъпки трябва да се изпълнят на nextcloud1, nextcloud2, nextcloud3, освен ако не е посочено друго.
Първа стъпка
Препоръчително е да имате отделно това за хранилище на GlusterFS, така че ще добавим допълнителен диск под /dev/sdb и ще създадем нов дял:
$ fdisk /dev/sdb
Следвайте съветника за създаване на fdisk дял, като натиснете следния клавиш:
n > p > Enter > Enter > Enter > w
Стъпка втора
Проверете дали /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
Стъпка трета
Форматирайте дяла с XFS:
$ mkfs.xfs /dev/sdb1
Стъпка четвърта
Монтирайте дяла като /storage/brick:
$ mkdir /glusterfs
$ mount /dev/sdb1 /glusterfs
Уверете се, че всички възли имат следното оформление:
$ 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
Стъпка пета
Създайте поддиректория, наречена brick под /glusterfs:
$ mkdir /glusterfs/brick
Стъпка шеста
За резервиране на приложения можем да използваме GlusterFS за репликация на файлове между хостовете. Първо, инсталирайте хранилището на GlusterFS за CentOS:
$ yum install centos-release-gluster -y
$ yum install epel-release -y
Стъпка седма
Инсталирайте сървъра GlusterFS
$ yum install glusterfs-server -y
Стъпка осма
Активиране и стартиране на демон gluster:
$ systemctl enable glusterd
$ systemctl start glusterd
Стъпка девет
На nextcloud1 проучете другите възли:
(nextcloud1)$ gluster peer probe 192.168.0.22
(nextcloud1)$ gluster peer probe 192.168.0.23
Можете да проверите състоянието на партньора със следната команда:
(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)
Стъпка десета
На nextcloud1 създайте репликиран том на изследвани възли:
(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
Стъпка единадесета
Стартирайте репликирания том на nextcloud1:
(nextcloud1)$ gluster volume start rep-volume
volume start: rep-volume: success
Проверете дали репликираният том и процесите са онлайн:
$ 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
Стъпка дванадесета
Монтирайте репликирания том на /var/www/html. Създайте директорията:
$ mkdir -p /var/www/html
Стъпка тринадесета
13) Добавете следния ред в /etc/fstab, за да разрешите автоматично монтиране:
/dev/sdb1 /glusterfs xfs defaults,defaults 0 0
localhost:/rep-volume /var/www/html glusterfs defaults,_netdev 0 0
Стъпка четиринадесет
Монтирайте GlusterFS в /var/www/html:
$ mount -a
И потвърдете с:
$ 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)
Реплицираният том вече е готов и монтиран във всеки възел. Вече можем да продължим с внедряването на приложението.
Разгръщане на приложението Nextcloud
Следните стъпки трябва да се извършат на nextcloud1, nextcloud2 и nextcloud3, освен ако не е посочено друго.
Nextcloud изисква PHP 7.2 и по-нова версия, а за разпространението на CentOS трябва да активираме редица хранилища като EPEL и Remi, за да опростим процеса на инсталиране.
Първа стъпка
Ако SELinux е активиран, първо го деактивирайте:
$ setenforce 0
$ sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config
Можете също да стартирате Nextcloud с активиран SELinux, като следвате това ръководство.
Стъпка втора
Инсталирайте изискванията на Nextcloud и активирайте хранилището на Remi за 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
Стъпка трета
Инсталирайте зависимостите на Nextcloud, предимно свързани с Apache и 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
Четвърта стъпка
Активирайте Apache и го стартирайте:
$ systemctl enable httpd.service
$ systemctl start httpd.service
Стъпка пета
Направете символна връзка за PHP, за да използва PHP 7.2 двоичен файл:
$ ln -sf /bin/php72 /bin/php
Стъпка шеста
На nextcloud1 изтеглете Nextcloud Server от тук и го извлечете:
$ wget https://download.nextcloud.com/server/releases/nextcloud-17.0.0.zip
$ unzip nextcloud*
Стъпка седма
На nextcloud1 копирайте директорията в /var/www/html и задайте правилна собственост:
$ cp -Rf nextcloud /var/www/html
$ chown -Rf apache:apache /var/www/html
**Обърнете внимание, че процесът на копиране в /var/www/html ще отнеме известно време поради репликацията на том на GlusterFS.
Стъпка осма
Преди да пристъпим към отваряне на съветника за инсталиране, трябва да деактивираме променливата pxc_strict_mode на различна от "ENFORCING" (стойността по подразбиране). Това се дължи на факта, че импортирането на база данни в Nextcloud ще има определен брой таблици без дефиниран първичен ключ, което не се препоръчва да се изпълнява на Galera Cluster. Това е обяснено по-нататък в раздела Настройка по-надолу.
За да промените конфигурацията с ClusterControl, просто отидете на Управление -> Конфигурации -> Промяна/Задаване на параметри:
Изберете всички екземпляри на база данни от списъка и въведете:
- Група:MYSQLD
- Параметър:pxc_strict_mode
- Нова стойност:PERMISSIVE
ClusterControl автоматично ще извърши необходимите промени във всеки възел на базата данни. Ако стойността може да бъде променена по време на изпълнение, тя ще влезе в сила незабавно. ClusterControl също така конфигурира стойността в конфигурационния файл на MySQL за постоянство. Трябва да видите следния резултат:
Стъпка девет
Сега сме готови да конфигурираме нашата инсталация на Nextcloud. Отворете браузъра и отидете на HTTP сървъра на nextcloud1 на http://192.168.0.21/nextcloud/ и ще ви бъде представен следния съветник за конфигуриране:
Конфигурирайте секцията „Съхранение и база данни“ със следната стойност:
- Папка с данни:/var/www/html/nextcloud/data
- Конфигурирайте базата данни:MySQL/MariaDB
- Потребителско име:nextcloud
- Парола:(паролата за потребителя nextcloud)
- База данни:nextcloud
- Хост:192.168.0.10:6603 (Виртуалният IP адрес с ProxySQL порт)
Щракнете върху "Finish Setup", за да започнете процеса на конфигуриране. Изчакайте, докато приключи и ще бъдете пренасочени към таблото за управление на Nextcloud за потребител "admin". Инсталацията вече е завършена. Следващият раздел предоставя някои съвети за настройка, за да работите ефективно с Galera Cluster.
Настройка на базата данни на Nextcloud
Първичен ключ
Наличието на първичен ключ във всяка таблица е жизненоважно за репликацията на набора за запис на Galera Cluster. За сравнително голяма таблица без първичен ключ, голяма транзакция за актуализиране или изтриване напълно би блокирала вашия клъстер за много дълго време. За да избегнете всякакви странности и крайни случаи, просто се уверете, че всички таблици използват машина за съхранение на InnoDB с изричен първичен ключ (уникалният ключ не се брои).
Инсталацията по подразбиране на Nextcloud ще създаде куп таблици в посочената база данни и някои от тях не отговарят на това правило. За да проверим дали таблиците са съвместими с Galera, можем да изпълним следния оператор:
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 | | |
+---------------------------------------+--------+------+-------+--------+
Гореният изход показва, че има 7 таблици, които нямат дефиниран първичен ключ. За да коригирате горното, просто добавете първичен ключ с колона за автоматично увеличение. Изпълнете следните команди на един от сървърите на базата данни, например 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;
След като бъдат приложени горните модификации, можем да преконфигурираме обратно pxc_strict_mode до препоръчителната стойност „ENFORCING“. Повторете стъпка #8 в секцията „Разгръщане на приложение“ със съответната стойност.
Ниво на изолация ЗА ПРОЧЕТЕНЕ
Препоръчителното ниво на изолация на транзакциите, както е препоръчано от Nextcloud, е да се използва READ-COMMITTED, докато Galera Cluster е по подразбиране на по-строго ниво на изолация REPEATABLE-READ. Използването на READ-COMMITTED може да избегне загуба на данни при сценарии с голямо натоварване (например чрез използване на клиента за синхронизиране с много клиенти/потребители и много паралелни операции).
За да промените нивото на транзакцията, отидете на ClusterControl -> Manage -> Configurations -> Change/Set Parameter и посочете следното:
Щракнете върху "Напред" и ClusterControl ще приложи промените в конфигурацията незабавно. Не се изисква рестартиране на базата данни.
Nextcloud с множество инстанции
Тъй като извършихме инсталацията на nextcloud1 при достъп до URL адреса, този IP адрес автоматично се добавя към променливата 'trusted_domains' в Nextcloud. Когато се опитате да получите достъп до други сървъри, например вторичния сървър, http://192.168.0.22/nextcloud, ще видите грешка, че този хост не е оторизиран и трябва да бъде добавен към променливата trusted_domain.
Затова добавете всички IP адреси на хостове под масива "trusted_domain" вътре /var/www/html/nextcloud/config/config.php, като пример по-долу:
'trusted_domains' =>
array (
0 => '192.168.0.21',
1 => '192.168.0.22',
2 => '192.168.0.23'
),
Горената конфигурация позволява на потребителите да имат достъп до трите сървъра на приложения чрез следните URL адреси:
- http://192.168.0.21/nextcloud (nextcloud1)
- http://192.168.0.22/nextcloud (nextcloud2)
- http://192.168.0.23/nextcloud (nextcloud3)
Забележка:Можете да добавите ниво за балансиране на натоварването върху тези три екземпляра на Nextcloud, за да постигнете висока наличност за нивото на приложението, като използвате HTTP обратни прокси сървъри, налични на пазара, като HAProxy или nginx. Това е извън обхвата на тази публикация в блога.
Използване на Redis за заключване на файлове
Механизмът за заключване на транзакционни файлове на Nextcloud заключва файлове, за да избегне повреда на файловете по време на нормална работа. Препоръчително е да инсталирате Redis, за да се погрижите за заключването на транзакционни файлове (това е активирано по подразбиране), което ще разтовари клъстера на базата данни от справянето с тази тежка задача.
За да инсталирате Redis, просто:
$ yum install -y redis
$ systemctl enable redis.service
$ systemctl start redis.service
Добавете следните редове вътре /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,
),
За повече подробности вижте тази документация, Заключване на транзакционни файлове.
Заключение
Nextcloud може да бъде конфигуриран да бъде мащабируема и високодостъпна услуга за хостинг на файлове, която да отговаря на вашите изисквания за споделяне на лични файлове. В този блог показахме как можете да внесете излишък в слоевете Nextcloud, файловата система и базата данни.