Couchbase.Exceptions.UnAmbigousTimeoutException с использованием Python SDK

Я получаю couchbase.exceptions.UnAmbiguousTimeoutException каждый раз, когда пытаюсь подключиться к своему кластеру Couchbase с помощью Python SDK. С тем же именем и конфигурацией у меня нет проблем с подключением через .NET SDK.

Это мой код Python:

class CouchbaseBase:
    def __init__(self, endpoint, username, password, bucket_name):

        logging.basicConfig(filename='example.log',
                            filemode='w',
                            level=logging.DEBUG,
                            format='%(levelname)s::%(asctime)s::%(message)s',
                            datefmt='%Y-%m-%d %H:%M:%S')
        logger = logging.getLogger()
        couchbase.configure_logging(logger.name, level=logger.level)

        # Connect options - authentication
        auth = PasswordAuthenticator(username, password)
        timeout_opts = ClusterTimeoutOptions(connect_timeout=timedelta(seconds=60),
                                             kv_timeout=timedelta(seconds=60))

        # get a reference to our cluster
        options = ClusterOptions(auth,
                                 timeout_options=timeout_opts,
                                 disable_mozilla_ca_certificates=True,
                                 enable_dns_srv=False,
                                 tls_verify=None)
        cluster = Cluster.connect(f"couchbase://{endpoint}", options)

        # Wait until the cluster is ready for use.
        cluster.wait_until_ready(timedelta(seconds=5))

А это логи (имя адреса и ip заменены в целях безопасности):

