ну брать это одно - если имеется ввиду пополнение списка доменов то бд, а вот если чтение/запись, то почему бы не работать с бд в памяти и асинхронными снапшотами на диск..по сути все будет очень быстро крутиться в оперативе. вопрос уже архитектурный)
Спасибо! В реальности я очень далек от "работать с базой в памяти" и от "асинхронных снапшотов".
Хотя, возможно это просто какие-то определенные настройки самой базы.
Интересно, а как вы собираетесь 350 млн строк с данными доменов, ns серверов, ip адресов держать в ОЗУ?
Вы правы! Весь объем данных совершенно нет необходимости держать в оперативной памяти.
В моем случае скорость обработки около 1 000 000 каждых 5 минут.
Примерно на этой скорости есть смысл обеспечить подачу данных на обработку.
Это примерно 20мб данных в виде доменов (или 80мб если домен+нс1+нс2+IP) - что полностью приемлимо.
Ну вот зачем это все? ну вот если соберусь, то подумаю на какие чанки бить, сколько держать в памяти а сколько дампить на диск,как часто, как лучше, даже,уверен, что сделаю несколько гипотез и тестов. Если рассматривать требование как "приортитет скорости", то остальное будет "жертвой" и не регламентируется, значит строим архитектуру исходя из здравого смысла и ресурсов.
и зачем держать " с данными доменов, ns серверов, ip адресов держать в ОЗУ?" тоже хз) их надо собирать и обновлять циклически.
Да и на хорошем серваке это по грубым прикидкам 128Гб несжатых данных
Как я выше написал - работать я собрался порциями по 1млн (20мб) сырых доменов.
Уже исходя из этого брать сервера на 128гб или строить решение которое будет использовать столько памяти мне выглядит избыточным. Хотя, возможно я ещё чего-то не вижу (что также не исключаю).
В реальности на текущий момент я все ещё не определился с тем, что мне делать с информацией, которая была получена.
Хотя примерный план решения вижу примерно таким (речь уже о возможности держать актуальную информацию о всех доменах интернета):
Так как привык работать с MySQL, значит для хранения данных её и буду использовать.
Чтобы не обращаться к ней напрямую - напишу что-то вроде API на PHP+Swagger.
Возможно где-то в конфигах нужно будет подправить время до разрыва соединения, чтобы когда буду отправлять пачки по 10к доменов соединение не разрывалось преждевременно (с ходу помню, что была какая-то у меня проблема что больше 1000 записей не удавалось добавлять, не хватало времени).
А дальше просто напишу шаблон Зенно
Он будет спрашивать базу зону, которая протухла.
Если такая есть - будет скачивать её.
А дальше пачками по этих 10к обычными запросами к API будет добавлять в базу (или обновлять время).
После чего - удалять все домены этой зоны, у которых протухло время.
Это и даст мне постоянные актуальные домены в базе.
Здесь фактически потребления памяти и процессора быть не должно, важно наверно чтобы оно успевало выкачивать новые данные каждых 30 часов (скорость проверки всех).
Второй шаг в этой истории - это как-то обеспечить возможность обработки на нескольких серверах.
Проблема, которая сразу всплывет - это получение этого 1млн доменов, так как их нужно как-то получить, и потом как-то после обработки вернуть обратно уже с новыми данными.
Чтобы обойти это место, наверно будет сделан шаблон, который будет брать например этих 10к записей определенной зоны и отправлять их в Rabbit. Тоесть, будет обеспечено например хранение 1-5 млн записей в очереди.
Шаг третий - это то решение, о котором эта тема - шаблон который будет брать с очереди 1 млн, производить проверку, возвращать данные обратно в Rabbit, в другую очередь. Здесь идея в том, что таких обработчиков может быть несколько независимых на разных серверах, которые не будут создавать какой-то дискомфорт для базы.
И последний - это уже разбор очереди успехов и не успехов и обновление нужных данных в базе.
Это по идее должно позволить зациклить весь процесс - первый берет время от времени зоны и обновляет их.
Второй видит какие домены стоит отправить на проверку - занимается их отправкой на обработку.
Обработчики производят обогащение данных и возвращают результат не зависимо от базы или ожидают пока в очереди появлятся данные.
И последний просто ожидает данные в очереди и разгребает их с удобной для себя скоростью.
Как-то так я вижу дальнейшее развитие этой истории.
Если у кого-то есть какие-то советы или критика по поводу что я где-то ошибаюсь - пишите!