Cloister → quản lý cụm OTP đơn giản

Hầu hết mọi ứng dụng kinh doanh thành công sớm hay muộn đều bước vào giai đoạn cần phải mở rộng quy mô theo chiều ngang. Trong nhiều trường hợp, bạn chỉ cần bắt đầu một phiên bản mới và giảm mức tải trung bình. Nhưng cũng có những trường hợp ít tầm thường hơn mà chúng ta cần đảm bảo rằng các nút khác nhau biết về nhau và phân phối khối lượng công việc một cách cẩn thận.

Cloister → quản lý cụm OTP đơn giản

Hóa ra may mắn đến thế đàn nhị, mà chúng tôi chọn vì cú pháp dễ chịu và sự cường điệu xung quanh nó, có tính năng hạng nhất hỗ trợ cho hệ thống phân tán. Về lý thuyết, điều này nghe có vẻ hoàn toàn tầm thường:

Thông báo truyền giữa các tiến trình trên các nút khác nhau, cũng như giữa các liên kết và màn hình, là minh bạch […]

Trong thực tế, mọi thứ phức tạp hơn một chút. phân phối đàn nhị được phát triển khi "container" có nghĩa là một hộp sắt lớn để vận chuyển, và "docker" đơn giản là từ đồng nghĩa với người bốc vác. TRONG IP4 có nhiều địa chỉ không được sử dụng, tình trạng ngừng hoạt động mạng thường do chuột nhai dây cáp và thời gian hoạt động trung bình của một hệ thống sản xuất được đo bằng hàng thập kỷ.

Bây giờ tất cả chúng ta đều có khả năng tự cung cấp đáng kinh ngạc, được đóng gói và vận hành đàn nhị trong một môi trường nơi các địa chỉ IP động được phân phát theo nguyên tắc ngẫu nhiên cao và các nút có thể xuất hiện và biến mất theo ý muốn của gót trái của bộ lập lịch. Để tránh hàng đống mã soạn sẵn trong mỗi dự án chạy hệ điều hành phân tán đàn nhị, để chống lại môi trường thù địch, cần có sự giúp đỡ.

Ghi: Tôi biết rằng có libcluster. Nó thực sự rất tuyệt, nó có hơn một nghìn ngôi sao, tác giả nổi tiếng trong cộng đồng, và tất cả những thứ đó. Nếu các phương pháp mà gói này cung cấp để tạo và duy trì một cụm là đủ cho bạn thì tôi rất mừng cho bạn. Thật không may, tôi cần nhiều hơn nữa. Tôi muốn kiểm soát việc thiết lập một cách chi tiết và không trở thành khán giả bên ngoài trong quá trình tái tổ chức cụm.

Yêu cầu

Điều cá nhân tôi cần là một thư viện có thể đảm nhận việc quản lý cụm và có các thuộc tính sau:

  • công việc minh bạch với cả danh sách các nút được mã hóa cứng và khám phá động thông qua các dịch vụ đàn nhị;
  • gọi lại đầy đủ chức năng cho mọi thay đổi cấu trúc liên kết (nút ở đó, nút ở đây, mạng không ổn định, phân tách);
  • giao diện trong suốt để khởi chạy một cụm có tên dài và ngắn, như với :nonode@nohost;
  • Hỗ trợ Docker ngay lập tức mà không cần phải viết mã cơ sở hạ tầng.

Điều sau có nghĩa là sau khi tôi thử nghiệm ứng dụng cục bộ trong :nonode@nohosthoặc trong môi trường phân phối nhân tạo bằng cách sử dụng test_cluster_task, tôi chỉ muốn chạy docker-compose up --scale my_app=3 và xem cách nó thực thi ba phiên bản trong docker mà không có bất kỳ thay đổi mã nào. Tôi cũng muốn các ứng dụng phụ thuộc như mnesia - khi cấu trúc liên kết thay đổi, đằng sau hậu trường, họ sẽ xây dựng lại cụm trực tiếp mà không cần bất kỳ tác động bổ sung nào từ ứng dụng.

tu viện không nhằm mục đích trở thành một thư viện có khả năng thực hiện mọi thứ, từ hỗ trợ một cụm đến pha cà phê. Nó không phải là viên đạn bạc nhằm mục đích bao quát tất cả các trường hợp có thể xảy ra, hoặc là một giải pháp hoàn chỉnh về mặt học thuật theo nghĩa mà các nhà lý thuyết từ CS đưa vào thuật ngữ này. Thư viện này được thiết kế để phục vụ một mục đích rất rõ ràng nhưng thực hiện công việc không quá lớn của nó một cách hoàn hảo. Mục tiêu này sẽ là cung cấp sự minh bạch hoàn toàn giữa môi trường phát triển cục bộ và môi trường đàn hồi phân tán chứa đầy các vùng chứa thù địch.

Cách tiếp cận được lựa chọn

tu viện được thiết kế để chạy dưới dạng một ứng dụng, mặc dù người dùng nâng cao có thể làm việc với việc lắp ráp và bảo trì cụm theo cách thủ công bằng cách chạy trực tiếp Cloister.Manager trong cây giám sát của ứng dụng đích.

