/otus_project

Проектная работа - Отказоустойчивый кластер веб-приложения

Primary LanguageShell

OTUS Проектная работа. Тема: Отказоустойчивый кластер веб-приложения (Centos 7)


Проектная работа
Заключительный месяц курса посвящен проектной работе. Свой проект это то, что интересно писать студенту. То, что можно создать на основе знаний, полученных на курсе.
При этом не обязательно закончить его за месяц. В процессе написания по проекту можно получить консультации преподавателей. 

Необходимое ПО для запуска проекта:

  • Vagrant (Конфигурирует ВМ исходя из написанного кода)
  • Ansible (Система управления конфигурациями)
  • VirtualBox (или другой провайдер виртуализации)

Vagrant и Ansible работают в парадигме "Инфрастуктура как код"

Схема:

Image 12

Состав проекта:

Всего нод: 17

  1. Балансировщики нагрузки (http), VIP: 192.168.10.39 (первично принимают и проксируют траффик до веб-серверов). Конфигурация Active-StandBy.
  • Balancer1 IP: 192.168.10.40 Установлено: KeepAlived, HAProxy (Master)
  • Balancer2 IP: 192.168.10.41 Установлено: KeepAlived, HAProxy (Slave)
  1. Веб-сервера (отдают статику и отправляют балансировкой на сервера приложения)
  • Web1 IP: 192.168.10.42 Установлено: Nginx, служба GlusterFS для монтирования директории с файлами сайта (Master)
  • Web2 IP: 192.168.10.43 Установлено: Nginx, служба GlusterFS для монтирования директории с файлами сайта (Master)
  1. Кластерная файловая система (здесь храняться файлы сайта)
  • GlusterFS1 IP: 192.168.10.44 Установлено: GlusterFS (Master)
  • GlusterFS2 IP: 192.168.10.45 Установлено: GlusterFS (Master)
  • GlusterFS3 IP: 192.168.10.46 Установлено: GlusterFS (Master)
  1. Сервера приложений (исполняют PHP код, проксируют SQL запросы к серверам БД, отправляют на сервера Redis (балансировщик) сессии и оттуда же читают)
  • Backend1 IP: 192.168.10.47 Установлено: PHP, служба GlusterFS для монтирования директории с файлами, ProxySQL (Master)
  • Backend2 IP: 192.168.10.48 Установлено: PHP, служба GlusterFS для монтирования директории с файлами ProxySQL (Master)
  1. Балансировщики нагрузки (Redis, MySQL) VIP: 192.168.10.53 (проксируют Redis запросы с серверов приложений и есть запасная возможность проксировать SQL через HAProxy). Конфигурация Active-StandBy.
  • Balancer3 IP: 192.168.10.52 Установлено: KeepAlived, HAProxy (Master)
  • Balancer4 IP: 192.168.10.54 Установлено: KeepAlived, HAProxy (Slave)
  1. Сервера NoSQL БД Redis для хранения сессий и кэширования (также может быть использован для кэширования результатов SQL запросов, ускоряет загрузку сайта примерно в 2 раза. Для этого используется специальное расширение в самом Wordpress, необходимо дополнительно настраивать). Sentinel необходим за контролем и переключением мастера и слэйва. Необходимо использовать нечетное количество нод для достижения кворума. В данном случае решение о переключении мастера принимают 2 ноды Sentinel.
  • Redis1 IP: 192.168.10.49 Установлено: Redis, Sentinel (Master)
  • Redis2 IP: 192.168.10.50 Установлено: Redis, Sentinel (Slave)
  • Redis3 IP: 192.168.10.51 Установлено: Redis, Sentinel (Slave)
  1. Сервера БД (Percona XtraDB - является наиболее стабильным форком MySQL, решено большое количество вопросов в плане стабильности и возможностей резервного копирования, есть возможность купить платную поддержку) Необходимо использовать нечетное количество серверов в режиме мультимастер.
  • Percona1 IP: 192.168.10.55 Установлено: Percona MySQL (Master)
  • Percona2 IP: 192.168.10.56 Установлено: Percona MySQL (Master)
  • Percona3 IP: 192.168.10.57 Установлено: Percona MySQL (Master)

