2017-06-21 92 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地址。