воскресенье, 14 августа 2016 г.

Построение отказоустойчивого облака на базе Owncloud 9.1

Намедни решил я посмотреть, чтож такого новенького деятся в мире информационных наших технологий, и пошел гуглить на предмет новых версий "внедренных" мной когда-то программных продуктов.
Вспомнил, что сделал однажды проджект облачного хранения данных на основе owncloud версии 7.0.2, с отказоустойчивостью, со всеми делами, данное решение функционирует до сих пор и "есть не просит"! Ну вот, оказывается что вышла уже 9 версия и мало того , даже 9.1.., и решил я потестить че за "зверь" такой, сказано-сделано.
Поехали!!!

На всех серверах в качестве OC будет установлен Debian 8.5
Отказоустойчивость облака будет осуществляться на нескольких уровнях, т.к. метаданные
пользователей будут храниться в BD mysql, то на этом уровне будем использовать 3 ноды
Percona XtraDB Cluster 5.6 (2 основные ( oc1 и oc2) их базы будут доступны для записи и для чтения и дополнительный сервер (pxc0) необходим для инициализации кластера, а так же для бекапа, он же, в случае краха кластера будет являться "донором" для oc1 и oc2), пользователи c базой данного сервера pxc0 работать не будут! На oc1 и ос2 будет установлен owncloud 9.1, пользовательские данные облака будут синхронизироваться между этими серверами с помощью glusterfs.
Для единой точки входа будет использоваться виртуальный IP, функционал предоставлен ucarp
в качестве web server будем использовать nginx, схема приблизительно такая:

!!! Все действия будем осуществлять из под пользователя root
 0. Предварительные шаги на всех нодах:
# nano /etc/hosts

10.10.10.110 oc1.mydomain.ru oc1
10.10.10.111 oc2.mydomain.ru oc2
10.10.10.112 pxc0.mydomain.ru pxc0

перезапустим сетевые интерфайсы
# ifdown eth0 && ifup eth0


эт для того, чтоб наши ноды видели друг-друга по имени (проверимпопингуя)

1. Установка и настройка ucarp на oc1 и oc2

воспользуемся ссылкой

2. Установка и настройка Percona XtraDB Cluster на всех нодах
установим по инструкции пройдя по ссылке

после завершения установки перейдем к настройке:
заходим в mysql консоль:
# mysql -u root -p
вводим пароль который указали при настройке
и добавим юзера для бэкапа:
mysql> grant RELOAD, LOCK TABLES, REPLICATION CLIENT, FILE on *.* to backup@localhost identified by 'yourpassword';
выходим из mysql консоли
mysql> quit
 Потом потребуется одна небольшая переделочка. Дело в том что в debian
симлинк с sh ведёт на dash, а стартовый скрипт кластера заточен под bash.
Если нет никаких противопоказаний, можно уладить это общесистемно: 
# dpkg-reconfigure dash
 
в появившемся окне:
 Ответить НЕТ

 сконфигурируем кластер из трех нод:
pxc0.mydomain.ru: 10.10.10.112
oc1.mydomain.ru: 10.10.10.110
oc2.mydomain.ru: 10.10.10.111


для начала остановим на всех трех нодах сервис mysql
# /etc/init.d/mysql stop

на первой ноде pxc0

# nano /etc/mysql/my.cnf
добавим в блок

[mysqld]

datadir=/var/lib/mysql
user=mysql

# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so

# Empty gcomm address is being used when cluster is getting bootstrapped
wsrep_cluster_address=gcomm://

# Cluster connection URL contains the IPs of node#1, node#2 and node#3
#wsrep_cluster_address=gcomm://10.10.10.112,10.10.10.111,10.10.10.110

# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW

# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB

# This is a recommended tuning variable for performance
innodb_locks_unsafe_for_binlog=1

# This changes how InnoDB autoincrement locks are managed and is a requirement $
innodb_autoinc_lock_mode=2

# Node #1 address
wsrep_node_address=10.10.10.112

# SST method
wsrep_sst_method=xtrabackup

# Cluster name
wsrep_cluster_name=cluster1

# Authentication for SST method
wsrep_sst_auth="backup:yourpassword"


параметр wsrep_cluster_address=gcomm://
нужен для инициализации кластера

стартанем службу:
# /etc/init.d/mysql start


