Я планирую реплицировать веб-сервер для обеспечения высокой доступности. Сервер работает как виртуальная машина Ubuntu 15.04 в Hyper-V и на нем установлены MariaDB 10.0, Apache 2.4 и PHP-FPM 5.6.
Вторая виртуальная машина запустится как прямая копия этой виртуальной машины, но будет расположена в США. Первая виртуальная машина находится в Европе. (задержка будет порядка 80-120 мс)
Я хотел бы, чтобы серверы были синхронизированы, чтобы они могли обслуживать один и тот же контент для моих клиентов, и чтобы клиенты использовали ближайший сервер (для этого я буду использовать Route 53)
Важно, чтобы обмен данными между серверами был безопасным, чтобы защитить контактные данные и другую информацию в базе данных и предотвратить изменение файлов в каталоге / var / www.
Я рассматривал возможность использования для этого следующих вариантов:
SSL (TLS)
Я рассматривал возможность использования SSH как для базы данных, так и для репликации файлов. Однако я не уверен, какое приложение использовать для репликации файлов.
SSL можно использовать для репликации базы данных, но для этого требуется генерация сертификатов, которые нужно время от времени заменять и что может стоить денег.
Мой последний вариант - использовать openvpn, но я не уверен, смогу ли я настроить его как дополнительную сеть вместо маршрутизации всего моего трафика по ней. Похоже, что этот метод также требует создания файлов сертификатов.
Вам не нужны платные сертификаты TLS для личного общения. Вы можете создать свой собственный ЦС (с очень долгосрочными сертификатами, в случае компрометации вы просто выбросите весь ЦС) и сделать так, чтобы ваши серверы доверяли ему, после чего вы можете выдавать столько сертификатов, сколько хотите для разных служб. Платные сертификаты необходимы только в том случае, если вы не можете надежно заставить удаленные узлы доверять вашему ЦС, как, например, посетители вашего веб-сайта.
Если вам просто нужно использовать одну службу, и она поддерживает TLS (например, MySQL), воспользуйтесь этим и добавьте дополнительный уровень безопасности, разрешив соединения только с IP-адресов вашего сервера на уровне брандмауэра.
Если вам нужно несколько услуг, вам лучше выбрать VPN. Не тратьте время на OpenVPN, ваше ядро имеет встроенную поддержку IPSec, и вы можете ее использовать. Кроме того, он сразу же поддерживается в Windows, поэтому, если вы когда-нибудь развернете такие серверы, их будет легко настроить.
Это была легкая часть. Реальная сложность заключается в том, чтобы синхронизировать файлы вашего приложения, это легко, если ваше приложение использует только базу данных, но если это CMS общего назначения, есть большая вероятность, что она также изменяет свои собственные файлы по любой причине (обновления плагинов для пример) или создает новые (загружаемый пользователем контент и т. д.), и я не знаю надежного способа их синхронизации. Единственное решение, которое приходит на ум, - это либо NFS (и наличие только одного сервера, на котором размещаются файлы, но это противоречит вашим требованиям к высокой доступности), либо GlusterFS, оба из которых будут работать довольно плохо с такой задержкой.
Вы не упомянули, но я предполагаю, что вам нужна установка с несколькими мастерами. Это исключает установку базы данных "главный-подчиненный".
Я считаю, что вы меньше всего будете беспокоиться о том, какую технологию использовать для обеспечения безопасности.
1. База данных
Сохранять синхронизацию настройки базы данных с несколькими мастерами непросто. Вы можете использовать настройки базы данных с несколькими ведущими (активными / активными), такие как MariaDB с Galera Cluster, но я не уверен, насколько это хорошая идея, учитывая географическое расстояние. Все записи будут синхронными для всех узлов базы данных. Задержка сильно повлияет на производительность базы данных. Кластеры баз данных, такие как Galera, обычно считаются хорошими кандидатами в рамках одной локальной сети. Однако с точки зрения производительности кластеры баз данных с несколькими главными обычно описываются как худшие, когда речь идет о «реальных» установках высокой доступности, когда узлы базы данных распределены по нескольким физическим местоположениям в глобальной сети. Прежде чем перейти к настройке базы данных с несколькими мастерами, сначала прочтите эту тему. Начните с взгляда на Блог о масштабировании.
Вы также можете использовать другой подход и изучить SymmetricDS, который позволяет синхронизировать базы данных. Он использует триггеры для захвата операций CRUD базы данных. Он не будет реплицировать изменения схемы, пользователей или что-либо еще, кроме чистых данных. Однако это будет асинхронная репликация, и она не позаботится, например, о автоматически увеличиваются первичные ключи, как в кластере MariaDB Galera.
2. Файлы
Вы можете использовать центральный сервер NFS, но это лишит вас возможности использовать несколько мастеров (и не будет единой точки отказа). Я использовал csync2 (с lsyncd), чтобы веб-узлы синхронизировались с успехом (rsync под капотом).
Генеральный совет
Вы делаете это для повышения производительности или для обеспечения высокой доступности? Если вы сделаете это для повышения производительности, одно место и сервер Varnish впереди уведут вас далеко. Я знаю, что у вас все еще будет задержка, но вы сможете «сократить» накладные расходы на сервер с помощью кэширования. Вы даже можете добавить серверы Varnish в других местах. Сложность будет значительно уменьшена (никогда не недооценивайте это; сохраняйте простоту). Добавьте к этому CDN для ресурсов (CSS, js, изображения и т. Д.), И вы, скорее всего, сможете предоставить пользователям в США такое же удобство, как и для европейских пользователей (если вы базируете свой сервис в Европе).
Если вы сделаете это для высокой доступности, вам придется добавить сложности, введя репликацию.
rsync
- отличный инструмент для синхронизации файлов. Я бы использовал его в сочетании с SSH (и открытыми ключами), например:
rsync -az -e ssh --delete /var/www otherserver:/var/www
Для нескольких серверов несколько вариантов использования rsync
может быть лучшим вариантом. Другой вариант - pdcp -r
, но для этого требуется каждый раз копировать все файлы, а не выполнять дельта-передачу. Другими словами, это лучше для небольших объемов данных и большого количества серверов.
Как наилучшим образом выполнить репликацию базы данных во многом зависит от того, что делает ваше приложение. Здесь есть много хороших советов в документации MariaDB и другие вопросы.