2017-06-21 91 views
0

我正嘗試使用地址轉換映射組成連接到scylladb羣集。如何在cassandra中使用地址轉換映射時進行端口轉換?

我只能如果我硬編碼實例羣集實例時端口獲取代碼工作:

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庫不支持端口transl與translate method?你可以在我的調試輸出的地址傳遞到翻譯方法見下文是不出口成線狀的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

其他卡桑德拉驅動器,如節點驅動程序支持端口轉換該translator documentation的NodeJS:

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

上面可以看到譯者既接收的IP地址和端口。

不過,我不認爲目前的卡桑德拉蟒蛇驅動程序支持端口地址translation

translate(addr) 

接受節點的IP地址,並返回用來連接到這個節點的轉換地址。

在這裏您可以看到翻譯器只接收IP地址。