DEBUG::2024-06-24 09:58:57::{"openssl_default_cert_dir": "/etc/ssl/certs", "openssl_default_cert_file": "/etc/ssl/cert.pem", "openssl_headers": "OpenSSL 1.1.1 (compatible; BoringSSL)", "openssl_runtime": "BoringSSL", "txns_forward_compat_extensions": "TI,MO,BM,QU,SD,BF3787,BF3705,BF3838,RC,UA,CO,BF3791,CM,SI,QC,IX,TS,PU", "txns_forward_compat_protocol_version": "2.0", "version": "1.0.0"}
DEBUG::2024-06-24 09:58:57::Found DNS Servers: [10.70.0.2, 10.2.127.254, 8.8.8.8], selected nameserver: "10.70.0.2"
DEBUG::2024-06-24 09:58:57::open cluster, id: "a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337", core version: "1.0.0+", {"bootstrap_nodes":[{"hostname":"couchbase-named-address.com","port":"11210"}],"options":{"analytics_timeout":"75000ms","bootstrap_timeout":"10000ms","config_idle_redial_timeout":"300000ms","config_poll_floor":"50ms","config_poll_interval":"2500ms","connect_timeout":"60000ms","disable_mozilla_ca_certificates":false,"dns_config":{"nameserver":"10.70.0.2","port":53,"timeout":"500ms"},"dump_configuration":false,"enable_clustermap_notification":true,"enable_compression":true,"enable_dns_srv":true,"enable_metrics":true,"enable_mutation_tokens":true,"enable_tcp_keep_alive":true,"enable_tls":false,"enable_tracing":true,"enable_unordered_execution":true,"idle_http_connection_timeout":"1000ms","key_value_durable_timeout":"10000ms","key_value_timeout":"60000ms","management_timeout":"75000ms","max_http_connections":0,"metrics_options":{"emit_interval":"600000ms"},"network":"auto","query_timeout":"75000ms","resolve_timeout":"2000ms","search_timeout":"75000ms","show_queries":false,"tcp_keep_alive_interval":"60000ms","tls_verify":"peer","tracing_options":{"analytics_threshold":"1000ms","key_value_threshold":"500ms","management_threshold":"1000ms","orphaned_emit_interval":"10000ms","orphaned_sample_size":64,"query_threshold":"1000ms","search_threshold":"1000ms","threshold_emit_interval":"10000ms","threshold_sample_size":64,"view_threshold":"1000ms"},"transactions_options":{"cleanup_config":{"cleanup_client_attempts":false,"cleanup_lost_attempts":false,"cleanup_window":"0ms","collections":[]},"durability_level":"none","query_config":{"scan_consistency":"not_bounded"},"timeout":"0ns"},"trust_certificate":"","use_ip_protocol":"any","user_agent_extra":"pycbc/4.2.1 (python/3.9.7)","view_timeout":"75000ms"}}
DEBUG::2024-06-24 09:58:57::Query DNS-SRV: address = "couchbase-named-address.com", service = "_couchbase", nameserver = "10.70.0.2:53"
DEBUG::2024-06-24 09:58:57::DNS UDP returned 0 records
WARNING::2024-06-24 09:58:57::DNS SRV query returned 0 records for "couchbase-named-address.com", assuming that cluster is listening this address
DEBUG::2024-06-24 09:58:57::[a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337/b49bd8-2d09-e440-6ac3-0b7691c4cef19e/plain/-] <couchbase-named-address.com:11210> attempt to establish MCBP connection
DEBUG::2024-06-24 09:58:57::[a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337/b49bd8-2d09-e440-6ac3-0b7691c4cef19e/plain/-] <couchbase-named-address.com:11210> connecting to 127.0.0.1:11210 ("couchbase-named-address.com:11210"), timeout=60000ms
DEBUG::2024-06-24 09:58:59::[a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337/b49bd8-2d09-e440-6ac3-0b7691c4cef19e/plain/-] <couchbase-named-address.com:11210> reached the end of list of bootstrap nodes, waiting for 500ms before restart
DEBUG::2024-06-24 09:59:00::[a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337/b49bd8-2d09-e440-6ac3-0b7691c4cef19e/plain/-] <couchbase-named-address.com:11210> attempt to establish MCBP connection
DEBUG::2024-06-24 09:59:00::[a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337/b49bd8-2d09-e440-6ac3-0b7691c4cef19e/plain/-] <couchbase-named-address.com:11210> connecting to 127.0.0.1:11210 ("couchbase-named-address.com:11210"), timeout=60000ms
DEBUG::2024-06-24 09:59:02::[a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337/b49bd8-2d09-e440-6ac3-0b7691c4cef19e/plain/-] <couchbase-named-address.com:11210> reached the end of list of bootstrap nodes, waiting for 500ms before restart
DEBUG::2024-06-24 09:59:02::[a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337/b49bd8-2d09-e440-6ac3-0b7691c4cef19e/plain/-] <couchbase-named-address.com:11210> attempt to establish MCBP connection
DEBUG::2024-06-24 09:59:02::[a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337/b49bd8-2d09-e440-6ac3-0b7691c4cef19e/plain/-] <couchbase-named-address.com:11210> connecting to 127.0.0.1:11210 ("couchbase-named-address.com:11210"), timeout=60000ms
DEBUG::2024-06-24 09:59:04::[a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337/b49bd8-2d09-e440-6ac3-0b7691c4cef19e/plain/-] <couchbase-named-address.com:11210> reached the end of list of bootstrap nodes, waiting for 500ms before restart
DEBUG::2024-06-24 09:59:05::[a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337/b49bd8-2d09-e440-6ac3-0b7691c4cef19e/plain/-] <couchbase-named-address.com:11210> attempt to establish MCBP connection
DEBUG::2024-06-24 09:59:05::[a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337/b49bd8-2d09-e440-6ac3-0b7691c4cef19e/plain/-] <couchbase-named-address.com:11210> connecting to 127.0.0.1:11210 ("couchbase-named-address.com:11210"), timeout=60000ms
DEBUG::2024-06-24 09:59:07::[a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337/b49bd8-2d09-e440-6ac3-0b7691c4cef19e/plain/-] <couchbase-named-address.com:11210> reached the end of list of bootstrap nodes, waiting for 500ms before restart
DEBUG::2024-06-24 09:59:07::all nodes failed to bootstrap, triggering DNS-SRV refresh, ec=unambiguous_timeout (14), last endpoint = "couchbase-named-address.com:11210"
WARNING::2024-06-24 09:59:07::[a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337/b49bd8-2d09-e440-6ac3-0b7691c4cef19e/plain/-] <couchbase-named-address.com:11210> unable to bootstrap in time
DEBUG::2024-06-24 09:59:07::[a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337/b49bd8-2d09-e440-6ac3-0b7691c4cef19e/plain/-] <couchbase-named-address.com:11210> stop MCBP connection, reason=do_not_retry
DEBUG::2024-06-24 09:59:07::Query DNS-SRV: address = "couchbase-named-address.com", service = "_couchbase", nameserver = "10.70.0.2:53"
DEBUG::2024-06-24 09:59:07::PYCBC: create conn callback completed
DEBUG::2024-06-24 09:59:07::[a7e0e7-ee62-6f4b-ab4b-67f599fe7e4337/b49bd8-2d09-e440-6ac3-0b7691c4cef19e/plain/-] <couchbase-named-address.com:11210> destroy MCBP connection

Единственное отличие, которое я вижу в своей конфигурации .NET, заключается в том, что есть некоторые параметры для HttpIgnoreRemoteCertificateMismatch и KvIgnoreRemoteCertificateNameMismatch, которые в моем случае я установил на true, но не могу найти ни одного для python sdk.

.NET эквивалентный код, который работает без проблем:

_clusterOptions = new ClusterOptions();
config.GetCouchbaseClientDefinition().Bind(_clusterOptions);

_clusterOptions.HttpCertificateCallbackValidation += new RemoteCertificateValidationCallback((object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) =>
{
    return true;
});
_clusterOptions.KvCertificateCallbackValidation += new RemoteCertificateValidationCallback((object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) =>
{
    return true;
});

_clusterOptions.NetworkResolution = "external";
_clusterOptions.EnableDnsSrvResolution = false;

_clusterOptions.WithSerializer(new CouchbaseSerializer());
_clusterOptions.AddLinq();
_clusterOptions.KvTimeout = TimeSpan.FromSeconds(10);

_cluster = Cluster.ConnectAsync(_clusterOptions).Result;

Используете ли вы самозаверяющий сертификат для кластера? Не могли бы вы поделиться кодом dotnet, который вам подходит?

nithishr 25.06.2024 11:35

@nithishr Я добавил в тему эквивалентный код .net. Спасибо

aminrd 25.06.2024 23:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После нескольких раундов разговоров с командой поддержки Couchbase я наконец смог подключиться через Python SDK, добавив Options:

        options = ClusterOptions(auth,
                                 timeout_options=timeout_opts,
                                 disable_mozilla_ca_certificates=True,
                                 enable_tls=enable_tls,
                                 enable_dns_srv=False,
                                 # This option was not documented in the python SDK at this time
                                 network='external',
                                 tls_verify=TLSVerifyMode.NO_VERIFY)

Кроме того, мой внешний кластер Couchbase использует соединение Encrypted. В .NET это, наверное, обрабатывается посредством рукопожатия, но в Python SDK нужно поставить еще и дополнительный s (couchbase ----> couchbases), чтобы соединение переключалось с Port=11210 на шифрованное Port=11207:

cluster = Cluster.connect(f"couchbases://{endpoint}", options)

И это решило мою проблему.

Другие вопросы по теме

Похожие вопросы

Как избежать цикла в Pandas, повторяющего уникальные значения?
Mlflow не регистрирует артефакты автоматически при регистрации изображений
Модель одноголового трансформатора, размеры выходного и целевого тензоров не совпадают
Дополнение до определенного уровня и добавление символа в конце
Расширение Python GDB: я пытаюсь получить вызывающую строку и информацию о файле для вызова макроса, но получаю неправильные значения из-за комментариев
Аутентификация ManagedIdentityCredential недоступна. Запрошенный идентификатор не был назначен этому ресурсу
Использование REST API в Python для запуска рабочих процессов в Azure Purview
Как исправить столбец с числовыми значениями, который воспринимается как строковое поле из-за пустых строк в фрейме данных Pandas?
Как оценить цвет изображения Pyplot в данной точке?
Возможно ли иметь встроенное определение класса данных в Python?