![Как сделать кластер MySQL полностью отказоустойчивым?](https://rvso.com/image/1502919/%D0%9A%D0%B0%D0%BA%20%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C%20%D0%BA%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80%20MySQL%20%D0%BF%D0%BE%D0%BB%D0%BD%D0%BE%D1%81%D1%82%D1%8C%D1%8E%20%D0%BE%D1%82%D0%BA%D0%B0%D0%B7%D0%BE%D1%83%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D1%8B%D0%BC%3F.png)
Итак, я хочу настроить сервер базы данных MySQL с высокой доступностью — поэтому я приобрел себе два устройства (Banana Pi) и следовал руководству по установке программного обеспечения кластера MySQL. Я знаю, что созвездие всего из двух устройств — это не совсем то, как должен использоваться кластер MySQL, но для экономии затрат на оборудование я пока приобрел только эти два устройства.
На данный момент у меня следующая конфигурация (sqlnode1 и sqlnode2 — имена хостов устройств):
Узлы управления (ndb_mgmd):
- sqlnode1 (идентификатор узла: 1)
- sqlnode2 (идентификатор узла: 2)
Двигатели хранения (ndbd):
- sqlnode1: настроен на использование узла управления на локальном хосте (идентификатор узла: 3)
- sqlnode2: настроен на использование узла управления на локальном хосте (идентификатор узла: 4)
MySQL-серверы (mysqld):
- sqlnode1: настроен на использование обоих узлов ndbd (идентификатор узла: 5)
- sqlnode2: настроен на использование обоих узлов ndbd (идентификатор узла: 6)
По сути, на каждом устройстве запущены ndb_mgmd, ndbd и mysqld.
Я хотел бы добиться того, чтобы в случае отказа одного из устройств другое устройство было полностью пригодно к использованию (по некоторым весьма специфическим причинам я не могу использовать здесь простую репликацию базы данных).
После запуска всех компонентов все работает нормально. Если я изменяю данные на одном хосте MySQL, другой немедленно применяет изменения (и наоборот).
Однако если я отсоединяю кабель локальной сети одного из устройств, происходит следующее:
- Отключение sqlnode2: Функционирующий узел (sqlnode1) зависает на короткое время, а затем продолжает работать нормально (что, в принципе, мне и нужно)
- Отключение sqlnode1: Функционирующий узел (sqlnode2) зависает на короткое время, а затемвообще не работает- все запросы заканчиваются на "4009 Cluster Failure" и запросы начинают работать снова только после восстановления сетевого соединения узла, который отключился. После этого мониторинг демона ndb_mgmd показывает, что идентификатор узла 4 (ndbd на sqlnode2) был принудительно выключен.
Подводя итог, можно сказать, что вся система, по-видимому, зависит от sqlnode1, и мне действительно интересно, почему это происходит, поскольку я думал, что если компонент выходит из строя (и доступен другой того же типа), то все продолжает работать.
Я следовал этому руководству по настройке двух разных узлов управления:http://www.clusterdb.com/mysql-cluster/deploying-mysql-cluster-over-multiple-hosts
Я что-то пропустил? Или, может быть, я неправильно понял, как работает кластеризация MySQL?
решение1
Я не использовал Mysql Cluster, но вы должны иметь возможность делать репликацию в нем, также mysql cluster делает гораздо больше, чем вам, вероятно, нужно, если все, что вам нужно, это репликация. MySQL cluster имеет возможность маршрутизации на разные SQL-серверы на лету, если один из них выходит из строя, тем самым уменьшая необходимость изменять записи DNS имени хоста каждый раз или настраивать временный SQL-сервер или просто оставлять его мертвым, пока не будет исправлено. Он может делать и другие вещи. Поэтому, чтобы помочь вам, я предлагаю использовать MySQL Community Edition, так как он более удобен для вас, чем MySQL Cluster.
Возьмите mysql community edition, это позволит вам иметь репликацию, таким образом, вы можете установить 1 сервер mysql как главный, где все редактируется, а второй сервер mysql будет подчиненным, и он может просто извлекать то, что есть у главного сервера с настраиваемым интервалом. Вы также можете легко добавить больше подчиненных в будущем. Кроме того, подчиненные серверы не обязательно должны быть на отдельных машинах, вы можете запустить более 1 экземпляра MySQL. Однако это противоречит цели репликации и отказоустойчивости. Это, скорее всего, то, что вы ищете. Кроме того, на веб-сайте mysql есть руководство по настройке репликации для mysql community edition.
решение2
Я решил свои проблемы, перейдя на кластер Galera MySQL, который, похоже, делает именно то, что мне нужно.