部署手册-Doris一站式部署

50 阅读9分钟

分布式仓库部署

准备条件

准备三台虚拟机,分别都为4C4G+40G,置于局域网内。

主机名称主机ip角色
node1192.168.32.130Follower,BE1,Broker
node2192.168.32.131Follower,BE2,Broker
node3192.168.32.132Follower,BE3,Broker

环境准备

JDK配置

这里不多介绍,不过需要注意的是jdk版本

WEBRESOURCE94e72a189d2f9e484f90ca9fcf63a45cimage.png

配置mysql客户端

从mysql官方下载以下依赖

-rw-rw-rw-. 1 root root 16773932 May  7 01:56 mysql-community-client-8.0.42-1.el7.x86_64.rpm
-rw-rw-rw-. 1 root root  3618748 May  7 01:57 mysql-community-client-plugins-8.0.42-1.el7.x86_64.rpm
-rw-rw-rw-. 1 root root   681376 May  7 01:59 mysql-community-common-8.0.42-1.el7.x86_64.rpm
-rw-rw-rw-. 1 root root  1563388 May  7 01:57 mysql-community-libs-8.0.42-1.el7.x86_64.rpm

注意:在安装mysql-community-libs-8.0.42-1.el7.x86_64.rpm会提示依赖检测失败。mariadb-libs依赖冲突

直接rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps,然后再次执行就可以啦。

配置主机名映射

所有节点执行

vim /etc/hosts
192.168.32.130 node1
192.168.32.131 node2
192.168.32.132 node3

关闭防火墙

请按照防火墙策略,逐一开放防火墙,或直接停掉防火墙

关闭Swap交换区

在部署 Doris 时,建议关闭 swap 分区。swap 分区是内核发现内存紧张时,会按照自己的策略将部分内存数据移动到配置的 swap 分区,

由于内核策略不能充分了解应用的行为,会对数据库性能造成较大影响。所以建议关闭。

echo -e "vm.swappiness = 0\nvm.overcommit_memory = 1" >> /etc/sysctl.conf && sysctl -p  
sudo swapoff -a
sudo sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

关闭大页面压缩

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo 511 > /proc/sys/net/core/somaxconn

设置系统最大打开文件句柄数

所有节点设置  最大进程数  文件数
sed -i '/^*/d' /etc/security/limits.conf
cat >>/etc/security/limits.conf <<EOF
* soft nproc 128605 
* hard nproc 128605 
* soft nofile 1000000
* hard nofile 1000000
EOF

ulimit -n 1024000
ulimit -u 1024000

设置时钟同步

配置免密登录

# 设置SSH免密登录
ssh-keygen -t rsa
# 密钥分发给其他节点
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3

内核优化

cat >/etc/sysctl.d/os_kernel.conf<<EOF
# 如果在该参数指定的秒数内,TCP连接一直处于空闲,则内核开始向客户端发起对它的探测,看他是否还存活着
net.ipv4.tcp_keepalive_time = 600

# 以该参数指定的秒数为时间间隔,向客户端发起对它的探测
net.ipv4.tcp_keepalive_intvl = 30

# 内核发起对客户端探测的次数,如果都没有得到相应,那么就断定客户端不可达或者已关闭,内核就关闭该TCP连接,释放相关资源
net.ipv4.tcp_keepalive_probes = 10

# 禁止使用swap空间 只有当系统为0时才允许使用
vm.swappiness=0

# 不检查物理内存是否可用
#vm.overcommit_memory = 1

# 开启网桥模式
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

# 关闭ipv6协议
net.ipv6.conf.all.disable_ipv6 = 1

# 启用IP路由转发功能
net.ipv4.ip_forward = 1

# 禁止TIME-WAIT状态sockets的快速回收,启用会在NAT网络下,会导致大量的TCP连接建立错误。
net.ipv4.tcp_tw_recycle = 0

# 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1

# linux 打开文件数 too many open files 解决方法
# 注册监听目录的数量限制
fs.inotify.max_user_watches = 1280000
# 调大最大文件句柄数
fs.file-max = 52706963
fs.nr_open = 52700000

