Files
BigDataTool/modules/cassandra_client.py
2025-08-04 09:14:27 +08:00

114 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Cassandra连接管理模块
负责Cassandra数据库的连接和错误诊断
"""
import time
import logging
from cassandra.cluster import Cluster
from cassandra.auth import PlainTextAuthProvider
from cassandra.policies import DCAwareRoundRobinPolicy
logger = logging.getLogger(__name__)
def create_connection(config):
"""创建Cassandra连接带有增强的错误诊断和容错机制"""
start_time = time.time()
logger.info(f"=== 开始创建Cassandra连接 ===")
logger.info(f"主机列表: {config.get('hosts', [])}")
logger.info(f"端口: {config.get('port', 9042)}")
logger.info(f"用户名: {config.get('username', 'N/A')}")
logger.info(f"Keyspace: {config.get('keyspace', 'N/A')}")
try:
logger.info("正在创建认证提供者...")
auth_provider = PlainTextAuthProvider(username=config['username'], password=config['password'])
logger.info("正在创建集群连接...")
# 设置负载均衡策略,避免单点故障
load_balancing_policy = DCAwareRoundRobinPolicy(local_dc=config.get('datacenter', 'dc1'))
# 创建连接配置,增加容错参数
cluster = Cluster(
config['hosts'],
port=config['port'],
auth_provider=auth_provider,
load_balancing_policy=load_balancing_policy,
# 增加容错配置
protocol_version=4, # 使用稳定的协议版本
connect_timeout=15, # 连接超时
control_connection_timeout=15, # 控制连接超时
max_schema_agreement_wait=30 # schema同步等待时间
)
logger.info("正在连接到Keyspace...")
session = cluster.connect(config['keyspace'])
# 设置session级别的容错参数
session.default_timeout = 30 # 查询超时时间
connection_time = time.time() - start_time
logger.info(f"✅ Cassandra连接成功: 连接时间={connection_time:.3f}")
# 记录集群状态
try:
cluster_name = cluster.metadata.cluster_name or "Unknown"
logger.info(f" 集群名称: {cluster_name}")
# 记录可用主机状态
live_hosts = [str(host.address) for host in cluster.metadata.all_hosts() if host.is_up]
down_hosts = [str(host.address) for host in cluster.metadata.all_hosts() if not host.is_up]
logger.info(f" 可用节点: {live_hosts} ({len(live_hosts)}个)")
if down_hosts:
logger.warning(f" 故障节点: {down_hosts} ({len(down_hosts)}个)")
except Exception as meta_error:
logger.warning(f"无法获取集群元数据: {meta_error}")
return cluster, session
except Exception as e:
connection_time = time.time() - start_time
error_msg = str(e)
logger.error(f"❌ Cassandra连接失败: 连接时间={connection_time:.3f}")
logger.error(f"错误类型: {type(e).__name__}")
logger.error(f"错误详情: {error_msg}")
# 提供详细的诊断信息
if "connection refused" in error_msg.lower() or "unable to connect" in error_msg.lower():
logger.error("❌ 诊断无法连接到Cassandra服务器")
logger.error("🔧 建议检查:")
logger.error(" 1. Cassandra服务是否启动")
logger.error(" 2. 主机地址和端口是否正确")
logger.error(" 3. 网络防火墙是否阻挡连接")
elif "timeout" in error_msg.lower():
logger.error("❌ 诊断:连接超时")
logger.error("🔧 建议检查:")
logger.error(" 1. 网络延迟是否过高")
logger.error(" 2. Cassandra服务器负载是否过高")
logger.error(" 3. 增加连接超时时间")
elif "authentication" in error_msg.lower() or "unauthorized" in error_msg.lower():
logger.error("❌ 诊断:认证失败")
logger.error("🔧 建议检查:")
logger.error(" 1. 用户名和密码是否正确")
logger.error(" 2. 用户是否有访问该keyspace的权限")
elif "keyspace" in error_msg.lower():
logger.error("❌ 诊断Keyspace不存在")
logger.error("🔧 建议检查:")
logger.error(" 1. Keyspace名称是否正确")
logger.error(" 2. Keyspace是否已创建")
else:
logger.error("❌ 诊断:未知连接错误")
logger.error("🔧 建议:")
logger.error(" 1. 检查所有连接参数")
logger.error(" 2. 查看Cassandra服务器日志")
logger.error(" 3. 测试网络连通性")
return None, None