РЕМАРКА
!!!!!!!!
после того как все ноды кластера будут добавлены, можно закомментировать параметр
#wsrep_cluster_address=gcomm://
и раскоментировать
wsrep_cluster_address=gcomm://10.10.10.112,10.10.10.111,10.10.10.110
и выполним:
#service mysql bootstrap-pxc
тогда pxc0 станет полноценным членом кластера
тогда при отключении двух нод oc1 и oc2, кластер будет все ровно работать, и при возвращении выключенных машин в работу, данные они получат от pxc0, но если произойдет остановка всех трех машин, сначала включаем pxc0, выполняем команду:
#service mysql bootstrap-pxc
и включаем oc1 и ос2
кластер опять в "строю"
!!!!!!!!!

на второй ноде oc1:

# nano /etc/mysql/my.cnf

[mysqld]

datadir=/var/lib/mysql
user=mysql

# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://10.10.10.112,10.10.10.110,10.10.10.111
binlog_format=ROW
default_storage_engine=InnoDB
innodb_locks_unsafe_for_binlog=1
innodb_autoinc_lock_mode=2
# Node #2 address
wsrep_node_address=10.10.10.110
# SST method
wsrep_sst_method=xtrabackup-v2
# Cluster name
wsrep_cluster_name=cluster1
# Authentication for SST method
wsrep_sst_auth="backup:1234Abcd"


запустим сервис
# /etc/init.d/mysql start


на третей ноде oc2:

# nano /etc/mysql/my.cnf

[mysqld]

datadir=/var/lib/mysql
user=mysql

# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so
# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://10.10.10.112,10.10.10.110,10.10.10.111
binlog_format=ROW
default_storage_engine=InnoDB
innodb_locks_unsafe_for_binlog=1
innodb_autoinc_lock_mode=2
# Node #2 address
wsrep_node_address=10.10.10.111
# SST method
wsrep_sst_method=xtrabackup-v2
# Cluster name
wsrep_cluster_name=cluster1
# Authentication for SST method
wsrep_sst_auth="backup:1234Abcd"


запустим сервис
# /etc/init.d/mysql start

смотрим статус нашего кластера:
на любой из нод:
# mysql -u root -p

mysql>show status like 'wsrep%';
+----------------------------+--------------------------------------+
 | Variable_name                | Value                                             |
+----------------------------+--------------------------------------+
 | wsrep_local_state_uuid     | b598af3e-ace3-11e2-0800-3e90eb9cd5d3 |
...
 | wsrep_local_state          | 4                                                  |
| wsrep_local_state_comment  | Synced                                  |
...
| wsrep_cluster_size           | 3                                                   |
| wsrep_cluster_status       | Primary                                        |
| wsrep_connected             | ON                                                |
...
| wsrep_ready                    | ON                                                    |
+----------------------------+--------------------------------------+
Если наблюдаем примерно следующее, т.е. параметр wsrep_cluster_size равен 3
то значит все три ноды добавлены и теперь возвращаемся на первую ноду pxc0 и правим конфиг

# nano /etc/mysql/my.cnf

изменяем строки:

[mysqld]

#wsrep_cluster_address=gcomm://
wsrep_cluster_address=gcomm://10.10.10.112,10.10.10.111,10.10.10.110



3.Установим web server nginx на oc1 и ос2
 установим nginx
 #apt-get install nginx

 установим php5-fpm
#apt-get install php5-common php5-fpm php5-cli php5-json php5-mysql php5-curl php5-intl php5-mcrypt php5-memcache php-xml-parser php-pear php5-gd

 Перед установкой owncloud 9.1 cоздадим реплицируемое файловое хранилище на основе glusterfs из двух нод:

oc1.mydomain.ru: 10.10.10.110
oc2.mydomain.ru: 10.10.10.111

Данные будут храниться на отдельных дисках, сконфигурим их как LVM хранилище на двух нодах:

3.1 Посмотрим какие диски у нас имеются:

# fdisk -l

если у вас только один диск sda (на котором установлена система (как в моем случае), то необходимо добавить еще один большого объема(ну или не очень большого, как вам будет удобно)), т.к. у меня все это "хозяйство" в виртуальной среде находится, я добавил диск и поочередно перегрузил серваки, появились добавленные мной диски приступим к их конфигурированию

Диск /dev/sdb: 107.4 Гб, 107374182400 байт
255 головок, 63 секторов/треков, 13054 цилиндров, всего 209715200 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0x00000000

