Arhn - архитектура программирования

Кассандра не дает данных, даже если данные существуют

У меня есть пространство ключей с коэффициентом репликации 3. Я вставляю данные в Cassandra (4-узловой кластер с одним центром обработки данных) с первым уровнем согласованности записи. После завершения вставок я читаю данные с кворумом уровня согласованности (2). Но иногда я не получаю данные, даже если данные существуют, через некоторое время я получаю данные с тем же запросом. Я не знаю, почему Кассандра так себя ведет.

Схема семейства моих столбцов

CREATE TABLE input_data_profile.input_log_profile_1 (
    cid text,
    ctdon bigint,
    ctdat bigint,
    email text,
    addrs set<frozen<udt_addrs>>,
    asset set<frozen<udt_asset>>,
    cntno set<frozen<udt_cntno>>,
    dob frozen<udt_date>,
    dvc set<frozen<udt_dvc>>,
    eaka set<text>,
    edmn text,
    educ set<frozen<udt_educ>>,
    gen tinyint,
    hobby set<text>,
    income set<frozen<udt_income>>,
    interest set<text>,
    lang set<frozen<udt_lang>>,
    levnt set<frozen<udt_levnt>>,
    like map<text, frozen<set<text>>>,
    loc set<frozen<udt_loc>>,
    mapp set<text>,
    name frozen<udt_name>,
    params map<text, frozen<set<text>>>,
    prfsn set<frozen<udt_prfsn>>,
    rel set<frozen<udt_rel>>,
    rel_s tinyint,
    skills_prfsn set<frozen<udt_skill_prfsn>>,
    snw set<frozen<udt_snw>>,
    sport set<text>,
    status tinyint,
    z_addrs tinyint,
    z_asset tinyint,
    z_cntno tinyint,
    z_dob tinyint,
    z_dvc tinyint,
    z_eaka tinyint,
    z_educ tinyint,
    z_email tinyint,
    z_gen tinyint,
    z_hobby tinyint,
    z_income tinyint,
    z_interest tinyint,
    z_lang tinyint,
    z_levnt tinyint,
    z_like tinyint,
    z_loc tinyint,
    z_mapp tinyint,
    z_name tinyint,
    z_params tinyint,
    z_prfsn tinyint,
    z_rel tinyint,
    z_rel_s tinyint,
    z_skills_prfsn tinyint,
    z_snw tinyint,
    z_sport tinyint,
    PRIMARY KEY (cid, ctdon, ctdat, email)
) WITH CLUSTERING ORDER BY (ctdon ASC, ctdat ASC, email ASC)
CREATE INDEX input_log_profile_1_z_snw_idx ON input_data_profile.input_log_profile_1 (z_snw);
CREATE INDEX input_log_profile_1_z_prfsn_idx ON input_data_profile.input_log_profile_1 (z_prfsn);
CREATE INDEX input_log_profile_1_z_hobby_idx ON input_data_profile.input_log_profile_1 (z_hobby);
CREATE INDEX input_log_profile_1_z_rel_idx ON input_data_profile.input_log_profile_1 (z_rel);
CREATE INDEX input_log_profile_1_z_gen_idx ON input_data_profile.input_log_profile_1 (z_gen);
CREATE INDEX input_log_profile_1_z_mapp_idx ON input_data_profile.input_log_profile_1 (z_mapp);
CREATE INDEX input_log_profile_1_z_dvc_idx ON input_data_profile.input_log_profile_1 (z_dvc);
CREATE INDEX input_log_profile_1_z_skills_prfsn_idx ON input_data_profile.input_log_profile_1 (z_skills_prfsn);
CREATE INDEX input_log_profile_1_z_eaka_idx ON input_data_profile.input_log_profile_1 (z_eaka);
CREATE INDEX input_log_profile_1_z_name_idx ON input_data_profile.input_log_profile_1 (z_name);
CREATE INDEX input_log_profile_1_z_cntno_idx ON input_data_profile.input_log_profile_1 (z_cntno);
CREATE INDEX input_log_profile_1_z_educ_idx ON input_data_profile.input_log_profile_1 (z_educ);
CREATE INDEX input_log_profile_1_z_loc_idx ON input_data_profile.input_log_profile_1 (z_loc);
CREATE INDEX input_log_profile_1_z_email_idx ON input_data_profile.input_log_profile_1 (z_email);
CREATE INDEX input_log_profile_1_z_interest_idx ON input_data_profile.input_log_profile_1 (z_interest);
CREATE INDEX input_log_profile_1_z_asset_idx ON input_data_profile.input_log_profile_1 (z_asset);
CREATE INDEX input_log_profile_1_z_like_idx ON input_data_profile.input_log_profile_1 (z_like);
CREATE INDEX input_log_profile_1_z_rel_s_idx ON input_data_profile.input_log_profile_1 (z_rel_s);
CREATE INDEX input_log_profile_1_z_lang_idx ON input_data_profile.input_log_profile_1 (z_lang);
CREATE INDEX input_log_profile_1_z_addrs_idx ON input_data_profile.input_log_profile_1 (z_addrs);
CREATE INDEX input_log_profile_1_z_dob_idx ON input_data_profile.input_log_profile_1 (z_dob);
CREATE INDEX input_log_profile_1_z_income_idx ON input_data_profile.input_log_profile_1 (z_income);
CREATE INDEX input_log_profile_1_z_sport_idx ON input_data_profile.input_log_profile_1 (z_sport);
CREATE INDEX input_log_profile_1_z_params_idx ON input_data_profile.input_log_profile_1 (z_params);

