Cassandra. Часть 2. DC, Rack, Snitch
В чем разница между датацентры, стойками, нодами и виртуальными нодами? Зачем нужны снитчи?
Кассандра имеет следующие иерархию понятий:
Cluster Data center(s) Rack(s) Server(s) Vode(s)
Cluster - весь набор данных которыми владеет Кассандра, в терминах реляционных баз - это база данных. Data center - группа серверов, физически сосредоточенных в одном месте. Rack - стойка, содержит несколько физических машин. Server - сервер или нода, это отдельная физическая машина. Vnode - виртуальная нода, дополнительно разделенные данные на машине.
Дата-центры и стойки
Во время физического распределения данных на серверах, Кассандара оперирует понятиями: датацентр и стойка. Несколько серверов могут располагаться в одной стойке. В случае аварии, вероятность одновременного отказа всей стойки выше, чем нескольких серверов из разных стоек. Например отключение питания, физическое воздействие. Поэтому надежней хранить реплики на разных стойках.
По умолчанию Кассандра считает что все ноды находятся в одном ДЦ и в одной стойке. Чтобы описать вашу структуру датацентов и стоек используются snitches.
Snitch
Снитч - это описание на каких серверах физически лежат данные. Существует много снитчей https://docs.datastax.com/en/cassandra/3.0/cassandra/architecture/archSnitchesAbout.html для разных окружений. Так, например, для кластера который разворачивается в облаке есть готовые снитчи: Amazon EC2, Googgle Cloud и Apache Cloudstack.
Если Кассандра стоит в вашем DC, лучше всего использовать GossipingPropertyFileSnitch. В этом случае на каждую ноду помещается в котором описано в каком она DC и rack’e. https://docs.datastax.com/en/cassandra/3.0/cassandra/architecture/archsnitchGossipPF.html
Важно: Количество раков (стоек) должно быть не меньше Replication Factor. Иначе возможна ситуация, когда реплики попадут на одну стойку.
Снитч, который используется по умолчанию - SimpleSnitch. Он ничего не знает ни о стойках, ни о DC, поэтому используется только для целей тестирования/разработки.
DynamicEndpointSnitch - отслеживает производительность запросов, учитывая дополнительные параметры, например на каких нодах выполняется compaction. Это позволяет выбрать лучшую реплику для каждого запроса. Быстрые ноды получает более высокий приоритет.
Задача снитча определить близость узла друг к другу в кластере. Эта информация позволяет определить с каких нод предпочительнее читать данные и на какие записывать. Снитчи собирают информацию о топологии кластера, позволяя лучше маршрутизировать запросы. По сути снитч выясняет где располагается нода относительно других.
*Можно использовать разные снитчи в разных DC, но в одном кластере.
Ссылки
- https://www.amazon.com/Cassandra-Definitive-Guide-Distributed-Scale/dp/1491933666
- https://stackoverflow.com/questions/28196440/what-are-the-differences-between-a-node-a-cluster-and-a-datacenter-in-a-cassand/28468789#28468789