【Doris】运维命令
- 【一】状态分析
- 【二】优化配置参考
-
- 【1】FE
- 【2】BE
- [【3】Timeout 参数](#【3】Timeout 参数)
- 【4】变量设置与查看
- 【三】可视化运维监控
- 【四】数据库连接池
- 【五】集群配置和负载均衡
【一】状态分析
【1】服务状态
(1)检查服务
sql
# 登录FE节点,检查进程状态
ps aux | grep doris
# 检查FE端口监听
netstat -tlnp | grep 9030
netstat -tlnp | grep 8030
# 查看当前连接到FE的TCP连接数
netstat -an | grep :9030 | wc -l
netstat -an | grep :9030 | grep ESTABLISHED | wc -l
(2)检查系统资源
sql
# 检查内存使用
free -h
# 检查CPU负载
top
# 检查磁盘空间
df -h
du -h --max-depth=2
# 检查文件描述符数量
cat /proc/sys/fs/file-nr
ulimit -n
(3)检查FE/BE进程状态
sql
# 检查FE日志文件大小和错误
ls -lh /path/to/doris/fe/log/
tail -100 /path/to/doris/fe/log/fe.warn.log
# 检查BE日志
tail -100 /path/to/doris/be/log/be.warn.log
【2】集群状态
(1)数据库查看节点状态
(1)fe和be节点的健康状态、主从关系、端口
(2)be节点的内存使用情况
sql
# 查看master(fe)的运行状态
show frontends;
# 查看slaver(be)的运行状态
show backends;
【3】连接状态
(1)查看当前正在运行的线程
使用以下命令查看当前的连接信息:
sql
SHOW PROCESSLIST;
或者查看详细的连接信息:
sql
SHOW FULL PROCESSLIST;
显示用户正在运行的线程,需要注意的是,除了 root 用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程
(1)CurrentConnected: 是否为当前连接。
(2)Id: 就是这个线程的唯一标识,当我们发现这个线程有问题的时候,可以通过 kill 命令,加上这个Id值将这个线程杀掉。
(3)User: 就是指启动这个线程的用户。
(4)Host: 记录了发送请求的客户端的 IP 和 端口号。通过这些信息在排查问题的时候,我们可以定位到是哪个客户端的哪个进程发送的请求。
(5)LoginTime: 建立连接的时间。
(6)Catalog: 当前执行的命令是在哪一个数据目录上。
(7)Db: 当前执行的命令是在哪一个数据库上。如果没有指定数据库,则该值为 NULL 。
(8)Command: 是指此刻该线程正在执行的命令。
Query: 该线程正在执行一个语句
Sleep: 正在等待客户端向它发送执行语句
Quit: 该线程正在退出
Kill : 正在执行 kill 语句,杀死指定线程
(9)Time: 上一条命令提交到当前状态的时间,单位为秒。
(10)State: 线程的状态,和 Command 对应。
(11)QueryId: 当前查询语句的ID。
(12)Info: 一般记录的是线程执行的语句。默认只显示前100个字符,也就是你看到的语句可能是截断了的,要看全部信息,需要使用 show full processlist。
sql
MySQL [test]> show full processlist;
+------------------+------+------+-----------------+---------------------+----------+------+---------+------+-------+-----------------------------------+-----------------------+
| CurrentConnected | Id | User | Host | LoginTime | Catalog | Db | Command | Time | State | QueryId | Info |
+------------------+------+------+-----------------+---------------------+----------+------+---------+------+-------+-----------------------------------+-----------------------+
| Yes | 0 | root | 127.0.0.1:34650 | 2023-09-06 12:01:02 | internal | test | Query | 0 | OK | c84e397193a54fe7-bbe9bc219318b75e | select 1 |
| | 1 | root | 127.0.0.1:34776 | 2023-09-06 12:01:07 | internal | | Sleep | 29 | EOF | 886ffe2894314f50-8dd73a6ca06699e4 | show full processlist |
+------------------+------+------+-----------------+---------------------+----------+------+---------+------+-------+-----------------------------------+-----------------------+
(2)通过系统表查询连接信息
sql
-- 查看详细的连接信息
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
-- 按用户统计连接数
SELECT USER, COUNT(*) as connection_count
FROM INFORMATION_SCHEMA.PROCESSLIST
GROUP BY USER;
-- 查看当前FE节点的连接统计
SELECT HOST, COUNT(*) as connections
FROM INFORMATION_SCHEMA.PROCESSLIST
GROUP BY HOST;
-- 定期监控连接数
SELECT COUNT(*) as active_connections
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE TIME < 300; -- 只统计活跃连接
-- 查看当前活跃连接详情
SELECT
ID as connection_id,
USER,
HOST,
DB,
COMMAND,
TIME,
STATE,
INFO
FROM INFORMATION_SCHEMA.PROCESSLIST
ORDER BY TIME DESC;
-- 查找长时间空闲的连接
SELECT
ID as connection_id,
USER,
HOST,
DB,
TIME as idle_seconds,
COMMAND,
STATE
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE TIME > 3600 -- 超过1小时空闲
AND STATE = 'idle'
ORDER BY TIME DESC;
-- 查找执行时间过长的查询
SELECT
ID as connection_id,
USER,
HOST,
DB,
TIME as execution_seconds,
COMMAND,
STATE,
LEFT(INFO, 100) as query_preview
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE STATE = 'running'
AND TIME > 300 -- 执行超过5分钟
ORDER BY TIME DESC;
(3)分析连接堆积原因
sql
# 查看TCP连接状态分布
netstat -an | grep :9030 | awk '{print $6}' | sort | uniq -c
# 查看连接来源IP分布
netstat -an | grep :9030 | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
# 监控新建连接速率
watch -n 1 'netstat -an | grep :9030 | grep ESTAB | wc -l'
(4)查看用户最大连接数
通过以下命令查看指定用户的最大连接数配置:
sql
SHOW PROPERTY FOR '用户名' LIKE '%max_user_connections%';
示例:
sql
SHOW PROPERTY FOR 'test_user' LIKE '%max_user_connections%';
(5)修改用户最大连接数
可以通过以下命令调整用户的最大连接数:
sql
SET PROPERTY FOR '用户名' 'max_user_connections' = '值';
示例:将用户 test_user 的最大连接数设置为 200:
sql
SET PROPERTY FOR 'test_user' 'max_user_connections' = '200';
(4)查看 FE 最大连接数
FE(Frontend)的最大连接数可以通过 qe_max_connection 参数查看,默认值为 1024。可以在 fe.conf 文件中找到该参数。
(5)注意事项
空闲连接超时:wait_timeout 参数控制空闲连接的超时时间,默认为 28800 秒(8 小时)。建议根据实际情况调整,例如:
sql
SET GLOBAL wait_timeout = 300;
资源优化:如果频繁出现 "Reach limit of connections" 错误,可以适当增加 max_user_connections 或减少 wait_timeout。
通过以上方法,可以有效管理和优化 Doris 的连接数配置,确保系统稳定运行。
(6)若是空闲连接占满资源,可检查 wait_timeout 参数:
sql
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE COMMAND = 'Sleep' AND USER = 'root';
如果大量连接处于 Sleep 状态,建议缩短超时时间:
sql
SET GLOBAL wait_timeout = 300;
查看空闲连接存活时间
sql
SHOW PROPERTY FOR 'root' LIKE '%wait_timeout%';
这样可在 5 分钟无活动后自动释放连接,避免浪费资源。
总结:
应根据业务峰值合理规划 max_user_connections、wait_timeout 和 workload group 配置,并定期监控 PROCESSLIST,防止因资源占满导致业务中断。
(6)重要监控指标阈值
单个FE节点连接数 > 500(需要关注)
单个FE节点连接数 > 800(需要告警)
BE节点存活状态 = false(立即告警)
查询执行时间 > 300秒(需要关注)
【4】fe.conf中的关键配置
sql
# 连接相关配置
qe_max_connection = 1024
max_connection_num = 4096
# 内存相关
qe_query_max_memory =
# 超时配置
query_timeout = 300
【二】优化配置参考
【1】FE
fe.conf
yml
qe_max_connection = 4096
max_conn_per_user = 1024
lower_case_table_names=1
broker_timeout_ms = 120000
qe_query_timeout_second = 12000
backend_rpc_timeout_ms = 60000
remote_fragment_exec_timeout_ms = 300000
meta_publish_timeout_ms = 30000
check_consistency_default_timeout_second = 1800
publish_version_timeout_second = 90
tablet_create_timeout_second = 10
bdbje_lock_timeout_second = 10
max_bdbje_clock_delta_ms = 20000
max_running_txn_num_per_db = 1000
enable_concurrent_update = true
enable_batch_delete_by_default = true
jetty_server_max_http_header_size = 30720
max_stream_load_timeout_second = 300
stream_load_default_timeout_second = 300
解析
(1)qe_max_connection:每个FE(Frontend)的最大连接数,默认值是1024。
(2)max_conn_per_user:每个用户的最大连接数,默认值是1024。
(3)lower_case_table_names:设置为1表示表名将被转换为小写存储。
(4)broker_timeout_ms:与Broker通信的超时时间,单位是毫秒,默认值是120000毫秒(2分钟)。
1-Break:在 Apache Doris 中,Broker 是一个重要的组件,它主要用于以下几个方面:
2-数据导入:
Broker 负责从外部存储系统(如 HDFS、S3、BOS 等)导入数据到 Doris 中。它作为数据导入过程中的中介,帮助 Doris 读取外部存储中的数据文件,并将其加载到 Doris 的存储引擎中。
3-数据导出:
同样,Broker 也可以用于将 Doris 中的数据导出到外部存储系统。
(5)qe_query_timeout_second:查询执行的超时时间,单位是秒,默认值是12000秒(3.33小时)。
(6)backend_rpc_timeout_ms:后端RPC调用的超时时间,单位是毫秒,默认值是60000毫秒(1分钟)。
RPC:RPC(Remote Procedure Call,远程过程调用)是一种通信协议,它允许一个程序(客户端)通过网络向另一个程序(服务器)请求服务
(7)remote_fragment_exec_timeout_ms:远程Fragment执行的超时时间,单位是毫秒,默认值是300000毫秒(5分钟)。
远程Fragment:在分布式数据库和大数据处理系统中,"Fragment"(片段)通常指的是查询执行计划中的一个单元,它代表了查询的一部分,需要在数据所在的节点上执行。在 Apache Doris 这样的 MPP(大规模并行处理)数据库中,查询通常被分解成多个 Fragment,每个 Fragment 负责处理数据的一个子集。
(8)meta_publish_timeout_ms:元数据发布操作的超时时间,单位是毫秒,默认值是30000毫秒(30秒)。
元数据:在分布式数据库和大数据系统中,元数据(Metadata)是指描述数据的结构、属性、存储位置等信息的数据。元数据发布(Metadata Publishing)是指在系统中更新和同步元数据的过程,确保系统中的所有节点都能够访问到最新的元数据信息。
(9)check_consistency_default_timeout_second:检查一致性的默认超时时间,单位是秒,默认值是1800秒(30分钟)。
(10)publish_version_timeout_second:发布版本的超时时间,单位是秒,默认值是90秒。
(11)tablet_create_timeout_second:创建tablet的超时时间,单位是秒,默认值是10秒。
tablet:Tablet 是 Apache Doris 中用于存储数据的一个小块,它类似于数据库中的"分区"。每个 Tablet 包含表中的一部分数据,并且这些 Tablet 会被分散存储在集群的不同节点上,以实现数据的分布式管理和查询。这样可以提高查询效率和数据的可靠性。
(12)bdbje_lock_timeout_second:BDB JE锁的超时时间,单位是秒,默认值是10秒。
BDB JE锁:BDB JE锁是指 Berkeley DB Java Edition(BDB JE)中的锁机制。简单来说,BDB JE锁是用来管理对数据库中数据的并发访问,确保数据一致性和事务隔离的一种技术。当一个事务需要修改数据时,它会使用锁来保证在这个事务完成之前,其他事务不能修改同一批数据,从而防止数据冲突和不一致。
(13)max_bdbje_clock_delta_ms:BDB JE时钟偏差的最大值,单位是毫秒,默认值是20000毫秒(20秒)。
BDB JE时钟偏差:BDB JE(Berkeley DB Java Edition)时钟偏差是指在分布式系统中,不同节点上的时钟可能会存在微小的差异。由于物理时钟的不完美,以及网络延迟等因素,这些差异是难以避免的。
简单来说,BDB JE时钟偏差就是指在一个分布式数据库环境中,不同服务器或节点上的时钟时间不完全同步的现象。这种时间上的差异可能会影响那些依赖于精确时间戳的操作,比如事务处理、日志记录等。因此,了解和管理时钟偏差对于维护数据的一致性和完整性是很重要的。
(14)max_running_txn_num_per_db:每个数据库允许的最大运行事务数,默认值是1000。
数据库允许的最大运行事务数:数据库允许的最大运行事务数是指在任何给定时间点,数据库系统能够同时处理的事务(即一组操作,要么全部成功,要么全部失败)的最大数量。这个限制通常由数据库的配置参数决定,并且受到数据库资源(如内存、存储、处理能力)的限制。
简单来说,最大运行事务数就是数据库能同时"记住"并处理的事务数量。
与连接数的关系如下:
1-连接数:
连接数指的是数据库可以同时接受的客户端连接的数量。每个连接可能代表一个用户会话或一个应用程序与数据库的通信通道。
2-事务与连接:
每个连接可能启动一个或多个事务。因此,连接数直接影响可能同时启动的事务数量。
3-资源竞争:
如果连接数过多,可能会导致同时运行的事务数超过数据库的处理能力,从而引起性能瓶颈或事务超时。
4-配置调整:
数据库管理员可以根据系统资源和业务需求调整最大运行事务数和最大连接数,以优化性能和资源利用率。
5-事务管理:
即使连接数很多,合理的事务管理(如及时提交或回滚事务)可以避免事务积压,从而减少对系统资源的占用。
总的来说,最大运行事务数与连接数密切相关,但它们不是一一对应的关系。一个连接可能启动多个事务,而一个事务可能涉及多个数据库操作。合理的配置和优化可以确保数据库系统在高并发环境下的稳定性和响应性。
(15)enable_concurrent_update:是否启用并发更新,默认为true。
并发更新:并发更新是指在数据库系统中,多个事务(Transaction)或操作(Operation)同时对同一条数据记录进行修改的情况。
(16)enable_batch_delete_by_default:是否默认启用批量删除,默认为true。
(17)jetty_server_max_http_header_size:Jetty服务器最大HTTP头大小,默认值是30720字节。
Jetty服务器最大HTTP头:Jetty 服务器是一个开源的 Java servlet 容器,它可以用来处理 web 请求和响应。在 Jetty 中,"最大 HTTP 头"(Max HTTP Header Size)是指 Jetty 服务器配置中允许接收的 HTTP 请求头的最大字节数。
(18)max_stream_load_timeout_second:Stream Load操作的最大超时时间,单位是秒,默认值是300秒(5分钟)。
(19)stream_load_default_timeout_second:Stream Load操作的默认超时时间,单位是秒,默认值是300秒(5分钟)。
【2】BE
be.conf
yml
disable_storage_page_cache = true
be_service_threads = 512
doris_scanner_thread_pool_thread_num = 192
fragment_pool_thread_num_min =256
fragment_pool_thread_num_max = 1024
brpc_num_threads =32
enable_stream_load_record = true
max_runnings_transactions_per_txn_map = 2000
解析
(1)disable_storage_page_cache:是否禁用Page Cache,禁用后不会使用操作系统的page cache来缓存索引数据。该配置仅在BETA存储格式时生效。
Page Cache:Page Cache 是操作系统用于缓存文件数据的内存区域,它存储了最近访问的文件页,以便快速访问。简单来说,Page Cache 就是操作系统层面的文件系统缓存。
(2)be_service_threads:BE(Backend)服务的线程数,用于处理来自FE(Frontend)的请求。
(3)doris_scanner_thread_pool_thread_num:Doris扫描器线程池的线程数量,用于执行数据扫描任务。
(4)fragment_pool_thread_num_min 和 fragment_pool_thread_num_max:查询执行器使用的线程池的最小和最大线程数。
(5)brpc_num_threads:BRPC(百度RPC)框架使用的线程数,用于处理RPC请求。
(6)enable_stream_load_record:是否启用Stream Load操作的记录功能。
(7)max_runnings_transactions_per_txn_map:每个事务映射允许的最大运行事务数。
【3】Timeout 参数
在 Apache Doris 中,timeout 参数主要影响与查询执行和数据导入相关的操作。这些参数确保系统在遇到长时间运行的操作时能够采取相应的措施,避免资源长时间被占用。以下是一些可能受 timeout 参数影响的方面:
(1)查询超时(Query Timeout):
query_timeout:控制查询执行的最大时间。如果查询运行时间超过这个设置值,系统将终止查询以防止资源过度消耗。
(2)数据插入超时(Insert Timeout):
insert_timeout:用于设置针对 INSERT 语句的超时。该变量仅作用于 INSERT 语句,建议在 INSERT 行为易持续较长时间的场景下设置。默认为 4 小时,单位为秒。由于旧版本用户会通过延长 query_timeout 来防止 INSERT 语句超时,insert_timeout 在 query_timeout 大于自身的情况下将会失效,以兼容旧版本用户的习惯。
(3)空闲连接超时(Wait Timeout):
wait_timeout:用于设置空闲连接的连接时长。当一个空闲连接在该时长内与 Doris 没有任何交互,则 Doris 会主动断开这个链接。默认为 8 小时,单位为秒。
(4)数据可见超时(Insert Visible Timeout):
insert_visible_timeout_ms:在执行 insert 语句时,导入动作 (查询和插入) 完成后,还需要等待事务提交,使数据可见。此参数控制等待数据可见的超时时间,默认为 10000,最小为 1000。
【4】变量设置与查看
(1)查看
可以通过 SHOW VARIABLES [LIKE 'xxx']; 查看所有或指定的变量。如:
sql
SHOW VARIABLES; SHOW VARIABLES LIKE '%time_zone%';
(2)设置
部分变量可以设置全局生效或仅当前会话生效。
注意,在 1.1 版本之前,设置全局生效后,后续新的会话连接中会沿用设置值,但当前会话中的值不变。 而在 1.1 版本(含)之后,设置全局生效后,后续新的会话连接中会沿用设置值,当前会话中的值也会改变。
仅当前会话生效,通过 SET var_name=xxx; 语句来设置。如:
SET exec_mem_limit = 137438953472; SET forward_to_master = true; SET time_zone = "Asia/Shanghai";
全局生效,通过 SET GLOBAL var_name=xxx; 设置。如:
SET GLOBAL exec_mem_limit = 137438953472
【三】可视化运维监控
ip+8030端口
【四】数据库连接池
【五】集群配置和负载均衡
【1】负载均衡
用户通过 FE 的查询端口(query_port,默认 9030)使用 MySQL 协议连接 Doris。当部署多个 FE 节点时,用户可以在多个 FE 之上部署负载均衡层来实现 Doris 查询的高可用。
sql
192.168.1.101:9030
192.168.1.102:9030
192.168.1.103:9030
代理服务器所在节点:
sql
192.168.1.100
(1)JDBC URL
使用 JDBC URL 中自带的负载均衡配置。
sql
jdbc:mysql:loadbalance://192.168.1.101:9030,192.168.1.102:9030,192.168.1.103:9030/test_db
(2)Nginx
使用 Nginx TCP 反向代理实现 Doris 的负载均衡。
shell
events {
worker_connections 1024;
}
stream {
upstream mysqld {
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 {
# Proxy port
listen 6030;
proxy_connect_timeout 300s;
proxy_timeout 300s;
proxy_pass mysqld;
}
}
使用代理端口进行连接:
sql
mysql -uroot -P6030 -h192.168.1.100
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
2 rows in set (0.00 sec)