Напишу будущим поколениям, как все это работает, вдруг кто-то тоже попытается все это расковырять.
Да, вы были правы, Zookeeper не хранит собственно данных. Внутри он сохраняет кучу параметров, в частности host для каждой реплики и ее порты (у мене некорректное значение с hostname -f цеплялось, поэтому были проблемы) ну и собственно метаданные "какие части статистики синхронизируются". Поэтому да, достаточно синхронизировать таблицу через zookeeper, а уже внутри него хранятся все реплики, их порты и прочие настройки.
Но собственно синхронизация данных будет происходить напрямую между Clickhouse-серверами. Они имеют свой отдельный порт для синхронизации-репликации в параметре interserver_http_port (по умолчанию 9009). Получается, нужно в iptables между собой открыть 9009 для серверов, которые будут общаться между собой, а для zookeeper - 2888 и 3888. Если хотя бы один порт не будет открыть - синхронизации не будет.
В общем, все очень запутано и почти нет гайдов, но докопаться все же удалось.
Получается, в конфиге я указываю секцию zookeeper, в секции remote_servers мне ничего указывать не нужно и репликация будет проводиться автоматически? Как-то странно, на самом деле, я тогда не совсем понимаю, как они данные репликации переносятся между собой.
Слишком контринтуитивно, почему-то кажется, что в таком случае нужно указать существование серверов друг для друга.
Точнее даже, через какой процесс и какие открытые порты им нужны - нужно между серверами открыть порты Zookeeper 2181, 2888, 3888 + порт, который использует Clickhouse (по умолч. 9000)? Коммуникация для репликации будет через эти порты происходить или нужно что-то еще открыть?
Дмитрий, если все собирать - конечно упадет.
Но если, например, нужно посчитать сумму чисел либо распарсить какую-то статистическую информацию - тогда все будет впорядке.
На самом деле, структура простейшая:
Таблица sent_keys, две колонки: id_message id_key
Стоит индекс KEY(id_message, id_key)
Запрос:
SELECT EXISTS(SELECT * FROM sent_keys WHERE id_message=100 AND id_key=765000)
Все работает (хотя и весит немало). Но хочется более быстрой скорости. Специфика алгоритма такова, что нужно делать запрос на каждый ключ.
Я понимаю, что видимо придется как-то делать цикличную проверку, но это чертовски усложняет алгоритм просчетов.
Поэтому решил поискать, существует ли более быстрое решение именно в базе данных. Если ничего более быстрого найти не удастся - придется как-то переосмысливать систему отбора ключей.
Александр Аксентьев, само собой, filter_var вполне сойдет, я только говорю о том, что данным доверять нельзя, даже, казалось бы, IP адресу. Вот только что Виктор написал пример готовой инъекции.
Виктор Викторов, не будет это ОК, я могу вписать туда любой текст и будет SQL-инъекция;
2) после запятой может не быть пробела.
3) проверьте регуляркой, так безопаснее.
file_put_contents($log_file, $string, FILE_APPEND | LOCK_EX);
А добавить LOCK_EX - еще лучше.
В случае синхронного доступа к файлу меньше вероятность перетереть изменение
2k18, некоторые PHP-программисты до сих пор не знают, что такое Composer... :-)
Обязательно изучите этот инструмент, его появление было по своему для PHP революционным, я был ошарашен, когда узнал о его существовании и его возможностях в плане удобства.
Добавлю, что по своему опыту базы данных в подобных проектах-солянках пишутся без любой планировки и оптимизации, поэтому намного проще сформулировать грамотную базу и написать скрипты-конвертаторы, которые перенесут данные со старых таблиц в новые.
Вячеслав Лукоянов, тогда задача особо отпала. Тут вопрос больше к сеошникам - реализовывать выбор языка в адресной строке или делать подмену прозрачно.
Тут есть как за, так и против, нужно консультироваться.
А вообще через кастомные правила UrlRule довольно удобно получается
SuperNikiforov, если вы новичек - вы не заметите разницы между ними. А когда вы начнете видеть разницу между базами данных - выберете ту, которая подходит лучше.
Да, вы были правы, Zookeeper не хранит собственно данных. Внутри он сохраняет кучу параметров, в частности host для каждой реплики и ее порты (у мене некорректное значение с hostname -f цеплялось, поэтому были проблемы) ну и собственно метаданные "какие части статистики синхронизируются". Поэтому да, достаточно синхронизировать таблицу через zookeeper, а уже внутри него хранятся все реплики, их порты и прочие настройки.
Но собственно синхронизация данных будет происходить напрямую между Clickhouse-серверами. Они имеют свой отдельный порт для синхронизации-репликации в параметре interserver_http_port (по умолчанию 9009). Получается, нужно в iptables между собой открыть 9009 для серверов, которые будут общаться между собой, а для zookeeper - 2888 и 3888. Если хотя бы один порт не будет открыть - синхронизации не будет.
В общем, все очень запутано и почти нет гайдов, но докопаться все же удалось.