Size: a a a

2021 April 19

EB

Evgenii Blokhin in Tarantool
Спасибо!
источник

EB

Evgenii Blokhin in Tarantool
Ещё такой вопрос, столкнулся с проблемой распределения бакетов, на один мастер бакеты назначаются, на другой нет. Собственно, версия Tarantool 2.5.3, чистый запуск, и следующая последоватльеность:
1) Стартую роутер
2) Стартую storage-1
3) Стартую storage-2
4) Выполняяю бутстрап на роутере командой: vshard.router.bootstrap

Конфигурация:
sharding:
 23e6344f-5b22-496c-809d-946f024f7906:
   replicas:
     97d8437e-7200-498a-b195-3326ead7860e:
       master: true
       name: storage-1
       uri: login:pass@ip_1
   weight: 1
 8f8874d0-53b4-4b6b-bf05-a898fb0bafb9:
   replicas:
     0ed5e019-e6fb-4e57-a028-29fea2cc1f6f:
       master: true
       name: storage-2
       uri: login:pass@ip_2
   weight: 1


vshard.storage.info() на мастере, куда не попадают бакеты - ошибок не показывает.
localhost:30011> vshard.storage.info()
---
- replicasets:
   8f8874d0-53b4-4b6b-bf05-a898fb0bafb9:
     uuid: 8f8874d0-53b4-4b6b-bf05-a898fb0bafb9
     master:
       uri: login@ip_2
   23e6344f-5b22-496c-809d-946f024f7906:
     uuid: 23e6344f-5b22-496c-809d-946f024f7906
     master:
       uri: login@ip_1
 bucket:
   receiving: 0
   active: 0
   total: 0
   garbage: 0
   pinned: 0
   sending: 0
 status: 0
 replication:
   status: master
 alerts: []
...

vshard.router.info() на роутере, ошибка
alerts: 
- ['UNKNOWN_BUCKETS', '90000 buckets are not discovered']


Пробовал запускать в разных вариациях, по отдельности, если убирать из конфигурации мастера, то всё бакеты распределяются. В логах ошибок нет.
Единственное различие, которое удалось найти, это то, что бакеты попадают только туда, где было "rebalancer_f has been started"
источник

A

Alexandr in Tarantool
Привет.

Пытаюсь сделать join

iterator = box.space.subscribers.index.primary
               :pairs(sn)
               :map(function(sub) return box.space.tasks.index.primary:pairs(sub[2]) end)

Вопрос - можно ли на получившийся итератор сделать аналог flatten или нужно свою обёртку писать для этого?
источник

VG

Vladislav Grubov in Tarantool
М, попробуйте vshard.router.bootstrap{ timeout = 60 }
источник

VG

Vladislav Grubov in Tarantool
В принципе:
iterators = iterator:totable()
result = fun.chain(iterators):totable()
источник

A

Alexandr in Tarantool
Не выходит, я примерно так пытался
источник

VG

Vladislav Grubov in Tarantool
А если fun.chain(unpack(a)):totable() ?
источник

A

Alexandr in Tarantool
Спасибо, так работает!
источник

VG

Vladislav Grubov in Tarantool
только, вынужден предупредить, так лучше делать, если у вас малор итераторов (например штук 10). У луа стека есть лимит на количество переменных в аргументах в функцию, и он там что-то около нескольких сотен.

Также из-за того, что здесь полная свертка, вы можете подвесить Тарантул, если ему придется собираться большое количество таплов (например пару тысяч).

Обычная практика это написать цикл for вокруг и проставить аккуратно fiber.yield
источник

IB

Ivan Blohin in Tarantool
Владислав, спасибо! Танцы вокруг кворума помогли
источник

A

Alexandr in Tarantool
А как тогда по-хорошему сделать join без sql?
источник

VG

Vladislav Grubov in Tarantool
Вообще, я для себя пока не придумал ничего лучше, чем сначала поднимать 1 мастер, с низким кворумом = 1, затем поднимать всех остальных (это первичный бутстрап, если тарантулов не очень много, и нужна кастомная топология, и бывают проблемы с сетью)
источник

DS

Dmitry Sharonov in Tarantool
(картридж вроде так же делает, или раньше делал)
источник

VG

Vladislav Grubov in Tarantool
local result = {}
local iterator_of_iterators = box.space.subscribers.index.primary
   :pairs(sn)
   :map(function(sub) return box.space.tasks.index.primary:pairs(sub[2]) end)

for _, iterator in iterator_of_iterators do
   result = iterator:enumerate()
       :map(function(no, ...) if no % 100 == 0 then fiber.yield() end return ... end)
       :reduce(function(res, t) table.insert(result, t) return result end, result)
end
return result
источник

IB

Ivan Blohin in Tarantool
ок, спасибо)
источник

R

R-omk in Tarantool
источник

EB

Evgenii Blokhin in Tarantool
Да, спасибо большое. Помогло. Получается это из-за того что лаг между мастерами большой?

И можете ещё подсказать, Если я хочу через коннектор питона выполнять эту команду, то выглядеть она будет так:
response = connection.call("vshard.router.bootstrap", { timeout = 60 })
источник

VG

Vladislav Grubov in Tarantool
не совсем, роутеру тяжеловато забустрапить большое количество бакетов на одну шарду за секунду (дефолтный таймаут).
У вас 180к на 2 шарда, то есть по 90к на каждый. Так как бутстрап всего раз в жизни, ему можно подкинуть таймаут
источник

VG

Vladislav Grubov in Tarantool
С питоном не подскажу, но если бы это был другой тарантул и netbox, то должно было бы быть что-то типа:
tnt:call('vshard.router.bootstrap', {{ timeout = 60 }}, { timeout = 60+1 })
источник

EB

Evgenii Blokhin in Tarantool
К сожалению не прошло.
источник