Комментарии 41
1) Кадровая — людей, которые умеют траблшутить галеру на рынке достаточно мало.
2) Галера работает на основе синхронной репликации. То есть в случае замедления работы на одном из серверов, это будет сказываться на всем кластере. Да и в штатном режиме такой режим работы медленнее. При этом наше ПО адекватно реагирует на вменяемое отставание реплик.
Когда мы начнем задумываться об отказоустойчивости по ДЦ, то мы обязательно вернемся к этому вопросу. Пока думаем, что наши проблемы решаются без получения дополнительной головной боли.
Вероятность роста таких нагрузок все же много больше вероятности отказа ДЦ. Мы впервую очередь закрываем наиболее вероятные риски с наибольшей опасностью для аптайма.
На случай ухода ДЦ у нас есть свои механизмы восстановления работоспособности (пока с небольшим даунтаймом), но об этом в следующих сериях ;-)
По галере: для внедрения нужен как минимум опыт в команде по её использованию и сопровождению в продакшене под нагрузкой. Галера накладывает ряд ограничений на схему, допустимые операции, локи + обычно всплывают подводные камни во время использования такого рода систем. Поэтому решение выбираем, исходя из текущих реалий (об этом можно прочитать у Ивана в статье) и тем как быстро и на приемлемом уровне можем устранить SPOF.
А почему не решения на Consul KV для переключения типа как тут к примеру https://blog.pythian.com/mysql-high-availability-with-proxysql-consul-and-orchestrator/ ?
И сколько у вас мастеров если не секрет?
А удалось выяснить причину такого поведения?
Были созданы две группы, только-чтение для слейва и чтение-запись для мастера и несколько правил для роутинга запросов. Все работало примерно месяц, пока не случился факап.
UPD. Зашел к ним на гитхаб и сразу вижу такое github.com/sysown/proxysql/issues/2592
Мы сейчас изучаем и постепенно внедряем ProxySql. Когда решение отработаем, планируем перейти на Consul+Orchestrator+Proxy.
По splitbrain: ситуация возможна, если не смогли зайти по ssh на сервер и он не перезагружался. На этот случай подстелили соломку в виде бесконечного arping + ETA дежурного инженера около 3 минут. Эти риски сейчас приемлемы в сравнении с получаемыми преимуществами
Я ещё не до конца дочитал документацию по Vitess, но раз уж вы его используете, то такой вопрос:
Умеет ли vitess.io без Orchestrator автоматически сделать слейв мастером в случае сбоя мастера?
Использовать, конечно, можно. Но для переключения нужно использовать оркестратор. Вот из документации:
High availability: Vitess integrates with Orchestrator, which is capable of performing a failover to a new master within seconds of failure detection. This is usually sufficient for most applications.
Я вижу, что здесь Вы указываете Orchestrator-у считывать ClusterAlias из БД.
"DetectClusterAliasQuery": "select ifnull(max(cluster_name), '') as cluster_alias from meta.cluster where anchor=1",
Значит существует таблица cluster в базе meta, которая реплицируется на другие хосты. В этой таблице хранится ClusterAlias одинаковый для всех хостов.
Вот здесь у Вас используется ClusterAlias.
Скажите, пожалуйста, не сталкивались ли Вы с такой ситуацией, когда Orchestrator присваивал ClusterAlias произвольным хостам, которые были вынесены в отдельные кластеры в процессе FailoverProcesses?
Что можете посоветовать в вот такой ситуации?
github.com/openark/orchestrator/issues/1132
Привет,
Да, мы используем ClusterAlias, создавая БД meta и реплицируя ее на все узлы кластера — согласно документации оркестратора.
Во время failover старый мастер автоматически не возвращается в кластер, это уже обязанность администратора сделать. При этом в UI он может показываться как новый кластер, но при его возврате все становится нормально.
Правильно ли я понял, что во время failover у вас кластер из 3 нод развалился на 3 отдельных нереплицирующихся узла?
С приведенным поведением в issue ни разу не доводилось встречаться. Хотя мы при тестировании и iptables, и kill пользовались. Возможно, это связанно с использованием консула
Правильно ли я понял, что во время failover у вас кластер из 3 нод развалился на 3 отдельных нереплицирующихся узла?
Да, но проблема не в этом. Это не просто 3 отдельных нереплицирующихся узла, а в понимании оркестратора 3 отдельных кластера у каждого по 1 нереплицирующемуся узлу.
У каждого из этих кластеров есть свои ClusterName и ClusterAlias:
1) Старый мастер, ClusterName = 10.0.0.31:3306, ClusterAlias = 10.0.0.31:3306
2) Новый мастер, ClusterName = 10.0.0.32:3306, ClusterAlias = testcluster
3) Реплика, которая не смогла подключиться, ClusterName = 10.0.0.33:3306, ClusterAlias = 10.0.0.33:3306
При такой схеме если мы попросим оркестратора отдать адрес мастера testcluster, он вернет 10.0.0.32:3306 и это врено.
Проблема заключается в том, что Оркестратор через некоторое время простоя без каких либо причин присвоил ClusterAlias = testcluster кластеру с репликой, то есть другому кластеру.
После этого картина изменилась следующим образом:
1) Старый мастер, ClusterName = 10.0.0.31:3306, ClusterAlias = 10.0.0.31:3306
2) Новый мастер, ClusterName = 10.0.0.32:3306, ClusterAlias = 10.0.0.32:3306
3) Реплика, которая не смогла подключиться, ClusterName = 10.0.0.33:3306, ClusterAlias = testcluster
А при такой схеме если мы попросим оркестратора отдать адрес мастера testcluster, он вернет 10.0.0.33:3306 и это ошибка!
И это не противоречит его логике.
Понятное дело, что 1 кластер развалился на 3 отдельных и требуется вмешательство администратора. Но реакция администратора может занять определенное время, за которое оркестратор уже создал проблему.
Зависит ли Ваша система от связи ClusterAlias и IP адреса, который хранится под этим ClusterAlias у оркестратора?
— используем имя в failover (на основе его определяем VIP, SSH параметры и т.п для этого кластера)
— используем имя в кронах выдачи приоритетов репликам по выбору мастера.
Все внешние клиенты ходят на мастер по VIP (сейчас через ProxySQL), на реплики через HAProxy. Также у оркестратора есть anti-flapping: когда ставится блокировка на failover, у нас она составляет один час.
Если вашу ситуацию можно стабильно воссоздать на тестовом стенде, то я мог бы посмотреть более детально.
Обсуждение данной проблемы и ответ разработчика orchestrator на github.com/openark/orchestrator/issues/1132
Orchestrator и VIP как HA-решение для кластера MySQL