2009-04-06 20 views
13

Giả sử bạn có bảng miaia được sao chép trên các nút A và B. Nếu trên nút C, không chứa bản sao của bảng, tôi làm mnesia:change_config(extra_db_nodes, [NodeA, NodeB]) và sau đó trên nút CI làm mnesia:dirty_read(user, bob) cách nút C chọn bản sao của nút nào của bảng để thực hiện truy vấn trên?Trong một cụm Mnesia, nút nào được truy vấn?

Trả lời

14

Theo câu trả lời nghiên cứu của riêng tôi cho câu hỏi là - nó sẽ chọn nút được kết nối gần đây nhất. Tôi sẽ biết ơn vì đã chỉ ra các lỗi nếu tìm thấy - chứng mất trí là một hệ thống thực sự phức tạp!

Khi Dan Gudmundsson pointed out trên thuật toán danh sách gửi thư của lựa chọn nút từ xa đến truy vấn được xác định trong mnesia_lib:set_remote_where_to_read/2. Đó là sau

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. 

Vì vậy, nó được danh sách các active_replicas (tức là danh sách các ứng cử viên), tùy co lại danh sách để làm chủ các nút cho bảng, loại bỏ bảng để được bỏ qua (vì lý do bất kỳ), co lại danh sách để hiện kết nối các nút và sau đó chọn theo thứ tự sau:

  1. Đầu tiên phi disc_only_copies
  2. Bất kỳ nút sẵn

các phần quan trọng nhất trong thực tế là danh sách của active_replicas, vì nó xác định thứ tự các nút trong danh sách các ứng cử viên.

Danh sách active_replicas được hình thành bởi các cuộc gọi từ xa của mnesia_controller:add_active_replica/* từ các nút mới được kết nối với các nút cũ (có nghĩa là mật mà là trong cụm trước đó), mà nắm để chức năng add/1 mà thêm mục là người đứng đầu danh sách.

Do đó, câu trả lời cho câu hỏi là - nó sẽ chọn nút được kết nối gần đây nhất.

Ghi chú: Để kiểm tra danh sách các bản sao hoạt động trên các nút cho bạn có thể sử dụng này (bẩn hack) mã:

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

Vâng, nút C sẽ cần liên hệ với nút A hoặc nút B để thực hiện truy vấn. Vì vậy, nút C sẽ phải tự quyết định bản sao bảng nào để thực thi truy vấn.

Nếu bạn cần thứ gì đó hơn bạn cần có một số thuật toán sẽ quyết định nút nào truy vấn, hoặc thậm chí sao chép bảng trên nút C (điều này thường phụ thuộc vào loại đặc điểm bạn muốn/cần).

Nếu nút A và nút B tạo thành hoặc là một phần của cụm cơ sở dữ liệu, khởi đầu tốt có thể là thuật toán xoay vòng (hoặc ngẫu nhiên, như bạn đề xuất).

+0

Kiểm tra bài viết của tôi, tôi không chắc chắn cách này sẽ áp dụng đối với những gì tôi hỏi. Tôi có thể làm một truy vấn trên nút C mà không có một đặc tả địa điểm, vậy làm thế nào nó chọn bảng sao chép để sử dụng? – ryeguy

+0

Không nhận được rằng các nút thực sự đã có bảng trong lược đồ của nó. Xin lỗi, tôi xấu! –

Các vấn đề liên quan