Skip to content

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.log

awk 命令

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 连接数持续增长,达到最大连接数限制,导致新连接无法建立

诊断步骤

  1. 查看 ODP 连接数:SELECT * FROM __proxy_server_status__ WHERE name = 'connection_count';
  2. 查看连接状态分布:SELECT * FROM __proxy_server_status__ WHERE name LIKE '%connection%state%';
  3. 查看客户端连接情况:netstat -anp | grep obproxy | grep ESTABLISHED | wc -l
  4. 查看 ODP 日志:grep -i "connection" /home/obproxy/logs/obproxy.log

解决方案

  1. 调整 ODP 最大连接数:ALTER PROXYCONFIG SET proxy_max_connections = 20000;
  2. 优化客户端连接池配置,减少连接数
  3. 启用连接复用:ALTER PROXYCONFIG SET enable_connection_reuse = TRUE;
  4. 调整连接超时时间:ALTER PROXYCONFIG SET proxy_idle_timeout = 1800;

结果:ODP 连接数稳定在 15000 左右,新连接可以正常建立

案例二:ODP 响应时间变长

场景:ODP 平均响应时间从 50ms 增加到 500ms,影响业务性能

诊断步骤

  1. 查看 ODP 性能指标:SELECT * FROM __proxy_server_status__ WHERE name IN ('qps', 'tps', 'avg_response_time');
  2. 查看后端服务器响应时间:SELECT * FROM __proxy_route_status__ WHERE name = 'backend_avg_response_time';
  3. 查看慢查询:SELECT * FROM __proxy_slow_query__;
  4. 查看 ODP 资源使用:top -p $(pidof obproxy)

解决方案

  1. 增加 ODP 内存配置:ALTER PROXYCONFIG SET proxy_mem_limited = '10G';
  2. 增加 ODP 线程数:ALTER PROXYCONFIG SET proxy_thread_pool_size = 64;
  3. 优化负载均衡策略:ALTER PROXYCONFIG SET proxy_balance_type = 'least_conn';
  4. 优化后端 OceanBase 节点性能,解决慢查询问题

结果:ODP 平均响应时间恢复到 50ms 左右,业务性能恢复正常