说明:
- 操作系统: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 -versionopenjdk 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 -n1000000# 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: trueReplayedJournalId: 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");xxxxxxxxxxCREATE TABLE `flows_test` ( `k1` int(11) NULL, `k2` int(11) NULL) ENGINE=OLAPDUPLICATE KEY(`k1`, `k2`)COMMENT 'OLAP'DISTRIBUTED BY HASH(`k1`) BUCKETS 1PROPERTIES ("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 的内容如下:
xxxxxxxxxx1,12,23,34,45,56,67,78,89,910,10
执行如下 SQL:
xxxxxxxxxxshow tablets from flows_test\G输出如下:
x*************************** 1. row ***************************TabletId: 58478ReplicaId: 58479BackendId: 10005SchemaHash: 1045430500Version: 2LstSuccessVersion: 2LstFailedVersion: -1LstFailedTime: NULLLocalDataSize: 404RemoteDataSize: 0RowCount: 10State: NORMALLstConsistencyCheckTime: NULLCheckVersion: -1VersionCount: 2PathHash: 4110169422028928350MetaUrl: http://192.168.0.4:8040/api/meta/header/58478CompactionStatus: http://192.168.0.4:8040/api/compaction/show?tablet_id=584781 row in set (0.01 sec)
可见该表只有一个 Tablet,该 Tablet 被存放在 ID 为 10005 的 BE 上。接下来通过如下 SQL,查看 BE 节点列表:
xxxxxxxxxxshow backends\G部分输出如下:
x*************************** 3. row ***************************BackendId: 10005Cluster: default_clusterIP: 192.168.0.4HeartbeatPort: 9050BePort: 9060HttpPort: 8040
可见 ID 为 10005 的 BE 的 IP 地址是 192.168.0.4。
接下来,登陆 192.168.0.4,进入目录
xxxxxxxxxx<Storage Root Path>/data/*/<Tablet ID>/<Schema Hash>
可以看到 Segment 文件。
综上,该测试符合预期。