Я уже видел этот вопрос и это сообщение в списке рассылки о перебалансировках ожидающих узлов, но они не помогли решить мою проблему.Подобным образом, такие вещи, как this , не помогли пролить свет на происходящее.Я следовал этому руководству и переводил его на Эликсир по ходу дела.В разделе 3. я столкнулся с этой проблемой.
:riak_core
объявлено в моем mix.exs
следующим образом:
{:riak_core, github: "Kyorai/riak_core", branch: "fifo-merge"},
и escriptize
часть cuttlefish
rebar.config
закомментирован так, что он может даже построить.
Я использую Elixir 1.8.1 с Erlang 21.3.Все узлы выполняются на одном и том же компьютере.
Я определяю модуль vnode, как описано в связанном учебном пособии riak_core
, включая удаление обратных вызовов, не упомянутых в руководстве, и настраиваю riak_core
следующим образом.:
case Supervisor.start_link(children, opts) do
{:ok, pid} ->
:ok = :riak_core.register vnode_module: MyApp.VNode
:ok = :riak_core_node_watcher.service_up MyApp.Service, self()
Supervisor.start_child MyApp.Supervisor, worker(:riak_core_vnode_master, [MyApp.VNode], id: :riak_core_vnode_master)
{:ok, pid}
{:error, reason} ->
{:error, reason}
end
Затем я запускаю два узла MyApp
.Оба запускаются с iex --name whatever@127.0.0.1 -S mix run --no-halt
, где длинные имена узлов: myapp-1@127.0.0.1
и myapp-2@127.0.0.1
.Оба узла запускаются нормально по отдельности и запускают свои отдельные vnode.
На этом этапе я пытаюсь присоединить второй узел к первому.При объединении узлов через :riak_core.join 'myapp-1@127.0.0.1'
, кажется, что он изначально работает:
:riak_core_console.member_status []
:
================================= Membership ==================================
Status Ring Pending Node
-------------------------------------------------------------------------------
valid 100.0% 50.0% 'myapp-1@127.0.0.1'
valid 0.0% 50.0% 'myapp-2@127.0.0.1'
-------------------------------------------------------------------------------
:riak_core_ring.pretty_print ring, [:legend]
:
==================================== Nodes ====================================
Node a: 64 (100.0%) myapp-1@127.0.0.1
Node b: 0 ( 0.0%) myapp-2@127.0.0.1
==================================== Ring =====================================
aaaa|aaaa|aaaa|aaaa|aaaa|aaaa|aaaa|aaaa|aaaa|aaaa|aaaa|aaaa|aaaa|aaaa|aaaa|aaaa|
:riak_core_console.ring_status []
:
================================== Claimant ===================================
Claimant: 'myapp-1@127.0.0.1'
Status: up
Ring Ready: true
============================== Ownership Handoff ==============================
Owner: myapp-1@127.0.0.1
Next Owner: myapp-2@127.0.0.1
Index: 22835963083295358096932575511191922182123945984
Waiting on: [MyApp.VNode]
Index: 45671926166590716193865151022383844364247891968
Waiting on: [MyApp.VNode]
... this continues for every vnode...
-------------------------------------------------------------------------------
============================== Unreachable Nodes ==============================
All nodes are up and reachable
но он просто застревает в этом состоянии навсегда.Ожидание до 15 минут ничего не меняет, поэтому я могу только предположить, что что-то не так.
Пройдя несколько раз, я добавил некоторые входы в каждый обратный вызов в MyApp.VNode
.MyApp.VNode.init/1
вызывается для каждого vnode, пытающегося переместиться на myapp-2@127.0.0.1
, но никакие другие обратные вызовы никогда не вызываются.Узел myapp-2@127.0.0.1
пытается запустить vnode 3 раза, а затем, по-видимому, сдается.В этот момент кластер «зависает» в этом состоянии навсегда.Никакой новой информации не зарегистрировано;я не вижу никаких ошибок или информационных / отладочных сообщений.Кроме того, нет файлов журналов в каталогах log*/
в корне моего проекта.
При включенных журналах отладки в :lager
я получаю:
20:41:37.865 [debug] started riak_core_metadata_manager exchange with 'myapp-2@127.0.0.1' (<0.825.0>)
20:41:37.866 [debug] Tree {state,<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>,cluster_meta,3,65536,256,0,{dict,0,16,16,8,80,48,{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}},#Ref<0.2966336661.3930193920.250738>,"./data_myapp-1/cluster_meta/trees",undefined,full,[],0,{array,2428,0,0,10000}} level 1 bucket 0
L=[]
R=[]
D=[]
20:41:37.866 [debug] completed metadata exchange with 'myapp-2@127.0.0.1'. nothing repaired
на обоих узлах,На узле, который должен принимать vnode, я получаю:
20:42:11.655 [debug] vnode :: 'Elixir.MyApp.VNode'/1415829711164312202009819681693899175291684651008 :: undefined
20:42:11.655 [debug] Started VNode, waiting for initialization to complete <0.807.0>, 1415829711164312202009819681693899175291684651008
20:42:11.655 [debug] VNode initialization ready <0.807.0>, 1415829711164312202009819681693899175291684651008
, который повторяется со всеми 3 попытками запуска vnode.В журналах отладки первого узла я вижу, что есть 32 ожидающие передачи, но они никогда не завершаются.
Вещи, которые я пытался исправить это:
- Решение, предложенное в этот вопрос .Ничего не изменилось.
- После этого руководства , написанного на эликсире.Это ничего не изменило для меня.
- Использование
:riak_core_ng
из Hex вместо GitHub.Это также не решило проблему. - Изменение модуля, зарегистрированного в качестве службы.
- Изменение модуля vnode.
- Объединение узлов вместе с
:riak_core.join/1
- Объединение узлов вместес
Node.connect/1
перед вызовом :riak_core.join/1
.
Обновление: я начал копать в обратном направлении от :riak_core_console.ring_status/1
.Это привело меня к :riak_core_vnode.maybe_handoff/3
.Я обнаружил, что maybe_handoff
на самом деле никогда не вызывали, так что это привело меня к поиску того, откуда оно в конечном счете вызывалось.После прохождения этого приключения через :riak_core_vnode_manager
лучшее, что я смог догадаться, это то, что что-то внутри riak_core
неправильно вызывает функции передачи обслуживания.Сейчас я просто молюсь, чтобы мои предположения были неверными.