2015-06-16 12 views
6

Tôi đã cố gắng chạy một ứng dụng đơn giản theo cách phân tán để thử nghiệm các tính năng chuyển đổi dự phòng nhưng không thành công.Cách khởi động ứng dụng Erlang được phân phối mà không bắt đầu phụ thuộc ở mọi nút?

Những gì tôi muốn:

Ứng dụng này myapp_api với một api nghỉ ngơi, nó có myapp ứng dụng như một phụ thuộc. Tôi muốn bắt đầu myapp_api trên 3 nút, tôi muốn toàn bộ ứng dụng (myapp_api + myapp) chỉ hoạt động tại một nút cùng một lúc.

Điều gì là sai:

Các ứng dụng chính (myapp_api) hoạt động như mong đợi: chỉ một nút với failover và thâu tóm. Nhưng vì một số lý do phụ thuộc myapp luôn bắt đầu ở mọi nút. Tôi muốn nó chỉ hoạt động ở một nút cùng một lúc.

Những gì tôi làm:

cấu hình của tôi cho nút đầu tiên làm ví dụ.

[ 
    {kernel, 
    [{distributed, [{myapp_api, 
     1000, 
     ['[email protected]', {'[email protected]', '[email protected]'}]}]}, 
     {sync_nodes_optional, ['[email protected]', '[email protected]']}, 
     {sync_nodes_timeout, 5000} 
    ]} 
]. 

tôi gọi erl -sname nI -config nI.config -pa apps/*/ebin deps/*/ebin -s myapp_api tại mỗi nút.

Trả lời

4

Bây giờ này được một chút bối rối vì bạn nói:

Tôi muốn bắt đầu myapp_api trên 3 nút, tôi muốn toàn bộ ứng dụng (myapp_api + myapp) để được làm việc chỉ một nút cùng một lúc .

và bạn thêm:

Các ứng dụng chính (myapp_api) hoạt động như mong đợi: chỉ một nút với failover và thâu tóm. Nhưng đối với một số lý do phụ thuộc myapp luôn luôn bắt đầu ở mỗi nút.

Trong đoạn đầu tiên bạn nói myapp_api nên chạy ở mọi nơi, trên báo giá thứ hai bạn nói nó hoạt động như dự định bằng cách khởi động trên một nút tại một thời điểm.

Tôi sẽ giả định ở đây rằng bạn muốn toàn bộ thiết lập là chuyển đổi dự phòng, không chỉ ứng dụng cấp cao nhất và tôi vừa bị nhầm lẫn trong đoạn đầu tiên.

Các tập tin cấu hình bạn sử dụng cho thấy những gì xảy ra:

[{kernel, 
    [{distributed, [{myapp_api, 
    1000, 
    ['[email protected]', {'[email protected]', '[email protected]'}]}]}, 
    {sync_nodes_optional, ['[email protected]', '[email protected]']}, 
    {sync_nodes_timeout, 5000} 
]}]. 

Các bit quan trọng là myapp_api có các nút ['[email protected]', {'[email protected]', '[email protected]'}] xác định. Thứ tự này có nghĩa là nó chạy trên [email protected] ở mức ưu tiên hàng đầu và sau đó trên các nút khác có mức độ ưu tiên bằng nhau nếu có chuyển đổi dự phòng.

Vấn đề là không có phụ thuộc nào được phân phối theo cùng một cách, và do đó có thể được dự kiến ​​sẽ chạy ở mọi nơi.

Bạn chỉ cần mở rộng trên tệp cấu hình đó để nó hoạt động. Ở đây tôi đã thực hiện nó và reindented nó để hiển thị cấu trúc của nó tốt hơn:

[{kernel, 
    [{distributed, [ 
    {myapp_api, 1000, ['[email protected]', {'[email protected]', '[email protected]'}]}, 
    {myapp, 1000, ['[email protected]', {'[email protected]', '[email protected]'}]}, 
    ]}, 
    {sync_nodes_optional, ['[email protected]', '[email protected]']}, 
    {sync_nodes_timeout, 5000} 
]}]. 

Tôi chưa thử nghiệm trực tiếp, nhưng tôi khá chắc chắn điều này sẽ làm việc.

Nếu những gì bạn muốn là myapp_api được ở khắp mọi nơi nhưng đối với myapp để chạy ở một nơi, bạn có thể sử dụng global registration, đặt tên cho quá trình công phải đối mặt với myapp 's, có myapp_api gọi này. myapp_api sau đó sẽ có thể giao thông đường đến bất cứ nơi nào myapp được khi được hỗ trợ với các cấu hình sau:

[{kernel, 
    [{distributed, [ 
    {myapp, 1000, ['[email protected]', {'[email protected]', '[email protected]'}]}, 
    ]}, 
    {sync_nodes_optional, ['[email protected]', '[email protected]']}, 
    {sync_nodes_timeout, 5000} 
]}]. 

(Xem cách myapp là ứng dụng chỉ nhận được một hồ sơ phân phối các ứng dụng khác sẽ nhận được để chạy trên tất cả các nút?)

+0

Vâng, cảm ơn, bạn đã làm đúng, tôi muốn toàn bộ thiết lập là chuyển đổi dự phòng. Và có, thêm myapp vào cấu hình phân tán làm việc là tốt. Thật kỳ lạ đối với tôi rằng tôi phải làm điều này bằng tay. – user2461860

+0

Nó chỉ lạ nếu bạn có các thiết lập đơn giản. Bạn có thể có các cụm không đồng nhất trong đó ứng dụng A và C cần chạy trên các nút 1,2,3,4 và sau đó là ứng dụng B chỉ có thể chạy trên nút 4 và 5 vì lý do phần cứng hoặc hệ điều hành. Với các chiến lược khác nhau cho các ứng dụng khác nhau, một cách tiếp cận linh hoạt hơn như phương pháp trên có ý nghĩa. –

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