Отказоустойчивость сайта на KVM

12 3
G
На сайте с 19.07.2009
Offline
39
1927

Здравствуйте.

Беспокоюсь о беспрерывной работе сайта. Поэтому решил провести работы по повышению отказоустойчивости.

Сейчас сижу на KVM (CentOS, nginx, php-fpm, mysql), данные (mysql, php, img - т.е. то что касается только сайта, а не сервера) бэкапятся на другой KVM с помощью "XtraBackup" и "Rsync + lsyncd".

Все это позволяет относительно быстро восстановить работоспособность при потере данных с основного KVM, но с остановкой сайта.

Прочитал множество статей на эту тему (зеркалирование, кластеризация (облако), RAID, масштабируемость ...) и обсуждения в комментариях к ним, но так и не смог найти и остановиться на том, что мне надо.

А конкретнее, что в итоге хотелось бы получить:

1) создать зеркало (или что-то типа этого) "KVM_1" ( расположен в России) на KVM у другого хостера, назовем его "KVM_2" (расположен в Германии).
2) при отказе "KVM_1" автоматически переключаться на "KVM_2"
3) по возможности использовать ресурсы "KVM_2" совместно с "KVM_1" (балансировка нагрузки)
4) при необходимости провести тестирование или обновления ПО на "KVM_1", временно отключить его и перенаправить все запросы на "KVM_2"
5) масштабируемость: сначала естественно просто покупка самого дорогого KVM плана, ну а дальше переход на один дедик, два и т.д., с безостановочной работой сайта для пользователя
6) Реализовать все это программным путем, не аппаратным.

Самым оптимальным решением на данный момент для меня:

- создаем два KVM

- синхронизируем их с помощью "Rsync + lsyncd" (и сразу вопрос, можно ли синхронизировать таким образов и файлы баз данных mysql)

- при отказе или проведении моих работ на "KVM_1", переключать с помощью "A" записи в "Управление DNS зоной" с ip "KVM_1" на ip "KVM_2".

Минусы данной схемы:

- это все происходит не автоматом, а в ручном режиме.

- не используются ресурсы "KVM_2" совместно с "KVM_1"

- и не нашел информацию можно ли синхронизировать "Rsync + lsyncd" файлы баз данных mysql

Рассматривал так же DNS ротацию, но она откидывает половину пользователей при не рабочем одном KVM, так что это не вариант.

Как и любой другой нормальный проект, планируется постоянное увеличение пользователей и соответственно нагрузки на систему, увеличения размера БД, количества файлов, поэтому хотелось с самого начала организовать все максимально правильно, чтобы потом не грызть локти. НУ а сейчас все это умещается на не большом KVM )))

Прошу поделиться рабочими примерами (схемы и реализация), желательно с реальных проектов. Кто уже сталкивался с этим, не проходите мимо, подскажите, пожалуйста, как это делается ПРАВИЛЬНО.

****************************************************************************