# 设置最大打开文件数为65535
#net.core.somaxconn=65535


# 设置内核网络netfilter最大连接数
# 内核4.0以上才有此此参数
# 注意如果需要启用此参数,需要开启系统防火墙
#net.netfilter.nf_conntrack_max = 2310720
# 增加网络端口范围
net.ipv4.ip_local_port_range = 1024 65000
# 增加网络arp地址表
net.ipv4.neigh.default.gc_thresh1 = 1024
net.ipv4.neigh.default.gc_thresh2 = 4096
net.ipv4.neigh.default.gc_thresh3 = 8192

# nfs
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

# 修改虚拟内存区域至少 2000000
vm.max_map_count=2000000
EOF

# 执行刷新
sysctl -p /etc/sysctl.d/os_kernel.conf

部署步骤

准备安装包

# 创建安装路径
mkdir /data/
tar -zxvf apache-doris-2.1.9-bin-x64.tar.gz
mv apache-doris-2.1.9-bin-x64 doris/
# 将这个压缩包分发到其余两个节点上

解压完毕的目录为:

WEBRESOURCEd0ea8d961244af61528fece28832ae52image.png

配置环境变量

vim /etc/profile

export DORIS_HOME=/data/doris
export DORIS_FE_HOME=/data/doris/fe
export DORIS_BE_HOME=/data/doris/be
export PATH=$PATH:$DORIS_BE_HOME/bin:$DORIS_FE_HOME/bin


source /etc/profile

部署FE节点

1. 创建元数据路径

FE元数据通常不会超过10GB,建议存储在不同的硬盘上,在解压安装包会附带doris-meta目录,建议可以创建独立的元数据目录并创建软链接。生产环境强烈建议单独指定目录不要放在安装目录下,单独的SSD磁盘。

mkdir -p /data/doris-meta
rm -rf doris-meta/
ln -sf /data/doris-meta/ /data/doris/fe/doris-meta
2. 修改FE配置文件

FE配置文件置于FE部署路径下的conf目录中,要先修改fe.conf

JAVA_HOME=${JAVA_HOME}
LOG_DIR=${DORIS_FE_HOME}/log
meta_dir = /data/doris/fe/doris-meta
priority_networks = 10.177.32.0/24
lower_case_table_name = 1
3. 启动FE Master节点
./start_fe.sh --daemon
# 查看进程状态
jps
# CURL查看状态
curl http://192.168.32.130:8030/api/bootstrap
{"msg":"success","code":0,"data":{"replayedJournalId":0,"queryPort":0,"rpcPort":0,"arrowFlightSqlPort":0,"version":""},"count":0}

FE进程启动后进入后台执行,日志存放在之前配置文件配置的路径哪里

tail -f fe.log 
2025-05-07 00:13:42,753 INFO (binlog-gcer|50) [BinlogManager.gc():570] begin gc binlog
2025-05-07 00:13:42,754 INFO (binlog-gcer|50) [BinlogManager.gc():581] gc binlog, dbBinlogMap is null
2025-05-07 00:13:42,754 INFO (binlog-gcer|50) [BinlogGcer.runAfterCatalogReady():63] no gc binlog
2025-05-07 00:13:42,908 INFO (InternalSchemaInitializer|152) [InternalCatalog.createDb():433] create database[__internal_schema] which already exists
2025-05-07 00:13:42,914 WARN (InternalSchemaInitializer|152) [InternalSchemaInitializer.run():89] Statistics storage initiated failed, will try again later
org.apache.doris.common.DdlException: errCode = 2, detailMessage = System has no available disk capacity or no available BE nodes
        at org.apache.doris.system.SystemInfoService.checkAvailableCapacity(SystemInfoService.java:833) ~[doris-fe.jar:1.2-SNAPSHOT]
        at org.apache.doris.datasource.InternalCatalog.createTable(InternalCatalog.java:1173) ~[doris-fe.jar:1.2-SNAPSHOT]
        at org.apache.doris.catalog.InternalSchemaInitializer.createTbl(InternalSchemaInitializer.java:238) ~[doris-fe.jar:1.2-SNAPSHOT]
        at org.apache.doris.catalog.InternalSchemaInitializer.run(InternalSchemaInitializer.java:87) ~[doris-fe.jar:1.2-SNAPSHOT]
