Ускорение запросов Кассандры, если узлы отключены - PullRequest
0 голосов
/ 11 ноября 2019

Рабочий код:

using System;
using Cassandra;

    namespace CassandraSelectTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                var cluster = Cluster.Builder()
                .AddContactPoints("192.168.0.18","192.168.0.21","192.168.0.22","192.168.0.23","192.168.0.24")
                .WithPort(9042)
                .Build();

                var session = cluster.Connect("test_keyspace");

                var results = session.Execute("SELECT * FROM test_table");

                foreach(var result in results)
                {
                    Console.WriteLine(result.GetValue<string>("col1"));
                }

                Console.WriteLine($"Finished");
                Console.ReadKey();
            }
        }
    }

Настройки:

Nodes = 5
Replication = 5
Consistency = 1

Тест:

Удалите 1 узел за раз, чтобы увидеть, продолжает ли работать приведенный выше код.


Результат:

Код продолжаетсяработать после того, как каждый узел отключается, а затем выдает ошибку, как и ожидалось, когда все узлы отключены. Однако чем больше узлов переходит в автономный режим, тем больше времени требуется для выполнения кода. Примерно 5 секунд на каждый автономный узел.


Скорости:

5 nodes online = 1 second
4 nodes online = 5 seconds
3 nodes online = 10 seconds
2 nodes online = 15 seconds
1 node online = 20 seconds

Вопрос:

Можно ли ускорить запрос в коде, чтобы он не занимал больше времени, когда узлы отключены? Или, по крайней мере, сократить время, необходимое для выполнения запроса, если большинство узлов отключены?

1 Ответ

2 голосов
/ 11 ноября 2019

Вы измеряете общее время выполнения этого кода? Или вас больше интересует измерение времени, которое требуется приложению для выполнения запросов после инициализации?

Во время инициализации (cluster.Connect) драйвер перебирает коллекцию точек контакта, пока не сможет открытьуправляйте соединением успешно, поэтому, если вы хотите ускорить инициализацию, вы должны удалить автономные узлы из этого списка.

Также по умолчанию драйвер выполняет операцию прогрева во время инициализации, которая заключается в открытии соединений со всеми узлами, возвращеннымиполитика балансировки нагрузки, поэтому здесь также будет время ожидания. Вы можете попробовать установить .WithPoolingOptions(new PoolingOptions().SetWarmup(false)), чтобы ускорить инициализацию.

Отключение операции прогрева может замедлить первые запросы, пока драйвер не обнаружит, какие узлы отключены. Рекомендуемый способ сократить время выполнения запроса в этом сценарии - использовать умозрительные повторы (https://docs.datastax.com/en/developer/csharp-driver/3.12/features/speculative-retries).

...