будем конфигурить неразмеченный вышеуказанный диск

Для создания LVM раздела нужна соответствующая утилита (LVM2), которая не устанавливается по умолчанию,
установим ее:

# apt-get install lvm2

3.2 Cоздим партицию LVM

# fdisk /dev/sdb
n -> p -> 1 -> enter -> enter
t -> 8e
w



1) создадим PV
# pvcreate /dev/sdb1 (new partition's name)
# pvdisplay

2) создадим VG
# vgcreate vg1 /dev/sdb1
# vgdisplay

3) создадим LV
# lvcreate -L +99G -n lv1 /dev/vg1 (L- указываем размер раздела LVM (он должен быть немного меньше нашего диска) n- имя lvm раздела)
# lvdisplay

4) отформатируем раздел под ext4
# mkfs.ext4 /dev/vg1/lv1

5) создадим директорию в которую будем мапить наш раздел

# mkdir /data


6) для автомапа добавим в /etc/fstab соответствующие строки
# nano /etc/fstab
в конец добавим:
/dev/vg1/lv1 /data ext4 errors=remount-ro 0 1

7) обновим /etc/fstab
# mount -a

8) убедимся что наш раздел успешно замаплен

# df -h

3.3 установим относительно новую версию(по сравнению с той которая в стандартных репах находится 3.4) glusterfs 3.6.9:
удалим старую установку(если таковые имеются)
#apt-get purge glusterfs-client glusterfs-server

и установим новую:
#echo "deb http://ppa.launchpad.net/gluster/glusterfs-3.6/ubuntu trusty main" >>/etc/apt/sources.list

#echo "deb-src http://ppa.launchpad.net/gluster/glusterfs-3.6/ubuntu trusty main" >>/etc/apt/sources.list
#gpg --keyserver pgpkeys.mit.edu --recv-key 13E01B7B3FE869A9

#gpg -a --export 13E01B7B3FE869A9 | apt-key add -

#apt-get update
#apt-get install glusterfs-client glusterfs-server


убедимся что версии glusterfs у нас одинаковые:
# glusterfsd --version

на первой ноде oc1.mydomain.ru выполним:

# gluster peer probe oc2.mydomain.ru

тем самым добавим ее в кластер

посмотрим статус
# gluster peer status
 
3.4 Hастроим репликация файлов между 2 nodes, без единой точки отказа:

1) на каждой ноде создадим точку монтирования:

в этой папке будут находиться файлы данных пользователей нашего облачного хранилища owncloud:

# mkdir -p /var/www/owncloud/data


2) созданим реплицируемый раздел на первой ноде oc1.mydomain.ru
создадим субдиректорию в смонтированной /data

  mkdir -p /data/oc


2.1) # gluster volume create owncloudvol replica 2 transport tcp oc1.mydomain.ru:/data/oc oc2.mydomain.ru:/data/oc
и запустим его:

2.2) # gluster volume start owncloudvol


2.3) на первой ноде oc1.mydomain.ru добавим строку в /etc/fstab
# nano /etc/fstab

oc1.mydomain.ru:/owncloudvol /var/www/owncloud/data glusterfs defaults,_netdev 0 0

на второй ноде oc2.mydomain.ru

# nano /etc/fstab

oc2.mydomain.ru:/owncloudvol /var/www/owncloud/data glusterfs defaults,_netdev 0 0

2.4) обновим /etc/fstab

# mount -a

!!!!!!
если вдруг автомонтирования не происходит после перезагрузки то
необходимо сделать след:

#nano /etc/rc.local
пропишем в скрипте (перед exit 0) нижеследующее:

sleep 5
mount -a


получится вот так:
sleep 5
mount -a
exit 0

т.е. выполним mount -a c задержкой в 5 секунд

4. Скачаем и установим owncloud 9.1
#cd /var/www/


#wget https://download.owncloud.org/community/owncloud-9.1.0.tar.bz2

#tar xvfj owncloud-9.1.0.tar.bz2

#rm owncloud-9.1.0.tar.bz2

#chown -R www-data:www-data owncloud/ 

 4.1 сгенерируем и получим сертификаты для нашего веб сервера и поместим их в соответствующее хранилище:
этот момент тоже очень важный,  я уже писал как  получить валидный несамоподписанный ssl сертификат у startssl (в рамках статьи про zimbra), но намедне узнал, что китайсы а именно
WoSing выдают бесплатный сертификат аж на 3 года, вот так, идем по ссылке и следуя инструкции получаем, у нас должно получится 2 сертификата, один закрытый ключ (после выполнения
#openssl genrsa -des3 -out mydomain.ru.key 2048 (если с паролем)
или
#openssl genrsa -out mydomain.ru.key 2048 (без пароля)

и подписанный сертификат, который в последствии мы получим от WoSing
mydomain.ru.crt
вот их нужно поместить в специально создай "контейнет"
#mkdir /etc/nginx/ssl/
и потом в конфиге нашего веб сервера nginx указать путь к ним, приведем конфиг nginx к следующему виду:
#nano /etc/nginx/conf.d/default.conf 

 upstream php-handler {
        server unix:/var/run/php5-fpm.sock;
}

server {
listen 80;
server_name cloud.mydomain.ru oc1.mydomain.ru oc2.mydomain.ru;
return 301 https://$server_name$request_uri; # enforce https
}

server {
listen 443 ssl;
server_name cloud.mydomain.ru oc1.mydomain.ru oc2.mydomain.ru;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains";
ssl_certificate /etc/nginx/ssl/mydomain.ru.crt;
ssl_certificate_key /etc/nginx/ssl/mydomain.ru.key;

# Path to the root of your installation
root /var/www/owncloud;

client_max_body_size 10G; # set max upload size
fastcgi_buffers 64 4K;

rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

index index.php;
error_page 403 /core/templates/403.php;
error_page 404 /core/templates/404.php;

location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}

location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README) {
deny all;
}

location / {
# The following 2 rules are only needed with webfinger
rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

try_files $uri $uri/ index.php;
}

location ~ \.php(?:$|/) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param HTTPS on;
fastcgi_pass php-handler;
}

# Optional: set long EXPIRES header on static assets
location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
expires 30d;
# Optional: Don't log access to assets
access_log off;
}

}

а конфигурационный файл php5-fpm к следующему:

#nano /etc/php5/fpm/pool.d/www.conf
точнее добавить нужно следующие строки, ну или раскомментировать
listen.mode = 0660
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

перезагрузим сервисы:

service php5-fpm restart
service nginx restart


сразу же настроим Memory Caching, воспользуемся официальными манами пройдя по ссылке
(я лично воспользовался  Redis), можно конечно обойтись и без кешинга, но я рекомендую все таки сконфигурить, прирост в производительности очень заметный!!!

 

до того как приступим непосредственно к конфигурированию, мы должны создать базу данных owncloud и пользователя, на любой из нод:

#mysql -u root -p

mysql> CREATE DATABASE owncloud;

mysql> GRANT ALL ON owncloud.* TO 'owncloud'@'localhost' IDENTIFIED BY 'mypass';

mysql> quit


заходим через браузер по адресу:
http://VIP
Мы видим начальный экран приветствия, где настраиваем
1. учетную запись (имя пользователя и пароль)- это будет админская учетная запись
2. в качестве базы данных выбираем mysql
2.1 указываем базу (owncloud) имя пользователя для доступа к базе
     (owncloud) и пароль (mypass), имя хоста оставляем без изменений (localhost)
т.к. у нас кластер а конфиг файл у нас не реплицируется, поэтому мы выключим одну ноду (любую), а после включим на скопируем на нее "правильный"
/var/www/owncloud/config/config.php

 Ну вот и все, теперь конфигурим сервер из вебинтерфейса под ваши нужды, как это делать читаем в админ мануале от вендера, ну или в гугль!

PS: узнал, что основатель проекта и 9 из 10 основных кодера покинули компанию owncloud и форкнули продукт под новой маркой nextcloud, что посути означает, что в скором времени(скорее всего)owncloud канет в летА, посему лучше сразу перейти на nextcloud, что я и сделал:-))), благо миграция занимает несколько минут, правда с 9.1 пока нет возможности перейти до официального выхода nextcloud 10, поэтому я даунгрейднул систему(проще говоря переустановил) до версии 9.0.4, а уже с нее легко переехал на nextcloud 9.0.53
howto по ссылке

Вот теперь все,здоровья Вам, мира и по традиции
Удачи и помните:"Все в Ваших руках, если есть "Руки""

Комментариев нет:

Отправить комментарий