2025-05-07 00:13:47,761 INFO (InsertOverwriteDropDirtyPartitions|54) [InsertOverwriteManager.runAfterCatalogReady():368] start clean insert overwrite temp partitions
2025-05-07 00:13:47,794 INFO (Automatic Analyzer|43) [StatisticsAutoCollector.runAfterCatalogReady():70] Stats table not available, skip

报错属于正常现象,因为BE未启动

4. 连接网页

WEBRESOURCE3a354e3cbd6d46622f006669fb36c7f8image.png

账号:root,密码:空

5. 连接FE Master节点

节点启动完毕后,可以通过mysql的客户端链接到doris集群中查看FE状态,通过要确定其状态

Aive为true表示节点存活。

Join为true表示节点加入到集群中,但是不代表还在集群中。

IsMaster为true代表当前节点为主节点。

终端输入
mysql -uroot -P 9030 -h192.168.32.130

WEBRESOURCE0e3a13922aee2612ac748f5c4f8f740dimage.png

6. 添加其余节点FE Flower节点

将节点一的fe更改的文件同步在其他节点上

7. 注册FE Follower节点

在启动新的FE节点前,需要先在FE集群中注册新的FE节点。节点一连接到mysql后,执行命令:

alter system add follower "192.168.32.131:9010";
alter system add follower "192.168.32.132:9010";

# 额外,如果想移除一个节点,可以执行
alter system drop follower "192.168.32.131:9010";

注意项:

  1. FE Follower(包括 Master)节点的数量建议为奇数,建议部署 3 个组成高可用模式。

  2. 当 FE 处于高可用部署时(1 个 Master,2 个 Follower),我们建议通过增加 Observer FE 来扩展 FE 的读服务能力。

  3. 通常一个 FE 节点可以应对 10-20 台 BE 节点。建议总的 FE 节点数量在 10 个以下

8. 启动FE节点连接到leader中

值得注意是,如果第一次启动,需要通过--helper启动,自动同步元数据。

节点二执行
sh bin/start_fe.sh --helper 192.168.32.130:9010 --daemon
# 如果启动时报错bdb Clock delta: 5000ms,导致拉取元数据失败


节点三执行
sh bin/start_fe.sh --helper 192.168.32.130:9010 --daemon

如果不是第一次启动,则不需要加--helper

启动完毕后,运行jps查看进程是否存在
9. 校验FE集群

WEBRESOURCEf185b6ddbd8f10cad41fb86c5273c684image.png

10. FE节点主从切换
停止主节点./bin/stop_fe.sh

WEBRESOURCEafa84124050f009521343d0e3501eb13image.png

再次启动节点一

WEBRESOURCEc9b1ea7eeab68df3da5324f186f56c83image.png

部署BE节点

1. 创建数据目录

Be进程应用于数据的计算与存储。数据目录默认放在be/storage下。在生产环境下,通常使用独立的硬盘来存储数据,将BE数据与BE部署文件置于不同的硬盘中。

# 所有节点执行
mkdir -p /data/storage
rm -rf /data/doris/be/storage
ln -sf /data/storage/ /data/doris/be/storage
2. 修改BE配置文件
	vim be/conf/be.conf
	# 1.配置JAVA环境及日志目录
		JAVA_HOME=${JAVA_HOME}
		LOG_DIR="${DORIS_BE_HOME}/log/"

	# 2.配置BE存储路径
		storage_root_path =/data/storage
	# 3.绑定集群id
		priority_networks = 192.168.32.0/24

将文件分发到别的节点上。

特别项:

Doris支持冷热数据分级存储,将冷数据存储在 HDD 或对象存储中,热数据存储在 SSD 中。可以通过路径区别节点内的冷热数据存储目录,HDD(冷数据目录)或 SSD(热数据目录)。如果不需要 BE 节点内的冷热机制,那么只需要配置路径即可,无需指定 medium 类型;也不需要修改 FE 的默认存储介质配置。在使用冷热数据分离功能时,需要在 storage_root_path 中使用 medium 选项。

## 在 storage_root_path 中使用 medium 指定磁盘类型
## /home/disk1/doris,medium:HDD: 表示该目录存储冷数据;
## /home/disk2/doris,medium:SSD: 表示该目录存储热数据;
storage_root_path=/home/disk1/doris,medium:HDD;/home/disk2/doris,medium:SSD

注意:

1.当指定存储路径的存储类型时,至少设置一个路径的存储类型为 HDD;

2.如未显示声明存储路径的存储类型,则默认全部为 HDD;

3.指定 HDD 或 SSD 存储类型与物理存储介质无关,只为区分存储路径的存储类型,即可以在 HDD 介质的盘上标记某个目录为 SSD;

4.存储类型 HDD 和 SSD 关键字须大写。

3. 添加BE节点
mysql -uroot -P9030 -h 192.168.32.130
ALTER SYSTEM ADD BACKEND "192.168.32.130:9050";
ALTER SYSTEM ADD BACKEND "192.168.32.131:9050";
ALTER SYSTEM ADD BACKEND "192.168.32.132:9050";
4. 启动BE节点
# 所有节点启动
bin/start_be.sh --daemon
5. 查看BE启动状态
mysql> show backends;
+-----------+----------------+---------------+--------+----------+----------+--------------------+---------------------+---------------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+--------+-----------------------------+-------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+
| BackendId | Host           | HeartbeatPort | BePort | HttpPort | BrpcPort | ArrowFlightSqlPort | LastStartTime       | LastHeartbeat       | Alive | SystemDecommissioned | TabletNum | DataUsedCapacity | TrashUsedCapacity | AvailCapacity | TotalCapacity | UsedPct | MaxDiskUsedPct | RemoteUsedCapacity | Tag                      | ErrMsg | Version                     | Status                                                                                                                        | HeartbeatFailureCounter | NodeRole |
+-----------+----------------+---------------+--------+----------+----------+--------------------+---------------------+---------------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+--------+-----------------------------+-------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+
| 16269     | 192.168.32.131 | 9050          | 9060   | 8040     | 8060     | -1                 | 2025-05-07 19:26:22 | 2025-05-07 19:27:31 | true  | false                | 0         | 0.000            | 0.000             | 22.542 GB     | 35.813 GB     | 37.06 % | 37.06 %        | 0.000              | {"location" : "default"} |        | doris-2.1.9-rc02-3390475e02 | {"lastSuccessReportTabletsTime":"2025-05-07 19:26:34","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false} | 0                       | mix      |
| 16324     | 192.168.32.132 | 9050          | 9060   | 8040     | 8060     | -1                 | 2025-05-07 19:26:52 | 2025-05-07 19:27:31 | true  | false                | 10        | 0.000            | 0.000             | 22.556 GB     | 35.813 GB     | 37.02 % | 37.02 %        | 0.000              | {"location" : "default"} |        | doris-2.1.9-rc02-3390475e02 | {"lastSuccessReportTabletsTime":"2025-05-07 19:27:06","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false} | 0                       | mix      |
| 18449     | 192.168.32.130 | 9050          | 9060   | 8040     | 8060     | -1                 | 2025-05-07 19:25:46 | 2025-05-07 19:27:31 | true  | false                | 12        | 0.000            | 0.000             | 22.423 GB     | 35.813 GB     | 37.39 % | 37.39 %        | 0.000              | {"location" : "default"} |        | doris-2.1.9-rc02-3390475e02 | {"lastSuccessReportTabletsTime":"2025-05-07 19:26:56","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false} | 0                       | mix      |
+-----------+----------------+---------------+--------+----------+----------+--------------------+---------------------+---------------------+-------+----------------------+-----------+------------------+-------------------+---------------+---------------+---------+----------------+--------------------+--------------------------+--------+-----------------------------+-------------------------------------------------------------------------------------------------------------------------------+-------------------------+----------+
3 rows in set (0.02 sec)
6. 修改Doris集群密码

在创建Doris集群后,系统会自动创建root用户,并默认密码为空,我们需要root用户重置一个新密码。

mysql> select user();
+-------------------------+
| user()                  |
+-------------------------+
| 'root'@'192.168.32.130' |
+-------------------------+
1 row in set (0.09 sec)

mysql> set password = password('123456');
Query OK, 0 rows affected (0.07 sec)
7. 创建测试表并插入数据

在新创建的集群中,可以创建表并插入数据以验证集群正确性。

mysql> create database testdb;
Query OK, 0 rows affected (0.08 sec)
mysql> CREATE TABLE testdb.table_hash
    -> (
    ->     k1 TINYINT,
    ->     k2 DECIMAL(10, 2) DEFAULT "10.5",
    ->     k3 VARCHAR(10) COMMENT "string column",
    ->     k4 INT NOT NULL DEFAULT "1" COMMENT "int column"
    -> )
    -> COMMENT "my first table"
    -> DISTRIBUTED BY HASH(k1) BUCKETS 32;
Query OK, 0 rows affected (0.22 sec)

mysql> INSERT INTO testdb.table_hash VALUES
    -> (1, 10.1, 'AAA', 10),
    -> (2, 10.2, 'BBB', 20),
    -> (3, 10.3, 'CCC', 30),
    -> (4, 10.4, 'DDD', 40),
    -> (5, 10.5, 'EEE', 50);
Query OK, 5 rows affected (0.69 sec)
{'label':'label_8f4121023fe5438b_b51ce8d48ff5b53e', 'status':'VISIBLE', 'txnId':'32'}

mysql> select * from testdb.table_hash
    -> ;
+------+-------+------+------+
| k1   | k2    | k3   | k4   |
+------+-------+------+------+
|    1 | 10.10 | AAA  |   10 |
|    4 | 10.40 | DDD  |   40 |
|    2 | 10.20 | BBB  |   20 |
|    3 | 10.30 | CCC  |   30 |
|    5 | 10.50 | EEE  |   50 |
+------+-------+------+------+
5 rows in set (0.29 sec)

部署Broker

1. 启动Broker

启动集群中各节点的Broker,并查看Doris进程

sh /data/doris/extensions/apache_hdfs_broker/bin/start_broker.sh --daemon
# 可以通过jps查看进程
[root@node3 be]# jps
16227 DorisBE
29032 BrokerBootstrap
15388 DorisFE
29244 Jps

将broker添加到FE的mysql数据库中

mysql> alter system add broker broker_name "192.168.32.130:8000","192.168.32.131:8000","192.168.32.132:8000";
Query OK, 0 rows affected (0.05 sec)

添加 BROKER 节点:
ALTER SYSTEM ADD BROKER broker_name "broker_host1:broker_ipc_port1","broker_host2:broker_ipc_port2",...;
删除 BROKER 节点:
ALTER SYSTEM DROP BROKER broker_name "broker_host1:broker_ipc_port1","broker_host2:broker_ipc_port2",...;
删除所有 BROKER 节点:ALTER SYSTEM DROP ALL BROKER broker_name;

查看状态broker状态

mysql> show proc "/brokers";
+-------------+----------------+------+-------+---------------------+---------------------+--------+
| Name        | Host           | Port | Alive | LastStartTime       | LastUpdateTime      | ErrMsg |
+-------------+----------------+------+-------+---------------------+---------------------+--------+
| broker_name | 192.168.32.132 | 8000 | true  | 2025-05-07 23:51:17 | 2025-05-07 23:51:37 |        |
| broker_name | 192.168.32.130 | 8000 | true  | 2025-05-07 23:51:17 | 2025-05-07 23:51:37 |        |
| broker_name | 192.168.32.131 | 8000 | true  | 2025-05-07 23:51:17 | 2025-05-07 23:51:37 |        |
+-------------+----------------+------+-------+---------------------+---------------------+--------+
3 rows in set (0.03 sec)

集群关闭

# 按照顺序进行关闭
先关闭broker
关闭be
关闭其余两节点fe,再关闭主节点fe