1. Doris 集群负载均衡方案概述
在 Doris 分布式数据库架构中,前端节点(FE)负责接收和处理客户端查询请求。当集群规模扩大时,单一 FE 节点可能成为性能瓶颈和单点故障源。通过部署多个 FE 节点并配置负载均衡,可以实现查询请求的分布式处理,提高系统整体的可用性和吞吐量。
Doris 的 FE 节点通过 MySQL 协议(默认端口 9030)与客户端通信,这使得我们可以利用成熟的 MySQL 生态工具来实现负载均衡。根据不同的业务场景和技术栈,主要有以下几种实现方案:
- JDBC 内置负载均衡:适用于 Java 应用,通过连接字符串配置多个 FE 节点
- Nginx TCP 代理:轻量级方案,适合中小规模集群
- HAProxy:专业级负载均衡器,支持丰富的健康检查机制
- ProxySQL:MySQL 专用代理,提供高级路由和查询管理功能
提示:无论采用哪种方案,都需要特别注意客户端 IP 透传问题,否则 Doris 的审计、权限控制等功能将无法获取真实客户端信息。
2. JDBC 内置负载均衡方案
2.1 实现原理
MySQL Connector/J 驱动提供了原生负载均衡支持,通过在 JDBC URL 中指定多个 FE 节点地址,驱动会自动在这些节点间分配连接请求。其核心机制是:
- 驱动维护一个活跃节点列表
- 新建连接时随机选择一个可用节点
- 当节点故障时自动尝试其他节点
2.2 配置示例
java复制String url = "jdbc:mysql:loadbalance://192.168.1.101:9030,192.168.1.102:9030,192.168.1.103:9030/test_db?loadBalanceAutoCommitStatementThreshold=5&retriesAllDown=10";
Properties props = new Properties();
props.setProperty("user", "root");
props.setProperty("password", "password");
Connection conn = DriverManager.getConnection(url, props);
关键参数说明:
loadBalanceAutoCommitStatementThreshold:自动提交语句的阈值retriesAllDown:所有节点不可用时的重试次数
2.3 优缺点分析
优势:
- 无需额外中间件,部署简单
- 客户端直接感知节点状态,响应快速
- 支持自动故障转移
局限:
- 仅适用于 Java 应用
- 缺乏高级路由策略
- 客户端需要维护连接池
3. Nginx TCP 负载均衡方案
3.1 环境准备
建议使用 Nginx 1.9.0 及以上版本,支持 stream 模块。以下以 Ubuntu 系统为例:
bash复制# 安装依赖
sudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev
# 编译安装
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar zxvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
./configure --prefix=/usr/local/nginx \
--with-stream \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_stub_status_module
make && sudo make install
3.2 详细配置
创建 /usr/local/nginx/conf/stream.conf:
nginx复制events {
worker_connections 1024;
}
stream {
upstream doris_fe {
hash $remote_addr consistent;
server 192.168.1.101:9030 weight=1 max_fails=2 fail_timeout=60s;
server 192.168.1.102:9030 weight=1 max_fails=2 fail_timeout=60s;
server 192.168.1.103:9030 weight=1 max_fails=2 fail_timeout=60s;
}
server {
listen 6030;
proxy_pass doris_fe;
proxy_connect_timeout 300s;
proxy_timeout 300s;
proxy_protocol on; # 启用Proxy Protocol
}
}
关键配置说明:
hash $remote_addr:保持客户端会话一致性max_fails:失败次数阈值fail_timeout:节点不可用时长
3.3 管理命令
bash复制# 启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/stream.conf
# 重载配置
/usr/local/nginx/sbin/nginx -s reload
# 停止
/usr/local/nginx/sbin/nginx -s stop
4. HAProxy 专业负载均衡方案
4.1 安装部署
以 CentOS 7 为例:
bash复制# 安装依赖
yum install gcc gcc-c++ -y
# 下载编译
wget https://www.haproxy.org/download/2.6/src/haproxy-2.6.15.tar.gz
tar -zxvf haproxy-2.6.15.tar.gz
cd haproxy-2.6.15
make TARGET=linux-glibc PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
4.2 完整配置
/usr/local/haproxy/haproxy.cfg:
haproxy复制global
log /dev/log local0
maxconn 4000
user haproxy
group haproxy
daemon
defaults
mode tcp
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
log global
listen stats
bind *:8080
mode http
stats enable
stats uri /haproxy?stats
stats realm Haproxy\ Statistics
stats auth admin:admin123
frontend doris_frontend
bind *:6030
mode tcp
default_backend doris_backend
backend doris_backend
mode tcp
balance roundrobin
option tcp-check
tcp-check connect port 9030
tcp-check send PING\r\n
tcp-check expect string PONG
server fe1 192.168.1.101:9030 check inter 2000 rise 2 fall 3 send-proxy
server fe2 192.168.1.102:9030 check inter 2000 rise 2 fall 3 send-proxy
server fe3 192.168.1.103:9030 check inter 2000 rise 2 fall 3 send-proxy
4.3 高级功能
健康检查配置:
haproxy复制option mysql-check user haproxy_check
tcp-check connect port 9030
tcp-check send PING\r\n
tcp-check expect string PONG
SSL 终端:
haproxy复制bind *:6030 ssl crt /etc/ssl/doris.pem
5. ProxySQL 高级路由方案
5.1 安装与初始化
bash复制# Ubuntu安装
apt-get install -y proxysql mysql-client
# 启动服务
systemctl start proxysql
# 管理接口连接
mysql -u admin -padmin -h 127.0.0.1 -P 6032 --prompt='ProxySQL> '
5.2 完整配置流程
sql复制-- 添加服务器节点
INSERT INTO mysql_servers(hostgroup_id,hostname,port)
VALUES
(10,'192.168.1.101',9030),
(10,'192.168.1.102',9030),
(10,'192.168.1.103',9030);
-- 配置监控用户
UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='monitor_pass' WHERE variable_name='mysql-monitor_password';
-- 负载均衡配置
INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply)
VALUES (1,1,'^SELECT.*FOR UPDATE',10,1),(2,1,'^SELECT',20,1);
-- 保存配置
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
5.3 读写分离实现
sql复制-- 设置写组
UPDATE mysql_servers SET hostgroup_id=10 WHERE hostname IN ('192.168.1.101');
-- 设置读组
UPDATE mysql_servers SET hostgroup_id=20 WHERE hostname IN ('192.168.1.102','192.168.1.103');
-- 配置路由规则
INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply)
VALUES
(1,1,'^INSERT',10,1),
(2,1,'^UPDATE',10,1),
(3,1,'^DELETE',10,1),
(4,1,'^SELECT',20,1);
6. 客户端 IP 透传方案
6.1 Doris 端配置
在 fe.conf 中启用 Proxy Protocol:
properties复制enable_proxy_protocol = true
重要说明:
- 仅支持 Proxy Protocol V1 版本
- 仅作用于 MySQL 协议端口(不影响 HTTP/BRPC)
- Doris 3.1+ 版本支持混合模式(同时接受普通连接和Proxy Protocol连接)
6.2 代理层配置
Nginx 配置:
nginx复制server {
listen 6030;
proxy_pass doris_fe;
proxy_protocol on; # 关键配置
}
HAProxy 配置:
haproxy复制server fe1 192.168.1.101:9030 check send-proxy
6.3 验证方法
sql复制-- 查看连接来源
SHOW PROCESSLIST;
-- 检查审计日志
cat /path/to/fe/log/fe.audit.log | grep -i proxy
7. 性能优化与问题排查
7.1 性能调优参数
Nginx 优化:
nginx复制worker_processes auto;
worker_rlimit_nofile 100000;
events {
worker_connections 4096;
multi_accept on;
use epoll;
}
HAProxy 优化:
haproxy复制global
maxconn 100000
tune.ssl.default-dh-param 2048
tune.bufsize 32768
tune.maxrewrite 1024
7.2 常见问题排查
连接失败问题:
- 检查 FE 节点网络连通性
- 验证端口防火墙设置
- 查看代理日志(Nginx error.log / HAProxy 日志)
性能瓶颈分析:
bash复制# 查看连接数
netstat -anp | grep 6030 | wc -l
# 监控系统负载
top -b -n 1 | grep -E '(nginx|haproxy)'
Proxy Protocol 问题:
- 确认 Doris 版本支持
- 检查代理配置是否正确
- 使用 tcpdump 抓包验证协议头
8. 方案选型建议
8.1 小型集群方案
- 推荐组件:Nginx
- 优势:轻量、易配置
- 适用场景:FE节点≤5个,QPS<1k
8.2 中型集群方案
- 推荐组件:HAProxy
- 优势:丰富的健康检查
- 适用场景:5-15个FE节点,需要高可用
8.3 大型集群方案
- 推荐组件:ProxySQL
- 优势:高级查询路由
- 适用场景:15+FE节点,需要读写分离
8.4 特殊需求场景
- Kubernetes环境:使用Ingress Controller + Service
- 云环境:使用云厂商LB服务(如AWS ALB)
- 极致性能:LVS(DR模式)+Keepalived
在实际生产环境中,我们部署的Doris集群采用HAProxy方案,稳定支撑了日均10亿+的查询请求。关键经验是:
- 合理设置timeout参数(连接超时建议5s,请求超时建议30s)
- 开启TCP keepalive防止连接泄漏
- 监控后端节点响应时间,及时发现性能问题