У меня есть небольшой кластер Cassandra из 4 узлов, на котором работает Cassandra 3.9.
Я передаю 4 IP-адреса connect()
функция и когда я проверяю соединения с netstat -a4n | grep 9042
Я вижу, что они все связаны. Обратите внимание, что я передаю 1 IP или 4 на connect()
результат будет тот же, когда он полностью подключен, включая двойное подключение к узлу 10.0.1.1 … (10.0.1.1 и 10.0.1.3 — начальные числа, но почему-то только 10.0.1.1 имеет двойное подключение, так что я не слишком уверенный, почему это происходит с этим, я попытался перетасовать список IP-адресов, используемых для подключения, и снова, в конце концов, это не имело никакого значения.)
tcp 0 0 10.0.0.1:45012 10.0.1.3:9042 ESTABLISHED
tcp 0 0 10.0.0.1:48400 10.0.1.4:9042 ESTABLISHED
tcp 0 0 10.0.0.1:51514 10.0.1.2:9042 ESTABLISHED
tcp 0 0 10.0.0.1:56460 10.0.1.1:9042 ESTABLISHED
tcp 0 0 10.0.0.1:56452 10.0.1.1:9042 ESTABLISHED
Когда я смотрю на вывод nodetool status
это выглядит довольно хорошо:
Datacenter: dc1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 10.0.1.1 7.92 MiB 256 76.1% (id) rack1
UN 10.0.1.4 12.26 MiB 256 77.7% (id) rack1
UN 10.0.1.3 10.08 MiB 256 72.2% (id) rack1
UN 10.0.1.2 8.77 MiB 256 74.0% (id) rack1
(Примечание: я удалил ID, они здесь не нужны).
Тем не менее, с точки зрения сети, я вижу огромное несоответствие, когда смотрю на объем данных, передаваемых на эти машины. Я использую iptables -L -nvx
команда, и к моему удивлению я вижу, что я отправляю примерно в 3 раза больше пакетов и почти в 20 раз больше данных на первый узел Cassandra:
6856 13581751 RETURN all -- eth1 * 10.0.1.1 0.0.0.0/0
2736 816810 RETURN all -- eth1 * 10.0.1.2 0.0.0.0/0
2831 807426 RETURN all -- eth1 * 10.0.1.3 0.0.0.0/0
2745 806023 RETURN all -- eth1 * 10.0.1.4 0.0.0.0/0
(6,856 / 2736 = 2,51 и 13,581,751 / 806,023 = 16,85)
Я полагаю, что в некотором смысле это не имеет большого значения, если узлы все равно не заняты, но я все еще задаюсь вопросом, почему я вижу такое огромное несоответствие? Почему не все 4 соединения участвуют на одном уровне?
Драйверы будут использовать контактные точки в качестве начальной точки подключения для настройки пула подключений. После этого пул создается на основе топологии схемы, локальной политики балансировки и параметров пула. Для справки некоторые полезные документы здесь (извините, если вы уже видели их):
http://datastax.github.io/cpp-driver/topics/
http://datastax.github.io/cpp-driver/topics/configuration/
Дополнительным трафиком вполне может быть управляющее соединение, используемое драйвером, которое обновляет топологию схемы, чтобы помочь способу работы драйвера:
http://datastax.github.io/cpp-driver/topics/basics/schema_metadata/
Других решений пока нет …