Skip to content

OceanBase OBProxy 性能优化

连接管理优化

1. 连接池配置优化

yaml
# OBProxy 配置文件中连接池相关配置
# 最大连接数
max_connection = 10240

# 每个服务器的最大连接数
server_max_connection = 1000

# 连接超时时间(毫秒)
connect_timeout = 5000

# 连接空闲超时时间(毫秒)
idle_timeout = 3600000

# 连接重试次数
retry_times = 3

# 连接重试间隔(毫秒)
retry_interval = 1000

2. 连接复用优化

yaml
# 启用连接复用
enable_connection_reuse = true

# 连接复用超时时间(毫秒)
connection_reuse_timeout = 3600000

# 连接复用最大次数
connection_reuse_max_count = 1000

3. 连接队列优化

yaml
# 连接队列大小
connection_queue_size = 1000

# 连接队列超时时间(毫秒)
connection_queue_timeout = 5000

4. 客户端连接优化

sql
-- 客户端连接参数优化示例
mysql -h127.0.0.1 -P2883 -uroot@sys#obcluster -p'root@123' \
  --connect-timeout=5 \
  --read-timeout=30 \
  --write-timeout=30 \
  --max-connections=100 \
  --no-auto-rehash \
  -A oceanbase

负载均衡优化

1. 负载均衡策略选择

OBProxy 支持多种负载均衡策略,可根据业务场景选择合适的策略:

策略类型描述适用场景
roundrobin轮询方式分配连接各节点性能相近的场景
leastconn最少连接数优先节点性能差异较大的场景
random随机分配连接简单场景,负载较为均衡
weighted_roundrobin加权轮询需要根据节点性能分配权重的场景
weighted_leastconn加权最少连接节点性能差异较大且需要权重分配的场景
yaml
# 设置负载均衡策略
loadbalance_type = roundrobin

# 加权轮询时的权重配置(示例)
server_weight = "127.0.0.1:2881=3,127.0.0.2:2881=2,127.0.0.3:2881=1"

2. 路由规则优化

yaml
# 路由规则配置文件路径
route_rule_file = /home/obproxy/conf/route_rules.conf

# 启用租户级路由
enable_tenant_route = true

# 启用数据库级路由
enable_database_route = true

# 启用表级路由
enable_table_route = false

路由规则配置示例(route_rules.conf):

txt
# 租户级路由规则
tenant=test_tenant route=127.0.0.1:2881,127.0.0.2:2881

# 数据库级路由规则
db=test_db route=127.0.0.3:2881

# 表级路由规则
table=test_db.test_table route=127.0.0.1:2881

3. 读写分离优化

yaml
# 启用读写分离
enable_rw_split = true

# 读请求路由策略(master/slave/all)
read_route_policy = slave

# 主库不可用时是否允许读从库
allow_read_when_write_fail = true

# 从库延迟阈值(秒),超过阈值则不路由读请求到该从库
slave_delay_threshold = 30

4. 连接路由缓存优化

yaml
# 启用连接路由缓存
enable_route_cache = true

# 连接路由缓存大小
route_cache_size = 10000

# 连接路由缓存超时时间(秒)
route_cache_timeout = 300

配置参数优化

1. 内存配置优化

yaml
# 内存限制(MB)
memory_limit = 4096

# 工作线程内存限制(MB)
worker_memory_limit = 1024

# 连接内存限制(KB)
connection_memory_limit = 1024

2. 线程配置优化

yaml
# 工作线程数量
worker_threads = 16

# 每个工作线程的任务队列大小
task_queue_size = 10000

# 任务队列超时时间(毫秒)
task_queue_timeout = 1000

# 后台线程数量
bg_threads = 4

3. 网络配置优化

yaml
# 监听端口
listen_port = 2883

# 监听地址
listen_addr = 0.0.0.0

# 最大并发连接数
max_concurrency = 10000

# TCP 发送缓冲区大小(字节)
tcp_send_buffer_size = 65536

# TCP 接收缓冲区大小(字节)
tcp_recv_buffer_size = 65536

# TCP 保活时间(秒)
tcp_keepalive_time = 7200

# TCP 保活间隔(秒)
tcp_keepalive_intvl = 75

# TCP 保活探测次数
tcp_keepalive_probes = 9

4. 日志配置优化

yaml
# 日志级别(ERROR/WARN/INFO/DEBUG/TRACE)
log_level = INFO

# 日志文件大小限制(MB)
log_file_size = 100

# 日志文件数量限制
log_file_num = 10

# 启用异步日志
enable_async_log = true