Мне нужно обрабатывать поля с умом, поэтому я проиндексировал статус каждого поля. Я хочу улучшить tps чтения и записи. Предложите мне некоторые изменения в схеме.


Ответы:


1

Если я вас правильно понял, то вы действительно задаете здесь два вопроса:

Во-первых, вы пишете данные с CL = 1 и читаете их с CL = Quorum и задаетесь вопросом, почему вы не всегда извлекаете данные, которые вы написали, но затем можете получить их позже. Если это верно, то это ожидаемое поведение Кассандры. При записи с CL = 1 первая из 3 ответивших реплик вернет клиенту успешную запись. Если вы затем попытались прочитать с помощью Quorum до того, как данные будут записаны в другие реплики, возможно, вы не получите никаких (или устаревших) данных, возвращенных вам. Это конечная часть согласованности Cassandra. Если вы пытаетесь прочитать данные сразу после успешной записи, то это, вероятно, причина ваших проблем, поскольку «Чтение после записи» является анти-шаблоном в Cassandra и большинстве других распределенных систем.

Во-вторых, в вашей схеме данных вы неправильно используете индексы. Если вы используете индексы, позволяющие запрашивать эти поля, то это анти-шаблон, особенно с большим числом, которое у вас есть. Индексы в Cassandra - дорогостоящая операция, которую следует использовать только в редких случаях, когда индексируемый столбец имеет низкую мощность. См. Этот https://docs.datastax.com/en/cql/3.1/cql/ddl/ddl_when_use_index_c.html

Если вам нужно выполнить запрос по такому большому количеству столбцов, вам необходимо переоценить свою модель данных, поскольку Cassandra оптимизирована для методологии «таблица на запрос», где вы запрашиваете только поля в первичном ключе. Это требует от вас денормализовать данные в несколько разных таблиц, чтобы построить любое приложение разумной сложности. Это один из компромиссов, которые вы делаете при выборе производительности, высокой доступности и масштабируемости, которые обеспечивает Cassandra. Если вам действительно нужна возможность выполнять специальные запросы к вашим данным, я предлагаю вам взглянуть на другое хранилище данных.

06.12.2017
  • После завершения вставки данные только я читаю, поэтому данные реплицируются до того, как я их прочитал. Нет никаких шансов, что данные в других репликах отсутствуют. 07.12.2017
  • Если вы записываете данные в CL = 1, а затем читаете данные в CL = Quorum с RF = 3, то есть вероятность, что данные записываются в реплику A, но еще не были записаны в реплику B или C. немедленно прочтите эти данные, вы можете получить ответы от реплик B и C (которые еще не имеют данных) до реплики A (которая имеет данные). Если вы измените CL = Quorum как для чтения, так и для записи, этого не произойдет. 08.12.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..