2009-05-04 34 views
10

Tôi có một nhóm các nút xóa đang sao chép dữ liệu của họ thông qua "extra_db_nodes" của Mnesia ... Tôi cần nâng cấp phần cứng và phần mềm để tôi phải tách một số nút khi tôi thực hiện theo cách của mình nút đến nút.làm cách nào để xóa nút phụ

Làm cách nào để xóa nút và vẫn bảo toàn dữ liệu được chèn?

[cập nhật] xóa các nút cũng quan trọng như thêm chúng. Theo thời gian như cụm của bạn phát triển nó cũng phải ký hợp đồng. Nếu không thì Mnesia sẽ bận rộn cố gắng gửi dữ liệu đến các nút không tồn tại làm đầy hàng đợi và giữ cho mạng bận.

[cập nhật lần cuối] sau khi rót qua mã nguồn erlang/mnesia tôi đã có thể xác định rằng không thể tách rời hoàn toàn các nút. Trong khi del_table_copy loại bỏ mối liên kết giữa các bảng, nó chưa hoàn thành. Tôi sẽ đóng câu hỏi này nhưng không có mô tả nào phù hợp.

+0

cơ hội hacker erlang đi qua đây? thấp. Nhưng tôi đã tìm thấy câu hỏi hấp dẫn, và đang nhìn vào erlang và mnesia, vì vậy khi tôi đã học được nó tôi có thể quay trở lại trong một hoặc hai năm và trả lời một shot! cảm ơn vì bài đăng thú vị – Will

+0

tốt, có 19 câu hỏi về mnesia, vì vậy tỷ lệ cược không thấp. Câu hỏi càng thích hợp, bạn càng phải đợi lâu để có được câu trả lời, đó là tất cả. –

+0

Chỉ là vấn đề thời gian trước khi tôi mở mã và tự tìm kiếm. Tôi sẽ có rất nhiều thời gian vào tuần tới khi sa thải của tôi là cuối cùng. – Richard

Trả lời

0

Nếu bạn đã sao chép bảng (thêm bản sao bảng) trên các nút khác với nút bạn đang xóa, thì bạn đã ổn - chỉ cần xóa nút.

Nếu bạn muốn gọn gàng hơn một chút, bạn sẽ xóa bản sao bảng khỏi nút bạn sắp xóa trước tiên qua mnesia:del_table_copy/2.

Nói chung, miaia xử lý một cách duyên dáng nút mất và phát hiện lại nút (nút khởi động lại có được bản sao bảng mới từ các nút tiếp tục chạy, các nút không khởi động lại được phát hiện dưới dạng sự kiện phân vùng mạng). Mnesia không tiêu thụ CPU hoặc lưu lượng mạng cho các nút đã bị hỏng. Tôi nghĩ rằng, mặc dù tôi đã không xác nhận nó trong nguồn, mnesia sẽ không kết nối lại với các nút đã đi xuống tự động - nút mà đi xuống dự kiến ​​sẽ khởi động lại (miaia) và kết nối lại.

mnesia:add_table_copy/3, mnesia:move_table_copy/3mnesia:del_table_copy/2 là các chức năng bạn nên xem xét để quản lý giản đồ trực tiếp.

Thông số extra_db_nodes chỉ nên được sử dụng khi khởi tạo nút DB mới - khi nút mới có bản sao lược đồ, nó không cần tham số extra_db_nodes.

+0

Tôi đang ở hàng rào với câu trả lời này. Tôi thích thông tin chung, tuy nhiên, nó không phải là hiện tại. Ba phương pháp bạn đề cập không được bao gồm trong bản phát hành R13B. Tìm kiếm mã R13A không tiết lộ bất kỳ phương pháp tương tự nào. – Richard

+0

Tiếp tục tìm kiếm nguồn của tôi Tôi đã tìm thấy một số dấu hiệu cho thấy có một cuộc gọi đến mnesia_controller: add_list/2 được sử dụng khi thêm nút phụ. Có một nhận xét cho rằng gọi mnesia_recover: disconnect_nodes/1, tuy nhiên, phương thức đó không tồn tại ở bất cứ đâu và có thể đơn giản là lỗi đánh máy; mnesia_recover: ngắt kết nối/1 tồn tại. – Richard