# 异步日志缓冲区大小(MB)
async_log_buffer_size = 64

5. 安全配置优化

yaml
# 启用密码加密
enable_password_encryption = true

# 密码加密算法
password_encryption_algorithm = aes_256_cbc

# 启用连接认证
enable_connection_auth = true

# 认证超时时间(毫秒)
auth_timeout = 5000

资源分配优化

1. CPU 资源优化

  • 为 OBProxy 分配足够的 CPU 核心,建议至少 4 核
  • 绑定 OBProxy 进程到特定 CPU 核心,减少上下文切换
  • 调整工作线程数量,建议设置为 CPU 核心数的 1-2 倍
bash
# 绑定 OBProxy 进程到特定 CPU 核心
numactl -C 0-3 /home/obproxy/bin/obproxy -c /home/obproxy/conf/obproxy.conf

2. 内存资源优化

  • 为 OBProxy 分配足够的内存,建议至少 4GB
  • 调整内存相关配置参数,如 memory_limitworker_memory_limit
  • 监控内存使用情况,避免内存泄漏

3. 磁盘资源优化

  • 使用 SSD 存储 OBProxy 日志文件,提高日志写入性能
  • 定期清理过期日志文件,避免磁盘空间不足
  • 配置合理的日志文件大小和数量限制

4. 网络资源优化

  • 使用万兆网卡,提高网络吞吐量
  • 配置合理的网络缓冲区大小
  • 优化网络路由和防火墙规则,减少网络延迟
  • 避免在同一服务器上部署多个 OBProxy 实例,导致网络竞争

监控与分析

1. 关键性能指标

指标名称说明监控工具
连接数当前连接数、最大连接数、连接使用率OCP、Prometheus
QPS/TPS每秒查询数、每秒事务数OCP、Prometheus
响应时间平均响应时间、95% 响应时间、99% 响应时间OCP、Prometheus
错误率连接错误率、查询错误率OCP、Prometheus
CPU 使用率OBProxy 进程 CPU 使用率OCP、Prometheus、top
内存使用率OBProxy 进程内存使用率OCP、Prometheus、top
网络吞吐量网络发送/接收吞吐量OCP、Prometheus、iftop
队列长度任务队列长度、连接队列长度OCP、Prometheus
负载均衡效果各后端节点连接分布情况OCP、Prometheus

2. 使用 Prometheus 监控 OBProxy

OBProxy 内置 Prometheus 监控功能,可以通过以下配置启用:

yaml
# 启用 Prometheus 监控
enable_metrics = true

# Prometheus 监控端口
prometheus_listen_port = 2884

配置 Prometheus 采集任务:

yaml
scrape_configs:
  - job_name: 'obproxy'
    static_configs:
      - targets: ['obproxy1:2884', 'obproxy2:2884']
    scrape_interval: 15s

3. 使用 Grafana 可视化监控数据

  1. 安装 Grafana
  2. 添加 Prometheus 数据源
  3. 导入 OBProxy 监控面板
  4. 配置告警规则

4. 性能分析工具

  • obproxy_admin:OBProxy 自带的管理工具,用于查看和管理 OBProxy 实例
  • tcpdump:用于分析网络流量和性能瓶颈
  • strace:用于跟踪 OBProxy 系统调用,分析性能问题
  • gdb:用于调试 OBProxy 进程,分析崩溃和死锁问题

5. 常见性能问题分析

问题症状可能原因解决方案
高连接数连接池配置不合理、连接泄漏调整连接池配置、检查应用连接泄漏
高响应时间后端节点性能问题、负载均衡不均、网络延迟高优化后端节点、调整负载均衡策略、优化网络
高错误率后端节点故障、连接超时、认证失败检查后端节点、调整超时配置、检查认证配置
高 CPU 使用率工作线程不足、查询复杂、日志级别过高增加工作线程、优化查询、调整日志级别
高内存使用率内存配置不合理、内存泄漏调整内存配置、检查内存泄漏
负载不均衡负载均衡策略不合理、节点权重配置不当调整负载均衡策略、优化节点权重配置

最佳实践

1. 部署架构最佳实践

  • 多实例部署:部署多个 OBProxy 实例,避免单点故障
  • 跨可用区部署:在不同可用区部署 OBProxy 实例,提高可用性
  • 独立服务器部署:将 OBProxy 部署在独立服务器上,避免资源竞争
  • 与应用同可用区部署:将 OBProxy 与应用部署在同一可用区,减少网络延迟