Khi chạy như một ứng dụng, thư viện dựa vào config, từ đó nó đọc các giá trị cơ bản sau:

config :cloister,
  otp_app: :my_app,
  sentry: :"cloister.local", # or ~w|n1@foo n2@bar|a
  consensus: 3,              # number of nodes to consider
                             #    the cluster is up
  listener: MyApp.Listener   # listener to be called when
                             #    the ring has changed

Các thông số trên có nghĩa đen như sau: tu viện được sử dụng cho ứng dụng OTP :my_app, sử dụng khám phá dịch vụ erlang để kết nối các nút, ít nhất là ba, và MyApp.Listener mô-đun (thực hiện @behaviour Cloister.Listener) được cấu hình để nhận thông báo về những thay đổi cấu trúc liên kết. Một mô tả chi tiết về cấu hình hoàn chỉnh có thể được tìm thấy trong tài liệu.

Với cấu hình này, ứng dụng tu viện sẽ khởi động theo từng giai đoạn, trì hoãn quá trình khởi động ứng dụng chính cho đến khi đạt được sự đồng thuận (ba nút được kết nối và kết nối, như trong ví dụ trên.) Điều này mang lại cho ứng dụng chính cơ hội giả định rằng khi nó khởi động, cụm đã có sẵn. Bất cứ khi nào cấu trúc liên kết thay đổi (sẽ có nhiều thay đổi, vì các nút không khởi động hoàn toàn đồng bộ), trình xử lý sẽ được gọi MyApp.Listener.on_state_change/2. Hầu hết chúng ta thực hiện một hành động khi nhận được thông báo trạng thái %Cloister.Monitor{status: :up}, có nghĩa là: “Xin chào, cụm đã được lắp ráp.”

Trong hầu hết các trường hợp, việc cài đặt consensus: 3 là tối ưu vì ngay cả khi chúng tôi mong đợi có nhiều nút kết nối hơn thì cuộc gọi lại sẽ được thực hiện status: :rehashingstatus: :up trên bất kỳ nút mới được thêm hoặc xóa.

Khi bắt đầu ở chế độ phát triển, bạn chỉ cần đặt consensus: 1 и tu viện sẽ vui vẻ bỏ qua việc chờ đợi tập hợp cụm khi anh ấy nhìn thấy :nonode@nohostHoặc :node@hostHoặc :[email protected] - tùy thuộc vào cách nút được cấu hình (:none | :shortnames | :longnames).

Quản lý ứng dụng phân tán

Các ứng dụng phân tán không ở dạng chân không thường bao gồm các phần phụ thuộc phân tán, chẳng hạn như mnesia. Thật dễ dàng để chúng tôi xử lý việc cấu hình lại của họ từ cùng một lệnh gọi lại on_state_change/2. Ví dụ: đây là mô tả chi tiết về cách cấu hình lại mnesia đang bay vào tài liệu tu viện.

Ưu điểm chính của việc sử dụng tu viện là nó thực hiện tất cả các hoạt động cần thiết để xây dựng lại cụm sau khi thay đổi cấu trúc liên kết dưới mui xe. Ứng dụng chỉ chạy trong môi trường phân tán đã được chuẩn bị sẵn, với tất cả các nút được kết nối, bất kể chúng ta có biết trước địa chỉ IP và tên nút hay chúng đã được gán/thay đổi động. Điều này hoàn toàn không yêu cầu cài đặt cấu hình docker đặc biệt và theo quan điểm của nhà phát triển ứng dụng, không có sự khác biệt giữa việc chạy trong môi trường phân tán hoặc chạy trong môi trường cục bộ. :nonode@nohost. Bạn có thể đọc thêm về điều này trong tài liệu.

Mặc dù có thể xử lý phức tạp các thay đổi cấu trúc liên kết thông qua triển khai tùy chỉnh MyApp.Listener, có thể luôn có những trường hợp đặc biệt trong đó những hạn chế về thư viện và sai lệch cấu hình này chứng tỏ là nền tảng của việc triển khai. Không sao đâu, chỉ cần làm như trên libcluster, có mục đích chung hơn hoặc thậm chí tự mình xử lý cụm cấp thấp. Mục tiêu của thư viện mã này không phải là bao gồm mọi tình huống có thể xảy ra mà là sử dụng kịch bản phổ biến nhất mà không gây đau đớn không cần thiết và việc sao chép-dán rườm rà.

Lưu ý: Tại thời điểm này trong bản gốc có cụm từ “Chúc mừng phân cụm!”, và Yandex, mà tôi dịch (tôi không cần phải tra từ điển), đã đưa ra cho tôi tùy chọn “Chúc mừng phân cụm!” Có lẽ không thể tưởng tượng được một bản dịch tốt hơn, đặc biệt là trong bối cảnh tình hình địa chính trị hiện nay.

Nguồn: www.habr.com

Thêm một lời nhận xét