MariaDB
 sql >> база данни >  >> RDS >> MariaDB

Разгръщане на високодостъпен Nextcloud с MySQL Galera Cluster и GlusterFS

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, файловата система и базата данни.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Форматирайте число като валута в MariaDB

  2. Как да форматирате числа в MariaDB

  3. Мигриране от Oracle Database към MariaDB – какво трябва да знаете

  4. Как работи WEIGHT_STRING() в MariaDB

  5. Как да инсталирате и защитите MariaDB в Ubuntu