分布式仓库部署
准备条件
准备三台虚拟机,分别都为4C4G+40G,置于局域网内。
| 主机名称 | 主机ip | 角色 |
|---|---|---|
| node1 | 192.168.32.130 | Follower,BE1,Broker |
| node2 | 192.168.32.131 | Follower,BE2,Broker |
| node3 | 192.168.32.132 | Follower,BE3,Broker |
环境准备
JDK配置
这里不多介绍,不过需要注意的是jdk版本
配置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/
# 将这个压缩包分发到其余两个节点上
解压完毕的目录为:
配置环境变量
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. 连接网页
账号:root,密码:空
5. 连接FE Master节点
节点启动完毕后,可以通过mysql的客户端链接到doris集群中查看FE状态,通过要确定其状态
Aive为true表示节点存活。
Join为true表示节点加入到集群中,但是不代表还在集群中。
IsMaster为true代表当前节点为主节点。
终端输入
mysql -uroot -P 9030 -h192.168.32.130
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";
注意项:
-
FE Follower(包括 Master)节点的数量建议为奇数,建议部署 3 个组成高可用模式。
-
当 FE 处于高可用部署时(1 个 Master,2 个 Follower),我们建议通过增加 Observer FE 来扩展 FE 的读服务能力。
-
通常一个 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集群
10. FE节点主从切换
停止主节点./bin/stop_fe.sh
再次启动节点一
部署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