Python通過SSH隧道連結Kafka

來源:互聯網
上載者:User

標籤:available   nobrokers   kafka   

Python通過SSH隧道連結Kafka

最近有一個需求需要串連Kafka,但是它只允許內網連結,但是有些服務跑在伺服器上總沒有在我本機調試起來爽,畢竟很多開發工具還是在用戶端機器上用的熟練。於是我想到了通過SSH串連Kafka,至於怎麼串連可以通過XShell、Proxifier等等,由於個人還是覺得自己寫更靈活,所以我是用Python裡的sshtunnel寫的(有需要後面我也可以分享下),個人喜好啊,你們自行選擇。

由於筆者這裡的Kafka環境使用Zookeeper做分布式部署,有多個broker的IP地址,不過這樣難不倒,大不了映射多幾個連接埠,一切都似乎很順利,SSH隧道建立起來,連接埠都配置好。

 

from kafka import KafkaProducerimport logging logging.basicConfig(level=logging.INFO) # 已經配置好的ssh隧道kafka_host = [    ‘127.0.0.1:19091‘,    ‘127.0.0.1:19092‘,    ‘127.0.0.1:19093‘,]producer = KafkaProducer(bootstrap_servers=kafka_host)producer.send(‘test‘, b‘some_message_bytes‘)

 

開始啟動指令碼發現問題來了,報錯:

Traceback (most recent call last):  File "<stdin>", line 12, in <module>  File "c:\python27\lib\site-packages\kafka\producer\kafka.py", line 347, in __init__    **self.config)  File "c:\python27\lib\site-packages\kafka\client_async.py", line 220, in __init__    if self.config[‘api_version‘] is None:  File "c:\python27\lib\site-packages\kafka\client_async.py", line 861, in check_version    except Errors.NodeNotReadyError:NoBrokersAvailable: NoBrokersAvailableNoBrokersAvailable

 

沒找到可串連的Brokers,在伺服器上相同的代碼卻可以直接連接上去了...

於是開始排查,發現Kafka串連時即使使用IP地址配置,但依舊會使用主機名稱解析IP地址,那麼就配置hosts把伺服器主機名稱都指向本地地址(127.0.0.1)不就行了,按道理是可以的,不過發現串連是沒問題了,可是訊息並沒有發送成功。

仔細查看日誌,發現:

INFO:kafka.conn:<BrokerConnection node_id=258 host=kafka-04/127.0.0.1 port=9092>: connecting to 127.0.0.1:9092

確實是把對應的主機名稱解析到本地地址,但是連接埠卻並沒有做相應的改變...

筆者並不是一個輕易放棄的人,於是開始讀pykafka的原始碼,實際也不是很難,立刻定位到問題了。基本就是pykafka會通過配置好的地址去串連Kafka伺服器,並且擷取一個可用的地址(這裡返回了Kafka的主機名稱),然後連接埠會使用預設的Port(如果沒有修改的話),所以即使使用hosts把IP解析到本地,但是連接埠並沒有使用配置好的連接埠。
===============================================================

解決方案:

終於到解決方案了,不囉嗦,直接上。

找到pykafka目錄,筆者這裡是:

C:\Python27\Lib\site-packages\kafka

增加一個自訂的設定檔self_config.py(自行修改,這裡都是舉例)

self_design = {    "kafka-04": 19094,    "kafka-03": 19093,    "kafka-02": 19092,    "kafka-01": 19091,}

分別對client_async.py和conn.py匯入設定檔

from .self_config import self_design

並且定位到原始碼中get_ip_port_afi方法處(該方法將host處理返回ip、port、afi)

# ----------------------------------------

client_async.py

host, port, afi = get_ip_port_afi(broker.host)# ==================================# Self Addonconn_port = port if broker.host in self_design else broker.port# ==================================

並且把以下broker.port修改為conn_port

conn = BrokerConnection(host, conn_port, afi,  # broker.port                        state_change_callback=cb,                        node_id=node_id,                        **self.config)

# ----------------------------------------

conn.py

if ‘:‘ not in host_and_port_str:    # ==================================    # Self Addon    if host_and_port_str in self_design:        af = _address_family(host_and_port_str)        return u‘127.0.0.1‘, self_design[host_and_port_str], af    # ==================================    af = _address_family(host_and_port_str)    return host_and_port_str, DEFAULT_KAFKA_PORT, af

# Self Addon 處為自己添加的代碼

再次串連,成功解決問題

 

 

 

 

 


本文出自 “雲驛站 -Leyex學習筆記” 部落格,請務必保留此出處http://leyex.blog.51cto.com/4230949/1958453

Python通過SSH隧道連結Kafka

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.