yopp
для того чтоб построить индекс, нужно читать данные, а значит нужно место как для куска данных, так и для индекса
yopp
в нормальном состояние, в продакшене, у тебя есть стабилизировавшийся кеш, который оптимален для твоей нагрузки. сделав background ты часть этого кеша забираешь на строительства индекса
yopp
что в 99% случаев приведёт к пиздецу неизвестной продолжительности
Aleksey
хорошо. звучит убедительно.
Aleksey
однако и тут не понятно. при роллинг индексе нагрузки на выведенную ноду нет ни на запись ни на чтение.
yopp
так как многие не понимают последствий, по-умолчанию выбрали самый жесткий способ, который заставит тебя _задуматься_ перед тем как делать
Aleksey
построение индекса на ней в блокрирующем режиме и в неблокирующем потенциально займет одно и тоже время
yopp
что такое роллинг индекс?
Aleksey
это вот то что вы описываете роллинг индекс. по одной выводим строим вводим
yopp
потому что там алгоритм другой
yopp
я перефразирую: так сделали чтоб народ не стрелял себе в коленку
yopp
(хотя я всё ещё не понимаю почему у курсоров по-умолчанию таймаута нет)
Aleksey
https://github.com/mongodb/mongo/blob/584ca76de9ee66b3e11987e640f5317ae40975e4/src/mongo/db/index_builder.h#L46
yopp
если ещё проще: создание индекса ебически дорогая операция с точки зрения cpu и io. ты должен думать головой перед тем как строить индекс, иначе ты почти гарантированно наебнёшь кластер
Aleksey
https://github.com/mongodb/mongo/blob/72408d7f852058088e1446f77cbea06c029df133/src/mongo/db/catalog/index_create.h#L71
Aleksey
as there is no concurrency benefit to building a subset of * indexes in the background, but there is a performance benefit to building all in the * foreground. */
yopp
but there is a performance benefit to building all in the foreground.
yopp
ну
Aleksey
но
Aleksey
foreground 2017-04-02T13:13:23.421+0300 using default 'dump' directory 2017-04-02T14:18:49.055+0300 done background 2017-04-02T14:20:47.295+0300 using default 'dump' directory 2017-04-02T15:13:51.539+0300 done
Aleksey
второе получено из первого путем for f in *.json.gz; do cp "$f" "$f~" && gzip -cd "$f~" | sed 's/"background":false/"background":true/g' | gzip > "$f" done
yopp
это всё конечно замечательно. но какую проблему ты пытаешься решить?
Aleksey
лишь понять зачем так
yopp
because reasons
Aleksey
так себе ответ
yopp
я тебе выше уже аргументы дал
Aleksey
да дал. и комменты в коде говорят что нет бенефита.
yopp
на незагруженной базе, коненчо разница будет на уровне статистической прогрешности. bg будет немного медленее fg (там иначе данные из хранилища достаются)
Aleksey
но я от чегото вижу этот бенефит
yopp
потому что твой тест говно :)
Aleksey
даже не спорю
yopp
это очередная попытка урановых коней в ртути топить
Aleksey
мой тест говно и я не против.
Aleksey
но в где он гавно не понятно
Aleksey
аргументы про управляемость нагрузки понятны.
yopp
потому что условия и методология тестирования не определены, датасет неизвестен
yopp
а самое главное: я всё ещё не понимаю зачем ты топишь за bg индексы
yopp
потому что в практике bg индексы работают до момента пока у нас датасет вместе с индексами в память влазит
yopp
условно если у тебя есть коллекция в пару десятков гигов и тебе надо быстренько ебануть туда индекс, без особых заморочек, пожалуйста, ебашь bg
yopp
но если у тебя есть шарженная коллекция, на пару террабайт, надо быть экстремалом чтоб сделать индекс с bg
yopp
вообще в жирном шарженом кластере с индексами всё очень печально, долго и муторно
yopp
что почитать-то?
Aleksey
про влазят в память
Aleksey
откуда такое ограничение
yopp
из фон неймановской архитектуры, блин
yopp
строительство индекса == прочитай весь датасет
Aleksey
я согласен что прочитать надо весь датасет. но не понимаю почему его надо прочитать за раз и всё сложить в память.
Aleksey
парни из монги тоже рекомендуют роллинг https://docs.mongodb.com/manual/tutorial/build-indexes-on-replica-sets/#index-building-replica-sets
yopp
если датасет влазит в память, мы не создаём нагрузки на сторадж, а просто ебашим сколько можем из памяти, нагружая сторадж только записью новых страниц индекса
yopp
если датасет в память не влазит, у нас получатся пиздец: надо отжать память на место для батча датасета, место для страниц индекса
yopp
а это значит слить из кеша на диск страницы, загрузить в кеш страницы с диска и так пока датасет не кончится
Aleksey
если датасет в память не влазит, у нас получатся пиздец: надо отжать память на место для батча датасета, место для страниц индекса
да, это все надо сделать на ноде которая * предварительно была выведена из сета * перезапущена, тоесть лучшее что у нее есть это page cache * не имеет другой нагрузки кроме построения индекса.
yopp
да
Aleksey
тоесть рид на весь сторадж нам _гарантирован_
yopp
в этом случае доступные ресурсы будут потрачены наиболее эффективным образом
yopp
так как мы контролируем выведение, мы знаем об влияние наших действий на кластер
yopp
и знаем что если его потом холодный сразу сделать мастером, может быть грустно
Aleksey
ок. @dd_bb спасибо.
yopp
это. я никак не могу решить на чём делать клиента для эспортера
Aleksey
пайтон
Aleksey
или гошка
yopp
у него те-же проблемы с портабельностью что и у руби
yopp
го — пиздец
Aleksey
а ты не морочься и сразу делай единственный формат распространения докер имидж
yopp
не, не взлетит
Aleksey
чой то ?
yopp
надо бинарник
Aleksey
ну вот докер это и есть бинарник, пакетный менеджер
yopp
когда из докер имаджа можно будет сделать портабельный самозапускающийся бинарник, мы с тобой поговорим
Aleksey
ой, а сейчас нельзя да ?
Aleksey
черт :(
Aleksey
а под портабельностью ты наверное имеешь в виду для арма да ?
Aleksey
или соляра ?
yopp
я имею ввиду self-contained binary, который не требует ничего не целевой системе
Aleksey
тогда гошка
yopp
скачал и сказал ./mybin