Как лучше настроить двухсерверную репликацию без шардинга для Clickhouse?
Добрый день!
Планирую поднять три экземпляра Zookeeper и "синхронизировать" их между собой (чтобы между ними было согласование).
Затем - поднять два экземпляра ClickHouse на двух серверах.
А вот и вопрос: а нужно ли вообще настраивать кластер Clickhouse между собой, если сервера должны, как я понимаю, синхронизироваться между собой с помощью ZooKeeper?
Т.е., как я понимаю, в теории, внутрь remote_servers я должен добавить один кластер, внутри него один шард, и внутри шарда - две реплики.
Но потом я подумал, если ClickHouse будут синхронизироваться между собой с помощью ZooKeeper, то есть ли смысл им знать о существовании друг друга, если они будут работать исключительно как реплики? Или желательно указать их в конфиге для каких-то целей, о которых я не знаю?
Ну и соответственно, если их все же зачем-то нужно указать в remote_servers, то должен ли я указывать, что они часть единого шарда, или я могу прямо внутрь кластера прописать xml-тег двух реплик и явно указывать о том, что они внутри "единственного шарда" - мне не нужно?
А вот и вопрос: а нужно ли вообще настраивать кластер Clickhouse между собой, если сервера должны, как я понимаю, синхронизироваться между собой с помощью ZooKeeper?
При чтении документации навело точно на такую же мысль, однако нет - в zookeper складывается только метаинформация о проведенных операциях с базой данных и на каком из серверов она была выполнена. Фактически, за данными другие хосты обращаются друг к другу напрямую.
Если шардирование не используется, то в конфигурационный файл ничего прописывать не нужно - только конфигурацию zookeeper. Друг друга они себя через него найдут.
Дальнейшая конфигурация репликации конфигурируется на уровне движков баз данных
Получается, в конфиге я указываю секцию zookeeper, в секции remote_servers мне ничего указывать не нужно и репликация будет проводиться автоматически? Как-то странно, на самом деле, я тогда не совсем понимаю, как они данные репликации переносятся между собой.
Слишком контринтуитивно, почему-то кажется, что в таком случае нужно указать существование серверов друг для друга.
Точнее даже, через какой процесс и какие открытые порты им нужны - нужно между серверами открыть порты Zookeeper 2181, 2888, 3888 + порт, который использует Clickhouse (по умолч. 9000)? Коммуникация для репликации будет через эти порты происходить или нужно что-то еще открыть?
Получается, в конфиге я указываю секцию zookeeper, в секции remote_servers мне ничего указывать не нужно и репликация будет проводиться автоматически?
Репликация будет выполняться только для реплицируемых таблиц, настроенных на тот же zoo_path.
как они данные репликации переносятся между собой
К сожалению, детально не рассматривал этот вопрос. В моем представлении, сервер на котором был выполнен INSERT, создает запись об этом в zookeeper. Другие участники видят факт обновления, подключаются к этому серверу и забирают данные для обновления собственных таблиц.
в таком случае нужно указать существование серверов друг для друга
Все серверы подключены к одному и тому же кластеру zookeper. В нем и содержатся данные о всех участниках репликации.
Zookeeper 2181, 2888, 3888 + порт, который использует Clickhouse (по умолч. 9000)
2181 для подключения к zookekper и 9000. Кажется, это все необходимые порты для работы самого Clickhouse.
Напишу будущим поколениям, как все это работает, вдруг кто-то тоже попытается все это расковырять.
Да, вы были правы, Zookeeper не хранит собственно данных. Внутри он сохраняет кучу параметров, в частности host для каждой реплики и ее порты (у мене некорректное значение с hostname -f цеплялось, поэтому были проблемы) ну и собственно метаданные "какие части статистики синхронизируются". Поэтому да, достаточно синхронизировать таблицу через zookeeper, а уже внутри него хранятся все реплики, их порты и прочие настройки.
Но собственно синхронизация данных будет происходить напрямую между Clickhouse-серверами. Они имеют свой отдельный порт для синхронизации-репликации в параметре interserver_http_port (по умолчанию 9009). Получается, нужно в iptables между собой открыть 9009 для серверов, которые будут общаться между собой, а для zookeeper - 2888 и 3888. Если хотя бы один порт не будет открыть - синхронизации не будет.
В общем, все очень запутано и почти нет гайдов, но докопаться все же удалось.