2. 配置最佳实践

  • 根据业务场景调整配置:不同业务场景需要不同的 OBProxy 配置
  • 逐步调整配置参数:每次只调整一个配置参数,观察效果后再调整其他参数
  • 记录配置变更:记录所有配置变更,便于回滚和分析
  • 定期备份配置文件:定期备份 OBProxy 配置文件,避免配置丢失

3. 监控和告警最佳实践

  • 设置合理的告警阈值:根据业务情况设置合理的告警阈值
  • 配置多级告警:根据问题严重程度配置多级告警
  • 定期分析监控数据:定期分析监控数据,发现潜在问题
  • 建立性能基线:建立正常情况下的性能基线,便于识别异常

4. 性能测试最佳实践

  • 模拟真实业务场景:使用真实业务数据和查询模式进行性能测试
  • 逐步增加负载:逐步增加负载,观察系统性能变化
  • 测试不同配置组合:测试不同配置组合的性能表现
  • 记录测试结果:详细记录测试结果,便于对比和分析

常见问题(FAQ)

Q1: 如何确定 OBProxy 工作线程数量的最优值?

A1: OBProxy 工作线程数量的最优值取决于 CPU 核心数和业务场景。一般建议设置为 CPU 核心数的 1-2 倍。可以通过以下步骤确定最优值:

  1. 从 CPU 核心数开始设置
  2. 逐步增加工作线程数量,观察性能变化
  3. 当性能不再提升或开始下降时,停止增加
  4. 选择性能最佳的工作线程数量

Q2: 如何优化 OBProxy 的连接数?

A2: 优化 OBProxy 连接数可以从以下几个方面入手:

  • 调整 max_connectionserver_max_connection 配置参数
  • 优化应用连接池配置,减少不必要的连接
  • 启用连接复用,提高连接利用率
  • 配置合理的连接超时和空闲超时时间
  • 监控连接使用情况,及时发现连接泄漏

Q3: 如何选择合适的负载均衡策略?

A3: 选择合适的负载均衡策略需要考虑业务场景和后端节点情况:

  • 如果各节点性能相近,建议使用 roundrobin 策略
  • 如果各节点性能差异较大,建议使用 weighted_roundrobinweighted_leastconn 策略
  • 如果连接数是主要考虑因素,建议使用 leastconn 策略
  • 如果需要简单配置,建议使用 random 策略

Q4: 如何监控 OBProxy 的性能?

A4: 可以通过以下方式监控 OBProxy 的性能:

  • 使用 OCP 的监控功能,查看 OBProxy 性能指标
  • 配置 Prometheus 和 Grafana,实现自定义监控和可视化
  • 使用 OBProxy 自带的 obproxy_admin 工具,查看实时状态
  • 使用系统工具(如 top、iftop、tcpdump 等),监控系统资源使用情况

Q5: 如何处理 OBProxy 性能突然下降的问题?

A5: 处理 OBProxy 性能突然下降的问题可以按照以下步骤进行:

  1. 检查监控数据,确定性能下降的具体指标
  2. 检查 OBProxy 日志,查找错误信息
  3. 检查后端节点状态,是否有节点故障或性能问题
  4. 检查网络连接,是否有网络延迟或丢包
  5. 检查应用请求模式,是否有突发流量或异常查询
  6. 根据分析结果,采取相应的优化措施

Q6: 如何优化 OBProxy 的网络性能?

A6: 优化 OBProxy 的网络性能可以从以下几个方面入手:

  • 使用万兆网卡,提高网络吞吐量
  • 配置合理的网络缓冲区大小
  • 优化网络路由和防火墙规则
  • 启用 TCP 快速打开(如果支持)
  • 调整 TCP 保活参数,及时释放无效连接
  • 避免在同一服务器上部署多个 OBProxy 实例

Q7: 如何配置 OBProxy 的读写分离?

A7: 配置 OBProxy 的读写分离可以通过以下步骤进行:

  1. 在 OBProxy 配置文件中设置 enable_rw_split = true
  2. 配置 read_route_policy 参数,选择读请求路由策略
  3. 根据需要配置 allow_read_when_write_failslave_delay_threshold 等参数
  4. 重启 OBProxy 实例,使配置生效
  5. 测试读写分离效果,确保读请求正确路由到从库

Q8: 如何优化 OBProxy 的日志性能?

A8: 优化 OBProxy 的日志性能可以从以下几个方面入手:

  • 调整日志级别,生产环境建议使用 INFO 级别
  • 启用异步日志,提高日志写入性能
  • 配置合理的日志文件大小和数量限制
  • 使用 SSD 存储日志文件
  • 定期清理过期日志文件
  • 避免在日志中记录敏感信息,减少日志大小