새앙 토끼 연결 rabbitmq 클러스터

사용 새앙 토끼가 rabbitmq 클러스터를 연결
파이썬 프로그램은 종종 rabbitmq 새앙 토끼에 메시지를 보내는 데 사용되는 사용하여 단일 노드가 연결된 rabbitmq은 비교적 간단하다,이 문서는 클러스터 rabbitmq 상황에서 연결의 사용에 대해 설명합니다.

VIP 연결
클라이언트와 rabbitmq 서버 간의이 같은로드 밸런싱 VIP로 haproxy에 의해 제공됩니다, 나는 환경이 방법을 사용하는 것입니다,하지만 연결이 실패하면 클러스터가 중단됩니다 노드에 연결 rabbitmq의 VIP 액세스, 공통 로그가 발생 사용 로 다음과 같습니다 :

1
4
5
6
(7)
8
9
(10)
(11)
(12)
(13)
(14)
(15)
(16)
(17)
(18)
(19)
(20)
<URLParameters host=10.10.11.1 port=5672 virtual_host=/ ssl=False>
DEBUG:pika.adapters.select_connection:Using EPollPoller
DEBUG:pika.callback:Added: { 'callback' : <bound method SelectConnection._on_connection_start of <SelectConnection CLOSED socket=None  params =<URLParameters host=10.10.11.1 port=5672 virtual_host=/ ssl=False>>>,  'only' : None,  'one_shot' : True,  'arguments' : None,  'calls' : 1}
DEBUG:pika.callback:Added: { 'callback' : <bound method SelectConnection._on_connection_close of <SelectConnection CLOSED socket=None  params =<URLParameters host=10.10.11.1 port=5672 virtual_host=/ ssl=False>>>,  'only' : None,  'one_shot' : True,  'arguments' : None,  'calls' : 1}
DEBUG:pika.callback:Added: { 'callback' : <bound method _CallbackResult.set_value_once of <pika.adapters.blocking_connection._CallbackResult  object  at 0x7f869db987a0>>,  'only' : None,  'one_shot' : False,  'arguments' : None}
DEBUG:pika.callback:Added: { 'callback' : <bound method _CallbackResult.set_value_once of <pika.adapters.blocking_connection._CallbackResult  object  at 0x7f869db98758>>,  'only' : None,  'one_shot' : False,  'arguments' : None}
DEBUG:pika.callback:Added: { 'callback' : <bound method _CallbackResult.set_value_once of <pika.adapters.blocking_connection._CallbackResult  object  at 0x7f869db987e8>>,  'only' : None,  'one_shot' : False,  'arguments' : None}
DEBUG:pika.adapters.select_connection:call_later: added timeout <pika.adapters.select_connection._Timeout  object  at 0x7f869dc0b6d0> with deadline=1538140088.706256 and callback=<bound method SelectConnection._on_connect_timer of <SelectConnection INIT socket=None  params =<URLParameters host=10.10.11.1 port=5672 virtual_host=/ ssl=False>>>; now=1538140088.71; delay=0
INFO:pika.adapters.base_connection:Pika version 0.12.0 connecting to 10.10.11.1:5672
ERROR:pika.adapters.base_connection:Read empty data, calling disconnect
INFO:pika.connection:Disconnected  from  RabbitMQ at 10.10.11.1:5672 (-1): EOF
ERROR:pika.connection:Incompatible Protocol Versions
ERROR:pika.connection:Connection setup failed due to The protocol returned  by  the server  is  not supported: (-1,  'EOF' )
DEBUG:pika.callback:Processing 0:_on_connection_error
DEBUG:pika.callback:Calling <bound method _CallbackResult.set_value_once of <pika.adapters.blocking_connection._CallbackResult  object  at 0x7f869db987a0>>  for  "0:_on_connection_error"
DEBUG:pika.callback:Processing 0:_on_connection_closed
DEBUG:pika.callback:Calling <bound method _CallbackResult.set_value_once of <pika.adapters.blocking_connection._CallbackResult  object  at 0x7f869db987e8>>  for  "0:_on_connection_closed"
DEBUG:pika.callback:Incremented callback reference counter: { 'callback' : <bound method SelectConnection._on_connection_start of <SelectConnection CLOSED socket=None  params =<URLParameters host=10.10.11.1 port=5672 virtual_host=/ ssl=False>>>,  'only' : None,  'one_shot' : True,  'arguments' : None,  'calls' : 2}
DEBUG:pika.callback:Incremented callback reference counter: { 'callback' : <bound method SelectConnection._on_connection_close of <SelectConnection CLOSED socket=None  params =<URLParameters host=10.10.11.1 port=5672 virtual_host=/ ssl=False>>>,  'only' : None,  'one_shot' : True,  'arguments' : None,  'calls' : 2}
ERROR:pika.adapters.blocking_connection:Connection open failed - The protocol returned  by  the server  is  not supported: (-1

이 오류는 일반적으로 정상으로 복귀, 원인 VIP 액세스 새앙 토끼의 rabbitmq 연결이 실패 찾을 아직, 네트워크 문제로 인해, 텔넷 연결 VIP 포트를 시도한다 그래서 연결 rabbitmq 유사한 방식으로 OpenStack은의 사용, 구성 여러 호스트 목록, 연결 풀을 설정합니다.

配置 multiple hosts
openstack 配置transport_url 采用 rabbitmq 集群 host 列表方式,然后在 oslo.message 中建立连接池,通过 kombu 来使用 rabbitmq。参考这种方式,用 pika 实现。
pika 的官方文档中有示例参考 blocking_consume_recover_multiple_hosts

实际实现的时候会抛异常,原因是传递给 pika 需要是个实例而不是列表,官网上提供的方式把 host url 参数化后直接放到列表里传给 pika 进行连接:

1
2
3
4
5
node1 = pika.URLParameters( 'amqp://node1' )
node2 = pika.URLParameters( 'amqp://node2' )
node3 = pika.URLParameters( 'amqp://node3' )
all_endpoints = [node1, node2, node3]
connection = pika.BlockingConnection(all_endpoints)

实际执行后报错如下:

1
Expected instance of Parameters, not [.........]

github 上提交的 issue: parameters error

目前不支持直接传入多 host url 来池化 rabbitmq 集群的连接,所以要在应用程序中单独实现。

用一个简单 for 循环来做:

1
2
3
4
5
6
7
8
9
random.shuffle(all_endpoints)
for  url  in  all_endpoints:
     try :
         logging.basicConfig(level=logging.DEBUG)
         connection = pika.BlockingConnection(url)
     except Exception  as  ex:
         print str(ex)
     else :
         break

用 shuffle 来改变列表中的 host 顺序,可以起到负载均衡的作用。

추천

출처www.cnblogs.com/ExMan/p/12190041.html