Проблема при обновлении записи в кластере cassandra из 3 узлов, развернутом с использованием kubernetes - PullRequest
0 голосов
/ 25 марта 2019

У меня есть 3-х узловый кластер Cassandra с коэффициентом репликации 2 и согласованностью чтения-записи, установленной на QUORUM.Мы используем Spring Data Cassandra.Вся инфраструктура развернута с использованием Kubernetes.

Теперь в обычном случае многие записи вставляются в таблицу Cassandra.Затем мы пытаемся изменить / обновить одну из записей, используя метод сохранения репо, как показано ниже:

ChunkMeta tmpRec = chunkMetaRepository.save(chunkMeta);

После выполненияВ приведенном выше утверждении мы никогда не видим никаких исключений или ошибок.Но все же это обновление периодически прерывается.То есть, когда мы проверяем запись в БД, она иногда обновляется успешно, а в другой раз - не удается.Также в приведенном выше запросе, когда мы печатаем tmpRec, он содержит обновленное и правильное значение.Тем не менее в БД эти обновленные значения не отражаются.

Мы проверили журналы транспорта TRACE Cassandra на всех узлах и обнаружили, что наши запросы регистрируются там и выполняются также.

Теперь еще одно странное наблюдение - все это работает, если я использую один узел Cassandra (в Kubernetes) или если мы развертываем выше, чем у Infra, используя Ansible (даже работает для 3 узлов для Ansible).

Это выглядит как проблемав частности, с развертыванием узла Кассандры 3 в Кассандре.В основном это выглядит как репликация среди узлов, вызывающих это.

Содержимое файла Docker:

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y python sudo lsof vim dnsutils net-tools && apt-get clean && \
    addgroup testuser && useradd -g testuser testuser && usermod --password testuser testuser;

RUN mkdir -p /opt/test && \
    mkdir -p /opt/test/data;

ADD jre8.tar.gz /opt/test/
ADD apache-cassandra-3.11.0-bin.tar.gz /opt/test/

RUN chmod 755 -R /opt/test/jre && \
    ln -s /opt/test/jre/bin/java /usr/bin/java && \
    mv /opt/test/apache-cassandra* /opt/test/cassandra;

RUN mkdir -p /opt/test/cassandra/logs;

ENV JAVA_HOME /opt/test/jre
RUN export JAVA_HOME

COPY version.txt /opt/test/cassandra/version.txt

WORKDIR /opt/test/cassandra/bin/

RUN mkdir -p /opt/test/data/saved_caches && \
    mkdir -p /opt/test/data/commitlog && \
    mkdir -p /opt/test/data/hints && \
    chown -R testuser:testuser /opt/test/data && \
    chown -R testuser:testuser /opt/test;

USER testuser

CMD cp /etc/cassandra/cassandra.yml ../conf/conf.yml && perl -p -e 's/\$\{([^}]+)\}/defined $ENV{$1} ? $ENV{$1} : $&/eg; s/\$\{([^}]+)\}//eg' ../conf/conf.yml > ../conf/cassandra.yaml && rm ../conf/conf.yml && ./cassandra -f

Обратите внимание, что conf.yml - это, по сути, файл cassandra.yml, имеющий свойства, связанные с Cassandra.

...