mnesia восстановление онлайн после [закрытого] разделения сети

Если вы вызываете myObject.method(), то this будет ссылаться на myObject внутри method.

19
задан archaelus 9 March 2009 в 12:51
поделиться

3 ответа

After some experimentation I've discovered the following:

  • Mnesia considered the network to be partitioned if between two nodes there is a node disconnect and a reconnect without an mnesia restart.
  • This is true even if no Mnesia read/write operations occur during the time of the disconnection.
  • Mnesia itself must be restarted in order to clear the partitioned network event - you cannot force_load_table after the network is partitioned.
  • Only Mnesia needs to be restarted in order to clear the network partitioned event. You don't need to restart the entire node.
  • Mnesia resolves the network partitioning by having the newly restarted Mnesia node overwrite its table data with data from another Mnesia node (the startup table load algorithm).
  • Generally nodes will copy tables from the node that's been up the longest (this was the behaviour I saw, I haven't verified that this explicitly coded for and not a side-effect of something else). If you disconnect a node from a cluster, make writes in both partitions (the disconnected node and its old peers), shutdown all nodes and start them all back up again starting the disconnected node first, the disconnected node will be considered the master and its data will overwrite all the other nodes. There is no table comparison/checksumming/quorum behaviour.

So to answer my question, one can perform semi online recovery by executing mnesia:stop(), mnesia:start() on the nodes in the partition whose data you decide to discard (which I'll call the losing partition). Executing the mnesia:start() call will cause the node to contact the nodes on the other side of the partition. If you have more than one node in the losing partition, you may want to set the master nodes for table loading to nodes in the winning partition - otherwise I think there is a chance it will load tables from another node in the losing partition and thus return to the partitioned network state.

Unfortunately mnesia provides no support for merging/reconciling table contents during the startup table load phase, nor does it provide for going back into the table load phase once started.

A merge phase would be suitable for ejabberd in particular as the node would still have user connections and thus know which user records it owns/should be the most up-to-date for (assuming one user conneciton per cluster). If a merge phase existed, the node could filter userdata tables, save all records for connected users, load tables as per usual and then write the saved records back to the mnesia cluster.

15
ответ дан 30 November 2019 в 05:07
поделиться

Это работает как это. Вообразите небо полным птиц. Снимите, пока Вы не получили всех птиц. Поместите изображения в таблицу. Изображения карты друг по другу. Таким образом, Вы видите каждую птицу одно время. Вы se каждая птица? Хорошо. Тогда Вы знаете в то время. Система была устойчива. Запись, на что походят все птицы (обменивается сообщениями), и сделайте еще некоторые снимки. Тогда повторитесь.

, Если Вам разделяли узел. Вернитесь к последнему общему устойчивому снимку. И попробуйте ** для воспроизведения то, что добавляет после этого.:)

Это лучше описано в "Распределенных Снимках: Определение Глобальных состояний Распределенных систем" K. MANI CHANDY и LESLIE LAMPORT

** я думаю, что существует проблема, решающая, кто часы для следования при попытке воспроизвести то, что произошло

0
ответ дан 30 November 2019 в 05:07
поделиться

Ответ Sara является большим, даже посмотрите на статью приблизительно ОГРАНИЧЕНИЕ . Разработчики Mnesia жертвуют P за Приблизительно. Если Вам нужен P, то Вы должны выбор, что из ОГРАНИЧЕНИЯ Вы хотите жертву и, чем выбор другое устройство хранения данных. Например CouchDB (жертвуют C), или Scalaris (жертвуют A).

0
ответ дан 30 November 2019 в 05:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: