外观
OceanBase OBProxy 性能优化
连接管理优化
1. 连接池配置优化
yaml
# OBProxy 配置文件中连接池相关配置
# 最大连接数
max_connection = 10240
# 每个服务器的最大连接数
server_max_connection = 1000
# 连接超时时间(毫秒)
connect_timeout = 5000
# 连接空闲超时时间(毫秒)
idle_timeout = 3600000
# 连接重试次数
retry_times = 3
# 连接重试间隔(毫秒)
retry_interval = 10002. 连接复用优化
yaml
# 启用连接复用
enable_connection_reuse = true
# 连接复用超时时间(毫秒)
connection_reuse_timeout = 3600000
# 连接复用最大次数
connection_reuse_max_count = 10003. 连接队列优化
yaml
# 连接队列大小
connection_queue_size = 1000
# 连接队列超时时间(毫秒)
connection_queue_timeout = 50004. 客户端连接优化
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:28813. 读写分离优化
yaml
# 启用读写分离
enable_rw_split = true
# 读请求路由策略(master/slave/all)
read_route_policy = slave
# 主库不可用时是否允许读从库
allow_read_when_write_fail = true
# 从库延迟阈值(秒),超过阈值则不路由读请求到该从库
slave_delay_threshold = 304. 连接路由缓存优化
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 = 10242. 线程配置优化
yaml
# 工作线程数量
worker_threads = 16
# 每个工作线程的任务队列大小
task_queue_size = 10000
# 任务队列超时时间(毫秒)
task_queue_timeout = 1000
# 后台线程数量
bg_threads = 43. 网络配置优化
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 = 94. 日志配置优化
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 = 645. 安全配置优化
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.conf2. 内存资源优化
- 为 OBProxy 分配足够的内存,建议至少 4GB
- 调整内存相关配置参数,如
memory_limit、worker_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: 15s3. 使用 Grafana 可视化监控数据
- 安装 Grafana
- 添加 Prometheus 数据源
- 导入 OBProxy 监控面板
- 配置告警规则
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 倍。可以通过以下步骤确定最优值:
- 从 CPU 核心数开始设置
- 逐步增加工作线程数量,观察性能变化
- 当性能不再提升或开始下降时,停止增加
- 选择性能最佳的工作线程数量
Q2: 如何优化 OBProxy 的连接数?
A2: 优化 OBProxy 连接数可以从以下几个方面入手:
- 调整
max_connection和server_max_connection配置参数 - 优化应用连接池配置,减少不必要的连接
- 启用连接复用,提高连接利用率
- 配置合理的连接超时和空闲超时时间
- 监控连接使用情况,及时发现连接泄漏
Q3: 如何选择合适的负载均衡策略?
A3: 选择合适的负载均衡策略需要考虑业务场景和后端节点情况:
- 如果各节点性能相近,建议使用
roundrobin策略 - 如果各节点性能差异较大,建议使用
weighted_roundrobin或weighted_leastconn策略 - 如果连接数是主要考虑因素,建议使用
leastconn策略 - 如果需要简单配置,建议使用
random策略
Q4: 如何监控 OBProxy 的性能?
A4: 可以通过以下方式监控 OBProxy 的性能:
- 使用 OCP 的监控功能,查看 OBProxy 性能指标
- 配置 Prometheus 和 Grafana,实现自定义监控和可视化
- 使用 OBProxy 自带的
obproxy_admin工具,查看实时状态 - 使用系统工具(如 top、iftop、tcpdump 等),监控系统资源使用情况
Q5: 如何处理 OBProxy 性能突然下降的问题?
A5: 处理 OBProxy 性能突然下降的问题可以按照以下步骤进行:
- 检查监控数据,确定性能下降的具体指标
- 检查 OBProxy 日志,查找错误信息
- 检查后端节点状态,是否有节点故障或性能问题
- 检查网络连接,是否有网络延迟或丢包
- 检查应用请求模式,是否有突发流量或异常查询
- 根据分析结果,采取相应的优化措施
Q6: 如何优化 OBProxy 的网络性能?
A6: 优化 OBProxy 的网络性能可以从以下几个方面入手:
- 使用万兆网卡,提高网络吞吐量
- 配置合理的网络缓冲区大小
- 优化网络路由和防火墙规则
- 启用 TCP 快速打开(如果支持)
- 调整 TCP 保活参数,及时释放无效连接
- 避免在同一服务器上部署多个 OBProxy 实例
Q7: 如何配置 OBProxy 的读写分离?
A7: 配置 OBProxy 的读写分离可以通过以下步骤进行:
- 在 OBProxy 配置文件中设置
enable_rw_split = true - 配置
read_route_policy参数,选择读请求路由策略 - 根据需要配置
allow_read_when_write_fail和slave_delay_threshold等参数 - 重启 OBProxy 实例,使配置生效
- 测试读写分离效果,确保读请求正确路由到从库
Q8: 如何优化 OBProxy 的日志性能?
A8: 优化 OBProxy 的日志性能可以从以下几个方面入手:
- 调整日志级别,生产环境建议使用 INFO 级别
- 启用异步日志,提高日志写入性能
- 配置合理的日志文件大小和数量限制
- 使用 SSD 存储日志文件
- 定期清理过期日志文件
- 避免在日志中记录敏感信息,减少日志大小
