7

Tôi đang cố gắng chuyển từ SQS sang RabbitMQ cho dịch vụ nhắn tin. Tôi đang tìm cách xây dựng một dịch vụ xếp hàng sẵn sàng ổn định cao. Bây giờ tôi đang đi với cluster.Cách thiết lập tự động tính toán RabbitMQ Cluster AWS

thực hiện hiện tại, Tôi có ba máy EC2 với RabbitMQ với plugin quản lý cài đặt trong một AMI, và sau đó tôi dứt khoát đi đến từng máy và thêm

sudo rabbitmqctl join_cluster [email protected]<hostnameOfParentMachine> 

Với bất động sản HÀ thiết lập để tất cả và đồng bộ hóa hoạt động. Và một cân bằng tải trên đầu trang nó với một DNS được giao. Cho đến nay điều này hoạt động.

Triển khai dự kiến ​​: Tạo môi trường nhóm tự động sắp xếp nơi các máy lên/xuống phải tham gia/Xóa cụm động. cách tốt nhất để đạt được điều này là gì? Hãy giúp tôi.

+0

tự động tính toán dựa trên? cloudwatch? – Gabriele

+0

Có. Nhưng sau đó cá thể được chia tỷ lệ phải tự động tham gia cụm. – Karthik

+1

Hãy cẩn thận - Erlang ở chế độ nhóm không khoan dung với phân vùng mạng (bao gồm phân vùng vi mô) và có thể gây ra một số vấn đề; Tôi đã thường xuyên phân vùng vi mô trên AWS mà sẽ mang lại cụm của tôi xuống. Tôi sẽ khuyên bạn nên chạy một cụm dàn dựng một lúc trước khi cam kết với nó để sản xuất. –

Trả lời

11

Tôi đã có cấu hình tương tự 2 năm trước.

Tôi quyết định sử dụng amazon VPC, theo mặc định thiết kế của tôi có hai phiên bản RabbitMQ luôn chạy và được định cấu hình trong cụm (được gọi là nút chính). Cụm thỏ nằm phía sau internal amazon load balancer.

Tôi đã tạo một AMI với RabbitMQ và trình cắm quản lý được định cấu hình (được gọi là "master-AMI"), sau đó tôi đã định cấu hình quy tắc tự động đánh dấu.

nếu báo động tự động thu được nâng lên, AMI chính mới được khởi chạy. AMI này thực thi kịch bản sau lần đầu tiên được thực hiện:

#!/usr/bin/env python 
import json 
import urllib2,base64 

if __name__ == '__main__': 
    prefix ='' 
    from subprocess import call 
    call(["rabbitmqctl", "stop_app"]) 
    call(["rabbitmqctl", "reset"]) 
    try: 
     _url = 'http://internal-myloadbalamcer-xxx.com:15672/api/nodes' 
     print prefix + 'Get json info from ..' + _url 
     request = urllib2.Request(_url) 

     base64string = base64.encodestring('%s:%s' % ('guest', 'guest')).replace('\n', '') 
     request.add_header("Authorization", "Basic %s" % base64string) 
     data = json.load(urllib2.urlopen(request)) 
     ##if the script got an error here you can assume that it's the first machine and then 
     ## exit without controll the error. Remember to add the new machine to the balancer 
     print prefix + 'request ok... finding for running node' 


     for r in data: 
      if r.get('running'): 
       print prefix + 'found running node to bind..' 
       print prefix + 'node name: '+ r.get('name') +'- running:' + str(r.get('running')) 
       from subprocess import call 
       call(["rabbitmqctl", "join_cluster",r.get('name')]) 
       break; 
     pass 
    except Exception, e: 
     print prefix + 'error during add node' 
    finally: 
     from subprocess import call 
     call(["rabbitmqctl", "start_app"]) 


    pass 

Các kịch bản sử dụng API HTTP “http://internal-myloadbalamcer-xxx.com:15672/api/nodes” để tìm các nút, sau đó chọn một và liên kết AMI mới để cluster.

Như chính sách HA tôi quyết định sử dụng này:

rabbitmqctl set_policy ha-two "^two\."^
    "{""ha-mode"":""exactly"",""ha-params"":2,"ha-sync-mode":"automatic"}" 

Vâng, tham gia là “khá” dễ dàng, vấn đề được quyết định khi nào bạn có thể loại bỏ các nút từ cluster.

Bạn không thể xóa nút dựa trên quy tắc tự động quy đổi, vì bạn có thể có thư đến hàng đợi mà bạn phải tiêu thụ.

tôi quyết định thực hiện một kịch bản định kỳ chạy đến hai trường hợp chủ-nút đó:

  • kiểm tra các tin nhắn đếm thông qua API http://node:15672/api/queues
  • nếu các thông điệp đếm cho tất cả các hàng đợi là số không, tôi có thể loại bỏ thể hiện khỏi cân bằng tải và sau đó từ cụm thỏmq.

Đây là một cách rộng rãi những gì tôi đã làm, hy vọng nó sẽ giúp.

[EDIT]

Tôi chỉnh sửa các câu trả lời, vì có plugin này có thể giúp:

Tôi đề nghị để thấy điều này: https://github.com/rabbitmq/rabbitmq-autocluster

Plugin đã được chuyển đến các quan chức Kho lưu trữ RabbitMQ và có thể giải quyết một cách dễ dàng loại sự cố này

+0

Kịch bản của bạn hoạt động như một nét duyên dáng! cảm ơn một tấn. Về việc lấy nút đi fro m cân bằng tải im bằng cách sử dụng chính sách autoscaling dựa trên việc sử dụng bộ nhớ tức là <40%. – Karthik

+0

Tôi đã có thể thực hiện điều đó thông qua chỉ số tùy chỉnh cho bộ nhớ theo tài liệu aws về chỉ số tùy chỉnh. Cảm ơn mã. – Karthik

+3

Không phải là điểm của cụm sao mà bạn _can_ loại bỏ một nút vì dữ liệu được nhân rộng giữa các nút? – Volte

0

Gần đây, chúng tôi đã gặp sự cố tương tự.

Chúng tôi đã cố gắng sử dụng https://github.com/rabbitmq/rabbitmq-autocluster nhưng thấy nó quá phức tạp đối với trường hợp sử dụng của chúng tôi.

Tôi đã tạo cấu hình terraform để quay các nút X RabbitMQ trên mạng con Y (các vùng khả dụng) bằng cách sử dụng Nhóm tự động.

TL; DR https://github.com/ulamlabs/rabbitmq-aws-cluster

Cấu hình tạo ra vai trò IAM để cho phép các nút để Autodiscover tất cả các nút khác trong Nhóm Autoscaling.

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