У меня есть вопрос Кассандры. Вы знаете, как Cassandra обновляет/увеличивает счетчики?
Я хочу использовать штурмовой болт (CassandraCounterBatchingBolt из репортера storm-contrib на github), который записывается в cassandra. Тем не менее, я не уверен, как работает часть метода incrementCounterColumn(), и есть также ограничения с счетчиками cassandra (от: http://wiki.apache.org/cassandra/Counters), что делает их бесполезными для моего сценария ИМХО:
-
Если запись неожиданно завершается (время ожидания или потеря связи с координатором node), клиент не будет знать, была ли выполнена операция. Повторение может привести к превышению количества CASSANDRA-2495.
-
Удаление счетчика по существу ограничено. Например, если вы очень быстро произвели последовательность "increment, remove, increment", возможно, что удаление будет потеряно
В любом случае, вот мой сценарий:
Я обновляю тот же счетчик быстрее, чем обновления распространяются на другие узлы Cassandra.
Пример:
Скажем, у меня есть 3 узла кассандры. Счетчики на каждом из этих узлов равны 0.
Node1: 0, node2: 0, node3: 0Приращение приходит: 5 → Node1: 0, node2: 0, node3: 0
Приращение начинается с node 2 - все еще нужно распространять на node1 и node3
Node1: 0, node2: 5, node3: 0Тем временем, еще один прирост до предыдущего приращения: 3 → Node1: 0, node2: 5, node3: 0
Предполагая, что 3 начинается с другого node, чем в начале 5, мы имеем:
Node1: 3, node2: 5, node3: 0
Теперь, если 3 передается другим узлам AS IN INCREMENT, а не как новое значение (и то же самое для 5), то в конечном итоге узлы будут равны 8, и это то, что я хочу.
Если 3 перезаписывает 5 (потому что имеет более позднюю временную метку), это проблематично - не то, что я хочу.
Знаете ли вы, как эти обновления/приращения обрабатываются Cassandra?
Обратите внимание, что чтение перед записью по-прежнему подвержено той же самой проблеме, в зависимости от которой реплика node выполняется чтение (кворум все равно может завершиться неудачей, если распространение не далеко)
Я также думаю, что, возможно, ставить кеш-бет/ш мой штурмовой болт, и Кассандра может решить эту проблему, но это история в другое время.