外观
OceanBase ODP 监控与维护
ODP (OceanBase Database Proxy) 是 OceanBase 数据库的访问代理,负责处理客户端连接、负载均衡和请求路由。ODP 监控与维护是确保 OceanBase 集群高可用性和高性能的关键环节。通过实时监控 ODP 的连接状态、性能指标和资源使用情况,可以及时发现并解决问题,保障数据库服务的稳定运行。
监控指标
监控指标是了解 ODP 运行状态的重要依据,包括连接监控、性能监控和资源监控三个方面。通过监控这些指标,可以全面掌握 ODP 的运行情况,及时发现异常并进行处理。
连接监控
连接监控是 ODP 监控的基础,通过监控连接数和连接状态分布,可以了解 ODP 处理客户端连接的情况,及时发现连接泄漏或连接数过多等问题。
连接数指标
sql
-- 获取 ODP 总连接数
SELECT * FROM __proxy_server_status__ WHERE name = 'connection_count';
-- 获取 ODP 活跃连接数
SELECT * FROM __proxy_server_status__ WHERE name = 'active_connection_count';
-- 获取 ODP 空闲连接数
SELECT * FROM __proxy_server_status__ WHERE name = 'idle_connection_count';
-- 获取 ODP 最大连接数
SELECT * FROM __proxy_server_status__ WHERE name = 'max_connection_count';连接状态分布
sql
-- 获取连接状态分布
SELECT * FROM __proxy_server_status__ WHERE name LIKE '%connection%state%';性能监控
性能监控是评估 ODP 处理能力的重要手段,通过监控 QPS、TPS 和响应时间等指标,可以了解 ODP 的性能表现,及时发现性能瓶颈并进行优化。
QPS 与 TPS
sql
-- 获取 ODP QPS
SELECT * FROM __proxy_server_status__ WHERE name = 'qps';
-- 获取 ODP TPS
SELECT * FROM __proxy_server_status__ WHERE name = 'tps';
-- 获取 ODP 读写分离统计
SELECT * FROM __proxy_server_status__ WHERE name LIKE '%read%' OR name LIKE '%write%';响应时间
sql
-- 获取 ODP 平均响应时间
SELECT * FROM __proxy_server_status__ WHERE name = 'avg_response_time';
-- 获取 ODP 响应时间分布
SELECT * FROM __proxy_server_status__ WHERE name LIKE '%response_time%';负载均衡
sql
-- 获取后端服务器连接分布
SELECT * FROM __proxy_route_status__ WHERE name = 'backend_connection_count';
-- 获取后端服务器请求分布
SELECT * FROM __proxy_route_status__ WHERE name = 'backend_request_count';
-- 获取后端服务器响应时间
SELECT * FROM __proxy_route_status__ WHERE name = 'backend_avg_response_time';资源监控
资源监控是确保 ODP 稳定运行的重要保障,通过监控 CPU、内存、磁盘 I/O 和网络 I/O 等资源使用情况,可以了解 ODP 的资源消耗情况,及时调整资源配置或进行优化。
CPU 与内存
bash
# 查看 ODP 进程 CPU 使用率
top -p $(pidof obproxy) -d 1
# 查看 ODP 进程内存使用率
ps aux | grep obproxy | grep -v grep
# 查看 ODP 内存分配
cat /proc/$(pidof obproxy)/status | grep Vm磁盘 I/O
bash
# 查看 ODP 日志目录磁盘使用情况
df -h /home/obproxy/logs/
# 查看 ODP 数据目录磁盘使用情况
df -h /home/obproxy/data/
# 查看磁盘 I/O 负载
iostat -x -k 1网络 I/O
bash
# 查看 ODP 网络连接
netstat -anp | grep obproxy
# 查看 ODP 网络流量
tcpdump -i eth0 port 2883 -n
# 查看网络 I/O 统计
ifstat 1日志管理
日志管理是 ODP 维护的重要组成部分,通过分析 ODP 日志,可以了解 ODP 的运行情况、排查问题和优化性能。ODP 日志包括访问日志、错误日志和审计日志三种类型。
日志类型
访问日志
bash
# 查看 ODP 访问日志
cat /home/obproxy/logs/access.log
# 实时查看 ODP 访问日志
tail -f /home/obproxy/logs/access.log
# 统计访问日志中的慢查询
grep -i "slow" /home/obproxy/logs/access.log错误日志
bash
# 查看 ODP 错误日志
cat /home/obproxy/logs/obproxy.log
# 实时查看 ODP 错误日志
tail -f /home/obproxy/logs/obproxy.log
# 统计错误日志中的严重错误
grep -i "error\|critical\|fatal" /home/obproxy/logs/obproxy.log审计日志
bash
# 查看 ODP 审计日志
cat /home/obproxy/logs/audit.log
# 实时查看 ODP 审计日志
tail -f /home/obproxy/logs/audit.log
# 统计审计日志中的登录失败记录
grep -i "failed" /home/obproxy/logs/audit.log日志配置
日志级别配置
yaml
# ODP 配置文件 /home/obproxy/conf/obproxy.conf
log_level = INFO
access_log_level = INFO
audit_log_level = INFO日志滚动配置
yaml
# ODP 配置文件 /home/obproxy/conf/obproxy.conf
log_file_size = 1073741824 # 1GB
log_file_num = 10
access_log_file_size = 1073741824 # 1GB
access_log_file_num = 10
audit_log_file_size = 1073741824 # 1GB
audit_log_file_num = 10日志分析工具
grep 命令
bash
# 查找特定客户端 IP 的访问记录
grep "192.168.1.100" /home/obproxy/logs/access.log
# 查找特定 SQL 语句的执行记录
grep "SELECT * FROM employees" /home/obproxy/logs/access.log
# 查找响应时间超过 1 秒的请求
grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.*[0-9]{4}ms" /home/obproxy/logs/access.logawk 命令
bash
# 统计每秒请求数
awk '{print $1, $2}' /home/obproxy/logs/access.log | sort | uniq -c | sort -nr
# 统计每个客户端 IP 的请求数
awk '{print $1}' /home/obproxy/logs/access.log | sort | uniq -c | sort -nr
# 统计每个 SQL 语句的执行次数
awk '{for(i=11;i<=NF;i++) printf "%s ", $i; print ""}' /home/obproxy/logs/access.log | sort | uniq -c | sort -nr日常维护
配置管理
查看当前配置
sql
-- 查看 ODP 所有配置
SHOW PROXYCONFIG;
-- 查看特定配置项
SHOW PROXYCONFIG LIKE 'proxy%';修改配置
sql
-- 修改 ODP 配置
ALTER PROXYCONFIG SET proxy_mem_limited = '10G';
ALTER PROXYCONFIG SET proxy_thread_pool_size = 64;
ALTER PROXYCONFIG SET enable_compression_protocol = TRUE;重载配置
bash
# 重载 ODP 配置
obproxy --reload
# 或使用 SQL 命令
ALTER PROXYCONFIG RELOAD;健康检查
检查 ODP 状态
sql
-- 检查 ODP 状态
SELECT * FROM __proxy_server_status__ WHERE name = 'server_status';
-- 检查 ODP 版本
SELECT * FROM __proxy_server_status__ WHERE name = 'version';
-- 检查 ODP 启动时间
SELECT * FROM __proxy_server_status__ WHERE name = 'start_time';检查后端 OceanBase 节点
sql
-- 查看后端 OceanBase 节点状态
SELECT * FROM __all_server__;
-- 查看后端 OceanBase 节点健康状态
SELECT * FROM __all_server__ WHERE status = 'ACTIVE';
-- 查看后端 OceanBase 节点连接数
SELECT * FROM __proxy_route_status__ WHERE name = 'backend_connection_count';性能优化
连接池优化
sql
-- 调整连接池大小
ALTER PROXYCONFIG SET proxy_mem_limited = '10G';
ALTER PROXYCONFIG SET proxy_thread_pool_size = 64;
-- 调整连接超时时间
ALTER PROXYCONFIG SET proxy_connect_timeout = 5000;
ALTER PROXYCONFIG SET proxy_read_timeout = 30000;
ALTER PROXYCONFIG SET proxy_write_timeout = 30000;负载均衡优化
sql
-- 调整负载均衡策略
ALTER PROXYCONFIG SET proxy_balance_type = 'least_conn';
-- 调整连接权重
ALTER PROXYCONFIG SET proxy_server_weight = 'server1:10,server2:20,server3:30';
-- 启用读写分离
ALTER PROXYCONFIG SET enable_read_write_split = TRUE;内存优化
sql
-- 调整内存分配
ALTER PROXYCONFIG SET proxy_mem_limited = '10G';
ALTER PROXYCONFIG SET proxy_cache_size = '2G';
ALTER PROXYCONFIG SET proxy_session_mem_size = '16M';备份与恢复
配置备份
bash
# 备份 ODP 配置文件
cp /home/obproxy/conf/obproxy.conf /home/obproxy/conf/obproxy.conf.$(date +%Y%m%d)
# 备份 ODP 路由配置
obclient -h127.0.0.1 -P2883 -uroot -p -c -A oceanbase -e "SHOW PROXYROUTE;" > /home/obproxy/conf/proxy_route.$(date +%Y%m%d).sql配置恢复
bash
# 恢复 ODP 配置文件
cp /home/obproxy/conf/obproxy.conf.$(date +%Y%m%d) /home/obproxy/conf/obproxy.conf
# 重载配置
obproxy --reload故障诊断
连接故障
症状
- 客户端无法连接到 ODP
- 连接超时
- 连接被拒绝
诊断步骤
bash
# 检查 ODP 进程是否运行
ps -ef | grep obproxy
# 检查 ODP 监听端口
netstat -anp | grep 2883
# 检查 ODP 日志
cat /home/obproxy/logs/obproxy.log | grep -i "error\|listen\|bind"
# 测试 ODP 连接
obclient -h127.0.0.1 -P2883 -uroot -p -c -A oceanbase -e "SELECT 1;"解决方案
- 启动 ODP 进程
- 检查端口占用情况
- 检查防火墙设置
- 调整 ODP 连接数限制
- 检查后端 OceanBase 节点状态
性能故障
症状
- ODP 响应时间变长
- QPS/TPS 下降
- CPU 或内存使用率过高
诊断步骤
sql
-- 查看 ODP 性能指标
SELECT * FROM __proxy_server_status__ WHERE name IN ('qps', 'tps', 'avg_response_time', 'cpu_usage', 'mem_usage');
-- 查看后端服务器状态
SELECT * FROM __all_server__;
-- 查看慢查询
SELECT * FROM __proxy_slow_query__;bash
# 查看 ODP 进程资源使用
top -p $(pidof obproxy)
# 查看 ODP 连接数
netstat -anp | grep obproxy | wc -l
# 查看 ODP 日志中的慢查询
grep -i "slow" /home/obproxy/logs/access.log解决方案
- 调整 ODP 内存配置
- 增加 ODP 线程数
- 优化负载均衡策略
- 检查后端 OceanBase 节点性能
- 优化 SQL 查询
路由故障
症状
- 请求被路由到错误的后端节点
- 读写分离失效
- 负载均衡不均衡
诊断步骤
sql
-- 查看 ODP 路由配置
SHOW PROXYROUTE;
-- 查看后端服务器连接分布
SELECT * FROM __proxy_route_status__ WHERE name = 'backend_connection_count';
-- 查看后端服务器请求分布
SELECT * FROM __proxy_route_status__ WHERE name = 'backend_request_count';解决方案
- 重新配置 ODP 路由
- 调整负载均衡策略
- 重启 ODP 进程
- 检查后端 OceanBase 节点状态
监控工具
OCP 监控
OCP 监控界面
- 连接监控:查看 ODP 连接数、连接状态和连接分布
- 性能监控:查看 ODP QPS、TPS 和响应时间
- 资源监控:查看 ODP CPU、内存和磁盘使用情况
- 日志监控:查看和分析 ODP 日志
- 告警管理:配置 ODP 告警规则和通知
OCP 告警配置
bash
# 登录 OCP 控制台
https://ocp_host:8080
# 进入 ODP 监控页面
集群管理 > 集群 > ODP 管理 > 监控
# 配置告警规则
系统管理 > 告警管理 > 告警规则 > 新建规则Prometheus + Grafana
配置 Prometheus
yaml
# prometheus.yml
scrape_configs:
- job_name: 'obproxy'
static_configs:
- targets: ['obproxy1:2884', 'obproxy2:2884']
metrics_path: '/metrics'
scrape_interval: 15s
scrape_timeout: 10s配置 Grafana
- 导入 ODP 监控模板:在 Grafana 中导入 ODP 监控模板
- 创建监控面板:创建 ODP 连接监控、性能监控和资源监控面板
- 配置告警:为 ODP 关键指标配置告警规则
Zabbix
配置 Zabbix Agent
bash
# 安装 Zabbix Agent
yum install -y zabbix-agent
# 配置 Zabbix Agent
vi /etc/zabbix/zabbix_agentd.conf
Server=zabbix_server_ip
ServerActive=zabbix_server_ip
Hostname=obproxy_hostname
# 启动 Zabbix Agent
systemctl start zabbix-agent
systemctl enable zabbix-agent配置 Zabbix 模板
- 导入 ODP 监控模板:在 Zabbix 中导入 ODP 监控模板
- 关联主机:将 ODP 主机关联到 ODP 监控模板
- 配置告警:为 ODP 关键指标配置告警规则
常见问题(FAQ)
Q1: 如何查看 ODP 版本?
A1: 查看 ODP 版本的方法:
- 使用 SQL 命令:
SELECT * FROM __proxy_server_status__ WHERE name = 'version'; - 使用命令行:
obproxy --version
Q2: 如何调整 ODP 连接数限制?
A2: 调整 ODP 连接数限制的方法:
- 修改 ODP 配置文件:
proxy_max_connections = 10000 - 使用 SQL 命令:
ALTER PROXYCONFIG SET proxy_max_connections = 10000; - 重载配置:
obproxy --reload
Q3: 如何查看 ODP 中的慢查询?
A3: 查看 ODP 慢查询的方法:
- 查看访问日志:
grep -i "slow" /home/obproxy/logs/access.log - 使用 SQL 命令:
SELECT * FROM __proxy_slow_query__; - 配置慢查询阈值:
ALTER PROXYCONFIG SET slow_query_time = 1000;(单位:毫秒)
Q4: 如何重启 ODP 进程?
A4: 重启 ODP 进程的方法:
- 使用 systemd:
systemctl restart obproxy - 使用命令行:
obproxy --restart - 手动重启:
kill -9 $(pidof obproxy) && obproxy
Q5: 如何配置 ODP 读写分离?
A5: 配置 ODP 读写分离的方法:
- 修改 ODP 配置:
enable_read_write_split = TRUE - 使用 SQL 命令:
ALTER PROXYCONFIG SET enable_read_write_split = TRUE; - 配置读库权重:
ALTER PROXYCONFIG SET proxy_server_weight = 'server1:10,server2:20,server3:30';
Q6: 如何监控 ODP 性能?
A6: 监控 ODP 性能的方法:
- 使用 OCP 监控界面
- 使用 Prometheus + Grafana
- 使用 Zabbix
- 定期查看 ODP 性能指标:
SELECT * FROM __proxy_server_status__ WHERE name IN ('qps', 'tps', 'avg_response_time');
Q7: 如何优化 ODP 性能?
A7: 优化 ODP 性能的方法:
- 调整内存配置:
proxy_mem_limited = '10G' - 增加线程数:
proxy_thread_pool_size = 64 - 优化负载均衡策略:
proxy_balance_type = 'least_conn' - 启用连接复用:
enable_connection_reuse = TRUE - 启用压缩协议:
enable_compression_protocol = TRUE
Q8: 如何处理 ODP 连接泄漏?
A8: 处理 ODP 连接泄漏的方法:
- 检查客户端连接关闭情况
- 调整连接超时时间:
proxy_idle_timeout = 3600(单位:秒) - 启用连接回收:
enable_connection_recycle = TRUE - 监控连接数变化:
SELECT * FROM __proxy_server_status__ WHERE name = 'connection_count';
Q9: 如何配置 ODP 日志滚动?
A9: 配置 ODP 日志滚动的方法:
- 修改 ODP 配置文件:yaml
log_file_size = 1073741824 # 1GB log_file_num = 10 access_log_file_size = 1073741824 # 1GB access_log_file_num = 10 - 重载配置:
obproxy --reload
Q10: 如何备份 ODP 配置?
A10: 备份 ODP 配置的方法:
- 备份配置文件:
cp /home/obproxy/conf/obproxy.conf /home/obproxy/conf/obproxy.conf.$(date +%Y%m%d) - 备份路由配置:
obclient -h127.0.0.1 -P2883 -uroot -p -c -A oceanbase -e "SHOW PROXYROUTE;" > /home/obproxy/conf/proxy_route.$(date +%Y%m%d).sql - 备份完整配置:
obclient -h127.0.0.1 -P2883 -uroot -p -c -A oceanbase -e "SHOW PROXYCONFIG;" > /home/obproxy/conf/proxy_config.$(date +%Y%m%d).sql
最佳实践
监控最佳实践
- 实时监控:配置实时监控,及时发现问题
- 告警配置:为关键指标配置告警规则
- 历史数据:保留足够的历史监控数据,用于趋势分析
- 多维度监控:从连接、性能、资源等多个维度监控 ODP
- 关联监控:将 ODP 监控与后端 OceanBase 节点监控关联
维护最佳实践
- 定期备份:定期备份 ODP 配置和路由信息
- 配置管理:使用版本控制管理 ODP 配置
- 定期检查:定期检查 ODP 状态和性能
- 预演恢复:定期预演 ODP 故障恢复流程
- 文档记录:记录 ODP 配置变更和维护操作
性能最佳实践
- 合理配置:根据业务需求合理配置 ODP 资源
- 负载均衡:选择合适的负载均衡策略
- 连接复用:启用连接复用,减少连接创建开销
- 读写分离:合理配置读写分离,提高读取性能
- 内存优化:根据 ODP 负载调整内存配置
案例分析
案例一:ODP 连接数过高
场景:ODP 连接数持续增长,达到最大连接数限制,导致新连接无法建立
诊断步骤:
- 查看 ODP 连接数:
SELECT * FROM __proxy_server_status__ WHERE name = 'connection_count'; - 查看连接状态分布:
SELECT * FROM __proxy_server_status__ WHERE name LIKE '%connection%state%'; - 查看客户端连接情况:
netstat -anp | grep obproxy | grep ESTABLISHED | wc -l - 查看 ODP 日志:
grep -i "connection" /home/obproxy/logs/obproxy.log
解决方案:
- 调整 ODP 最大连接数:
ALTER PROXYCONFIG SET proxy_max_connections = 20000; - 优化客户端连接池配置,减少连接数
- 启用连接复用:
ALTER PROXYCONFIG SET enable_connection_reuse = TRUE; - 调整连接超时时间:
ALTER PROXYCONFIG SET proxy_idle_timeout = 1800;
结果:ODP 连接数稳定在 15000 左右,新连接可以正常建立
案例二:ODP 响应时间变长
场景:ODP 平均响应时间从 50ms 增加到 500ms,影响业务性能
诊断步骤:
- 查看 ODP 性能指标:
SELECT * FROM __proxy_server_status__ WHERE name IN ('qps', 'tps', 'avg_response_time'); - 查看后端服务器响应时间:
SELECT * FROM __proxy_route_status__ WHERE name = 'backend_avg_response_time'; - 查看慢查询:
SELECT * FROM __proxy_slow_query__; - 查看 ODP 资源使用:
top -p $(pidof obproxy)
解决方案:
- 增加 ODP 内存配置:
ALTER PROXYCONFIG SET proxy_mem_limited = '10G'; - 增加 ODP 线程数:
ALTER PROXYCONFIG SET proxy_thread_pool_size = 64; - 优化负载均衡策略:
ALTER PROXYCONFIG SET proxy_balance_type = 'least_conn'; - 优化后端 OceanBase 节点性能,解决慢查询问题
结果:ODP 平均响应时间恢复到 50ms 左右,业务性能恢复正常
