说明:
- 操作系统:Ubuntu 20.04
- FE:192.168.56.10
- BE:192.168.56.11
在每台 Doris FE 和 BE 执行:
# 安装基础依赖。
# 1. 安装 MySQL 客户端
# 1.1. 从 https://doris-build-hk.oss-cn-hongkong.aliyuncs.com/mysql-client/mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz 下载免安装的 MySQL 客户端,然后将其解压到 /opt/software/ 目录下
$ sudo mkdir -p /opt/software && sudo tar zxvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz -C /opt/software
# 1.2. 在 /etc/profile 的最后添加:export PATH=$PATH:/opt/software/mysql-5.7.22-linux-glibc2.12-x86_64/bin/
$ source /etc/profile
# 2. 安装依赖
$ sudo apt install -y screen libncurses5 libncurses-dev
# 安装 Doris 及其依赖。
# 1. 安装 openjdk-8-jdk(1.8.0)
$ sudo apt update && sudo apt install -y openjdk-8-jdk
# 2. 确认 JAVA 是否安装成功
$ java -version
openjdk version "1.8.0_362"
OpenJDK Runtime Environment (build 1.8.0_362-8u362-ga-0ubuntu1~20.04.1-b09)
OpenJDK 64-Bit Server VM (build 25.362-b09, mixed mode)
# 3. 下载 Doris(假设 CPU 支持 avx2 指令集,可以通过 cat /proc/cpuinfo | grep avx2 命令查看;如果下载较慢,那么设置代理)
$ curl https://doris.apache.org/download-scripts/1.2.4.1/download_x64_tsinghua.sh | bash
$ sudo mkdir -p /opt/software
$ sudo mv apache-doris-1.2.4.1-bin/ /opt/software/
$ rm -f download_base.sh
# 4. 查看系统最大打开文件句柄数限制。如果太小,那么通过 /etc/security/limits.conf 进行设置,比如
# * soft nofile 65536
# root soft nofile 65536
# * hard nofile 65536
# root hard nofile 65536
$ ulimit -n
1000000
# 5. 时钟同步。
# Doris 的元数据要求时间精度小于 5000ms,所以集群所有机器需要进行时钟同步,避免因为时钟问题引发元数据不一致,导致服务出现异常。
# 多个 FE 所在服务器的时钟必须保持一致(允许最多 5 秒的时钟偏差)
# 6. Linux 交换分区将给 Doris 带来很严重的性能问题,需要在安装之前禁用交换分区。
# 永久禁用 swap,打开 v 注释掉 swap
$ sudo swapoff -a
# 7. 修改 apache-doris-XXX-bin 目录下的 fe/conf/fe.conf 和 be/conf/be.conf 中的 priority_networks。
# priority_networks = 192.168.56.0/24
# 8. 运行 BE 进程需要设置 JAVA_HOME。
# 8.1. 获取 JAVA HOME
$ readlink $(readlink $(which java))
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
# JAVA HOME 为 /usr/lib/jvm/java-8-openjdk-amd64。
# 8.2. 设置 apache-doris-XXX-bin 目录下的 be/conf/be.conf 中的 JAVA_HOME。
# JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
在每台 Doris FE 上执行:
# 1. 创建存放元数据的目录
$ sudo mkdir -p /data/doris/fe
# 2. 修改配置文件 fe/conf/fe.conf 中的 meta_dir。
# meta_dir = /data/doris/fe
# 3. fe/conf/fe.conf 的 JAVA_OPTS 中默认的 JAVA 最大堆内存为 8GB,适当调整。
# JAVA_OPTS="-Xmx1024m ...
# 4. 进入到 apache-doris-XXX-bin/fe 目录
$ cd /opt/software/apache-doris-1.2.4.1-bin/fe/
# 5. 启动 FE
$ sudo screen -dmS doris-fe ./bin/start_fe.sh
# 日志在 log 目录下,如果启动失败,那么可以通过 log/fe.log 或 log/fe.out 查看错误信息
# 6. 验证
$ mysql -h192.168.56.10 -uroot -P9030 -e 'SHOW FRONTENDS\G'
*************************** 1. row ***************************
Name: 192.168.56.10_9010_1684218520050
IP: 192.168.56.10
EditLogPort: 9010
HttpPort: 8030
QueryPort: 9030
RpcPort: 9020
Role: FOLLOWER
IsMaster: true
ClusterId: 1675605346
Join: true
Alive: true
ReplayedJournalId: 64
LastHeartbeat: 2023-05-16 06:31:51
IsHelper: true
ErrMsg:
Version: doris-1.2.4-1-Unknown
CurrentConnected: Yes
# 其中 192.168.56.10 是 FE 的 IP 地址。
# 如果输出中 Role 为 FOLLOWER,并且 IsMaster、Join、Alive 都为 true,那么表明 FE 启动成功
在每台 Doris BE 上执行:
# 1. 创建存储数据的根路径
$ sudo mkdir -p /data{1,2,3}/doris/be
# 2. 修改配置文件 be/conf/be.conf 中的 storage_root_path。
# storage_root_path = /data1/doris/be,medium:HDD;/data2/doris/be,medium:HDD;/data3/doris/be,medium:HDD
# storage_root_path 用于指定数据根目录,多个路径之间用“;”分隔。
# 可以指定每个根路径的存储介质,HDD 或 SSD。
# 可以在每个根路径的尾部添加容量限制,用“,”分隔。
# 比如 storage_root_path = /home/disk1/doris.HDD,50;/home/disk2/doris.SSD,1;/home/disk2/doris 表示:
# /home/disk1/doris.HDD,容量限制是 50GB,HDD;
# /home/disk2/doris.SSD,容量限制是 1GB,SSD;
# /home/disk2/doris,容量限制是磁盘容量,HDD(默认)。
# 也可以通过设置 `<property>:<value>` 的方式,指定属性,属性之间用“,”分隔。属性“medium”比路径扩展的优先级高。
# 默认值是 ${DORIS_HOME}/storage,需要手动创建它。
# 3. 在 FE 中添加 BE 节点
$ mysql -h192.168.56.10 -uroot -P9030 -e 'ALTER SYSTEM ADD BACKEND "192.168.56.11:9050";'
# 其中 192.168.56.10 是 FE 的 IP;9030 是 FE 的 query_port;192.168.56.11 是 BE 的 IP;9050 是 BE 的 heartbeat_service_port
# 4. 启动 BE
# 4.1. 进入到 apache-doris-XXX-bin/be 目录
$ cd /opt/software/apache-doris-1.2.4.1-bin/be/
# 4.2. 在 ./bin/start_be.sh 的顶部添加:sysctl -w vm.max_map_count=2000000
# 4.3. 启动 BE
$ sudo screen -dmS doris-be ./bin/start_be.sh
# 日志在 log 目录下,如果启动失败,那么可以通过 log/be.log 或 log/be.out 查看错误信息
# 5. 通过 FE,确认 BE 状态
$ mysql -h192.168.56.10 -uroot -P9030 -e 'SHOW BACKENDS\G'
*************************** 1. row ***************************
BackendId: 11001
Cluster: default_cluster
IP: 192.168.56.11
HeartbeatPort: 9050
BePort: 9060
HttpPort: 8040
BrpcPort: 8060
LastStartTime: 2023-05-16 06:38:58
LastHeartbeat: 2023-05-16 06:39:53
Alive: true
...
# Alive 为 true 表示 BE 启动成功
主机名/IP | 角色 |
---|---|
app1/192.168.0.1 | FE |
app2/192.168.0.2 | BE |
app3/192.168.0.3 | BE |
app4/192.168.0.4 | BE |
给 BE 节点 192.168.0.4 设置标签 group_flows:
alter system modify backend "192.168.0.4:9050" set ("tag.location" = "group_flows");
xxxxxxxxxx
CREATE TABLE `flows_test` (
`k1` int(11) NULL,
`k2` int(11) NULL
) ENGINE=OLAP
DUPLICATE KEY(`k1`, `k2`)
COMMENT 'OLAP'
DISTRIBUTED BY HASH(`k1`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.group_flows: 1"
);
其中副本数为 1,该副本被存储在 group_flows 资源组内。
$ curl --location-trusted -u root:<密码> -H "label: load_flows_test_demo_data" -H "column_separator:," -X PUT -T demo.txt http://<FE IP>:<FE HTTP PORT>/api/<数据库名称>/flows_test/_stream_load
{
"TxnId": 1102,
"Label": "load_flows_test_demo_data",
"TwoPhaseCommit": "false",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 10,
"NumberLoadedRows": 10,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 42,
"LoadTimeMs": 112,
"BeginTxnTimeMs": 11,
"StreamLoadPutTimeMs": 65,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 6,
"CommitAndPublishTimeMs": 28
}
demo.txt 的内容如下:
xxxxxxxxxx
1,1
2,2
3,3
4,4
5,5
6,6
7,7
8,8
9,9
10,10
执行如下 SQL:
xxxxxxxxxx
show tablets from flows_test\G
输出如下:
x*************************** 1. row ***************************
TabletId: 58478
ReplicaId: 58479
BackendId: 10005
SchemaHash: 1045430500
Version: 2
LstSuccessVersion: 2
LstFailedVersion: -1
LstFailedTime: NULL
LocalDataSize: 404
RemoteDataSize: 0
RowCount: 10
State: NORMAL
LstConsistencyCheckTime: NULL
CheckVersion: -1
VersionCount: 2
PathHash: 4110169422028928350
MetaUrl: http://192.168.0.4:8040/api/meta/header/58478
CompactionStatus: http://192.168.0.4:8040/api/compaction/show?tablet_id=58478
1 row in set (0.01 sec)
可见该表只有一个 Tablet,该 Tablet 被存放在 ID 为 10005 的 BE 上。接下来通过如下 SQL,查看 BE 节点列表:
xxxxxxxxxx
show backends\G
部分输出如下:
x*************************** 3. row ***************************
BackendId: 10005
Cluster: default_cluster
IP: 192.168.0.4
HeartbeatPort: 9050
BePort: 9060
HttpPort: 8040
可见 ID 为 10005 的 BE 的 IP 地址是 192.168.0.4。
接下来,登陆 192.168.0.4,进入目录
xxxxxxxxxx
<Storage Root Path>/data/*/<Tablet ID>/<Schema Hash>
可以看到 Segment 文件。
综上,该测试符合预期。