На веб-серверах и серверах приложения настроены одинаковые пути до директории сайта - /mnt/gluster/.

Описание ПО и проекта:

Проект представляет собой отказоустойчивый кластер на всех уровнях работы приложения. Таким образом, выход какой либо ноды не критичен для работы сервиса.

Используемое ПО:

  1. KeepAlived - ПО, которое следит за состоянием приложения HAProxy, а также за состоянием другого хоста (в случае если Slave). Использует общий виртуальный IP адрес, который перетекает на ту ноду которая осталась жива либо на которой работает приложение HAProxy, необходимое для проксирования запросов.

  2. HAProxy - проксирует пользовательские запросы. В проекте используется http, redis, MySQL проксирование (на balancer3 и balancer4 как запасное MySQL проксирование).

Image 1

  1. Nginx - высокопроизводительный веб-сервер. Выделен в отдельно стоящую группу серверов, для более эффективного размазывания нагрузки. Сервер в данном случае сжимает траффик, на что тратяться дополнительные ресурсы процессора.

  2. Интерпретатор PHP 7.2 - установлен на отдельных серверах приложений

  3. ProxySQL - ПО, которое позволяет проксировать SQL запросы по группам серверов (группы записи, группы чтения, запасная группа записи). Следить за доступностью SQL серверов, и автоматически выводит и вводит в строй. Имеет свой командный интерфейс управления (аналогичен работе с обычным SQL инстансом). Умеет определять тип запроса и отправлять на нужные сервера. В данном случае используется 1 сервер для записи, несмотря на то что у нас в схеме 3 мастер сервера. Сделано для того чтобы избежать взаимных блокировок (DeadLock). В данном проекте ProxySQL является основным проксирующим средством SQL запросов.

Image 2

Image 3

  1. GlusterFS - кластерная файловая система. Образует файловый кластер для файлового хранилища (где хранятся файлы сайта). Все веб-сервера и сервера приложений имеют доступ к файловому хранилищу для того чтобы сайт работал. На веб-серверах и серверах приложений установлен клиент GlusterFS.

Image 4

  1. Redis (6 версия) - NoSQL БД для хранения сессий и кэширования данных. В нашей схеме используется 1 мастер и 2 слэйва. В случае падения мастера, происходит переключение. За переключением следит Sentinel. Хранит данные в ОЗУ, за счет чего быстро записывает и отдает данные. Периодически сохраняет данные на диск.

Image 5

Image 6

  1. Percona Multi-Master MySQL - сервера БД, которые хранят данные сайта в таблицах. Каждый читает и записывает с/на каждого.

Image 7

Balancer3 и Balancer4 также могут проксировать SQL запросы, однако HAProxy не умеет понимать тип SQL запроса. Проксирование идет исходя из доступности нод. Также же на этих нодах проксируется Redis, в данном случае HAProxy определяет кто из нод мастер и записывает только на мастер. Как видно на изображении ниже, 2 Slave сервера redis помечены красным, это нормально, так как на них не отправляются запросы. Запись может выполняться только на мастер сервер. Также видно что настроено MySQL проксирование (как резервное, а также для демонстрации возможностей), исходя из настроек весов, запросы отправляются всегда на один сервер.

Image 8

Веб-интерфейс сайта:

ProxySQL использует порт 6033 для проксирования запросов сайта, и порт 6032 для администрирования.

Image 9

На слайде ниже предлагается создать файл конфигурации для связи с БД. Чтобы не создавать файл вручную нужно выставить на 2 файла права 777, но предоставлять такие права файлам не безопасно, поэтому мы создаем такой файл вручную. Права 750.

Image 10

Image 11

Как запустить:

Ноды необходимо запускать в определенном порядке. Этот порядок отражен ниже.

  • git clone git@github.com:staybox/otus_project.git && cd otus_project && vagrant up percona1 percona2 percona3 redis1 redis2 redis3 balancer3 balancer4 glusterfs1 glusterfs2 glusterfs3 && export ANSIBLE_CONFIG=$(pwd)/ansible-gluster/ansible.cfg && ansible-playbook ansible-gluster/provision.yml && vagrant up backend1 backend2 web1 web2 balancer1 balancer2