У меня есть 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.