2009-04-06 14 views
13

Digamos que tiene una tabla mnesia replicada en los nodos A y B. Si en el nodo C, que no contiene una copia de la tabla, hago mnesia:change_config(extra_db_nodes, [NodeA, NodeB]), y luego en el nodo CI do mnesia:dirty_read(user, bob) cómo elige el nodo C qué copia de nodo de la tabla para ejecutar una consulta?En un clúster de mnesia, ¿qué nodo se consulta?

Respuesta

14

Según mi propia investigación, la respuesta a la pregunta es - elegirá el nodo conectado más recientemente. Estaré agradecido por señalar los errores si los encuentra - ¡mnesia es un sistema realmente complejo!

Como Dan Gudmundsson pointed out en la lista de correo el algoritmo de selección del nodo remoto a consultar se define en mnesia_lib:set_remote_where_to_read/2. Es el siguiente

set_remote_where_to_read(Tab, Ignore) -> 
    Active = val({Tab, active_replicas}), 
    Valid = 
     case mnesia_recover:get_master_nodes(Tab) of 
      [] -> Active; 
      Masters -> mnesia_lib:intersect(Masters, Active) 
     end, 
    Available = mnesia_lib:intersect(val({current, db_nodes}), Valid -- Ignore), 
    DiscOnlyC = val({Tab, disc_only_copies}), 
    Prefered = Available -- DiscOnlyC, 
    if 
     Prefered /= [] -> 
      set({Tab, where_to_read}, hd(Prefered)); 
     Available /= [] -> 
      set({Tab, where_to_read}, hd(Available)); 
     true -> 
      set({Tab, where_to_read}, nowhere) 
    end. 

por lo que obtiene la lista de active_replicas (es decir, la lista de candidatos), se encoge opcionalmente la lista de dominar los nodos de la tabla, eliminar tablas para ser ignorados (por cualquier motivo), se contrae la lista a conectado actualmente nodos y se selecciona en el orden siguiente:

  1. primer no disc_only_copies
  2. Cualquier nodo disponible

el La parte más importante es, de hecho, la lista de active_replicas, ya que determina el orden de los nodos en la lista de candidatos.

Lista de active_replicas está formada por las llamadas remotas de mnesia_controller:add_active_replica/* de nodos recién conectados a viejos nodos (es decir, uno que estaban en el clúster antes), que se reduce a la función add/1 que añade el artículo como la cabeza de la lista.

Por lo tanto respuesta para la pregunta es - se elegirá el nodo conectado más recientemente.

Notas: de revisar la lista de réplicas activas en el nodo dado puede utilizar este (truco sucio) código:

[ {T,X} || {{T,active_replicas}, X} <- ets:tab2list(mnesia_gvar) ]. 
-1

Bueno, el nodo C necesitaría contactar al nodo A o al nodo B para realizar una consulta. Por lo tanto, el nodo C tendrá que decidir sobre qué copia de tabla ejecutar la consulta.

Si necesita algo más que esto, necesitaría tener algún algoritmo que decidirá en qué nodo consultar, o incluso replicar la tabla en el nodo C (esto normalmente dependerá de qué tipo de características desee/necesite)

Si el nodo A y el nodo B forman o forman parte de un clúster de base de datos, un buen comienzo es probablemente el algoritmo round robin (o aleatorio, como usted sugiere).

+0

comprobar mi mensaje editado, no estoy seguro de cómo esto se aplicaría a lo que pedí Puedo hacer una consulta en el nodo C sin una especificación de ubicación, entonces, ¿cómo elige qué copia de tabla usar? – ryeguy

+0

No entendí que el nodo realmente tenía la tabla en su esquema. ¡Disculpa, me equivoque! –

Cuestiones relacionadas