2017-06-21 5 views
0

アドレス変換マップを使用して作成時にscylladbクラスタに接続しようとしています。cassandraでアドレス変換マップを使用する場合のポート変換の方法は?

Iハードコードポートクラスタインスタンスをインスタンス化する場合、私はコードのみが働いて得ることができます。

from cassandra.cluster import Cluster 
from cassandra.policies import AddressTranslator 
from cassandra.auth import PlainTextAuthProvider 

################################################################################ 
# our variables 

address_map = { 
    "10.0.24.69:9042": "sl-eu-lon-2-portal.3.dblayer.com:15227", 
    "10.0.24.71:9042": "sl-eu-lon-2-portal.2.dblayer.com:15229", 
    "10.0.24.70:9042": "sl-eu-lon-2-portal.1.dblayer.com:15228" 
} 

username = 'scylla' 
password = 'changeme' 

port = 15227 

################################################################################ 

次のアドレスを変換するためのクラス:

class ComposeAddressTranslator(AddressTranslator): 

    def set_map(self, address_map): 
     # strip ports from both source and destination as the cassandra python 
     # client doesn't appear to support ports translation 
     self.address_map = {key.split(':')[0]: value.split(':')[0] for (key, value) in address_map.items()} 

    def contact_points(self): 
     return [value.split(':')[0] for (key, value) in address_map.items()] 

    def translate(self, addr): 

     # print some debug output 
     print('in translate(self, addr) method', type(addr), addr) 

     trans_addr = self.address_map[addr] 
     return trans_addr 

今度は、接続してみましょう:

compose_translator = ComposeAddressTranslator() 
compose_translator.set_map(address_map) 

auth_provider = PlainTextAuthProvider(
          username=username, 
          password=password 
          ) 

# if the port parameter value is removed from below, we are unable 
# to establish a connection 

cluster = Cluster(
      contact_points = compose_translator.contact_points(), 
      address_translator = compose_translator, 
      auth_provider = auth_provider, 
      cql_version = '3.2.1', 
      protocol_version = 2, 
      port = port 
      ) 

session = cluster.connect() 
session.execute("USE my_keyspace;") 
session.shutdown() 

cassandraのpythonライブラリは、ポート変換をサポートしていないようですtranslate methodとのアトリオン?あなたはaddrが変換メソッドに渡されたというのが私のデバッグ出力には以下を参照することができますポートせずに文字列のIPアドレスの値である:

in translate(self, addr) method <class 'str'> 10.0.24.69 
in translate(self, addr) method <class 'str'> 10.0.24.71 

私の環境:ノードなど

$ pip freeze | grep cassandra 
cassandra-driver==3.10 

$ pip freeze | grep cassandra 
cassandra-driver==3.10 

答えて

0

その他カサンドラ・ドライバドライバサポートポートの変換。 nodejs translator documentation:あなたは、翻訳者がIPアドレスとポートの両方を受け取ること

MyAddressTranslator.prototype.translate = function (address, port, callback) { 
    // Your custom translation logic. 
}; 

を見ることができる上。

しかし、私は現在のカサンドラのPythonのドライバがポートアドレスtranslationをサポートしています信じていない:

translate(addr) 

は、ノードのIPアドレスを受け入れ、このノードへの接続に使用される変換後のアドレスを返します。

ここで、トランスレータはIPアドレスのみを受信することがわかります。

関連する問題