cassandra python驱动程序自动降级protocol_version不起作用

时间:2017-03-04 10:05:58

标签: python cassandra

这是我的代码:

from cassandra.cluster import Cluster
import cassandra
print('cassandra driver version: %s ' % str(cassandra.__version_info__))

# c = Cluster(['mgdevtestslc03-7583.slc07.dev.xxx.com'], protocol_version=3)
c = Cluster(['mgdevtestslc03-7583.slc07.dev.xxx.com'])
c.connect()

上面的代码将生成一个例外:

dbbox@ubuntu:~$ python  1.py
cassandra driver version: (3, 8, 0)
Traceback (most recent call last):
  File "1.py", line 7, in <module>
    c.connect()
  File "/usr/local/lib/python2.7/dist-packages/cassandra/cluster.py", line 1172, in connect
    self.control_connection.connect()
  File "/usr/local/lib/python2.7/dist-packages/cassandra/cluster.py", line 2618, in connect
    self._set_new_connection(self._reconnect_internal())
  File "/usr/local/lib/python2.7/dist-packages/cassandra/cluster.py", line 2655, in _reconnect_internal
    raise NoHostAvailable("Unable to connect to any servers", errors)
cassandra.cluster.NoHostAvailable: ('Unable to connect to any servers', {'10.***.***.**': ConnectionException('Failed to initialize new connection to 10.***.***.**: Error from server: code=0000 [Server error] message="io.netty.handler.codec.DecoderException: org.apache.cassandra.transport.ProtocolException: Invalid or unsupported protocol version: 4"',)})

但是,如果我添加“protocol_version = 3”,它就可以了。

Python Cassandra Driver official document,protocal_version可以自动降级,

  
    
      

如果未在构造函数中设置,驱动程序将根据与服务器的协商自动降级版本

    
  

但是为什么自动降级不会在这里发生?我需要这个功能,因为我想连接到许多不同版本的cassandra集群,所以我不想为每个连接设置protocal_version。

1 个答案:

答案 0 :(得分:1)

只是一个猜测,但您是否尝试连接到Apache Cassandra 2.1.0-2.1.5群集?这些cassandra版本(CASSANDRA-9451)中存在一个错误,当它不支持经过试用的协议版本时会返回错误的错误响应。

有一个问题是针对python驱动程序打开来更优雅地处理它(PYTHON-366),但是决定不显式处理它,因为它影响了过时/旧的Cassandra版本。如果您在2.1.0-2.1.5之间运行Cassandra版本,则可能值得考虑更新到最新的2.1版本(此日期为2.1.17),因为可能存在已知问题,因为那些是2.1的早期版本