1. 为什么选择Doris作为你的数据仓库第一次接触Doris是在三年前的一个电商项目当时我们被MySQL的性能瓶颈折磨得够呛。每当大促来临复杂的报表查询直接让数据库瘫痪。直到我们迁移到Doris查询响应时间从分钟级降到了秒级这才真正体会到MPP架构的魅力。Doris作为Apache顶级开源项目最大的优势在于它同时支持高并发点查询和批量分析。传统方案中你可能需要HBaseSpark两套系统才能满足需求而Doris一个就能搞定。我特别喜欢它的几个特性实时分析能力数据写入即可查不像Hive需要等定时调度兼容MySQL协议现有BI工具几乎无需改造就能接入自动分片与副本数据自动均衡节点宕机自动切换去年给一家物流公司部署Doris时他们原有系统每天处理1亿条轨迹数据需要4小时迁移后同样的数据量只需23分钟。这种性能提升在传统数仓架构中几乎不可能实现。2. 生产环境硬件选型指南2.1 服务器配置推荐在金融行业项目中踩过坑后我总结出这些硬件经验FE节点CPU16核起步建议Intel Gold 6248R内存64GB起步元数据全内存操作磁盘2块480GB SSD做RAID1存放元数据日志BE节点CPU32核起步查询性能与核数正相关内存128GB起步每个tablet副本约占用10MB磁盘4块1.92TB SSD做JBOD不要用RAID5重要提示千万别为了省钱用云盘我们曾因某云厂商的突发IOPS限制导致集群瘫痪。本地SSD是唯一选择。2.2 网络拓扑设计某次跨机房部署让我深刻认识到网络的重要性带宽BE节点间至少10Gbps互联延迟节点间RTT要1ms隔离单独划分VLAN给Doris心跳流量这是我常用的tcping测试命令# 检查节点间网络质量 while true; do tcping -t 1 ${BE_IP} 9050 | grep -oP time\K\d sleep 1 done3. 从零开始部署集群3.1 系统调优实战很多文档会告诉你关闭swap但实际生产中还涉及更多细节# 内核参数调优所有节点 cat /etc/sysctl.conf EOF # 防止OOM killer误杀BE进程 vm.overcommit_memory 1 # 提升单进程能打开的文件数 fs.file-max 1000000 # 加快TCP连接回收 net.ipv4.tcp_tw_reuse 1 EOF # BE节点额外设置 echo vm.max_map_count2000000 /etc/sysctl.conf sysctl -p3.2 集群初始化技巧第一次启动FE时有个隐藏技巧先不启动BE等FE完全初始化后再添加BE节点。这样可以避免早期版本的表自动均衡bug。-- 初始化完成后检查FE状态 SHOW PROC /frontends\G -- 预期输出示例 *************************** 1. row *************************** Name: fe_xxxx IP: 192.168.1.100 EditLogPort: 9010 HttpPort: 8030 QueryPort: 9030 RpcPort: 9020 Role: LEADER IsMaster: true ...4. 高可用配置全解析4.1 FE节点部署策略我习惯采用1 Leader 2 Follower 1 Observer架构Leader/Follower3节点确保元数据高可用Observer专供BI工具连接避免影响核心业务添加Follower的实操命令-- 在已运行的FE上执行 ALTER SYSTEM ADD FOLLOWER 192.168.1.101:9010; ALTER SYSTEM ADD FOLLOWER 192.168.1.102:9010; -- 新节点首次启动时指定helper节点 bin/start_fe.sh --helper 192.168.1.100:9010 --daemon4.2 BE节点冷热数据分离对于时序数据场景这个配置能节省40%存储成本# be.conf 配置示例 storage_root_path/hot/ssd1,medium:SSD;/cold/hdd1,medium:HDD配合表级TTL设置CREATE TABLE sensor_data ( ts DATETIME, value DOUBLE ) PARTITION BY RANGE(ts) ( PARTITION p202301 VALUES LESS THAN (2023-02-01), PARTITION p202302 VALUES LESS THAN (2023-03-01) ) DISTRIBUTED BY HASH(ts) BUCKETS 32 PROPERTIES ( storage_medium SSD, storage_cooldown_time 7 days );5. 安全加固与监控5.1 必须做的安全设置见过太多企业忘记改默认密码结果被挖矿程序入侵-- 修改root密码所有FE节点生效 SET PASSWORD FOR root PASSWORD(ComplexPass123); -- 创建业务账号 CREATE USER etl_user IDENTIFIED BY Etl2023; GRANT SELECT_PRIV ON *.* TO etl_user;5.2 监控指标清单这套Prometheus配置能抓住90%的异常# prometheus.yml 片段 - job_name: doris metrics_path: /metrics static_configs: - targets: [fe1:8030, fe2:8030] labels: { role: fe } - targets: [be1:8040, be2:8040] labels: { role: be }关键指标告警规则# 磁盘空间不足 doris_be_disk_used_percent 85% # 查询队列堆积 doris_fe_query_queue_size 100 # 副本异常 doris_be_tablet_unhealthy_count 06. 性能调优实战6.1 常见参数调整经过20项目验证的这些参数最有效# fe.conf query_queue_size 2000 # 默认500容易爆 max_conn_per_be 2048 # 防止BE连接数不足 # be.conf flush_thread_num_per_store 4 # SSD建议4-8 streaming_load_rpc_max_alive_time_sec 12006.2 分桶策略优化错误的分桶设计会导致严重数据倾斜-- 大表推荐使用动态分区分桶 CREATE TABLE user_behavior ( dt DATE, user_id BIGINT, item_id BIGINT ) PARTITION BY RANGE(dt) ( PARTITION p202301 VALUES LESS THAN (2023-02-01), PARTITION p202302 VALUES LESS THAN (2023-03-01) ) DISTRIBUTED BY HASH(user_id) BUCKETS 32 PROPERTIES ( dynamic_partition.enable true, dynamic_partition.time_unit MONTH, dynamic_partition.start -12, dynamic_partition.end 3 );7. 故障排查手册7.1 启动失败排查最近遇到一个典型问题BE启动报错Fail to get master client from cache解决步骤检查FE集群状态show frontends确认BE配置的priority_networks与实际IP匹配查看BE日志grep thrift client be/log/be.WARNING7.2 查询卡顿分析慢查询三板斧-- 1. 查看当前运行查询 SHOW PROC /current_queries; -- 2. 分析Profile需先开启 SET enable_profile true; [执行慢查询] SHOW QUERY PROFILE /; -- 3. 检查数据分布 SHOW TABLET FROM table_name WHERE ReplicaCount 3;8. 升级与扩容实战8.1 滚动升级步骤安全升级的黄金法则先升级Observer FE再升级Follower FE最后升级Leader FEBE节点逐个重启# 优雅停止BE避免触发副本修复 curl -X POST http://localhost:8040/api/stop8.2 在线扩容技巧扩容BE节点的隐藏坑点新节点storage_root_path必须与现有集群相同路径结构扩容后执行ADMIN SET REPLICA STATUS PROPERTIES(backend_id10086, statusfree);立即开始均衡9. 最佳实践总结在最近一个PB级项目中我们通过以下配置实现99.9%可用性混合部署FE独立部署BE与计算节点混部多租户隔离通过Resource Group限制BI查询资源冷热分离最近3月数据放SSD历史数据放HDD最重要的经验是一定要在上线前做全链路压测。我们曾模拟双11流量冲击提前发现了FE元数据内存泄漏问题。
从零到一:构建高可用Doris集群的实战指南
1. 为什么选择Doris作为你的数据仓库第一次接触Doris是在三年前的一个电商项目当时我们被MySQL的性能瓶颈折磨得够呛。每当大促来临复杂的报表查询直接让数据库瘫痪。直到我们迁移到Doris查询响应时间从分钟级降到了秒级这才真正体会到MPP架构的魅力。Doris作为Apache顶级开源项目最大的优势在于它同时支持高并发点查询和批量分析。传统方案中你可能需要HBaseSpark两套系统才能满足需求而Doris一个就能搞定。我特别喜欢它的几个特性实时分析能力数据写入即可查不像Hive需要等定时调度兼容MySQL协议现有BI工具几乎无需改造就能接入自动分片与副本数据自动均衡节点宕机自动切换去年给一家物流公司部署Doris时他们原有系统每天处理1亿条轨迹数据需要4小时迁移后同样的数据量只需23分钟。这种性能提升在传统数仓架构中几乎不可能实现。2. 生产环境硬件选型指南2.1 服务器配置推荐在金融行业项目中踩过坑后我总结出这些硬件经验FE节点CPU16核起步建议Intel Gold 6248R内存64GB起步元数据全内存操作磁盘2块480GB SSD做RAID1存放元数据日志BE节点CPU32核起步查询性能与核数正相关内存128GB起步每个tablet副本约占用10MB磁盘4块1.92TB SSD做JBOD不要用RAID5重要提示千万别为了省钱用云盘我们曾因某云厂商的突发IOPS限制导致集群瘫痪。本地SSD是唯一选择。2.2 网络拓扑设计某次跨机房部署让我深刻认识到网络的重要性带宽BE节点间至少10Gbps互联延迟节点间RTT要1ms隔离单独划分VLAN给Doris心跳流量这是我常用的tcping测试命令# 检查节点间网络质量 while true; do tcping -t 1 ${BE_IP} 9050 | grep -oP time\K\d sleep 1 done3. 从零开始部署集群3.1 系统调优实战很多文档会告诉你关闭swap但实际生产中还涉及更多细节# 内核参数调优所有节点 cat /etc/sysctl.conf EOF # 防止OOM killer误杀BE进程 vm.overcommit_memory 1 # 提升单进程能打开的文件数 fs.file-max 1000000 # 加快TCP连接回收 net.ipv4.tcp_tw_reuse 1 EOF # BE节点额外设置 echo vm.max_map_count2000000 /etc/sysctl.conf sysctl -p3.2 集群初始化技巧第一次启动FE时有个隐藏技巧先不启动BE等FE完全初始化后再添加BE节点。这样可以避免早期版本的表自动均衡bug。-- 初始化完成后检查FE状态 SHOW PROC /frontends\G -- 预期输出示例 *************************** 1. row *************************** Name: fe_xxxx IP: 192.168.1.100 EditLogPort: 9010 HttpPort: 8030 QueryPort: 9030 RpcPort: 9020 Role: LEADER IsMaster: true ...4. 高可用配置全解析4.1 FE节点部署策略我习惯采用1 Leader 2 Follower 1 Observer架构Leader/Follower3节点确保元数据高可用Observer专供BI工具连接避免影响核心业务添加Follower的实操命令-- 在已运行的FE上执行 ALTER SYSTEM ADD FOLLOWER 192.168.1.101:9010; ALTER SYSTEM ADD FOLLOWER 192.168.1.102:9010; -- 新节点首次启动时指定helper节点 bin/start_fe.sh --helper 192.168.1.100:9010 --daemon4.2 BE节点冷热数据分离对于时序数据场景这个配置能节省40%存储成本# be.conf 配置示例 storage_root_path/hot/ssd1,medium:SSD;/cold/hdd1,medium:HDD配合表级TTL设置CREATE TABLE sensor_data ( ts DATETIME, value DOUBLE ) PARTITION BY RANGE(ts) ( PARTITION p202301 VALUES LESS THAN (2023-02-01), PARTITION p202302 VALUES LESS THAN (2023-03-01) ) DISTRIBUTED BY HASH(ts) BUCKETS 32 PROPERTIES ( storage_medium SSD, storage_cooldown_time 7 days );5. 安全加固与监控5.1 必须做的安全设置见过太多企业忘记改默认密码结果被挖矿程序入侵-- 修改root密码所有FE节点生效 SET PASSWORD FOR root PASSWORD(ComplexPass123); -- 创建业务账号 CREATE USER etl_user IDENTIFIED BY Etl2023; GRANT SELECT_PRIV ON *.* TO etl_user;5.2 监控指标清单这套Prometheus配置能抓住90%的异常# prometheus.yml 片段 - job_name: doris metrics_path: /metrics static_configs: - targets: [fe1:8030, fe2:8030] labels: { role: fe } - targets: [be1:8040, be2:8040] labels: { role: be }关键指标告警规则# 磁盘空间不足 doris_be_disk_used_percent 85% # 查询队列堆积 doris_fe_query_queue_size 100 # 副本异常 doris_be_tablet_unhealthy_count 06. 性能调优实战6.1 常见参数调整经过20项目验证的这些参数最有效# fe.conf query_queue_size 2000 # 默认500容易爆 max_conn_per_be 2048 # 防止BE连接数不足 # be.conf flush_thread_num_per_store 4 # SSD建议4-8 streaming_load_rpc_max_alive_time_sec 12006.2 分桶策略优化错误的分桶设计会导致严重数据倾斜-- 大表推荐使用动态分区分桶 CREATE TABLE user_behavior ( dt DATE, user_id BIGINT, item_id BIGINT ) PARTITION BY RANGE(dt) ( PARTITION p202301 VALUES LESS THAN (2023-02-01), PARTITION p202302 VALUES LESS THAN (2023-03-01) ) DISTRIBUTED BY HASH(user_id) BUCKETS 32 PROPERTIES ( dynamic_partition.enable true, dynamic_partition.time_unit MONTH, dynamic_partition.start -12, dynamic_partition.end 3 );7. 故障排查手册7.1 启动失败排查最近遇到一个典型问题BE启动报错Fail to get master client from cache解决步骤检查FE集群状态show frontends确认BE配置的priority_networks与实际IP匹配查看BE日志grep thrift client be/log/be.WARNING7.2 查询卡顿分析慢查询三板斧-- 1. 查看当前运行查询 SHOW PROC /current_queries; -- 2. 分析Profile需先开启 SET enable_profile true; [执行慢查询] SHOW QUERY PROFILE /; -- 3. 检查数据分布 SHOW TABLET FROM table_name WHERE ReplicaCount 3;8. 升级与扩容实战8.1 滚动升级步骤安全升级的黄金法则先升级Observer FE再升级Follower FE最后升级Leader FEBE节点逐个重启# 优雅停止BE避免触发副本修复 curl -X POST http://localhost:8040/api/stop8.2 在线扩容技巧扩容BE节点的隐藏坑点新节点storage_root_path必须与现有集群相同路径结构扩容后执行ADMIN SET REPLICA STATUS PROPERTIES(backend_id10086, statusfree);立即开始均衡9. 最佳实践总结在最近一个PB级项目中我们通过以下配置实现99.9%可用性混合部署FE独立部署BE与计算节点混部多租户隔离通过Resource Group限制BI查询资源冷热分离最近3月数据放SSD历史数据放HDD最重要的经验是一定要在上线前做全链路压测。我们曾模拟双11流量冲击提前发现了FE元数据内存泄漏问题。