+0

Tôi đã nói delete_table_copy thay vì sao chép del_table, nhưng ngoài ra rằng những phương pháp có mặt, tài liệu và hiện tại. Bạn không cần phải ngắt kết nối các nút bằng tay - mnesia tự xử lý ngắt kết nối nút. Chỉ cần tắt các nút không mong muốn. Hoặc sử dụng net_kernel: disconnect/1 để thực hiện nó. – archaelus

1

Tôi chắc chắn đã sử dụng phương pháp này để thực hiện việc này (hỗ trợ việc mất trí nhớ: del_table_copy/2 sử dụng). Xem removeNode/1 dưới đây:

-module(tool_bootstrap). 

-export([bootstrapNewNode/1, closedownNode/0, 
    finalBootstrap/0, removeNode/1]). 

-include_lib("records.hrl"). 

-include_lib("stdlib/include/qlc.hrl"). 

bootstrapNewNode(Node) -> 
    %% Make the given node part of the family and start the cloud on it 
    mnesia:change_config(extra_db_nodes, [Node]), 
    %% Now make the other node set things up 
    rpc:call(Node, tool_bootstrap, finalBootstrap, []). 

removeNode(Node) -> 
    rpc:call(Node, tool_bootstrap, closedownNode, []), 
    mnesia:del_table_copy(schema, Node). 

finalBootstrap() -> 
    %% Code removed to actually copy over my tables etc... 
    application:start(cloud). 

closedownNode() -> 
    application:stop(cloud), mnesia:stop(). 
+0

trong khi mã này có thể đã xuất hiện để hoạt động, nó không dọn sạch tất cả dữ liệu. del_table_copy không loại bỏ nút khỏi danh sách extra_db_node.Trong thực tế không có mã trong nguồn mà hoàn toàn loại bỏ các nút. – Richard

+0

Có bạn đã đúng. Tôi đã xóa tất cả mã cụ thể cho đơn đăng ký của mình để làm rõ ... –

+0

Mã nguồn mà tôi đang đề cập đến nằm trong thư viện Mnesia. – Richard

2

Tôi rất muộn để đảng, nhưng đi qua thông tin này trong doc khi tìm kiếm một giải pháp cho cùng một vấn đề:

"Chức năng cuộc gọi mnesia:.. del_table_copy (schema, mynode @ host) xóa nút 'mynode @ host' từ hệ thống mnesia cuộc gọi thất bại nếu mnesia đang chạy trên 'mynode @ host' các nút mnesia khác sẽ không bao giờ cố gắng để kết nối lại với nút đó . ote, nếu có một đĩa lược đồ cư trú trên nút 'mynode @ host', toàn bộ mnesia thư mục sẽ bị xóa. Điều này có thể được thực hiện với chứng mất trí: delete_schema/1. Nếu sự kiện bắt đầu lại trên nút 'mynode @ host' và thư mục chưa bị xóa, hành vi của mnesia không xác định. " (http://www.erlang.org/doc/apps/mnesia/ Mnesia_chap5.html # id74278)

Tôi nghĩ rằng những điều sau đây có thể làm những gì bạn mong muốn:

AllTables = mnesia:system_info(tables), 
DataTables = lists:filter(fun(Table) -> Table =/= schema end, 
          AllTables), 

RemoveTableCopy = fun(Table,Node) -> 
    Nodes = mnesia:table_info(Table,ram_copies) ++ 
      mnesia:table_info(Table,disc_copies) ++ 
      mnesia:table_info(Table,disc_only_copies), 
    case lists:is_member(Node,Nodes) of 
    true -> mnesia:del_table_copy(Table,Node); 
    false -> ok 
    end 
end, 

[RemoveTableCopy(Tbl,'[email protected]_host') || Tbl <- DataTables]. 

rpc:call('[email protected]_host',mnesia,stop,[]), 
rpc:call('[email protected]_host',mnesia,delete_schema,[SchemaDir]), 
RemoveTablecopy(schema,'[email protected]_host'). 

Mặc dù, tôi đã không kiểm tra nó kể từ khi kịch bản của tôi là hơi khác nhau.

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