MirUrokov.ru - ГДЗ (готовые домашние задания), видео уроки, открытые уроки, онлайн калькуляторы. (http://mirurokov.ru)
M
На сайте с 30.08.2010
Offline
92
#1

А что мешает настроить репликацию баз? Балансировку http можно и на базе Nginx настроить: http://nginx.org/ru/docs/http/ngx_http_upstream_module.html или HAproxy

Оптимизайка
На сайте с 11.03.2012
Offline
396
#2

Нельзя синхронизировать виртуалки так, как вы пишете. Для перемещения сайта с одного kvm-узла на другой в kvm есть миграция, при которой мигрируемая система "замораживается". Вживую копировать образы диска - получите битую базу данных или файловую систему.

Баланисировку надо делать через nginx, а не через DNS лучше. БД реплицировать между узлами.

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
G
На сайте с 19.07.2009
Offline
39
#3
репликацию баз

На сколько я понимаю, это может поможет для бекапа и балансировки при SELECT, но если не доступен "KVM_1", то все равно ничего не работает. С Nginx и HAproxy, таже ситуация.

---------- Добавлено 09.11.2013 в 16:32 ----------

мигрируемая система "замораживается"

Ведь это делается всего на несколько секунд максимум, для создания слепка. Или на все время пока весь диск не скопируется и его разместят на "KVM_2". И эта "миграция" делается только один раз в начале, а потом все синхронизируется автоматом?

Балансировку надо делать через nginx, а не через DNS лучше. БД реплицировать между узлами.

Как же быть если нет доступа к "KVM_1", как перебросить на "KVM_2"?

Andreyka
На сайте с 19.02.2005
Offline
822
#4

Правильно это делается на уровне приложения

Не стоит плодить сущности без необходимости
G
На сайте с 19.07.2009
Offline
39
#5
Правильно это делается на уровне приложения

Правильно ли я понял, Вы про дальнейшую синхронизацию автоматом через "Rsync + lsyncd" после слепка диска.

А можете меня немного распутать, чтобы я понял суть...

Вот, например, Вконтакте, Google и т.п., как они держат постоянную доступность сайта. Получается у них есть аппаратный балансировщик, который принимает все запросы на себя и потом распределяет все на другие сервера. Он должен быть доступен 24/7. Но это же нереально. Или у них несколько аппаратных балансировщиков?

M
На сайте с 30.08.2010
Offline
92
#6
gooooodru:
На сколько я понимаю, это может поможет для бекапа и балансировки при SELECT, но если не доступен "KVM_1", то все равно ничего не работает. С Nginx и HAproxy, таже ситуация.

Это уже вопрос настройки серверов и приложения. Если топорно, то берите Failover DNS с маленьким TTL и A-записями, направленными на оба сервера. на каждом из серверов Nginx с балансировкой. Между базами правильная репликация (master-slave или master-master решать Вам), и т.д. и .т.п.

Правильным решением было бы обратиться к профессионалам, которые проанализируют приложение и предложат оптимальный вариант конкретно для Вашего приложения. А на форуме могут быть только общие советы и ссылки на тонны документации.

---------- Добавлено 09.11.2013 в 14:55 ----------

gooooodru:

Вот, например, Вконтакте, Google и т.п., как они держат постоянную доступность сайта. Получается у них есть аппаратный балансировщик, который принимает все запросы на себя и потом распределяет все на другие сервера. Он должен быть доступен 24/7. Но это же нереально. Или у них несколько аппаратных балансировщиков?

$ host google.com

google.com has address 173.194.39.66

google.com has address 173.194.39.65

google.com has address 173.194.39.67

google.com has address 173.194.39.73

google.com has address 173.194.39.72

google.com has address 173.194.39.64

google.com has address 173.194.39.71

google.com has address 173.194.39.78

google.com has address 173.194.39.70

google.com has address 173.194.39.68

google.com has address 173.194.39.69

Как-то так :)

G
На сайте с 19.07.2009
Offline
39
#7

Вот это уже ответ, есть куда копать. Но все равно есть вопросы.

Failover DNS с маленьким TTL и A-записями, направленными на оба сервера

Не получается что это DNS Round-Robin, то что я описывал в начале?

Не будет ли большая нагрузка на DNS сервер с маленьким TTL?

Правильным решением было бы обратиться к профессионалам

Обычная ситуация: проект не коммерческий и соответственно бюджет невелик. Вот и спрашиваю здесь.

Оптимизайка
На сайте с 11.03.2012
Offline
396
#8
gooooodru:
Обычная ситуация: проект не коммерческий и соответственно бюджет невелик. Вот и спрашиваю здесь.

Загрузите своим проектом сначала один сервер по максимуму, потом далее будете думать. А то даже сотни тысяч уников нету в день, а уже кластеры хочется строить.

M
На сайте с 30.08.2010
Offline
92
#9
gooooodru:
Вот это уже ответ, есть куда копать. Но все равно есть вопросы.


Не получается что это DNS Round-Robin, то что я описывал в начале?
Не будет ли большая нагрузка на DNS сервер с маленьким TTL?

В каком-то смысле да, round robin, но небольшой TTL позволит быстро переключиться. Как я говорил, решение топорное и не спасет от глупых провайдеров, игнорирующих TTL и кеширующих записи на несколько дней. Поэтому и нужен умный Failover-сервис. Городить свое решение в рамках небольшого бюджета нет смысла.

gooooodru:
Обычная ситуация: проект не коммерческий и соответственно бюджет невелик. Вот и спрашиваю здесь.

Вы думали что будете делать, если все это дело развалится на каком-то из уровней? Поднять - это одно. Поддерживать сложнее.

G
На сайте с 19.07.2009
Offline
39
#10
Загрузите своим проектом сначала один сервер по максимуму, потом далее будете думать. А то даже сотни тысяч уников нету в день, а уже кластеры хочется строить.

Да мне самое главное не нагрузку распределить, а "Отказоустойчивость сайта на KVM", т.е доступность. А то получается иногда, что вроде бы и есть сайт, а он недоступен. Представьте как плохо без если бы лежали Google, Яндекс...

---------- Добавлено 09.11.2013 в 17:39 ----------

решение топорное и не спасет от глупых провайдеров, игнорирующих TTL и кеширующих записи на несколько дней

А я уже подумал это панацея.

Поэтому и нужен умный Failover-сервис

А он спасет от тех "глупых провайдеров"?

Городить свое решение в рамках небольшого бюджета нет смысла.

Так получается, что нужен бюджет по-больше, а потом: покупка дедиков и аппаратных балансировщиков?

Или все же есть что-то среднее?

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий