使用主机名可连接Redis,但使用URL连接失败
Redis URL连接报错"No route to host",主机名连接正常
我尝试将Celery连接到另一台机器上的Redis后端时,出现“No route to host”错误。排除Celery因素后,用Redis客户端通过主机名能正常连接,但用Redis URL连接时还是报同样的错误。
创建两个连接对象,表面上二者参数一致:
>>> import redis >>> >>> r = redis.Redis(host='server.domain.com',port=6379) >>> r2 = redis.Redis.from_url('redis://server.domain.com:6379') >>> >>> r Redis<ConnectionPool<Connection<host=server.domain.com,port=6379,db=0>>> >>> r2 Redis<ConnectionPool<Connection<host=server.domain.com,port=6379,db=0>>>
用主机名创建的连接可以正常工作:
>>> r.get('test') b'Test stuff'
但用URL创建的连接返回“No route to host”错误:
>>> r2.get('test') Traceback (most recent call last): File "/home/user/venv/lib/python3.10/site-packages/redis/connection.py", line 264, in connect sock = self.retry.call_with_retry( File "/home/user/venv/lib/python3.10/site-packages/redis/retry.py", line 46, in call_with_retry return do() File "/home/user/venv/lib/python3.10/site-packages/redis/connection.py", line 265, in <lambda> lambda: self._connect(), lambda error: self.disconnect(error) File "/home/user/venv/lib/python3.10/site-packages/redis/connection.py", line 627, in _connect raise err File "/home/user/venv/lib/python3.10/site-packages/redis/connection.py", line 615, in _connect sock.connect(socket_address) OSError: [Errno 113] No route to host During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/user/venv/lib/python3.10/site-packages/redis/commands/core.py", line 1829, in get return self.execute_command("GET", name) File "/home/user/venv/lib/python3.10/site-packages/redis/client.py", line 533, in execute_command conn = self.connection or pool.get_connection(command_name, **options) File "/home/user/venv/lib/python3.10/site-packages/redis/connection.py", line 1086, in get_connection connection.connect() File "/home/user/venv/lib/python3.10/site-packages/redis/connection.py", line 270, in connect raise ConnectionError(self._error_message(e)) redis.exceptions.ConnectionError: Error 113 connecting to server.domain.com:6379. No route to host.
更新
深入排查Redis对象后发现,from_url方法创建connection_pool时缺少多个参数:
>>> r.connection_pool.__dict__ {'connection_class': <class 'redis.connection.Connection'>, 'connection_kwargs': {'db': 0, 'username': None, 'password': None, 'socket_timeout': None, 'encoding': 'utf-8', 'encoding_errors': 'strict', 'decode_responses': True, 'retry_on_error': [], 'retry': None, 'health_check_interval': 0, 'client_name': None, 'lib_name': 'redis-py', 'lib_version': '5.0.1', 'redis_connect_func': None, 'credential_provider': None, 'protocol': 2, 'host': 'server.domain.com', 'port': 6379, 'socket_connect_timeout': None, 'socket_keepalive': None, 'socket_keepalive_options': None}, 'max_connections': 2147483648, '_fork_lock': <unlocked _thread.lock object at 0x7fcfd576ebc0>, '_lock': <unlocked _thread.lock object at 0x7fcfd576d2c0>, '_created_connections': 1, '_available_connections': [Connection<host=server.domain.com,port=6379,db=0>], '_in_use_connections': set(), 'pid': 37317} >>> r2.connection_pool.__dict__ {'connection_class': <class 'redis.connection.Connection'>, 'connection_kwargs': {'host': 'server.domain.com', 'port': 6379, 'db': 0}, 'max_connections': 2147483648, '_fork_lock': <unlocked _thread.lock object at 0x7fcfd5d6bb40>, '_lock': <unlocked _thread.lock object at 0x7fcfd5d6bbc0>, '_created_connections': 1, '_available_connections': [Connection<host=server.domain.com,port=6379,db=0>], '_in_use_connections': set(), 'pid': 37317}
调整URL后,独立Redis客户端可以正常连接,但Celery仍然报相同错误:
>>> r2 = redis.Redis.from_url('redis://:@server.domain.com:6379') >>> r2.get('test') b'Test stuff'
内容的提问来源于stack exchange,提问作者beef623
相关产品推荐
相关产品推荐

