Узел - это отдельная машина, на которой работает Cassandra. Набор узлов, содержащих похожие данные, сгруппирован в так называемое «кольцо» или кластер.
Иногда, если у вас много данных или вы обслуживаете данные в разных географических областях, имеет смысл сгруппировать узлы вашего кластера в разные центры обработки данных. Хороший вариант использования - это веб-сайт электронной коммерции, у которого может быть много постоянных клиентов на восточном и западном побережье. Таким образом, ваши клиенты на восточном побережье подключаются к вашему DC на восточном побережье (для повышения производительности), но в конечном итоге получают доступ к тому же набору данных (оба DC находятся в одном кластере), что и клиенты на западном побережье.
Более подробную информацию об этом можно найти здесь: Об Apache Cassandra - Как работает Cassandra ?
И все узлы, содержащие одинаковые (дублированные) данные, составляют центр обработки данных. Это правильно?
Близко, но не обязательно. Уровень дублирования данных определяется вашим коэффициентом репликации, который устанавливается для каждого пространства ключей. Например, предположим, что у меня есть 3 узла в моем единственном контроллере домена, каждый из которых хранит 600 ГБ данных о продукте. Мое определение products
пространства ключей может выглядеть так:
CREATE KEYSPACE products
WITH replication = {'class': 'NetworkTopologyStrategy', 'MyDC': '3'};
Это обеспечит одинаковую репликацию данных о моих продуктах на все 3 узла. Размер моего общего набора данных составляет 600 ГБ, дублируется на всех 3 узлах.
Но предположим, что мы развертываем новую, довольно большую линейку продуктов, и, по моим оценкам, у нас будет еще 300 ГБ данных, что может привести к увеличению максимальной емкости наших жестких дисков. Если мы не можем позволить себе обновить все наши жесткие диски прямо сейчас, я могу изменить коэффициент репликации следующим образом:
CREATE KEYSPACE products
WITH replication = {'class': 'NetworkTopologyStrategy', 'MyDC': '2'};
Это создаст 2 копии всех наших данных и сохранит их в нашем текущем кластере из 3 узлов. Размер нашего набора данных теперь составляет 900 ГБ, но, поскольку есть только две его копии (каждый узел, по сути, отвечает за 2/3 данных), наш размер на диске по-прежнему составляет 600 ГБ. Недостатком здесь является то, что (при условии, что я читаю и пишу на уровне согласованности ONE
) я могу позволить себе потерять только 1 узел. Принимая во внимание, что с 3 узлами и RF 3 (снова чтение и запись с согласованностью ONE
), я мог бы потерять 2 узла и по-прежнему обслуживать запросы.
Изменить 20181128
Когда я делаю сетевой запрос, делаю ли я это против сервера? или узел? Или я делаю запрос к серверу, он затем маршрутизирует его и читает с узла или что-то еще?
Итак, очень быстрое объяснение: сервер == узел
Что касается выполнения запроса к узлам в вашем кластере, это поведение фактически диктуется драйвером на стороне приложения. Фактически, драйвер поддерживает копию текущей топологии сети, поскольку он читает слухи о кластере аналогично тому, как это делают узлы.
На стороне приложения вы можете установить политику балансировки нагрузки. В частности, класс TokenAwareLoadBalancingPolicy проверяет ключ раздела каждого запроса, выясняет, какой узел (узлы) имеет данные, и отправляет запрос прямо туда.
Для других политик балансировки нагрузки или запросов, в которых невозможно определить единственный ключ раздела, запрос будет отправлен на единственный узел. Этот узел будет действовать как «координатор». Этот выбранный узел будет обрабатывать маршрутизацию запросов к узлам, ответственным за них, а также компиляцию / возврат любых наборов результатов.
person
Aaron
schedule
28.01.2015