增加Redis查询比对
This commit is contained in:
114
modules/cassandra_client.py
Normal file
114
modules/cassandra_client.py
Normal file
@@ -0,0 +1,114 @@
|
||||
"""
|
||||
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
|
Reference in New Issue
Block a user